MySQL高可用目前有heartbeat+drbd、MHA、MySQL複制等幾種較成熟的方案,heartbeat+drbd的方案可擴充性較差,而且讀寫都由主伺服器負責,從庫并不提供讀功能,适合于資料增長量不大、一緻性要求很高的環境,如銀行、金融業等。今天重點講下MHA的高可用架構。
MHA是一款優秀的高可用環境下故障切換和主從提升的高可用軟體。在MySQL故障切換過程中,MHA能做到0-30秒之内自動完成資料庫的故障切換,并且在切換的過程中,最大限度的保證資料的一緻性,以達到真正意義上的高可用。MHA高可用建立在MySQL主從複制的基礎上,先了解下MySQL複制最常見的兩種方式:
異步複制:主庫寫入并送出事務之後,把記錄寫進主庫二進制日志即傳回用戶端,主庫和從庫的資料存在一定的延遲,這樣就存在一定的隐患,當主庫送出了一個事務,并且寫入了二進制日志,而從庫尚未得到主庫推送的二進制日志時,此時主庫當機,将造成主從伺服器的資料不一緻。
半同步複制:主庫在每次送出事務成功時,并不及時回報給用戶端,而是等待其中一個從庫也接收到二進制日志并寫入中繼日志之後,才傳回操作成功給用戶端。
MHA組成:
MHA Manager:管理節點,可以單獨的部署在一台獨立的伺服器上,管理多個master-slave叢集,也可以部署在一台Slave上。
MHA Node:資料節點,運作在每台MySQL伺服器上。
MHA Manager會定時探測叢集中的master節點,當master出現故障時,它可以自動将最新資料的slave提升為新master,然後将其它所有的slave重新指向新的master。整個故障轉移過程對應用程式是完全透明的。
MHA工作原理:
1)從當機的master儲存二進制日志事件
2)識别含有最新更新的Slave
3) 應用差異的中繼日志到其它從伺服器
4)應用從master儲存的二進制日志事件
5)提升一個新的Slave為master
6)使其它的Slave連接配接到新的master并複制
示例:MHA高可用架構(如果在内網可以關閉防火牆,否則請開啟相應的端口)
Manager:node1:192.168.154.128
Master:node2:192.168.154.156
Slave:node3:192.168.154.130
Slave:node4:192.168.154.154
一 配置主從複制:
1)主節點:
[root@node2 ~]# vim /etc/my.cnf
innodb_file_per_table=1 #開啟獨立的表空間
skip_name_resolve #禁止域名解析
log-bin=master-bin
relay-log=relay-bin
server-id=1
[root@node2 ~]# service mysqld restart
檢視二進制日志資訊
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| master-bin.000001 | 106 | | |
1 row in set (0.00 sec)
建立授權使用者:
mysql> grant replication slave,replication client on *.* to 'slave'@'192.168.154.%' identified by 'slave';
Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2)從節點:
[root@node3 ~]# vim /etc/my.cnf
innodb_file_per_table=1
skip_name_resolve
log-bin=slave-bin
server_id=2
read_only=1
relay_log_purge=0
[root@node3 ~]# service mysqld restart
[root@node4 ~]# vim /etc/my.cnf
server_id=3
read_only=1 #開啟隻讀模式
relay_log_purge=0 #關閉自動清理中繼日志
[root@node4 ~]# service mysqld restart
設定同步:
mysql> change master to master_host='192.168.154.156',master_user='slave',master_password='slave',master_log_file='master-bin.000001',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.154.156
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 354
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 500
Relay_Master_Log_File: master-bin.000001
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: 354
Relay_Log_Space: 649
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:
3)在master節點上建立具有管理權限的賬号
mysql> grant all on *.* to 'zwj'@'192.168.154.%' identified by 'zwj';
二 配置叢集間的密鑰登陸
在node1上:
[root@node1 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node1 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node1 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node1 ~]# ssh 192.168.154.154 'ifconfig' #驗證
eth0 Link encap:Ethernet HWaddr 00:0C:29:67:65:ED
inet addr:192.168.154.154 Bcast:192.168.154.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe67:65ed/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26253 errors:0 dropped:0 overruns:0 frame:0
TX packets:42416 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23453164 (22.3 MiB) TX bytes:2514457 (2.3 MiB)
Interrupt:19 Base address:0x2024
在node2上:
[root@node2 ~]# ssh-keygen -t rsa
[root@node2 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node2 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node2 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
在node3上:
[root@node3 log]# ssh-keygen -t rsa
[root@node3 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node3 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node3 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
在node4上:
[root@node4 ~]# ssh-keygen -t rsa
[root@node4 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node4 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
[root@node4 ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]
三 安裝MHA Manager,在node1上:
[root@node1 ~]# tar -zxf mha4mysql-node-0.56.tar.gz
[root@node1 ~]# cd mha4mysql-node-0.56
[root@node1 mha4mysql-node-0.56]# perl Makefile.PL
[root@node1 mha4mysql-node-0.56]# make
[root@node1 mha4mysql-node-0.56]# make install
[root@node1 mha4mysql-manager-0.56]# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y #安裝MHA Manger依賴的perl子產品
[root@node1 ~]# tar -zxf mha4mysql-manager-0.56.tar.gz
[root@node1 ~]# cd mha4mysql-manager-0.56
[root@node1 mha4mysql-manager-0.56]# perl Makefile.PL
[root@node1 mha4mysql-manager-0.56]# make
[root@node1 mha4mysql-manager-0.56]# make install
四 安裝MySQL node(在所有MySQL伺服器上)
[root@node2 ~]# cd mha4mysql-node-0.56/
[root@node2 mha4mysql-node-0.56]# perl Makefile.PL
[root@node2 mha4mysql-node-0.56]# make
[root@node2 mha4mysql-node-0.56]# make install
五 建立工作目錄,配置MHA:
[root@node1 ~]# mkdir -pv /etc/masterha
[root@node1 ~]# vim /etc/masterha/appl.cnf
[server default]
user=zwj
password=zwj
manager_workdir=/etc/masterha/appl
manager_log=/etc/masterha/appl/manager.log
remote_workdir=/etc/masterha/appl
ssh_user=root
repl_user=slave
repl_password=slave
ping_interval=1
[server1]
hostname=192.168.154.156
[server2]
hostname=192.168.154.130
candidate_master=1 #設定為備選的master
[server3]
hostname=192.168.154.154
六 檢查SSH連接配接狀态:
[root@node1 ~]# masterha_check_ssh --conf=/etc/masterha/appl.cnf
Wed May 10 00:12:58 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed May 10 00:12:58 2017 - [info] Reading application default configuration from /etc/masterha/appl.cnf..
Wed May 10 00:12:58 2017 - [info] Reading server configuration from /etc/masterha/appl.cnf..
Wed May 10 00:12:58 2017 - [info] Starting SSH connection tests..
Wed May 10 00:13:15 2017 - [debug]
Wed May 10 00:12:59 2017 - [debug] Connecting via SSH from [email protected](192.168.154.154:22) to [email protected](192.168.154.156:22)..
Wed May 10 00:13:05 2017 - [debug] ok.
Wed May 10 00:13:05 2017 - [debug] Connecting via SSH from [email protected](192.168.154.154:22) to [email protected](192.168.154.130:22)..
Wed May 10 00:13:15 2017 - [debug] ok.
Wed May 10 00:13:20 2017 - [debug]
Wed May 10 00:12:58 2017 - [debug] Connecting via SSH from [email protected](192.168.154.130:22) to [email protected](192.168.154.156:22)..
Wed May 10 00:13:11 2017 - [debug] ok.
Wed May 10 00:13:11 2017 - [debug] Connecting via SSH from [email protected](192.168.154.130:22) to [email protected](192.168.154.154:22)..
Wed May 10 00:13:20 2017 - [debug] ok.
Wed May 10 00:13:35 2017 - [debug]
Wed May 10 00:12:58 2017 - [debug] Connecting via SSH from [email protected](192.168.154.156:22) to [email protected](192.168.154.130:22)..
Wed May 10 00:13:15 2017 - [debug] Connecting via SSH from [email protected](192.168.154.156:22) to [email protected](192.168.154.154:22)..
Wed May 10 00:13:35 2017 - [debug] ok.
Wed May 10 00:13:35 2017 - [info] All SSH connection tests passed successfully.
七 檢查整個複制環境:
[root@node1 ~]# masterha_check_repl --conf=/etc/masterha/appl.cnf
...
192.168.154.156(192.168.154.156:3306) (current master)
+--192.168.154.130(192.168.154.130:3306)
+--192.168.154.154(192.168.154.154:3306)
Wed May 10 00:33:36 2017 - [info] Checking replication health on 192.168.154.130..
Wed May 10 00:33:36 2017 - [info] ok.
Wed May 10 00:33:36 2017 - [info] Checking replication health on 192.168.154.154..
Wed May 10 00:33:36 2017 - [warning] master_ip_failover_script is not defined.
Wed May 10 00:33:36 2017 - [warning] shutdown_script is not defined.
Wed May 10 00:33:36 2017 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
八 開啟MHA Manager監控:
[root@node1 ~]# nohup masterha_manager --conf=/etc/masterha/appl.cnf > /etc/masterha/appl/manager.log 2>&1 &
[1] 8300
檢視MHA Manager監控:
[root@node1 ~]# masterha_check_status --conf=/etc/masterha/appl.cnf
appl (pid:8300) is running(0:PING_OK), master:192.168.154.156
關閉MHA Manager監控:
[root@node1 ~]# masterha_stop --conf=/etc/masterha/appl.cnf
Stopped appl successfully.
[1]+ Exit 1 nohup masterha_manager --conf=/etc/masterha/appl.cnf > /etc/masterha/appl/manager.log 2>&1
九 模拟主庫當機:
[root@node2 ~]# service mysqld stop
Stopping mysqld: [ OK ]
檢視slave(node4),可見master已發生變化,
Master_Host: 192.168.154.130
Master_User: slave
Master_Log_File: slave-bin.000003
Read_Master_Log_Pos: 106
Relay_Log_Pos: 251
Relay_Master_Log_File: slave-bin.000003
Slave_SQL_Running: Yes
本文轉自 zengwj1949 51CTO部落格,原文連結:http://blog.51cto.com/zengwj1949/1923915