2014年10月31日金曜日

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

redis_to_mariadb前の記事で複数サーバー構成にした。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も使えるので便利。

connect-mysql-sessionの方が人気みたいだけど、内部でseqelizeというO/Rマッパーを使っている。node-mysqlを使ってほしいので除外。

MariaDB ClusterがサポートしているのはInnoDBかXtraDBストレージエンジンだけでMemoryは使えないので注意。

 

< Related Posts >

2014年10月25日土曜日

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

titanium_sqliteTitanium.Databaseを使ってテーブルを作成したあとに、確認のためにデータベースのテーブル一覧を出力したときの覚書。

環境: Titanium SDK 3.3.0.GA

公式ドキュメントを参考に。

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
    tables = {};
    while (rsTables.isValidRow()) {
        tableName = rsTables.fieldByName('name');
        tables[tableName] = {};

        // Get Columns ResultSet
        rsColumns = db.execute("PRAGMA TABLE_INFO('" + tableName + "');");
        while (rsColumns.isValidRow()) {
            tables[tableName][rsColumns.field(1)] = {
                cid: rsColumns.field(0),
                type: rsColumns.field(2),
                notNull: rsColumns.field(3),
                defalutValue: rsColumns.field(4),
                primaryKey: rsColumns.field(5)
            };
            rsColumns.next();
        }
        // Close
        rsColumns.close();

        rsTables.next();
    }
    // Close
    rsTables.close();
    db.close();

    // Output for debug
    console.log('[Database Structure]');
    console.log(tables);

    return tables;
}

 

< Related Posts >

2014年10月14日火曜日

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

gce_ssh開発用でGoogle Compute Engine上にCentOSインスタンスを作成してTera Termでログインするまでの覚書。

環境: f1-micro, CentOS 6.5 x86_64

 

目次

  1. Google Developers Consoleでプロジェクト作成
  2. Google Compute Engine上でインスタンス作成
  3. Tera Term(SSH)からrootでログイン
  4. 気付いたこと

 


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は料金に関係してくる。詳しくは公式サイトで。

「EXTERNAL IP」はEphemeral(一時IPアドレス)を選択しておけば追加料金はかからない。

作成後は自動で起動される。

一覧から選択して「SSH」を選択するとブラウザ版SSHが起動する。これでも十分操作可能。

 


3.Tera Term(SSH)からrootでログイン

TeraTerm Menuから起動するため。

詳しくは公式ドキュメントを参考にしながら。

まずは公開鍵と秘密鍵を作成する。この辺は前の記事を参考に。

作成した公開鍵を管理画面の「SSH Keys」から登録する。このとき最後にユーザー名を指定する。他のユーザー名を指定すると自動でユーザーが作成される。

ssh-rsa AAAAB3Nzahoge== root

image

今度は先ほどのブラウザSSHを起動してrootからのログインを許可する。
$ sudo vi /etc/ssh/sshd_config

PermitRootLogin yes

これでTera Termからログイン可能。

ちなみに他のユーザーでログインして
$ sudo su -
してもいい。

 


4.気付いたこと

停止(#shutdown -h now)したインスタンスを起動する手段がない。管理画面でRebootボタン押しても失敗する。

なぜ?

ディスクを切り離し → インスタンス削除 → 同じディスクから新たにインスタンス作成する必要がある。SSH Keyも再度追加しないといけないので面倒くさい。

External IPアドレスは変わらなかった。

大した時間はかからないけど、この辺はAWSの方が簡単便利。

スクリプトで自動化出来るみたいだけど。

 

< Related Posts >

2014年10月2日木曜日

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

phpstorm_boostupコード補完候補が表示されるときに一瞬止まるのがイラッときたので調査。

環境: Windows 8.1 x64, JDK 8u20, PHPStorm 8.0.2

やってはみたものの日本語入力すると落ちるのでオススメしない。

→ こちらの方が既に報告してくれている様子。Javaのバグらしい。バージョン9で直るらしいのでしばらく先になりそう。

 

< 2015/03/24 Modified >
PHPStorm 8.0.3 + JDK 8u40で無事動作するのを確認。

 

参考サイト

 

目次

  • 使用中のメモリ容量を表示
  • 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と参考サイトに書いてあった。

「jdk-8u20-windows-x64.exe」を実行してインストール。

念のためマシン再起動。

 


3.64bit版PHPStormを起動

PHPStormのインストールディレクトリに移動して64bit版を起動。

C:\Program Files (x86)\JetBrains\PhpStorm 8.0.2\bin\PhpStorm64.exe

Help → Aboutでさっきインストールした1.8を使っているか確認。

 


4.最大使用メモリ容量を増やす

PhpStorm64.exe.vmoptionsを編集する。

エディタ(メモ帳など)を管理者として実行して下記のように変更。

変更前

-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

 

変更後

-Xms512m
-Xmx1024m
-XX:MaxPermSize=500m
-XX:ReservedCodeCacheSize=225m
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50

 

PhpStorm64.exeを再起動。メモリインディケーターの最大値が増えていることを確認。

何となく速くなった気がする。

 

。。。でも残念なことに日本語を入力後に必ず落ちるので、前の32bit版を使ってる。IMEはGoogle日本語入力。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives