大綱前端
前言node
MHA的架構mysql
環境部署sql
實驗步驟vim
總結服務器
上篇文章咱們實現了
MySQL
的主從複製, 可是咱們以前就說過, 主從複製是有不少問題的, 咱們這篇文章爲你們介紹一如何使用MHA
來實現MySQL
複製集羣的高可用網絡
MHA (Master HA) 實現MySQL主從複製主節點高可用 , 主要實現了架構
Automated master monitoring and failover 自主監控和故障轉移app
Interactive (manual) Master Failover 手動故障轉移ssh
Non-interactive master failover 非交互式故障轉移
Online switching master to a different host 在線切換到新主機
MHA服務有兩種角色, 完成相應的功能
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