1. 程式人生 > >構建MHA實現MySQL高可用集群架構

構建MHA實現MySQL高可用集群架構

MySQL數據庫實現故障自動轉移

一、MHA簡介

MHA(Master HighAvailability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。

MHA裏有兩個角色一個是MHA Node(數據節點)另一個是MHA Manager(管理節點)。

MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave集群,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然後將所有其他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明

技術分享圖片
在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日誌,最大程度的保證數據的不丟失,但這並不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失了最新的數據。使用MySQL 5.5的半同步復制,可以大大降低數據丟失的風險。MHA可以與半同步復制結合起來。如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性

異步復制(Asynchronous replication)

MySQL默認的復制即是異步的,主庫在執行完客戶端提交的事務後會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。

全同步復制(Fully synchronousreplication)

指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。

半同步復制(Semisynchronous replication)

介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。

下面來看看半同步復制的原理圖:
技術分享圖片

總結:異步與半同步異同

默認情況下MySQL的復制是異步的,Master上所有的更新操作寫入Binlog之後並不確保所有的更新都被復制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現問題的時候,存在很高數據不同步的風險,甚至可能丟失數據。
MySQL5.5引入半同步復制功能的目的是為了保證在master出問題的時候,至少有一臺Slave的數據是完整的。在超時的情況下也可以臨時轉入異步復制,保障業務的正常使用,直到一臺salve追趕上之後,繼續切換到半同步模式。

工作原理

相較於其它HA軟件,MHA的目的在於維持MySQL Replication中Master庫的高可用性,其最大特點是可以修復多個Slave之間的差異日誌,最終使所有Slave保持數據一致,然後從中選擇一個充當新的Master,並將其它Slave指向它。

-從宕機崩潰的master保存二進制日誌事件(binlogevents)。  
-識別含有最新更新的slave。  
-應用差異的中繼日誌(relay log)到其它slave。  
-應用從master保存的二進制日誌事件(binlogevents)。  
-提升一個slave為新master。  
-使其它的slave連接新的master進行復制。

目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器。
相關軟件包

  1. MHA監控服務器安裝:mha4mysql-manager-0.55-1.el5.noarch,mha4mysql-node-0.54-1.el5.noarch
  2. 其他主從集群服務器安裝:mha4mysql-node-0.54-1.el5.noarch

MHA軟件包官網地址: https://code.google.com/archive/p/mysql-master-ha/
使用到如下包:

mha4mysql-manager-0.55-1.el5.noarch
mha4mysql-node-0.54-1.el5.noarch

二、構建集群架構基礎環境

實現環境:

角色 IP地址 主機名 Server Id 類型 OS
Manager 192.168.64.37 manager 管理節點 Centos7.2x86_64
master 192.168.64.7 master1 1 主mysql Centos7.2x86_64
Candidate master 192.168.64.17 master2 2 從mysql Centos7.2x86_64
slave 192.168.64.27 slave 3 從mysql Centos7.2x86_64

其中master對外提供寫服務,備選master(實際的slave,主機名master2)提供讀服務,slave也提供相關的讀服務,一旦master宕機,將會把備選master提升為新的master,slave指向新的master,manager作為管理服務器。

1、 在配置好所有主機IP地址後檢查selinux,firewalld設置,關閉所有主機selinux ,firewalld 服務以方便後期主從同步不出錯

vim /etc/sysconfig/selinux
SELINUX=disabled   本行替換為

systemctl stop firewalld   關閉防火墻

2.同步服務器時間

vim /etc/chrony.conf
server 192.168.64.7 iburst   master2 slave配置與master1時間同步

3、
在四臺主機上都配置epel源
官網下載地址:點擊打開鏈接 wget https://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
4.在四臺主機上建立ssh無交互登錄環境

[root@manager ~]#  ssh-keygen -t rsa
[root@manager ~]#  ssh-copy-id -i id_rsa.pub 192.168.64.37
[root@manager ~]#  scp authorized_keys id_rsa 192.168.64.17:/root/.ssh/
[root@manager ~]#  scp authorized_keys id_rsa 192.168.64.27:/root/.ssh/
[root@manager ~]#   scp authorized_keys id_rsa 192.168.64.7:/root/.ssh/

測試ssh登錄面密鑰
[root@master ~]# ssh [email protected]   
其它主機可以分別測試下

三、 配置MySQL的主從復制

1、在主從節點安裝node節點包(master1 master2,slave)

[root@master ~]# ls
anaconda-ks.cfg  Downloads                             original-ks.cfg  reset.sh   Videos
Desktop          mha4mysql-node-0.54-0.el6.noarch.rpm  Pictures         reset.sql
Documents        Music                                 Public           Template
[root@master ~]# l  yum install mha*

2、修改my.cnf文件,配置主從同步
註意:若主MYSQL服務器已經存在,只是後期才搭建從MYSQL服務器,在置配數據同步前應先將主MYSQL服務器的要同步的數據庫拷貝到從MYSQL服務器上(如先在主MYSQL上備份數據庫,再用備份在從MYSQL服務器上恢復)
(1.)master1的主機配置:

innodb_file_per_table
log_bin
read_only
server_id=0
skip_name_resolve=1

(2.)master2的主機配置:

innodb_file_per_table
server_id=2
skip_name_resolve=1
read_only
relay_log_purge=0
log_bin

(3)slave的主機配置:

innodb_file_per_table
server_id=3
skip_name_resolve=1
read_only
relay_log_purge=0
log_bin

註意:重啟所有主機的mariadb服務!!!

(3.)創建用於主從復制的賬號“mharep”,在(master1、master2)主機上創建即可,創建MHA管理賬號“manager”在所有mysql服務器上都要創建。
master1、master2主機上的配置:

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repluser‘@‘192.168.64.%‘ IDENTIFIED BY ‘centos‘;
mysql> GRANT ALL ON *.* TO ‘mhauser‘@‘192.168.64.%‘ IDENTIFIED BY ‘centos‘;

slave主機上的配置:

mysql> GRANT ALL ON *.* TO ‘mhauser‘@‘192.168.64.%‘ IDENTIFIED BY ‘centos‘;

開始創建主從復制:

查看master1的節點:

MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       502 |
| mariadb-bin.000002 |       487 |
| mariadb-bin.000003 |       504 |
| mariadb-bin.000004 |       245 |
+--------------------+-----------+
4 rows in set (0.04 sec)

master2主機上的配置:

創建主從復制,並開啟slave功能

mysql>CHANGE MASTER TO MASTER_HOST=‘192.168.64.7‘,MASTER_USER=‘repluser‘ ,MASTER_PASSWORD=‘centos‘,MASTER_LOG_FILE=‘mariadb-bin.000004‘,MASTER_LOG_POS=245;
mysql> start slave;

查看master2主機從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

Slave_IO_Running:Yes  
Slave_SQL_Running:Yes  

slave主機上的配置:

創建主從復制,並開啟salve功能

mysql>CHANGE MASTER TO MASTER_HOST=‘192.168.64.7‘,MASTER_USER=‘repluser‘ ,MASTER_PASSWORD=‘centos‘,MASTER_LOG_FILE=‘mariadb-bin.000004‘,MASTER_LOG_POS=245;
mysql> start slave;

查看slave主機從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

Slave_IO_Running:Yes  
Slave_SQL_Running:Yes
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.64.7
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000004
          Read_Master_Log_Pos: 245
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 531
        Relay_Master_Log_File: mariadb-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 245
              Relay_Log_Space: 827
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)

ERROR: No query specified

註意:

第一條grant命令是創建一個用於主從復制的帳號repluser,在master1和master2的主機上創建即可。

第二條grant命令是創建MHA管理賬號manager,所有mysql服務器上都需要創建。MHA會在配置文件裏要求能遠程登錄到數據庫,所以要進行必要的賦權。

四、安裝配置mysql-MHA

mha包括manager節點和data節點,data節點包括原有的MySQL復制結構中的主機,至少3臺,即1主2從,當masterfailover後,還能保證主從結構;主從復制集群只需安裝node包。

manager server:運行監控腳本,負責monitoring和 auto-failover;mha manager節點需要安裝node包和manager包。
1、在manager主機上需要安裝( mha4mysql-manager-0.55-0.el6.noarch.rpm和 mha4mysql-node-0.54-0.el6.noarch.rpm)兩個操作管理節點, 在3臺數據庫主機上只需要安裝MHA的node節點即可。

[root@manager ~]# ls
192.168.64.17    cobbler.ks            mha4mysql-manager-0.55-0.el6.noarch.rpm
192.168.64.27    ks-post.log           mha4mysql-node-0.54-0.el6.noarch.rpm
192.168.64.7     ks-post-nochroot.log  original-ks.cfg
anaconda-ks.cfg  ks-pre.log
[root@manager ~]#  yum install mha*

其他三臺數據庫節點需要安裝MHA的node節點(過程略)!!!

  1. 配置MHA

與絕大多數Linux應用程序類似,MHA的正確使用依賴於合理的配置文件。MHA的配置文件與mysql的my.cnf文件配置相似,采取的是param=value的方式來配置,配置文件位於管理節點,通常包括每一個mysql server的主機名,mysql用戶名,密碼,工作目錄等等。

(1.)編輯/etc/masterha/app1.conf,內容如下:

[root@manager ~]# vim /etc/mastermha/app1.cnf 
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1

[server1]
hostname=192.168.64.7
candidate_master=1
[server2]
hostname=192.168.64.17
candidate_master=1
[server3]
hostname=192.168.64.27
candidate_master=1

配置項的解釋:

manager_workdir=/masterha/app1 //設置manager的工作目錄  
manager_log=/masterha/app1/manager.log //設置manager的日誌  
user=manager//設置監控用戶manager  
password=123456  //監控用戶manager的密碼  
ssh_user=root  //ssh連接用戶  
repl_user=mharep  //主從復制用戶  
repl_password=123.abc //主從復制用戶密碼  
ping_interval=1   //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行railover  
master_binlog_dir=/usr/local/mysql/data   //設置master 保存binlog的位置,以便MHA可以找到master的日誌,我這裏的也就是mysql的數據目錄  
candidate_master=1//設置為候選master,如果設置該參數以後,發生主從切換以後將會將此從庫提升為主庫。

SSH 有效性驗證:

[root@manager ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf 
Sun Apr 22 06:36:33 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
/etc/masterha/app1.cnf:No such file or directory
 at /usr/share/perl5/vendor_perl/MHA/SSHCheck.pm line 148.
[root@manager ~]# masterha_check_ssh 
masterha_check_ssh
[root@manager ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf 
Sun Apr 22 06:37:13 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 22 06:37:13 2018 - [info] Reading application default configurations from /etc/mastermha/app1.cnf..
Sun Apr 22 06:37:13 2018 - [info] Reading server configurations from /etc/mastermha/app1.cnf..
Sun Apr 22 06:37:13 2018 - [info] Starting SSH connection tests..
Sun Apr 22 06:37:18 2018 - [debug] 
Sun Apr 22 06:37:14 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.27:22) to [email protected](192.168.64.7:22)..
Sun Apr 22 06:37:16 2018 - [debug]   ok.
Sun Apr 22 06:37:16 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.27:22) to [email protected](192.168.64.17:22)..
Sun Apr 22 06:37:17 2018 - [debug]   ok.
Sun Apr 22 06:37:18 2018 - [debug] 
Sun Apr 22 06:37:14 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.17:22) to [email protected](192.168.64.7:22)..
Sun Apr 22 06:37:16 2018 - [debug]   ok.
Sun Apr 22 06:37:16 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.17:22) to [email protected](192.168.64.27:22)..
Sun Apr 22 06:37:17 2018 - [debug]   ok.
Sun Apr 22 06:37:18 2018 - [debug] 
Sun Apr 22 06:37:13 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.7:22) to [email protected](192.168.64.17:22)..
Sun Apr 22 06:37:17 2018 - [debug]   ok.
Sun Apr 22 06:37:17 2018 - [debug]  Connecting via SSH from [email protected](192.168.64.7:22) to [email protected](192.168.64.27:22)..
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:080GPU/VjQmyb/Ije4lASHgZDXJv5E/QOqAcAv0wfV0.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:1
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
Sun Apr 22 06:37:18 2018 - [debug]   ok.
Sun Apr 22 06:37:18 2018 - [info] All SSH connection tests passed successfully.

集群復制的有效性驗證:

註意:mysql數據庫必須都啟動

[root@manager ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf 

註意:驗證成功的話會自動識別出所有服務器和主從狀況!!!

在驗證時,若遇到這個錯誤:Can‘t exec "mysqlbinlog" ......

解決方法是在所有服務器上執行:

[css] view plain copy
ln -s /usr/local/mysql/bin/* /usr/local/bin/

啟動 manager:

[root@manager ~]# masterha_manager --conf=/etc/mastermha/app1.cnf 
Sun Apr 22 06:39:35 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 22 06:39:35 2018 - [info] Reading application default configurations from /etc/mastermha/app1.cnf..
Sun Apr 22 06:39:35 2018 - [info] Reading server configurations from /etc/mastermha/app1.cnf..

註意:在應用Unix/Linux時,我們一般想讓某個程序在後臺運行,於是我們將常會用&在程序結尾來讓程序自動運行。比如我們要運行mysql在後臺: /usr/local/mysql/bin/mysqld_safe –user=mysql&。可是有很多程序並不想mysqld一樣,這樣我們就需要nohup命令,

五、模擬故障,檢測狀態轉移

1、停掉master1 的mariadb服務

[root@master ~]#  systemctl stop mariadb

(2.)查看 MHA 日誌
上面的配置文件中指定了日誌位置為/data /masterha/app1/manager.log

[root@manager ~]# cat/masterha/app1/manager.log 

從日誌信息中可以看到master failover 已經成功了,並可以看出故障轉移的大體流程

(3)檢查 slave 的復制
登錄 slave(192.168.64.27)的Mysql,查看 slave 狀態

mysql> show slave status\G; 

可以看到master 的 IP 現在為 192.168.64.17,已經切換到和192.168.64.27同步了,本來是和192.168.64.7同步的,說明 MHA 已經把Candicatemaster(master2)提升為了新的master,IO線程和SQL線程也正確運行,MHA 搭建成功!!!

構建MHA實現MySQL高可用集群架構