MHA:Master High Availability,對主節點進行監控,可實現自動故障轉移至其餘從節點;經過提高某一從節點爲新的主節點,基於主從複製實現,還須要客戶端配合實現,目前MHA主要支持一主二從,即一臺充當master,一臺充當備用master,另一臺充當從數據庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經一主一從。node
MHA是由一臺manager服務器遠程監控主服務器,當主服務器掛了提高一臺從服務器做爲主服務器。
當主節點掛了,manager首先要查看哪臺從節點,同步的數據最多,而後提高同步最多的從節點爲主節點,再將其他的MySQL服務器對他作從節點。
若是原主節點沒完全死透,manager會讓新的主機經過ssh協議遠程鏈接到原先的主節點,拉取二進制日誌進行同步。若是主節死透了那就放棄。 mysql
主機 | IP |
---|---|
Manager | 192.168.73.111 |
Master | 192.168.73.110 |
Slave1 | 192.168.73.112 |
Slave2 | 192.168.73.113 |
1.安裝chrony服務sql
[root@Manager ~]# yum install -y chrony
2.修改chrony配置文件數據庫
[root@Manager ~]# vim /etc/chrony.conf server 172.22.0.1 iburst allow 192.168.0.0/16 local stratum 10
3.啓動chrony服務vim
[root@Manager ~]# systemctl start chronyd
4.將MySQL服務器與Manager服務器進行時間同步
4.1在全部MySQL主機上修改配置文件並啓動,並啓動服務centos
[root@Master ~]# sed -i '/^server 0/i server 192.168.73.111 iburst' /etc/chrony.conf [root@Master ~]# systemctl start chronyd
4.2確認時間同步服務器
[root@Master ~]# chronyc sources -v 210 Number of sources = 1 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 192.168.73.111 4 6 377 54 +25us[ +41us] +/- 105ms
當主節點宕機,manager會讓從節點經過ssh協議去嘗試鏈接主節點,並拉取二進制日誌,因此要時用密鑰的認證方式讓從節點登錄到主節點拉取數據。
1.在manager服務器上生成私鑰文件架構
[root@Manager ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:yAvC2PJUlRyAf1udlrVXzmIsUljTdUdW6X6FVpQ3Ajo root@Manager The key's randomart image is: +---[RSA 2048]----+ | ..ooo ++. +%| | . .o o oo.=*| | .. E = oo*o| | + ...... B o B.+| |o = ..ooS. . =...| | + . ... ..| | . . .| | | | | +----[SHA256]-----+
2.將公鑰文件複製給本身app
[root@Manager ~]# ssh-copy-id 127.0.0.1
3.將整個~/.ssh目錄複製給全部的MySQL主機dom
[root@Manager ~]# scp -r ~/.ssh 192.168.73.110:/root
至此全部環境準備完畢
1.修改配置文件
[root@Master ~]# vim /etc/my.cnf [mysqld] server-id=1 log-bin binlog-format=row skip_name_resolve
2.啓動數據庫服務
[root@Master ~]# systemctl start mariadb
3.建立主從複製帳號
[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"
4.添加mha的管理帳號,讓管理節點遠程鏈接到主機用來設置主從調整
[root@Master ~]# mysql -e "GRANT ALL ON *.* TO 'mhauser'@'192.168.73.%' IDENTIFIED BY 'centos';"
1.修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf [mysqld] server-id=2 read-only log-bin relay_log_purge=0 skip_name_resolve
2.啓動服務
[root@Slave1 ~]# systemctl start mariadb
3.配置CHANGE MASTER TO
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.110', MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245; Query OK, 0 rows affected (0.00 sec)
4.啓動線程
MariaDB [(none)]> START SLAVE; Query OK, 0 rows affected (0.00 sec)
在Slave2節點上也執行相同的操做,此處步驟省略,須要注意server-id須要修改成和其餘主從節點不一樣
5.測試
主節點導入hellodb庫
[root@Master ~]# mysql < hellodb_innodb.sql
從節點查看是否同步
slave1
[root@Slave1 ~]# mysql -e "SHOW DATABASES;" +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mysql | | performance_schema | | test | +--------------------+
Slave2
[root@Slave2 ~]# mysql -e "SHOW DATABASES;" +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mysql | | performance_schema | | test | +--------------------+
1.在管理節上安裝mha4mysql-manager、mha4mysql-node,將兩個包放在同一目錄下
[root@Manager ~]# yum install *.rpm -y #這兩個包有依賴管理須要一塊兒安裝
2.在全部被管理節點上安裝mha4mysql-node
[root@Master ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@Slave1 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[root@Slave2 ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
3.在管理節點上建立配置文件
[root@Manager ~]# vim /etc/mha/aap1.conf [server default] user=mhauser password=centos manager_workdir=/data/mastermha/app1/ manager_log=/data/mastermha/app1/manager.log remote_workdir=/data/mastermha/app1/ ssh_user=root repl_user=repluser repl_password=centos ping_interval=1 [server1] hostname=192.168.73.110 candidate_master=1 [server2] hostname=192.168.73.112 candidate_master=1 [server3] hostname=192.168.73.113 candidate_master=1
4.作檢查
4.1檢查ssh鏈接
[root@Manager ~]# masterha_check_ssh --conf=/etc/mha/aap1.conf
4.2檢查主從複製
[root@Manager ~]# masterha_check_repl --conf=/etc/mha/aap1.conf
5.以上兩項所有成功後啓動程序
mha這個程序是跑在前臺的,一次性的可使用nohub或screen來解決跑在前臺的問題
[root@Manager ~]# masterha_manager --conf=/etc/mha/aap1.conf
1.在master上跑個存儲過程,導入存儲過程
[root@Master ~]# mysql hellodb < testlog.sql
2.調用存儲過程
MariaDB [(none)]> USE hellodb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [hellodb]> call pro_testlog;
3.另起一個主節點窗口將主節點斷網
[root@Master ~]# ifdown ens33
4.manager端完成切換退出,查看日誌,查看新的主節點是哪臺slave
[root@Manager app1]# tail /data/mastermha/app1/manager.log Started automated(non-interactive) failover. The latest slave 192.168.73.112(192.168.73.112:3306) has all relay logs for recovery. Selected 192.168.73.112(192.168.73.112:3306) as a new master. 192.168.73.112(192.168.73.112:3306): OK: Applying all logs succeeded. 192.168.73.113(192.168.73.113:3306): This host has the latest relay log events. Generating relay diff files from the latest slave succeeded. 192.168.73.113(192.168.73.113:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.73.112(192.168.73.112:3306) 192.168.73.112(192.168.73.112:3306): Resetting slave info succeeded. Master failover to 192.168.73.112(192.168.73.112:3306) completed successfully. #此處顯示最新的主節點爲192.168.73.112
因爲從節點在配置文件中定義的爲read-only,此時被提高爲主能執行寫操做時應爲管理服務器上有管理帳號,他將從節點的服務器全局變量read_only給關閉了
[root@Slave1 ~]# mysql -e "SELECT @@read_only;" +-------------+ | @@read_only | +-------------+ | 0 | +-------------+
爲了防止服務服務重啓再次變爲read-only,此時須要對新主節點的配置文件進行修改將read-only行註釋
[mysqld] server-id=2 #read-only log-bin relay_log_purge=0 skip_name_resolve
1.對hellodb.teachers表插入數據
[root@Slave1 ~]# mysql -e "INSERT hellodb.teachers VALUES(5,'Tang San',30,'M');"
2.Slave2主機上查看是否同步
[root@Slave2 ~]# mysql -e "SELECT * FROM hellodb.teachers;" +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Tang San | 30 | M | #已經同步 +-----+---------------+-----+--------+
當原主節點被修復後,將其添加爲從節點使用。