主節點高可用
MHA是一款開源的MySQL的高可用程序,他為MySQL主從復制架構提供了automating master failover功能。MHA在監控到master節點故障時,會提升其中擁有最新數據的slave節點成為新的master節點。在此期間,MHA會通過其他從節點獲取額外信息來避免一致性方面的問題。MHA還提供了master節點切換功能,即按需切換master/slave節點。
MHA服務有兩種角色,MHA Manager(管理節點)和HMA Node(數據節點)
- MHA Manager:通常部署在一臺獨立機器上管理多個master/slave集群,每個master/slave集群乘坐一個application;
- MHA node:運行在每臺MySQL服務器上(master/slave/manager),他通過監控解析和清理logs功能的腳本來加快故障轉移。
MHA組件說明
Manager節點:
-masterha_check_ssh:MHA依賴的SSH環境檢測工具;
-masterha_check_repl:MySQL復制環境檢測工具;
-masterha_manager:MHA服務主程序;
-masterha_check_status:MHA運行狀態探測工具;
-masterha_master_monitor:MySQL master節點可用性檢測工具;
-masterha_master_switch:master節點切換工具;
-masterha_conf_host:添加或刪除配置的節點;
-masterha_stop:關閉MHA服務的工具;
Node節點:
-save_binary_logs:保存和復制master的二進制日志;
-apply_diff_relay_logs:識別差異的中繼日志事件并用于其他slave;
-fiter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用這個工具);
-purge_relay_logs:清除中繼日志(不會阻塞SQL線程);
自定義擴展:
-secondary_check_script:通過多條網絡路由檢測master的可用性;
-master_ip_failover_script:更新appliction使用的masterip;
-shutdown_script:強制關閉master節點;
-report_script:發送報告;
-init_conf_load_script:加載初始配置參數;
-master_ip_online_change_script:更新master節點ip地址
高可用MHA架構部署及測試
節點角色
mysql-master 172.16.252.82
mysql-slave1 172.16.252.92
mysql-slave2 172.16.252.100
manager 172.16.252.67
配置各節點之間可以通過主機名通信
[root@manager ~]# vim /etc/hosts
172.16.252.82 mysql-master
172.16.252.92 mysql-slave1
172.16.252.100 mysql-slave2
172.16.252.67 manager
其他各主機依次配置主機名解析文件
mysql-master
[root@mysql-master ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 1
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
[root@mysql-master ~]# systemctl start mariadb
[root@mysql-master ~]# mysql
授權一個有權限做主從復制的用戶
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> FLUSH PRIVILEGES;
查看master節點的狀態,記錄二進制文件的位置信息,用于從節點的復制起點
MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000001 | 501 | | |
+-------------------+----------+--------------+------------------+
mysql-slave1
[root@mysql-slave1 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 2
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
read_only = ON
relay_log_purge = OFF
[root@mysql-slave1 ~]# systemctl start mariadb
[root@mysql-slave ~]# mysql
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'read_only'; \\查看數據庫為只讀
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
連接主節點數據庫
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.198.139',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=501;
啟動從節點復制進程
MariaDB [(none)]> START SLAVE;
查看SLAVE節點的狀態
MariaDB [(none)]> SHOW SLAVE STATUS\G;
連接manager的用戶
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
mysql-slave2
root@mysql-slave2 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 3
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
read_only = ON
relay_log_purge = OFF
[root@mysql-slave2 ~]# systemctl start mariadb
[root@mysql-slave ~]# mysql
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'read_only'; \\查看數據庫為只讀
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
連接主節點數據庫
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.198.139',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=501;
啟動從節點復制進程
MariaDB [(none)]> START SLAVE;
查看SLAVE節點的狀態
MariaDB [(none)]> SHOW SLAVE STATUS\G;
連接manager的用戶
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
mysql-master(master/slave上都需有此用戶權限來連接manager)
MariaDB [(none)]> GRANT ALL ON *.* TO 'mha'@'172.16.%.%' IDENTIFIED BY 'mhapass';
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
MHA安裝
github官網下載manager到本地
[root@manager ~]# ls mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager ~]# yum install ./mha4mysql-* 安裝MHA程序包
復制mha4mysql-node-0.56-0.el6.noarch.rpm程序包到各節點上
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-master:/root
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-slave1:/root
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-slave2:/root
mysql-master、mysql-slave1和mysql-slave2節點依次安裝mha4mysql-node-0.56-0.el6.noarch.rpm程序包
[root@mysql-master ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mysql-slave1 ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mysql-slave2 ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
配置各節點之間SSH互信的通信環境
MHA
[root@manager ~]# ssh-keygen -t rsa -P '' 生成ssh秘鑰文件
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@manager
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_leys root@mysql-master:/root/.ssh
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_leys root@mysql-slave1:/root/.ssh
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_leys root@mysql-slave2:/root/.ssh
[root@mysql-master ~]# ssh -o StrictHostKeyChecking=no mysql-slave1 直接連接mysql-slave主機,無詢問,無提示
初始化MHA
manager
[root@manager ~]# mkdir /data/masterha
[root@manager ~]# mkdir /data/masterha/app
[root@manager ~]# mkdir /etc/masterha
[root@manager ~]# vim /etc/masterha/app.cnf
[server default]
user=mha
password=mhapass \\node節點連接manager的用戶
manager_workdir=/data/masterha/app
manager_log=/data/masterha/app/manager.log
remote_workdir=/data/masterha/app
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1
[server1]
hostname=172.16.252.82
candidate_master=1
[server2]
hostname=172.16.252.92
candidate_master=1
[server3]
hostname=172.16.252.100
candidate_master=1
測試后端主機的集群
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app.cnf
測試運行MHA程序
[root@manager ~]# masterha_manager --conf=/etc/masterha/app.cnf
查看MHA集群的狀態
[root@manager ~]# masterha_check_status