MySQL主從復制: MHA
前言
上篇文章我們實現了
MySQL
的主從復制, 但是我們之前就說過, 主從復制是有很多問題的, 我們這篇文章為大家介紹一如何使用MHA
來實現MySQL
復制集群的高可用
MHA的架構
MHA (Master HA) 實現MySQL主從復制主節點高可用 , 主要實現了
Automated master monitoring and failover 自主監控和故障轉移
Interactive (manual) Master Failover 手動故障轉移
Non-interactive master failover 非交互式故障轉移
Online switching master to a different host 在線切換到新主機
MHA服務有兩種角色, 完成相應的功能
MHA Master(管理節點)
MHA Slave(數據節點)
MHA Manager通常單獨部署在單臺主機上 , 用來管理多個Master/Slave集群, 每個集群通常被稱為Application
MHA Slave通常部署在單臺MySQL服務器上, 通過監控和具有解析和清理log功能的腳本來加快故障轉移
MySQL主節點故障時, 按下面的步驟進行轉移
MHA的各組件
Manager節點的組件
masterha_check_ssh: MHA依賴的SSH環境檢測工具
masterha_repl: MySQL復制環境檢測工具
masterha_manager: MHA 服務主程序
masterha_check_status: MySQL master節點可用性檢測工具
masterha_conf_host: 添加或刪除配置的節點
masterha_stop: 關閉MHA服務的工具
Node節點的組件
save_binary_logs: 保存和復制master的二進制日志
apply_diff_relay_logs: 識別差異的中繼日志應用于于其他slave
filter_mysqbinlog: 去除不必要的ROLLBACK事件(MHA已經移除這個工具)
purge_relay_logs: 清除中繼日志(不會阻塞SQL線程)
自定義擴展組件
secondary_check_script: 通過多條網絡路由檢測master可用性
master_ip_failover_script: 更新application使用的masterip
shutdown_script: 強制關閉master節點
report_script: 發送報告
init_conf_load_script: 加載初始配置參數
master_ip_online_change_script: 更新master節點ip地址
環境部署
實驗環境
節點 | IP | 功用 |
---|---|---|
node1 | 172.16.1.2 | Master Node |
node2 | 172.16.1.3 | Slave Node/Master Node |
node3 | 172.16.1.4 | Slave Node |
node4 | 172.16.1.5 | Manager Node |
實驗拓撲
當主節點宕機后, node2節點自動替代成為主節點
軟件版本
軟件 | 版本 |
---|---|
MySQL | 5.1 |
MHA_Manager | 0.56 |
MHA_Node | 0.54 |
實驗步驟
安裝配置mysql
[root@node1 ~]# yum install mysql-server -y
[root@node2 ~]# yum install mysql-server -y
[root@node3 ~]# yum install mysql-server -y
[root@node4 ~]# yum install mysql-server -y
mysql_master_node配置文件
這里不對配置進行過多解釋,有興趣可以看我上篇文章
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table = 1
log-bin=master-log
log-bin-index=1
server_id=1
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
master_slave_node配置文件
我們這里只展示一個節點的配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table = 1
log-bin = master-log
log-bin-index = 1
relay-log = relay-log
read_only = 1
server_id=2 #每個從服務器要使用不同的
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
配置主從
MySQL Master節點配置
我們需要創建一個super權限的用戶給MHA_Manager管理來控制各節點
mysql> SHOW MASTER STATUS; #一定要在創建用戶前查看并記下POS數值
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000003 | 106 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'rpuser'@'%' IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.00 sec)
ENTFIED BY 'passwd'' at line 1mysql> GRANT ALL ON *.* TO 'mhauser'@'%' IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
MySQL Slave節點配置
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.16.1.2',
-> MASTER_USER='rpuser',
-> MASTER_PASSWORD='passwd',
-> MASTER_LOG_FILE='master-log.000003',
-> MASTER_LOG_POS=106;
Query OK, 0 rows affected (0.03 sec)
mysql> START SLAVE; #啟動slave
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G; #查看slave-IO和slave-SQL是否為YES
Master_Host: 172.16.1.2
Master_User: rpuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000003
Read_Master_Log_Pos: 476
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 622
Relay_Master_Log_File: master-log.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
配置MHA
配置前提
我們需要配置每一臺主機之間能夠互信
每臺主機互信配置
我們這里使用一個非常簡便的方法來實現
生成密鑰后, 復制到各節點主機
[root@node4 ~]# ssh-keygen -P '' -t rsa -f /root/.ssh/id_rsa #在node4生成密鑰
[root@node4 ~]# cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node1.anyisalin.com:/root/.ssh/
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node2.anyisalin.com:/root/.ssh/
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node3.anyisalin.com:/root/.ssh/
安裝MHA
[root@node4 ~]# yum localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm #在manager節點上安裝這兩個包
#在各個node節點安裝mha_node
[root@node2 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
[root@node3 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
[root@node4 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
創建配置文件
[root@node4 ~]# vim /etc/mha.cnf
[server default]
user=mhauser
password=passwd
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/data/masterha/app1
ssh_user=root
repl_user=rpuser
repl_password=passwd
ping_interval=1
[server1]
hostname=172.16.1.2
candidate_master=1
[server2]
hostname=172.16.1.3
candidate_master=1
[server3]
hostname=172.16.1.4
檢查環境
啟動Masterha前使用自帶的檢測工具檢查一下環境
[root@node4 ~]# masterha_check_ssh --conf=/etc/mha.cnf #檢查ssh, --conf指定配置文件
#最后出現以下字段代表成功
Thu Apr 28 19:02:05 2016 - [info] All SSH connection tests passed successfully.
[root@node4 ~]# masterha_check_repl --conf=/etc/mha.cnf #檢查主從復制
#最后出現以下字段代表成功
MySQL Replication Health is OK.
啟動MHA
nohup masterha_manager --conf=/etc/mha.cnf &> /data/masterha/app1/manager.log &
# 指定配置文件并且放進程在后臺運、剝離與終端的關系
測試故障轉移
[root@node4 ~]# masterha_check_status --conf /etc/mha.cnf #當前主節點為node1
mha (pid:2573) is running(0:PING_OK), master:172.16.1.2
[root@node1 ~]# service mysqld stop #手動停止主節點
[root@node3 ~]# mysql
mysql> SHOW SLAVE STATUS\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.3 #已經轉換為node2
Master_User: rpuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000006
Read_Master_Log_Pos: 106
Relay_Log_File: relay-log.000004
Relay_Log_Pos: 252
Relay_Master_Log_File: master-log.000006
[root@node2 ~]# mysql
mysql> SHOW GLOBAL VARIABLES LIKE '%read_only%'; #查看, read_only被MHA關閉了
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)
總結
其實我們這套架構不夠完整, 如果要投入生產環境使用還需要提供一個自動切換VIP的腳本, 前端使用MySQL專用的讀寫分離器進行調度, 但是由于時間原因. 這里又不做更多的敘述了, 大家能夠知道基本用法相比那些也就是小意思
作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感謝: MageEdu
原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/15698