さくらVPSでmysqlレプリケーションを構築してみる

前提

centos6
mysql5.5

まず、mysql5.5を入れる。

【シンプル】CentOS6にMySQL5.5をyumで簡単にインストールする手順 | 田舎に住みたいエンジニアの日記


最初5.6を入れてすすめていたが、5.1から5.6への移行は推奨されないというのを見て、嫌な予感がして5.5にすることにした。
MySQL 5.1→5.6のmy.cnfの差分とか - (ひ)メモ

service mysqld start で起動するとエラー

これの2と3で解決
[Web] さくらVPSでのメンテナンスについて: ものづくりログ

いくつかのサーバはなぜかさらに別のエラーがでて起動できなかった(復旧にコケたみたいなエラーだった)。エラーログでググってもあまりHITしなかったので、MySQLを初期化する方法を試してみたらすんなりいった。
MySQLのデータベースを初期化する - Qiita

    • 休憩 --

メイン

新規のサーバでセットアップ の節
現場指向のレプリケーション詳説

図9のところはmysqlのバージョンのせいか、できなかった

[mysqld]
server-id=11
master-host=mymaster
master-user=repl
master-password=qa55wd

ので、そこだけ、こちらの手順でやる。
MYSQLレプリケーション設定 - エーエイチレフ linuxサーバー技術情報

# slaveのmysqlにログイン

CHANGE MASTER TO
MASTER_HOST='マスターのIPアドレス',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=189;

で、これをmysqlに打ち込んだあとにさらに下を打つと、ようやくレプリケーションが始まる。

mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL 5.5 Server as Replication Slave « Code-Kolbold Code Talk

最初は権限の問題でうまくいかなかった
とりあえずすべて接続元からを許可するように「%」とするとうまくいった。(TODO:後から調べる!)
図4’

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'qa55wd';

からの、glassfishからconnection poolして利用

まずは、管理画面でconnection poolの作成
GlassFish v3.1.2.2でのMySQL/JDBC設定

java sourceからの利用

        Connection con = null;
        try {
            DataSource source = (DataSource)new InitialContext().lookup("jdbc/mysql1");
            con = source.getConnection();
            // 接続を使用する
            System.out.println("connection is successs.");
            
            
            try {
                Statement stmt = (Statement) con.createStatement();
                ResultSet rs = stmt.executeQuery("select * from aaa limit 2");
                while(rs.next()){
                    Integer no = rs.getInt("id");
                    String eid = rs.getString("name");

                    System.out.println(id+" : " + name);
                }
            } catch (SQLException ex) {
                Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (SQLException e) {
            // エラーのログを取る
            Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, e);
        } catch (NamingException e) {
            // JNDI内にDataSourceが見つからない
            System.out.println("JNDI内にDataSourceが見つからない");
        } finally {
            if (con != null) {
                try { con.close(); } catch (SQLException e) {}
            }
        }