本公眾號內容大多由平時操作整理記錄,如果有錯誤的地方歡迎留言指正
MHA簡述
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,并且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。
MHA負責監控主節點。一旦主節點發生故障,它能夠自動根據配置去探測從節點中哪一個節點的數據是最新的,然后將該節點提升為新的主節點,當原來主節點恢復上線后,不會變為主節點,只能以從節點的角色工作。
MHA依賴SSH
MHA在故障自動切換過程中會嘗試從故障的主服務器器上保存二進制日志,最大程度保證數據不丟失,但是如果故障服務器發生硬件故障或者斷電,ssh無法通信等是沒辦法保存數據的。
MHA 同步(基于SSH)master節點的二進制日志事件到本地為副本,當master宕機后MHA 通過本地的副本將slave的數據補全并將其提升為新的master,將其他的slave節點指向新的master
MHA工作原理
MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器,出于機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支持一主一從。
簡單總結MHA工作原理
MHA工作原理
1 從宕機崩潰的master保存二進制日志事件(binlog events)
2 識別含有最新更新的slave
3 應用差異的中繼日志(relay log)到其他的slave
4 應用從master保存的二進制日志事件(binlog events)
5 提升一個slave為新的master
6 使其他的slave連接新的master進行復制
軟件組成部分
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的同時建議配半同步復制
自定義拓展
自定義擴展:
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地址
配置文件:
global配置,為各application提供默認配置
application配置:為每個主從復制集群
?注意點:每一個從節點要開啟中繼日志和二進制日志,因為每個從節點都有可能成為新的master節點,,成為master要提供二進制日志給其他從節點復制
部署MHA
實驗使用4臺主機:系統:centos7.4
manger:MHA管理節點
master:復制集群的主節點
slave-1:復制集群從節點1
slave-2:復制集群從節點2
部署前注意事項:
環境準備:關閉selinux,iptables,各節點時間同步
配置主從環境
配置集群秘鑰認證:master節點與node節點之間認證
所有節點創建一個單獨的具有管理權限的賬號給master連接管理使用,主從環境下,在主庫上創建一次就可以了,其他節點會復制過去
安裝master節點管理包:安裝包依賴epel源
在管理節點建立配置文件
檢查環境是否準備好
開啟集群檢查(manger)
環境準備
時間同步,關閉防火墻,selinux
[root@master ~]# iptables -F
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@master ~]# ntpdate gudaoyufu.com
安裝mariadb
安裝mariadb
[root@master ~]# yum install mariadb-server -y ? ?#主備節點3臺主機都安裝
配置一主多從
master節點:
[mysqld]
log_bin=master-bin
server_id= 1
innodb_file_per_table=on
sync_binlog=1
skip_name_resolve
創建復制用戶
MariaDB [(none)]> grant replication slave on *.* to copyuser@'192.168.214.%' identified by '123456';
MariaDB [(none)]> flush privileges;
slave-1節點
[mysqld]
relay_log=relay-log
server-id=2
innodb_file_per_table=on
skip_name_resolve
relay_log_purge=0
log_bin=master-bin
slave-2節點
[mysqld]
relay_log=relay-log
server-id=3
innodb_file_per_table=on
skip_name_resolve
relay_log_purge=0
log_bin=master-bin
各節點修改配置后重啟服務
登錄slave-1,連接主庫
MariaDB [(none)]> change master to master_host='192.168.214.142',master_user='copyuser',master_port=3306,master_password='123456',master_log_file='master-bin.000004',master_log_pos=245;
MariaDB [(none)]> start slave;
登錄slave-2,連接主庫(過程與slave-1一樣)
MariaDB [(none)]> change master to master_host='192.168.214.142',master_user='copyuser',master_port=3306,master_password='123456',master_log_file='master-bin.000004',master_log_pos=245;
MariaDB [(none)]> start slave;
測試主庫復制
登陸master節點創建庫測試復制
MariaDB [(none)]> create database db1;
查看slave-1和slave-2復制情況
MariaDB [(none)]> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| db1 ? ? ? ? ? ? ? ?|
| mysql ? ? ? ? ? ? ?|
| performance_schema |
| test ? ? ? ? ? ? ? |
+--------------------+
配置MHA 環境
配置集群主機秘鑰認證
master節點與node節點之間認證
[root@manger ~]# ssh-keygen
[root@manger ~]# ssh-copy-id 192.168.214.143
[root@manger ~]# ls .ssh/
authorized_keys ?id_rsa ?id_rsa.pub ?known_hosts
將authorized_keys文件復制到各節點主機
[root@manger ~]# scp -pr .ssh/ 192.168.214.142:/root/
[root@manger ~]# scp -pr .ssh/ 192.168.214.134:/root/
[root@manger ~]# scp -pr .ssh/ 192.168.214.130:/root/
測試秘鑰認證
[root@manger .ssh]# ssh 192.168.214.142 'hostname'
master
[root@manger .ssh]# ssh 192.168.214.134 'hostname'
slave-1
[root@manger .ssh]# ssh 192.168.214.130 'hostname'
slave-2
manger節點安裝master和node包
安裝包依賴epel源,安裝前檢查epel源是否安裝了,如果沒有裝:
[root@manger ~]# yum install epel-release.noarch -y
manger安裝管理包:節點兩個包組都安裝
[root@manger ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm -y
mysql集群各節點安裝node包組
[root@master ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave-1 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@slave-2 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
配置manger節點
在mysql集群各節點創建一個具有管理權限的用戶,給mha連接使用,在主庫上創建,從庫上自動復制即可
MariaDB [(none)]> grant all privileges on *.* to mhauser@'192.168.214.%' identified by '123456';
MariaDB [(none)]> flush privileges;
創建mha管理配置文件目錄
[root@manger ~]# mkdir -p /etc/mha/
編輯管理配置文件
[root@manger ~]# vim /etc/mha/app1.cnf
[server default]
user=mhauser
password=123456
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=copyuser
repl_password=123456
ping_interval=1
[server1]
hostname=192.168.214.142
candidate_master=1
[server2]
hostname=192.168.214.134
candidate_master=1
[server3]
hostname=192.168.214.130
檢查manger管理節點配置
檢查ssh連接
[root@manger ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
檢查復制:(這里檢查復制出錯,錯誤如下)
Sat Jun 16 18:11:27 2018 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm, ln393] 192.168.214.134(192.168.214.134:3306): User copyuser does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.
Sat Jun 16 18:11:27 2018 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checking configurations. ?at /usr/share/perl5/vendor_perl/MHA/ServerManager.pm line 1403.
Sat Jun 16 18:11:27 2018 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523] Error happened on monitoring servers.
原因是在manger管理節點配置文件文件中指定了192.168.214.134為故障后的新主節點,但該節點沒有提供復制連接的用戶賬號,在配置主從環境的時候沒有包含到主庫創建復制用戶的操作的bin-log,在從庫添加主庫上相同的復制賬號
從庫上添加復制賬號后再測試
[root@manger ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
啟動MHA監測
[root@manger ~]# masterha_manager --conf=/etc/mha/app1.cnf
測試故障轉移
關掉mysql主庫,查看監測
[root@manger ~]# masterha_manager --conf=/etc/mha/app1.cnf
Sat Jun 16 18:27:27 2018 ?Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Jun 16 18:27:27 2018 ?Reading application default configuration from /etc/mha/app1.cnf..
Sat Jun 16 18:27:27 2018 ?Reading server configuration from /etc/mha/app1.cnf..
Creating /data/mastermha/app1 if not exists.. ?ok.
Checking output directory is accessible or not..
ok.Binlog found at /var/lib/mysql, up to master-bin.000005
Sat Jun 16 18:34:59 2018 ?Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Jun 16 18:34:59 2018 ?Reading application default configuration from /etc/mha/app1.cnf..
Sat Jun 16 18:34:59 2018 ?Reading server configuration from /etc/mha/app1.cnf..
[root@manger ~]#
在從庫上查看最新
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event
? ? ? ? ? ? ? ? ?Master_Host: 192.168.214.134
? ? ? ? ? ? ? ? ?Master_User: copyuser
? ? ? ? ? ? ? ? ?Master_Port: 3306
? ? ? ? ? ? ? ?Connect_Retry: 60
? ? ? ? ? ? ?Master_Log_File: master-bin.000003
? ? ? ? ?Read_Master_Log_Pos: 632
? ? ? ? ? ? ? Relay_Log_File: relay-log.000002
? ? ? ? ? ? ? ?Relay_Log_Pos: 530
? ? ? ?Relay_Master_Log_File: master-bin.000003
? ? ? ? ? ? Slave_IO_Running: Yes
? ? ? ? ? ?Slave_SQL_Running: Yes
可以看到,從庫的復制狀態正常,并且復制的主庫已經變成了新定義的master,在新的master節點上寫個數據看看
新master節點:
MariaDB [(none)]> create database db2;
slave-2查看復制
MariaDB [(none)]> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| db1 ? ? ? ? ? ? ? ?|
| db2 ? ? ? ? ? ? ? ?|
| mysql ? ? ? ? ? ? ?|
| performance_schema |
| test ? ? ? ? ? ? ? |
+--------------------+
6 rows in set (0.01 sec)
至此,mysql高可用集群MHA就配置好了
其他問題
當MHA完成故障轉移后,manager管理程序就自動退出運行了,也就是說,MHA只在故障轉移的關鍵時刻頂那么一下。那么退下來的故障節點再重新上線,會不會重新變成master節點呢,答案是不會的,故障節點重新上線后會被孤立,不會自動加入mysql集群中,并且只能以slave的身份加入集群。這個過程需要將新上線的節點配置成slave角色,如果上線后發現與master節點數據落后很多,需要先導入備份后再連接master復制。
故障節點重新上線
備份master節點的數據
[root@slave-1 opt]# mysqldump -A -F --single-transaction --master-data=2 > ./fullbak.sql
清空新上線的節點數據
systemctl stop mariadb
rm -rf /var/lib/mysql/*
systemctl start mariadb
復制備份數據
[root@slave-1 opt]# scp fullbak.sql 192.168.214.142:/opt/
恢復數據
[root@master ~]# mysql < /opt/fullbak.sql
查看數據
MariaDB [(none)]> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| db1 ? ? ? ? ? ? ? ?|
| db2 ? ? ? ? ? ? ? ?|
| db3 ? ? ? ? ? ? ? ?|
| db4 ? ? ? ? ? ? ? ?|
| db5 ? ? ? ? ? ? ? ?|
| db6 ? ? ? ? ? ? ? ?|
| mysql ? ? ? ? ? ? ?|
| performance_schema |
| test ? ? ? ? ? ? ? |
+--------------------+
配置主從
[mysqld]
log_bin=master-bin ? ?#因為該節點將來還有可能成為master節點,所以bin-log保留
server_id= 1
innodb_file_per_table=on
sync_binlog=1
skip_name_resolve
relay_log=relay-log
relay_log_purge
[root@master ~]# systemctl restart mariadb
連接master復制
查看最新master的bin-log記錄信息
MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? ?| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 | ? ? ?245 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
+-------------------+----------+--------------+------------------+
MariaDB [(none)]> ?change master to master_host='192.168.214.134',master_user='copyuser',mport=3306,master_password='123456',master_log_file='master-bin.000004',master_log_pos=245;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event
? ? ? ? ? ? ? ? ?Master_Host: 192.168.214.134
? ? ? ? ? ? ? ? ?Master_User: copyuser
? ? ? ? ? ? ? ? ?Master_Port: 3306
? ? ? ? ? ? ? ?Connect_Retry: 60
? ? ? ? ? ? ?Master_Log_File: master-bin.000004
? ? ? ? ?Read_Master_Log_Pos: 245
? ? ? ? ? ? ? Relay_Log_File: relay-log.000002
? ? ? ? ? ? ? ?Relay_Log_Pos: 530
? ? ? ?Relay_Master_Log_File: master-bin.000004
? ? ? ? ? ? Slave_IO_Running: Yes
? ? ? ? ? ?Slave_SQL_Running: Yes
? ? ? ? ? ? ?Replicate_Do_DB:
查看masterdump線程
MariaDB [(none)]> show processlist;
+----+----------+-----------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+----------+
| Id | User ? ? | Host ? ? ? ? ? ? ? ? ?| db ? | Command ? ? | Time ?| State ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | Info ? ? ? ? ? ? | Progress |
+----+----------+-----------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+----------+
| ?7 | root ? ? | localhost ? ? ? ? ? ? | NULL | Sleep ? ? ? | 53279 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | NULL ? ? ? ? ? ? | ? ?0.000 |
| 22 | copyuser | 192.168.214.130:60116 | NULL | Binlog Dump | 53166 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL ? ? ? ? ? ? | ? ?0.000 |
| 30 | copyuser | 192.168.214.142:50656 | NULL | Binlog Dump | ? 123 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL ? ? ? ? ? ? | ? ?0.000 |
| 31 | root ? ? | localhost ? ? ? ? ? ? | NULL | Query ? ? ? | ? ? 0 | NULL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| show processlist | ? ?0.000 |
+----+----------+-----------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+----------+
訪問個人博客: www.gudaoyufu.com, 點擊閱讀原文進入查看更多文檔
