Mysql實戰之高可用MHA

主節點高可用

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文/Bruce.Liu1 文章大綱MHA簡介1.1. mha組件介紹1.2. 背景和目標MHA原理2.1. MHA...
    BruceLiu1閱讀 10,381評論 4 19
  • 架構圖 故障轉移過程 介紹 MHA(Master High Availability)目前在MySQL高可用方面是...
    mvictor閱讀 3,842評論 2 3
  • 在某些條件下,經濟的外部性或曰非效率可以通過當事人的談判而得到糾正,從而達到社會效益最大化。比較流行的說法是...
    木頭的隨筆閱讀 1,599評論 0 1
  • 剛上大學的學子這會應該是剛剛經歷完名叫軍訓的階段,從最開始的新鮮開心到堅持不懈再到最后的不舍,這是每個上大學的人都...
    凸涂土兔閱讀 1,301評論 9 29
  • 一天,一個博士坐船欣賞風景。 在船上,博士問漁夫:“你會生物嗎?”漁夫說不會,博士就說:“那你的生命就要失去4分之...
    沅沨閱讀 431評論 0 0