1. 程式人生 > >MHA實現mysql的高可用叢集

MHA實現mysql的高可用叢集

前言:

        在生產環境中,資料庫對於一個企業是至關重要的,因此我們應該做到生產中的mysql高可用,從而實現假如有一臺資料庫宕機,別的機器會自動代替宕機的伺服器的工作,從而實現資料庫的快速切換,避免單點故障,從而保證業務的正常執行。MHA就可以很好的實現這一功能。

MHA(Master High Availability)是一套相對成熟的MySQL高可用方案,能做到在0~30s內自動完成資料庫的故障切換操作,在master伺服器不宕機的情況下,基本能保證資料的一致性。

它由兩部分組成:MHA Manager(管理節點)和MHA Node(資料節點)。MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave叢集,也可以部署在一臺slave節點上。MHA Node執行在每臺MySQL伺服器上,MHA Manager會定時探測叢集中的master節點,當master出現故障時,它可以自動將最新資料的slave提升為新的master,然後將所有其他的slave重新指向新的master。整個故障轉移過程對應用程式完全透明。

MHA工作原理
1 從宕機崩潰的master儲存二進位制日誌事件(binlog events)
2 識別含有最新更新的slave
3 應用差異的中繼日誌(relay log)到其他的slave
4 應用從master儲存的二進位制日誌事件(binlog events)
5 提升一個slave為新的master
6 使其他的slave連線新的master進行復制

MHA Manager 工具包:

1. masterha_check_ssh:檢查MHA的SSH配置狀況
2. masterha_check_repl:檢查MySQL的複製狀況
3. masterha_manager:啟動MHA
4. masterha_check_status:檢測當前MHA執行狀態
5. masterha_master_monitor:檢測master是否宕機
6. masterha_master_switch:控制故障轉移(自動或手動)
7. masterha_conf_host:新增或刪除配置的server資訊
8. masterha_stop:關閉MHA
搭建環境準備:

1:四臺centos7主機

mha manager               172.18.253.189                  

 master                   172.18.254.235      

candidate  master (slave1)           172.18.254.144                      

slave2                172.18.254.109

master對外提供寫服務,備選master提供讀服務,slave1也提供相關的讀服務,一旦master宕機,將會把備選master1提升為新的master,slave2指向新的master

2:MHA manager 下載安裝MHA

     mha4mysql-manager-0.56-0.el6.noarch.rpm

     在所有機器上安裝

     mha4mysql-node-0.56-0.el6.noarch.rpm
由於MHA網址受到防火牆限制,所以可以在放到了個人網盤中,http://pan.baidu.com/s/1boS31vT,有需要的可自行下載。

實驗步驟:

1:配置時間同步

#mha伺服器上ntpServer
[[email protected] ~]# vim /etc/ntp.conf 
restrict 127.0.0.1   #限制可以同步的主機
restrict ::1
restrict 172.18.0.0 mask 255.255.255.0
server 127.127.1.0   #以該主機的時間為標準
[[email protected] ~]#systemctl restart ntpd
[[email protected] ~]#systemctl restart ntpd  #開機自啟動
#其他三臺主機ntpclient
以master舉例
[[email protected] ~]# vim /etc/ntp.conf 
server 172.18.153.7 iburst    #確認ntpserver
[[email protected] ~]# ntpdate 172.18.153.7  #生效

2:配置四臺機器彼此ssh免密登陸

[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ssh-keygen 
[[email protected] .ssh]# ssh-copy-id localhost 主要是生成authorized_keys 檔案
[[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
[[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
[[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
另外配置ssh首次連線某主機不要詢問yes
[[email protected] ~]# vim /etc/ssh/ssh_config  
StrictHostKeyChecking no
另外三個主機同上設定

3:配置主從伺服器

#mysql master
[[email protected] ~]#  vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock
log_bin=/mysql/logbin/master-bin
binlog_format=row
skip_name_resolve
[[email protected] ~]# systemctl restart mariadb.service
[[email protected] ~]# mysql
MariaDB [(none)]> show master status;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| master-bin.000001 |       245 |
+-------------------+-----------+
MariaDB [(none)]> grant replication slave on *.* to [email protected]'172.18.%.%' identified by 'centos';
#MySQL slave1與MySQLslave2一樣
[[email protected] ~]#  vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mysql/data
log_bin=/mysql/logbin/slave-log
read_only=1
relay_log_purge=0
skip_name_resolve=1
[[email protected] ~]# systemctl restart mariadb.service
[[email protected] ~]# mysql
MariaDB [(none)]> CHANGE MASTER TO
->   MASTER_HOST='172.18.254.235',
->   MASTER_USER='repluser',
->   MASTER_PASSWORD='centos',
->   MASTER_PORT=3306,
->   MASTER_LOG_FILE='master-bin.000001',
->   MASTER_LOG_POS=245,
->   MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;(沒有異常說明主從配置成功)

4:配置mha

建立mha統一管理帳號

Master [(none)]> grant all on *.* to [email protected]'172.18.%.%' identified by 'centos';
Query OK, 0 rows affected (0.00 sec)

#安裝mha軟體包,需要epel源
[[email protected] ~]# yum -y localinstall mha4mysql-*

#在其他三個節點上安裝node
[[email protected] ~]# yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[[email protected] ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[[email protected] ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm

#配置mha
[[email protected] ~]# mkdir /etc/mha                                                                       
        
[[email protected] ~]# vim /etc/mha/app1.conf
[server default]
user=mhauser  #設定監控使用者
password=centos #設定監控使用者的密碼
manager_workdir=/data/mastermha/app1/  #設定manager的工作目錄
manager_log=/data/mastermha/app1/manager.log  #設定manager的日誌
master_logbin_dir=/mysql/logbin   #master上用於儲存binary日誌的全路徑。這個引數用於當master上mysql死掉後,通過ssh連到mysql伺服器上,找到需要binary日誌事件 
remote_workdir=/data/mastermha/app1/  #設定遠端mysql在發生切換時binlog的儲存位置
ssh_user=root #設定ssh的登入使用者名稱
repl_user=repluser  #設定複製環境中的複製使用者名稱
repl_password=centos#設定複製使用者的密碼
ping_interval=1 #設定監控主庫,傳送ping包的時間間隔,預設是3秒,嘗試三次沒有迴應的時候進行自動fail

[server1]  
hostname=172.18.254.235 #配置MySQL伺服器的機器名或是IP地址,這個配置項是必須的,而且只能配置在[server_xxx]這個塊下面。
candidate_master=1  
[server2]  
hostname=172.18.254.144
candidate_master=1  #備用master
[server3]  
hostname=172.18.254.209

5:檢查mha

#mha manage
[[email protected] ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
[[email protected] ~]# masterha_check_repl --conf=/etc/mha/app1.conf

6:執行mha

#mha manage
[[email protected] ~]# nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log &  #放到後端執行,把執行結果放到檔案裡,檢測檔案

7:模擬故障,直接對master關機在mha進行日誌檢查

[[email protected] ~]# tailf /data/mastermha/app1/manager.log

Started automated(non-interactive) failover.
The latest slave 172.18.254.144(172.18.254.144:3306) has all relay logs for recovery.
Selected 172.18.254.144(172.18.254.144:3306) as a new master.
172.18.254.144(172.18.254.144:3306): OK: Applying all logs succeeded.
172.18.254.209(172.18.254.209:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
172.18.254.209(172.18.254.209:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.18.254.144(172.18.254.144:3306)
172.18.254.144(172.18.254.144:3306): Resetting slave info succeeded.
Master failover to 172.18.254.144(172.18.254.144:3306) completed successfully.
^C[1]+  完成                  nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log

8:在切換成功後,再開啟舊的主,將舊的主設定為從。

#在slave1 進入mysql
MariaDB [(none)]> show master status;
+------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000007 |      375 |              |                  |
+------------+----------+--------------+------------------+

[[email protected] ~]# vim /etc/my.cnf
增加以下兩行
read_only=ON
relay_log_purge=0

[[email protected] ~]# systemctl restart mariadb.service

Master [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='172.18.254.144',
    ->   MASTER_USER='repluser',
    ->   MASTER_PASSWORD='centos',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='slave-log.000003',
    ->   MASTER_LOG_POS=375,
    ->   MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)

Master [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

完成了mysql的高可用。