MySQL的高可用(MHA)
MHA簡介
MHA:Master High Availability,對主節點進行監控,可實現自動故障轉移至其他從節點;通過提升某一從節點為新的主節點,基於主從復制實現,還需要客戶端配合實現,目前MHA主要支持一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從數據庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經一主一從。
MHA架構
MHA的工作原理
MHA是由一臺manager服務器遠程監控主服務器,當主服務器掛了提升一臺從服務器作為主服務器。
當主節點掛了,manager首先要查看哪臺從節點,同步的數據最多,然後提升同步最多的從節點為主節點,再將其余的MySQL服務器對他做從節點。
MHA搭建
環境準備
一、準備4臺主機,管理節點1臺,主節點MySQL服務器1臺,從節點MySQL服務器2臺
主機 | IP |
---|---|
Manager | 192.168.73.111 |
Master | 192.168.73.110 |
Slave1 | 192.168.73.112 |
Slave2 | 192.168.73.113 |
二、將Manager管理節點配置為時間服務器,向所有MySQL服務器提供時間同步。
1.安裝chrony服務
[[email protected] ~]# yum install -y chrony
2.修改chrony配置文件
[[email protected] ~]# vim /etc/chrony.conf
server 172.22.0.1 iburst
allow 192.168.0.0/16
local stratum 10
3.啟動chrony服務
[[email protected] ~]# systemctl start chronyd
4.將MySQL服務器與Manager服務器進行時間同步
4.1在所有MySQL主機上修改配置文件並啟動,並啟動服務
[[email protected] ~]# sed -i ‘/^server 0/i server 192.168.73.111 iburst‘ /etc/chrony.conf [[email protected] ~]# systemctl start chronyd
4.2確認時間同步
[[email protected] ~]# 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
三、配置ssh為的密鑰認證登陸
當主節點宕機,manager會讓從節點通過ssh協議去嘗試連接主節點,並拉取二進制日誌,所以要時用密鑰的認證方式讓從節點登陸到主節點拉取數據。
1.在manager服務器上生成私鑰文件
[[email protected] ~]# 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 [email protected]
The key‘s randomart image is:
+---[RSA 2048]----+
| ..ooo ++. +%|
| . .o o oo.=*|
| .. E = oo*o|
| + ...... B o B.+|
|o = ..ooS. . =...|
| + . ... ..|
| . . .|
| |
| |
+----[SHA256]-----+
2.將公鑰文件復制給自己
[[email protected] ~]# ssh-copy-id 127.0.0.1
3.將整個~/.ssh目錄復制給所有的MySQL主機
[[email protected] ~]# scp -r ~/.ssh 192.168.73.110:/root
至此所有環境準備完畢
一、配置主從復制
主節點配置
1.修改配置文件
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin
binlog-format=row
skip_name_resolve
2.啟動數據庫服務
[[email protected] ~]# systemctl start mariadb
3.創建主從復制賬號
[[email protected] ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO ‘repluser‘@‘192.168.73.%‘ IDENTIFIED BY ‘centos‘;"
4.添加mha的管理賬號,讓管理節點遠程連接到主機用來設置主從調整
[[email protected] ~]# mysql -e "GRANT ALL ON *.* TO ‘mhauser‘@‘192.168.73.%‘ IDENTIFIED BY ‘centos‘;"
從節點配置
1.修改配置文件
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
server-id=2
read-only
log-bin
relay_log_purge=0
skip_name_resolve
2.啟動服務
[[email protected] ~]# 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庫
[[email protected] ~]# mysql < hellodb_innodb.sql
從節點查看是否同步
slave1
[[email protected] ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
Slave2
[[email protected] ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
二、配置管理節點及被管理節點
1.在管理節上安裝mha4mysql-manager、mha4mysql-node,將兩個包放在同一目錄下
[[email protected] ~]# yum install *.rpm -y #這兩個包有依賴管理需要一起安裝
2.在所有被管理節點上安裝mha4mysql-node
[[email protected] ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[[email protected] ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
[[email protected] ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm -y
3.在管理節點上創建配置文件
[[email protected] ~]# 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連接
[[email protected] ~]# masterha_check_ssh --conf=/etc/mha/aap1.conf
4.2檢查主從復制
[[email protected] ~]# masterha_check_repl --conf=/etc/mha/aap1.conf
5.以上兩項全部成功後啟動程序
mha這個程序是跑在前臺的,一次性的可以使用nohub或screen來解決跑在前臺的問題
[[email protected] ~]# masterha_manager --conf=/etc/mha/aap1.conf
三、測試
1.在master上跑個存儲過程,導入存儲過程
[[email protected] ~]# 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.另起一個主節點窗口將主節點斷網
[[email protected] ~]# ifdown ens33
4.manager端完成切換退出,查看日誌,查看新的主節點是哪臺slave
[[email protected] 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給關閉了
[[email protected] ~]# 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表插入數據
[[email protected] ~]# mysql -e "INSERT hellodb.teachers VALUES(5,‘Tang San‘,30,‘M‘);"
2.Slave2主機上查看是否同步
[[email protected] ~]# 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 | #已經同步
+-----+---------------+-----+--------+
其他事項
當原主節點被修復後,將其添加為從節點使用。
MySQL的高可用(MHA)