2014年11月6日木曜日

MySQL Fabricつらい(マスター昇格編)

一昨日インストールして 、 昨日HA構成だけ設定してみた MySQL Fabric。
さすがに手動での切り替えくらいは簡単だった。

* ファームに登録しているのはMySQL::Sandboxで作ったマスター/スレーブ1台ずつ構成です。


$ ./use_all "select @@read_only"
# master
@@read_only
0
# server: 1:
@@read_only
1

$ ./check_slaves
master
             File: mysql-bin.000004
         Position: 191
slave # 1
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 191
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 191

こんな状態から


$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status       mode weight
------------------------------------ --------------- --------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886   PRIMARY READ_WRITE    1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 SECONDARY  READ_ONLY    1.0


$ mysqlfabric group promote my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                                uuid finished success result
------------------------------------ -------- ------- ------
03c27976-809f-48f1-a385-e3dc6caf9ae6        1       1      1

state success          when                                                   description
----- ------- ------------- -------------------------------------------------------------
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                      Executing action (_define_ha_operation).
    5       2   1.41525e+09                       Executed action (_define_ha_operation).
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                    Executing action (_find_candidate_switch).
    5       2   1.41525e+09                     Executed action (_find_candidate_switch).
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                   Executing action (_check_candidate_switch).
    5       2   1.41525e+09                    Executed action (_check_candidate_switch).
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                       Executing action (_block_write_switch).
    5       2   1.41525e+09                        Executed action (_block_write_switch).
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                       Executing action (_wait_slaves_switch).
    5       2   1.41525e+09                        Executed action (_wait_slaves_switch).
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                      Executing action (_change_to_candidate).
    5       2   1.41525e+09                       Executed action (_change_to_candidate).


$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status       mode weight
------------------------------------ --------------- --------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886 SECONDARY  READ_ONLY    1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887   PRIMARY READ_WRITE    1.0



単にmysqlfabric group promoteでグループ名だけ指定してやればよくて


$ ./use_all "select @@read_only"
# master
@@read_only
1
# server: 1:
@@read_only
0

$ ./check_slaves.a
master
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1548
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 1548
slave # 1
             File: mysql-bin.000003
         Position: 1548

こんな状態に入れ替わる。
(そのままじゃ動かないので、./check_slavesはマスターとスレーブでSHOW MASTER STATUSとSHOW SLAVE STATUSを逆にしてある)

* 出力結果のmaster, slave #1というのはMySQL::Sandboxから見た(最初の構成の)マスターとスレーブ。


マスターをもとに戻してから、今度はkill。


$ kill -9 15569 15853

$ ./check_slaves
master
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql_sandbox20886.sock' (111)
slave # 1
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 191
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 191

マスターが死んだぞ。さあどうする。


$ mysqlfabric group health my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                                uuid is_alive    status is_not_running is_not_configured io_not_running sql_not_running                                                                           io_error sql_error
------------------------------------ -------- --------- -------------- ----------------- -------------- --------------- ---------------------------------------------------------------------------------- ---------
47cf54df-63fc-11e4-942e-fa163e020fd0        0    FAULTY              0                 0              0               0                                                                              False     False
4b7036a9-63fc-11e4-942e-fa163e020fd0        1 SECONDARY              0                 0              1               0 error reconnecting to master 'fabric@127.0.0.1:20886' - retry-time: 60  retries: 3     False

issue
-----


$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address    status       mode weight
------------------------------------ --------------- --------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886   PRIMARY READ_WRITE    1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 SECONDARY  READ_ONLY    1.0


$ ./check_slaves
master
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql_sandbox20886.sock' (111)
slave # 1
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 191
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
          Exec_Master_Log_Pos: 191

変わんねぇ(´・ω・`)

と思ったら、答えはなんと日本語のスライドの中に見つけた。 doublemarketさん++。




mysqlfabric group activateだと…:(;゙゚'ω゚'):


$ mysqlfabric group activate my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                                uuid finished success result
------------------------------------ -------- ------- ------
91e8f2cc-43fa-4855-a6c9-44a4deedc9bf        1       1      1

state success          when                                                   description
----- ------- ------------- -------------------------------------------------------------
    3       2   1.41525e+09 Triggered by .
    4       2   1.41525e+09                           Executing action (_activate_group).
    5       2   1.41525e+09                            Executed action (_activate_group).


$ mysqlfabric group health my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                                uuid is_alive  status is_not_running is_not_configured io_not_running sql_not_running io_error
 sql_error
------------------------------------ -------- ------- -------------- ----------------- -------------- --------------- --------
 ---------
47cf54df-63fc-11e4-942e-fa163e020fd0        0  FAULTY              0                 0              0               0    False
     False
4b7036a9-63fc-11e4-942e-fa163e020fd0        1 PRIMARY              0                 0              0               0    False
     False

issue
-----


$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1

                         server_uuid         address  status       mode weight
------------------------------------ --------------- ------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886  FAULTY READ_WRITE    1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 PRIMARY READ_WRITE    1.0


$ ./check_slaves.a
master
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql_sandbox20886.sock' (111)
slave # 1
             File: mysql-bin.000003
         Position: 1548


$ ./use_all "select @@read_only"
# master
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql_sandbox20886.sock' (111)
# server: 1:
@@read_only
0

おおおお切り替わった!!

参考にしていたブログ公式スタートガイドもうちょっと大きな字で書いてくれていいんですよactivate。というかデフォルトそれじゃダメですかバッキングストアのテーブルにDEFAULT句つけるくらいで済むと思うんですがどうなんですかあとで見てみよう。

Fabric対応コネクターであれば、このstatus: PRIMARYとかを見て接続先を判断することになるので、VIPとかそういう仕組みなしでMySQL Fabricだけで完結するのが利点だと思う。余計な仕組み考えなくて良いけどGTID必須。新規には(コネクター使うかどうかは別として)配備だけでもしておいていいかも知れない。ヘルスチェックできるし。

今のところの感想は引き続きこれ。


0 件のコメント :

コメントを投稿