MySQL主從復制: MHA

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

項目地址 Google Code

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

  • MHA Master(管理節點)

  • MHA Slave(數據節點)

    MHA Manager通常單獨部署在單臺主機上 , 用來管理多個Master/Slave集群, 每個集群通常被稱為Application 
    MHA Slave通常部署在單臺MySQL服務器上, 通過監控和具有解析和清理log功能的腳本來加快故障轉移

    MySQL主從復制: MHA

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

    MySQL主從復制: MHA

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

原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/15698

(0)
Net18-AnyISalInNet18-AnyISalIn
上一篇 2016-04-28 14:58
下一篇 2016-04-28 21:37

相關推薦

  • OSI和TCP/IP

            我們生活中各方面都離不開網絡,那網絡究竟是什么東西呢?它是怎么做到讓在不同地點的人無視空間距離完成通信的呢?首先我們來了解一下網絡的基本概念。網絡是由節點和連線構成,表示諸多對象及其相互聯系。在數學上,網絡是一種圖,一般認為專指加權圖。網絡除了數學定義外,還有具體…

    2017-09-02
  • shell 腳本之數組 和 yum 【下】

    shell 腳本之數組 和 yum 【下】 數組 ?  變量:存儲單個元素的內存空間 ?  數組:存儲多個元素的連續的內存空間,相當于多個變量的 集合。 ?  數組名和索引        索引:編號從0開始,屬于數值索引        注意:索引可支…

    Linux干貨 2016-08-24
  • 第七周作業

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;        (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [ro…

    2017-04-05
  • nginx配置(一)

    Nginx:http協議:web服務器(類似于httpd)、http reverse proxy(類似于httpd)、imap/pop3 reverse proxy NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/…

    Linux干貨 2017-05-05
  • DNS資源記錄類型

      資源記錄   資源記錄(Resource Records),簡稱RRs。是指每個域所包含的與之相關的資源。例如,每個RR都包括這個域的所屬(RR是從哪個域名中得到的),類型(什么樣的資源存在于這個RR中),TTL(time to live,存活時間)等等。 DNS包括七大資源記錄 A記錄:也稱為主機記錄,是DNS名稱到IP地址的映射,用于正向解…

    Linux干貨 2017-02-08
  • 馬哥教育網絡班21期第6周作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; %s/^[[:space:]]\+/#& 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符; %s/^[[:space:]]\+/ …

    Linux干貨 2016-12-05
欧美性久久久久