MariaDB でレプリケーションが切断されているのに、ステータスを見る限り問題ないように見える現象が発生したのでメモ。
構成
[データセンターA]
Master DB
Slave DB 2
[データセンターB]
Slave DB 3
Slave DB 4
現象
- データセンターAで30分程度のネットワーク障害が発生
その間データセンターB の Slave DB から Master DB への接続が出来なくなる - 復旧後、データセンター B の Slave DB 2台のデータが更新されない状況が発生。
これだけ見ると、レプリケーションが切れたんじゃねーの?って話です。
実際、再接続すればOKなのですが、ステータスを見る限りレプリケーションが切れてるようには見えなかったので困りました。
show slave status を見た限りでは問題無さそう
と言う訳で、現象発生時の show slave status がこちら。
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 123.456.789.012
Master_User: slaveuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000617
Read_Master_Log_Pos: 725712009
Relay_Log_File: relay-bin.000784
Relay_Log_Pos: 725712301
Relay_Master_Log_File: mysql-bin.000617
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 725712009
Relay_Log_Space: 725712644
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert: /etc/mysql/ssl/client-cert.pem
Master_SSL_Cipher:
Master_SSL_Key: /etc/mysql/ssl/client-key.pem
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
(一部適当に変更してます…)
これを見る限りレプリケーションが停止しているようには見えない。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
だし
Seconds_Behind_Master: 0
だし。
でも、
Read_Master_Log_Pos: 107817893
が更新されないのです。
マスター側で show master status
した際の値はどんどん更新されていくので、本来であれば Read_Master_Log_Pos
も更新されるはず。
show slave hosts を見ると…
こうなると、レプリケーションは上手く行ってないことは確実なのですが、現象が良く分かりません。
一応、マスター側で何か分からないかなと思い、show slave hosts
を打った結果が下記のような感じ。
> show slave hosts;
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
| 2 | | 3306 | 1 |
+-----------+------+------+-----------+
本来、スレーブ DB は3台あるのはずなのですが、1台しか出てきません。
データセンター B にある slave db 3 と 4 は接続が切れていると言う事ですね。
謎です…
なんでこの状況で
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
なのか。
一応
> stop slave;
> start slave;
で復旧はしました。
が、モニタリングを考えないとダメだなと。
今までは、
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
だったら、レプリケーションは動いている。
で、
Seconds_Behind_Master: 0
だったら、遅延もしてない。
みたいな感じで考えてましたけど、それだと今回のようなケースは拾えないですね…
ちなみに、エラーログも見てみましたがマスタースレーブ共にそれらしきエラーはなし。
困った。