kolla-ansible mariadb_recovery 原理
詳情見 kolla-ansible\ansible\roles\mariadb\tasks\recover_cluster.yml
文件
# 在所有節點上, 刪除以下臨時文件
rm /tmp/kolla_mariadb_grastate.dat
rm /tmp/kolla_mariadb_recover_inventory_name # 該文件用來記錄誰是主節點
# 在所有節點上, 停止容器
# 在所有節點上, 帶參數 --wsrep-recover 啓動容器, 爲了從日誌文件中獲取事務ID, 來比較大小確定誰是主節點
# 在所有節點上, 停止容器
# 在所有節點上, 拷貝容器中的日誌文件到 /tmp
docker cp mariadb:/var/log/kolla/mariadb/mariadb.log /tmp/mariadb_tmp.log
# 在所有節點上, 獲取 mariadb wsrep recovery seqno
tail -n 200 /tmp/mariadb_tmp.log | awk -F" " '$0~/Recovered position/{print $NF;exit;}' | awk -F":" '{print $1}'
# 在所有節點上, 刪除 /tmp 目錄中的 mariadb_tmp.log
rm /tmp/mariadb_tmp.log
# 比較所有 mariadb 節點上的 seqno, 取得最大值
# 將最大值的節點的 hostname 寫入到 /tmp/kolla_mariadb_recover_inventory_name 文件中
echo "hostname" > /tmp/kolla_mariadb_recover_inventory_name
chmod 0644 /tmp/kolla_mariadb_recover_inventory_name
# 將最大值的節點定義爲啓動節點和 master 節點
# 在啓動節點上, 拷貝 /var/lib/mysql/grastate.dat 到 /tmp 目錄
docker cp mariadb:/var/lib/mysql/grastate.dat /tmp/kolla_mariadb_grastate.dat
# 在啓動節點上, 修改啓動節點中 /tmp/kolla_mariadb_grastate.dat 文件中的值
safe_to_bootstrap: 1
# 在啓動節點上, 將修改過後的文件拷回容器內
docker cp /tmp/kolla_mariadb_grastate.dat mariadb:/var/lib/mysql/grastate.dat
# 在啓動節點上, 帶參數 --wsrep-new-cluster 啓動容器
# 容器啓動成功後, 將改 mariadb 容器設置爲 primary
docker exec mariadb mysql -uroot -p{{ database_password }} -e \"SET GLOBAL wsrep_provider_options='pc.bootstrap=yes';\"
# 在其他節點上, 啓動 mariadb 容器
詳解
grastate.dat
文件記錄了全局事務ID(seqno
), 每執行一個操作集合(多個sql操作), 就將seqno
加 1,正常示例:
/var/lib/mysql/grastate.dat
version: 2.1
uuid: cbd332a9-f617-11e2-b77d-3ee9fa637069
seqno: 43760
mysql 服務停止後,查看grastate.dat
文件,如果 seqno
大於0,表示正常關閉,如果爲 -1
, 如下,表示改節點在執行事務時異常崩潰
/var/lib/mysql/grastate.dat
version: 2.1
uuid: cbd332a9-f617-11e2-b77d-3ee9fa637069
seqno: -1
而如果是如下, uuid
全爲0,表示該節點在執行 DDL
時異常崩潰
/var/lib/mysql/grastate.dat
version: 2.1
uuid: 00000000-0000-0000-0000-000000000000
seqno: -1
可以在啓動改服務時加上--wsrep-recover
參數,mysql 會輸出最後一次提交的 GTID
(seqno) 到 mysqld.log
文件中
例如:
140716 12:55:45 [Note] WSREP: Found saved state: cbd332a9-f617-11e2-b77d-3ee9fa637069:36742
表示 uuid
是cbd332a9-f617-11e2-b77d-3ee9fa637069
, 而 seqno
是 36742
以--wsrep-recover
啓動時,會將InnoDB表空間恢復到一致狀態,將相應的Global Transaction ID值打印到錯誤日誌中,然後退出
safe_to_bootstrap: 1
表示改節點可以用來啓動集羣,如果以沒有改標識的節點來啓動集羣,將會報以下錯誤:
2016-11-07 01:49:19 5572 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node.
It was not the last one to leave the cluster and may not contain all the updates.
To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
查看集羣大小
SHOW STATUS LIKE 'wsrep_cluster_size';
查看集羣狀態
show global status like 'wsrep_cluster_status';
例如
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
如果所有節點都不是 Primary
, 那麼就需要重置仲裁
通過如下命令將節點變爲 Primary
SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
參考
https://galeracluster.com/library/training/tutorials/restarting-cluster.html
https://galeracluster.com/library/documentation/quorum-reset.html