kolla-ansible mariadb_recovery原理

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

表示 uuidcbd332a9-f617-11e2-b77d-3ee9fa637069, 而 seqno36742

--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

發佈了77 篇原創文章 · 獲贊 40 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章