MariaDBのレプリケーションが切れてるのに切れてないっぽく見える件

MariaDB でレプリケーションが切断されているのに、ステータスを見る限り問題ないように見える現象が発生したのでメモ。

## 構成

```
[データセンターA]
Master DB
Slave DB 2

[データセンターB]
Slave DB 3
Slave DB 4
```

## 現象

1. データセンターAで30分程度のネットワーク障害が発生  
   その間データセンターB の Slave DB から Master DB への接続が出来なくなる
2. 復旧後、データセンター 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
```

だったら、遅延もしてない。

みたいな感じで考えてましたけど、それだと今回のようなケースは拾えないですね…

ちなみに、エラーログも見てみましたがマスタースレーブ共にそれらしきエラーはなし。

困った。