MySQL MHA: 一種master高可用的主從複製解決方案

大綱前端

  • 前言node

  • MHA的架構mysql

  • 環境部署sql

  • 實驗步驟vim

  • 總結服務器

前言

上篇文章咱們實現了MySQL的主從複製, 可是咱們以前就說過, 主從複製是有不少問題的, 咱們這篇文章爲你們介紹一如何使用MHA來實現MySQL複製集羣的高可用網絡

MHA的架構

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 在線切換到新主機

項目地址 Google Code

MHA服務有兩種角色, 完成相應的功能

  • MHA Manager(管理節點): 一般單獨部署在單臺主機上, 用來管理多個Master/Slave集羣, 每一個集羣一般被稱爲Application 

  • MHA Slave(數據節點): 一般部署在單臺MySQL服務器上, 經過監控和具備解析和清理log功能的腳原本加快故障轉移

    1461844421710938.png

  • MySQL主節點故障時, 按下面的步驟進行轉移 

    1461844421329883.png

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節點自動替代成爲主節點

blob.png

軟件版本

MHA下載地址

軟件 版本
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

相關文章
相關標籤/搜索