投稿

複数サーバーでセッション管理するためにRedisからMariaDB Cluster(MySQL)に変更

イメージ
前の記事 で複数サーバー構成にした。nginxの設定では「ip_hash」を使いIPアドレスをキーにした負荷分散にしたけど、モバイルアプリからのアクセスは頻繁にセッションが切れる現象に遭遇。 環境: CentOS 6.6 x64, Node.js v0.11.14, MariaDB 10.0.14 今までアプリのセッションは各サーバーごとにRedisで管理していた。セッション管理するサーバーを用意して各アプリサーバーが参照するようにすれば出来る。 Redisでセッションを一元管理する場合のポイント bind(/etc/redis.conf)は制限せずにファイヤーウォールで制限する Redis Clusterもあるけど、まだ開発段階みたい   。。。と調べたけど、このサービスはMariaDB Galera Clusterでクラスター構築したので、セッション管理もこっちを使うことにした。 connect-mysqlを使えば解決。poolも使えるので便利。 nlf/connect-mysql | GitHub connect-mysql-session の方が人気みたいだけど、内部で seqelize という O/Rマッパー を使っている。node-mysqlを使ってほしいので除外。 MariaDB ClusterがサポートしているのはInnoDBかXtraDBストレージエンジンだけでMemoryは使えないので注意。   < Related Posts > MariaDB Galera Clusterをインストールしてデータベースをクラスター化 CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめ RedisをInstallして、Node.js + RedisでSession管理

【Titanium】SQLiteのテーブル一覧を出力

イメージ
Titanium.Databaseを使ってテーブルを作成したあとに、確認のためにデータベースのテーブル一覧を出力したときの覚書。 環境: Titanium SDK 3.3.0.GA 公式ドキュメントを参考に。 Working with a SQLite Database - Appcelerator Platform - Appcelerator Docs Pragma statements supported by SQLite EZ-NET: SQLite でテーブルのカラム構造を取得する SQLで取得するためには「sqlite_master」からSELECTすればいいらしい。 データベース名を引数にして、構造をオブジェクトで返す関数を作った。 /** * Get Database Structure * * @api public * @param {String} dbName Database Name * @return {Object} */ function getStructure(dbName) {     var db, rsTables, rsColumns;     var sql, tables, tableName;     // Generate SQL     sql = [];     sql.push("SELECT name");     sql.push("FROM sqlite_master");     sql.push("WHERE type = 'table';");     // Excute     db = Ti.Database.open(dbName);     rsTables = db.execute(sql.join(' '));     // Loop in Table ResultSet     tabl...

Google Compute Engineにインスタンス作成してSSHでログイン

イメージ
開発用でGoogle Compute Engine上にCentOSインスタンスを作成してTera Termでログインするまでの覚書。 環境: f1-micro, CentOS 6.5 x86_64   目次 Google Developers Consoleでプロジェクト作成 Google Compute Engine上でインスタンス作成 Tera Term(SSH)からrootでログイン 気付いたこと   1.Google Developers Consoleでプロジェクト作成 Google Developers Console にアクセスして「Create Project」する。   2.Google Compute Engine上でインスタンス作成 作成したプロジェクトを選択して、 Compute → Compute Engine を選択すると初回はクレジットカードの登録が必要。住所と名前は日本語でも大丈夫だった。 有効になると Compute → Compute Engine → VM instances から「New instances」を選んでインスタンスを作成する。 MACHINE TYPEは料金に関係してくる。詳しくは公式サイトで。 Google Compute Engine - クラウド コンピューティングと Infrastructure As A Service ー Google Cloud Platform 「EXTERNAL IP」はEphemeral(一時IPアドレス)を選択しておけば追加料金はかからない。 作成後は自動で起動される。 一覧から選択して「SSH」を選択するとブラウザ版SSHが起動する。これでも十分操作可能。   3.Tera Term(SSH)からrootでログイン TeraTerm Menuから起動するため。 詳しくは公式ドキュメントを参考にしながら。 Google Developers Console - Google Compute Engine ー Google Cloud Platform まずは公開鍵と秘密鍵を作成する。この辺は前の記事を参考に。 【CentOS】さくらVPSサーバーの初期設定 作成した...

PHPStormを64bitで動作+メモリ容量を増やして高速化

イメージ
コード補完候補が表示されるときに一瞬止まるのがイラッときたので調査。 環境: Windows 8.1 x64, JDK 8u20, PHPStorm 8.0.2 やってはみたものの日本語入力すると落ちるのでオススメしない。 → こちらの方が既に報告してくれている様子。Javaのバグらしい。バージョン9で直るらしいのでしばらく先になりそう。 Windows 7、Java SE 8u20、NetBeans 8の組み合わせで落ちる - torutkの日記   < 2015/03/24 Modified > PHPStorm 8.0.3 + JDK 8u40で無事動作するのを確認。   参考サイト Selecting the JDK version the IDE will run under : JetBrains Support PhpStormのメモリ使用量を増やして高速化   目次 使用中のメモリ容量を表示 64bit版JDKをインストール 64bit版PHPStormを起動 最大使用メモリ容量を増やす   1.使用中のメモリ容量を表示 File → Settings → Appearance → Show memory indicator   2.64bit版JDKをインストール Help → Aboutで確認するとJRE 1.7.0 x86を使っているので最新の64bit版JDK 1.8をインストールすれば速くなるかなと思ってやってみた。 JDKを公式サイトからダウンロード。JREでなくJDKと参考サイトに書いてあった。 Java SE - Downloads | Oracle Technology Network | Oracle 「jdk-8u20-windows-x64.exe」を実行してインストール。 念のためマシン再起動。   3.64bit版PHPStormを起動 PHPStormのインストールディレクトリに移動して64bit版を起動。 C:\Program Files (x86)\JetBrains\PhpStorm 8.0.2\bin\PhpStorm64.exe Help → Aboutでさっ...

WordPressで$_SESSIONが使えない

イメージ
ページ遷移のログを簡易的に$_SESSIONに保存して使いまわそうとしたら動作しなかったので調査。 環境: CentOS 6.5, nginx 1.6.2, php-fpm 5.4.33 initにフックしてsession_startしても、各ページでsession_idするたびに新たに新しいIDになって引き継げない。 function hoge_init() {     if (!session_id()) {         session_start();     } } add_action('init', 'hoge_init'); 調べてみるとPHPの設定でsession.cookie_pathの設定が「/tmp」になってた。 # less /etc/php.ini session.cookie_path = /tmp cookie_path はクッキーを保存するパス(URI)。一致したアクセスのみクッキーを使えるようになる。 cookie_pathを直したら動いた。 他のサーバーをみると「/」だったので、session.save_pathと勘違いして書き換えてたみたい。設定した覚えがないのでどっかのバージョンは/tmpに設定されるかも。 ちなみにsession.save_pathの設定は/etc/php-fpm.d/www.confに記載してある。     ちょっと深追いしてWordPressと_SESSIONの関係を調査。 WordPressはグローバル変数として_SESSIONを扱っていない。 Php session not working in wordpress page template - Stack Overflow Global Variables | WordPress Codex var_dump($GLOBALS); するとWordPressが生成したグローバル変数が出力される。   ということで$_SESSIONを使うのはやめて、 update_user_meta を使うことにした。   < Related P...

WordPressのWP_Cronを使って非同期処理

イメージ
WordPressに投稿するとアプリにプッシュ通知する仕組みを作っているときの覚書。 環境: CentOS 6.5, WordPress 4.0.0 Linuxのcronとか pthread に頼らずにやってみた。 WordPressにはwp_schedule_single_eventという登録したフックを一度だけ実行する関数がある。 Function Reference/wp schedule single event | WordPress Codex ソースをみると10分の間に同じリクエストがくると無視されるが、$argsが違えばスケジュールに登録される。 同じ記事に対して何度もプッシュ通知が来てもウザいのでちょうどいい。 コードサンプルは上の公式サイトを参考に。     でも念のためLinuxのCronに10分ごとに/wp-cron.phpにリクエストを送る処理書いた。。。 # vi /etc/cron.d/wordpress MAILTO="" # Excute WordPress WP_Cron */10 * * * * root curl http://hoge.com/wp-cron.php > /dev/null 2>&1 参考サイト: Better wp-cron using linux's crontab   < Related Posts > 【Titanium, Android】Notificationからアプリにデータを渡す TitaniumアプリでPush Notification【Android版】 Titaniumアプリでプッシュ通知(Push Notification)【iOS版】

【Titanium】ビルドしたときにzipalignエラー

イメージ
ネットで拾った古いソースコードを古いSDKでビルドしたときに下記エラーに遭遇した。 環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA, Android SDK Tools 23.0.2 [ERROR] Unable to find Android SDK tools: zipalign. [ERROR] You have an incomplete or out-of-date installation. [ERROR] Verify your Android SDK packages or reinstall the Android SDK by running 'titanium setup android' or manually downloading from http://appcelerator.com/android-sdk. 下記サイトを参考にAndroid SDKにあるzipalignをコピーする Unable to find Android SDK tools: zipalign | Community Questions & Answers | Appcelerator Developer Center $ cd /Applications/android-sdk-macosx/ $ cp build-tools/19.1.0/zipalign tools/ これでビルドは通った。 元に戻すときは削除するだけ。 $ rm -rf tools/zipalign   < Related Posts > Titaniumを使ったアプリと苦労した事とかのまとめ2013年 Titanium CLIでAndroid向けにCompile(Build)と実機でDebug

MariaDB(MySQL)設定のチューニング

イメージ
5年前にも書いた けど、調べ直したときの覚書。 環境: MariaDB 10.0.13   参考サイト Server System Variables - MariaDB Knowledge Base MySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System Variables DSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング!   変数名 デフォルト 説明 max_connections 151 最大同時接続数。 Node.jsから非同期で処理する場合は一気に増加するので多めに設定。 thread_pool_size CPUの数 同時実行するスレッドグループの数。 デフォルトのままでいい。 参考: Thread pool in MariaDB 5.5 - MariaDB Knowledge Base thread_cache_size 0 キャッシュするスレッドの数。 "pool-of-threads"の場合無視される。 table_open_cache 400 全てのスレッドでオープンするテーブルの数。 多すぎても少なすぎてもダメらしい。 参考: Optimizing table_open_cache - MariaDB Knowledge Base 参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.8 MySQL でのテーブルのオープンとクローズの方法 key_buffer_size 134217728 MyISAMのインデックスをキャッシュするメモリ容量。全てのスレッドで共通。 実メモリの25%が妥当らしい。 参考: Optimizing key_buffer_size - MariaDB Knowledge Base sort_buffer_size 2M ソートするときにスレッドごとに使うメモリ容量。大きすぎるとメモリが足りなくなるので注意。 read_rnd_buffer_size 262144 ソート後にレコードを読み込むときに使用するメモリ容量。これもスレッドごと。 join_buffer_size 128KB インデック...

ロードバランサとしてHAProxyかNginxか

イメージ
ロードバランサにHAProxyとNginxで迷ったときの覚書。 ベンチマークはHAProxyの方が速いみたい。 architecture/elb-benchmark.wiki at master · eucalyptus/architecture | GitHub HAProxyは1.5からHTTPSもサポート。YUMのリポジトリにあるのは1.4が主流。 http, httpsをロードバランスするだけならNginxの方がいいかな? Nginxでロードバランサするときは下記記事が参考になりそう。 Nginx + WordPress ロードバランサー篇 | サーバーワークス エンジニアブログ   < 2014/09/23 Modified > Nginxの死活監視に不安があったけど、ちゃんと指定ポートに応答がなかったら別サーバーにリクエストを投げてくれた。   < Related Posts > Nginxを設定してWordPressにリバースプロキシする MariaDB, MySQLの冗長化、負荷分散の構成を考える

MariaDB Galera Clusterをインストールしてデータベースをクラスター化

イメージ
新サービスのサーバー構成を考えているときの覚書。 環境: CentOS 6.5 x86_64, MariaDB Galera Server 10.0.13 前の記事も参考に。 SE奮闘記: MariaDB, MySQLの冗長化, 負荷分散の構成を考える サービス全体のサーバー構成。 ロードバランサー02やWeb02がいればさらに安心できる。 ちなみにMariaDB Galera Clusterの最小ノード数は「3」。今回はデータベースをクラスター化するまで。   参考サイト MariaDB Galera Clusterを試す (1) | さくらインターネット研究所 Galera - MariaDB Knowledge Base CentOS 6.5 で MariaDB の Galera Replication Cluster を試す | CUBE SUGAR STORAGE   目次 YUM経由でインストール 起動と設定 2台目以降のノード設定 クラスターに参加   1.YUM経由でインストール 公式サイトを参考にYUMのリポジトリを追加する。 MariaDB - Setting up MariaDB Repositories [web01]# vi /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.0/centos6-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1   インストール実行 [web01] # yum search MariaDB [web01] # yum install MariaDB-Galera-server epelリポジトリを使ったので、 前の記事 を参考に登録した方がいいかも。 クラスター構成なので常に稼働する前提。メンテナンスで停止するときは手動で起動するため自動起動はしないようにしておく。 [web01] # chkconfig mysql off     2.起動と設定 公式...