MySQL的高可用實現:MySQL系列之十四
MySQL的高可以有三種實現方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp
一、MHA
? 對主節點進行監控,可實現自動故障轉移至其它從節點;通過提升某一從節點為新的主節點,基於主從復制實現,還需要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫。
1、MHA工作原理
- 從宕機崩潰的master保存二進制日誌事件(binlog events)
- 識別含有最新更新的slave
- 應用差異的中繼日誌(relay log)到其他的slave
- 應用從master保存的二進制日誌事件(binlog events)
- 提升一個slave為新的master
- 使其他的slave連接新的master進行復制
2、MHA軟件
MHA軟件由兩部分組成,Manager工具包和Node工具包;
Manager工具包主要包括以下幾個工具:
- masterha_check_ssh 檢查MHA的SSH配置狀況
- masterha_check_repl 檢查MySQL復制狀況
- masterha_manger 啟動MHA
- masterha_check_status 檢測當前MHA運行狀態
- masterha_master_monitor 檢測master是否宕機
- masterha_master_switch 故障轉移(自動或手動)
- masterha_conf_host 添加或刪除配置的server信息
Node工具包:這些工具通常由MHA Manager的腳本觸發,無需人為操作
- save_binary_logs 保存和復制master的二進制日誌
- apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
- filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
- purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)
提示:為了盡可能的減少主庫硬件損壞宕機造成的數據丟失,因此在配置MHA的同時建議配置成MySQL 5.5的半同步復制。
自定義擴展:
- secondary_check_script:通過多條網絡路由檢測master的可用性
- master_ip_ailover_script:更新Application使用的masterip
- shutdown_script:強制關閉master節點
- report_script:發送報告
- init_conf_load_script:加載初始配置參數
- master_ip_online_change_script:更新master節點ip地址
下載地址:https://code.google.com/archive/p/mysql-master-ha/downloads
3、MHA的實現
環境:基於秘鑰認證,參考:
https://www.cnblogs.com/L-dongf/p/9058265.html
,時間必須同步,執行:ntpdate cn.pool.ntp.org
1)manager節點
[root@manager ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm -y #安裝mha軟件
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.7:
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.8:
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.0.9:
[root@manager ~]# mkdir /etc/mha/
[root@manager ~]# vim /etc/mha/cluster1.cnf
[server default]
user=mhauser
password=mhapass
manager_workdir=/data/mastermha/cluster1/
manager_log=/data/mastermha/cluster1/manager.log
remote_workdir=/data/mastermha/cluster1/
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1 #每秒檢測一次
[server1]
hostname=192.168.0.7
candidate_master=1 #可以成為主節點
[server2]
hostname=192.168.0.8
candidate_master=1 #可以成為主節點
[server3]
hostname=192.168.0.9
[root@manager ~]# masterha_check_ssh --conf=/etc/mha/cluster1.cnf #檢查ssh秘鑰環境
All SSH connection tests passed successfully.
[root@manager ~]# masterha_check_repl --conf=/etc/mha/cluster1.cnf #檢查MySQL狀態
MySQL Replication Health is OK.
[root@manager ~]# yum install screen -y
[root@manager ~]# screen -S mha #mha是工作在前臺的進程,不能用終端實時檢測
[root@manager ~]# masterha_manager --conf=/etc/mha/cluster1.cnf #開始監測
2)master節點
[root@master ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y #安裝node包
[root@master ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
binlog_format=row
skip_name_resolve
[root@master ~]# systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass'; #創建主從復制賬號,可能切換為主的節點都要創建此賬號
MariaDB [(none)]> SHOW MASTER LOGS;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 401 |
+--------------------+-----------+
MariaDB [(none)]> GRANT ALL ON *.* TO mhauser@'192.168.0.%' IDENTIFIED BY 'mhapass'; #創建mha的管理用戶,確保所有節點都已經同步此賬號
3)slave節點
[root@slave ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave ~]# vim /etc/my.cnf
[mysqld]
read_only=1
log_bin
binlog_format=row
server_id=2
relay_log_purge=0
skip_name_resolve=1
[root@slave ~]# systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.0.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.7', #此時主節點為0.7
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='replpass',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001',
-> MASTER_LOG_POS=401,
-> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;
4)slave2節點
[root@slave2 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
read_only=1
relay_log_purge=0
skip_name_resolve=1
[root@slave2 ~]# systemctl start mariadb
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.7',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='replpass',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001',
-> MASTER_LOG_POS=401,
-> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;
4)測試
當master的服務停止:[root@master ~]# systemctl stop mariadb
在slave2上執行:MariaDB [(none)]> SHOW SLAVE STATUS\G
命令,看到Master_Server_Id: 2
說明:切換成功
4、MHA監控重新上線
將故障的master修復後重新上線,手動配置成為現在主節點的從
[root@master ~]# systemctl start mariadb
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.8', #此時的主為0.8
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='replpass',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001',
-> MASTER_LOG_POS=482,
-> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> START SLAVE;
管理節點:
[root@manager ~]# screen -S mha
[root@manager ~]# masterha_manager --conf=/etc/mha/cluster1.cnf #重新開啟監測
二、Galera Cluster
? Galera Cluster:集成了Galera插件的MySQL集群,是一種新型的,數據不共享的,高度冗余的高可用方案,目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
? 三個節點組成了一個集群,與普通的主從架構不同,它們都可以作為主節點,三個節點是對等的,稱為multi-master架構,當有客戶端要寫入或者讀取數據時,連接哪個實例都是一樣的,讀到的數據是相同的,寫入某一個節點之後,集群自己會將新數據同步到其它節點上面,這種架構不共享任何數據,是一種高冗余架構
特性:
- 多主架構:真正的多點讀寫的集群,在任何時候讀寫數據,都是最新的;
- 同步復制:集群不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失;
- 並發復制:從節點APPLY數據時,支持並行執行,更好的性能;
- 故障切換:在出現數據庫故障時,因支持多點寫入,切換容易;
- 熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務時間就會非常少。在節點故障期間,節點本身對集群的影響非常小;
- 自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集群會變為一致;
- 對應用透明:集群的維護,對應用程序是透明的。
工作原理:
參考官方文檔:
http://galeracluster.com/documentation-webpages/galera-documentation.pdf
http://galeracluster.com/documentation-webpages/index.html
https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/
至少需要三臺節點,不能安裝 mariadb-server 包,需要安裝特定的軟件包
Galera Cluster的實現
清華開源鏡像源:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
# vim /etc/yum.repos.d/mariadb_galera_server.repo
[mariadb]
name=mariadb_galera_server.repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0
# yum install MariaDB-Galera-server -y
? 1)mysql-1
[root@mysql-1 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9" #將所有IP都定義在此
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node1'
wsrep_node_address='192.168.0.7'
? 2)mysql-2
[root@mysql-2 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node2'
wsrep_node_address='192.168.0.8'
? 3)mysql-3
[root@mysql-3 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.0.7,192.168.0.8,192.168.0.9"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name='my_wsrep_cluster'
wsrep_node_name='node3'
wsrep_node_address='192.168.0.9'
? 4)啟動
[root@mysql-1 ~]# /etc/init.d/mysql start --wsrep-new-cluster #第一臺啟動加此參數
[root@mysql-2 ~]# /etc/init.d/mysql start #後續服務直接啟動即可
[root@mysql-3 ~]# /etc/init.d/mysql start
? 5)測試
? 在任何一個節點上操作數據庫,其他節點同步操作;如果發生同時操作同條記錄,則只有一臺節點操作成功。
? 6)查看工作狀態
MariaDB [(none)]> SHOW VARIABLES LIKE 'wsrep_%'\G
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_%'\G
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 | #集群中有三臺節點在線
+--------------------+-------+
記錄時間 2018.6.17 父親節
MySQL的高可用實現:MySQL系列之十四