ElasticLoadBalancerをWakameで使う(2/n)

前回のElasticLoadBalancerをWakameで使うの続きです

Wakameの次期バージョンではMysqlのSlaveが増やせるようになります。

それに伴い現在開発中のコードで、Rails2.3.2を使ってMysql-Slave構成の
アプリケーションのセットアップを行いました。

Wakame 0.3.x
Rails 2.3.2
Mysql 5.0.67-0ubuntu6-log
ELB   Amazon ElasticLoadBalancing CLI version 1.0.1.23 (API 2009-05-15)

1.まずはインスタンスを立ち上げるたときの初期状態

shell>/home/wakame/corelib/bin/wakameadm status

Cluster : Wakame::Service::WebCluster (0)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter> 
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter> 
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter> 
  Wakame::Service::MySQL_Slave : <current=1 min=1, max=5, type=ConstantCounter> 
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter> 

Agents :
  i-8384a0ea : 10.252.46.68, 174.129.175.158 load=0.18, 10 sec(s) (1)

2.launch_clusterコマンドを実行。
この時点で1台のインスタンスの中で
MysqlMasterがPORT:3306で
MysqlSlaveがPORT:3307
でそれぞれ立ち上がってます。

shell>/home/wakame/corelib/bin/wakameadm launch_cluster
Cluster : Wakame::Service::WebCluster (1)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter> 
     d12b2759abb761a3c8b5eaf99041eb785784bb8f (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter> 
     5d2c848392140b0ae961427e7e86cadbb9f6f8e6 (ONLINE)
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter> 
     e86ea71b4d991b85f4b9169ab87dbde7040ca791 (ONLINE)
  Wakame::Service::MySQL_Slave : <current=1 min=1, max=5, type=ConstantCounter> 
     f9add259b40dfc8e642b76373887312938b76b33 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter> 
     067f2b412d632388b8023b05e1636ffe1b763691 (ONLINE)

Instances :
  f9add259b40dfc8e642b76373887312938b76b33 : Wakame::Service::MySQL_Slave (ONLINE)
    On VM instance: i-8384a0ea
  e86ea71b4d991b85f4b9169ab87dbde7040ca791 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-8384a0ea
  067f2b412d632388b8023b05e1636ffe1b763691 : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-8384a0ea
  5d2c848392140b0ae961427e7e86cadbb9f6f8e6 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-8384a0ea
  d12b2759abb761a3c8b5eaf99041eb785784bb8f : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-8384a0ea

Agents :
  i-8384a0ea : 10.252.46.68, 174.129.175.158 load=0.52, 2 sec(s) (1)
    Services (5): Wakame::Service::MySQL_Slave, Wakame::Service::Apache_APP, Wakame::Service::MySQL_Master, Wakame::Service::Apache_WWW, Wakame::Service::Apache_LB


3.propagate_serviceコマンドでslaveを増やします。

shell>/home/wakame/corelib/bin/wakameadm propagate_service Wakame::Service::MySQL_Slave
shell>/home/wakame/corelib/bin/wakameadm status

Cluster : Wakame::Service::WebCluster (1)
  Wakame::Service::Apache_LB : <current=1 min=1, max=1, type=ConstantCounter> 
     d12b2759abb761a3c8b5eaf99041eb785784bb8f (ONLINE)
  Wakame::Service::Apache_WWW : <current=1 min=1, max=5, type=ConstantCounter> 
     5d2c848392140b0ae961427e7e86cadbb9f6f8e6 (ONLINE)
  Wakame::Service::Apache_APP : <current=1 min=1, max=5, type=ConstantCounter> 
     e86ea71b4d991b85f4b9169ab87dbde7040ca791 (ONLINE)
  Wakame::Service::MySQL_Slave : <current=2 min=1, max=5, type=ConstantCounter> 
     f9add259b40dfc8e642b76373887312938b76b33 (ONLINE)
     eea54acb977bc557c01c4fed319edf5b4a9688b7 (ONLINE)
  Wakame::Service::MySQL_Master : <current=1 min=1, max=1, type=ConstantCounter> 
     067f2b412d632388b8023b05e1636ffe1b763691 (ONLINE)

Instances :
  f9add259b40dfc8e642b76373887312938b76b33 : Wakame::Service::MySQL_Slave (ONLINE)
    On VM instance: i-8384a0ea
  e86ea71b4d991b85f4b9169ab87dbde7040ca791 : Wakame::Service::Apache_APP (ONLINE)
    On VM instance: i-8384a0ea
  067f2b412d632388b8023b05e1636ffe1b763691 : Wakame::Service::MySQL_Master (ONLINE)
    On VM instance: i-8384a0ea
  eea54acb977bc557c01c4fed319edf5b4a9688b7 : Wakame::Service::MySQL_Slave (ONLINE)
    On VM instance: i-6587a30c
  5d2c848392140b0ae961427e7e86cadbb9f6f8e6 : Wakame::Service::Apache_WWW (ONLINE)
    On VM instance: i-8384a0ea
  d12b2759abb761a3c8b5eaf99041eb785784bb8f : Wakame::Service::Apache_LB (ONLINE)
    On VM instance: i-8384a0ea

Agents :
  i-8384a0ea : 10.252.46.68, 174.129.175.158 load=0.04, 7 sec(s) (1)
    Services (5): Wakame::Service::MySQL_Slave, Wakame::Service::Apache_APP, Wakame::Service::MySQL_Master, Wakame::Service::Apache_WWW, Wakame::Service::Apache_LB
  i-6587a30c : 10.252.75.212, 174.129.127.228 load=0.09, 5 sec(s) (1)
    Services (1): Wakame::Service::MySQL_Slave

新しいインスタンスi-6587a30cが立ち上がり、Wakame::Service::MySQL_Slaveが立ち上がっています。
MysqlSlaveは複製され、PORT:3307で接続できます。

インスタンス i-8384a0eaには
Wakame::Service::MySQL_Slave
Wakame::Service::Apache_APP
Wakame::Service::MySQL_Master
Wakame::Service::Apache_WWW
Wakame::Service::Apache_LB

インスタンス i-6587a30cには
Wakame::Service::MySQL_Slave

がそれぞれ立ち上がっています。

4.次にELBを作成します。
ProtcolをTCP、Portは3307で通信します。
注意しなければいけないのはavailability-zonesでインスタンスの同じzoneを指定する必要があります。

shell>elb-create-lb wakame-lb --availability-zones us-east-1a --listener "protocol=TCP,lb-port=3307,instance-port=3307"
DNS-NAME  wakame-lb-7663338.us-east-1.elb.amazonaws.com

5.さきほど立ち上がったインスタンス、i-8384a0ea,i-6587a30cをELBに追加します

shell>elb-register-instances-with-lb wakame-lb --instances i-8384a0ea
shell>elb-register-instances-with-lb wakame-lb --instances i-6587a30c

6.通信可能かチェック

shell>elb-describe-instance-health wakame-lb
INSTANCE-ID  i-8384a0ea  InService
INSTANCE-ID  i-6587a30c  InService

7.ELBのIPをあらかじめ取得

shell>host wakame-lb-7663338.us-east-1.elb.amazonaws.com
wakame-lb-7663338.us-east-1.elb.amazonaws.com has address 174.129.228.168

8.データベースを作成。適当に

create database hoge_development;
create table tests(
id int unsigned auto_increment primary key,
text varchar(255)
);

9.任意のRailsプロジェクトを作成。適当に

10.mysql_replication_adapterをインストール

cd ./vendor/plugins/
wget http://github.com/findchris/mysql_replication_adapter/tarball/master
tar xvzf ./mysql_replication_adapter.tar.gz
mv ./findchris-mysql_replication_adapter-be201ae1ae1d944400d4d479d3a9c543c7900819 \
./mysql_replication_adapter
rm -i ./mysql_replication_adapter.tar.gz

11.database.ymlを修正

10.252.46.68はi-8384a0eaのIPでPORT:3306でMysqlのMasterへと接続します。
174.129.228.168はELBのIPを指定。PORT:3307で接続します。

shell>vim ./config/database.yml

development:
  adapter: mysql_replication 
  database: hoge_development
  host: 10.252.46.68 
  username: wakame
  password: wakame
  port: 3306
  slaves:
    - host: 174.129.228.168
      adapter: mysql
      database: hoge_development
      username: wakame
      password: wakame
      port: 3307

12.適当なcontrollerに

class HogeController < ApplicationController
  def index
    @test = Test.find(:all, :use_slave => true) #connecting slave
  end
end
:use_slave => true

としておくとSlaveへ読みにいきます。指定しなければMasterを見に行きます。


13.2台のSlaveのログを見て振り分けられているか確認

tail -f /var/log/mysql/mysql-slave.log

今回はまだ手動でMaster-Slaveの設定を行っていますが、4以降の手順は自動化できます。
将来のバージョンでELBへの割当も自動でおこなう予定です!!