さくら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) {}
            }
        }

jax-rsでNoSuchMethodErrorにハマる

問題

java.lang.NoSuchMethodError: com.sun.research.ws.wadl.Response.getRepresentationOrFault()Ljava/util/List;
at com.sun.jersey.server.wadl.WadlGeneratorImpl.createResponse(WadlGeneratorImpl.java:198)
at com.sun.jersey.server.wadl.WadlBuilder.generateResponse(WadlBuilder.java:397)

というエラーが発生。restart-domainすると発生しなくなるが、一度でもdeployするとずっと発生する。



jax-rsに関する依存をこの2つに変えたら問題は起きなくなった。

<dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.18.1</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.7</version>
        </dependency>


参考
spring - REST Exception: java.lang.reflect.InvocationTargetException - Stack Overflow

sqlite + java + connection pool + glassfish

Glassfishの設定
http://sourceforge.net/p/sqlite-connpool/wiki/How%20To%20Setup%20a%20SQLite%20Connection%20Pool%20on%20Glassfish/


Java source code
http://sourceforge.net/p/sqlite-connpool/home/Home/



おまけ 設定
java - Set SQLite connection properties in c3p0 connection pool - Stack Overflow

  • -
  • -

2015-07-14

Class.forName("org.sqlite.JDBC");でエラーがでるようであれば、sqlite-jdbc-3.7.2.jarを適切な場所に配置してglassfishを再起動したら直るもよう。置く場所はdomain/domain1/libだったと思う。

JAX-RS Viewable | jspで変数が展開されずにハマった

問題

${it}

これがjspでそのまま

${it}

と表示されてしまう。

解決方法

<%@ page isELIgnored="false" %>

java - JSP: EL expression is not evaluated - Stack Overflow

これでもいける

<%=pageContext.findAttribute("it")%>

なぜハマってしまったのか
原因がJAX-RSかViewable近辺にあると思いこんでいた。。
あと、jspのこの変数の方式が、「EL」という名前だと知っていれば多少まともな検索結果がヒットしていたのかもしれない。

Route53の設定を変えるとしばらくホスト名が解決できなくなる

しかしながら、他のネットワークからならアクセスできた。
あと、15分くらい待ったらすべてのネットワークの端末からアクセスできるようになった。

かなり不確かな情報だけど、プロバイダーがそういう情報をキャッシュとしてもっていてそのキャッシュが更新されるまでは古い情報のままだから、みたいな情報をどこかで読んだ気がする。
だから見れなかったのだと思う


Route53の
>TTL (Seconds):
には60secを指定しても、実際に見れるのは結構時間がかかった。


ネットワーク周りの知識皆無なので設定が間違っているのかなんなのかわからず途方に暮れて放置した結果、うまくいった。

Elastic Beanstalk + logback

beanstalkでtomcatデプロイ。で、ログを出したいだけなのに 何かといろいろ調べなければならなかった。


pom.xmlに依存を加える
<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-jdk14</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.5</version>
		</dependency>
	    <dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>1.7.5</version>
		</dependency>
		<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>0.9.15</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>0.9.15</version>
        </dependency>

このままだと、何かが重複している警告がでるが、今はとりあえず無視

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/gen/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jrs/WEB-INF/lib/logback-classic-0.9.15.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/gen/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jrs/WEB-INF/lib/slf4j-jdk14-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.selector.DefaultContextSelector]
SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6, 1.7]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.

src/main/resources以下にlogback.xmlというファイル名で設定ファイルを作る
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>

<configuration>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>aaa.log</file>
    <Encoding>UTF-8</Encoding>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <param name="Pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n" />
    </layout>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>aaa.log.%d{yyyy-MM-dd}.gz</FileNamePattern>
      <MaxHistory>30</MaxHistory>
    </rollingPolicy>
  </appender>
  
  <logger name="jp">
    <level value="DEBUG" />
    <appender-ref ref="FILE" />
  </logger>
   
  <root level="debug">
    <appender-ref ref="FILE" />
  </root>
</configuration>
logをtail

デプロイされたec2インスタンスsshでログインして、ログを見ることができる

tail -f /usr/share/tomcat7/aaa.log

beanstalkのWEB管理画面のログにはどうやって出すんだろう。。

それっぽい情報はあるが、めんどい。。
jcabi-beanstalk-maven-plugin - Using syslogd at Amazon Elastic Beanstalk