mysql MHA集群的搭建
MHA集群介紹與安裝
MHA ( Master High Availability )
– 由日本 DeNA 公司 youshimaton (現就職於 Facebook 公司)開發
– 是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟件。
– 目前在 MySQL 高可用方面是一個相對成熟的解決方案。
– 在 MySQL 故障切換過程中, MHA 能做到在 0~30 秒之內自動完成數據庫的故障切換操作
– 並且在進行故障切換的過程中, MHA 能在最大程度上保證數據的一致性,以達到真正意義上的高可用。
MHA 組成
? MHA Manager (管理節點)
– 可以單獨部署在一臺獨立的機器上管理多個 master-slave 集群,也可以部署在一臺 slave 節點上。
? MHA Node (數據節點)
– 運行在每臺 MySQL 服務器上。
MHA 工作過程
? MHA Manager 會定時探測集群中的 master 節點,當 master 出現故障時,它可以自動將最新數據的 slave 提升為新的 master ,然後將所有其他的 slave重新指向新的 master 。整個故障轉移過程對應用程序完全透明。
– ( 1 )從宕機崩潰的 master 保存二進制日誌事件( binlog events)
– ( 2 )識別含有最新更新的 slave
– ( 3 )應用差異的中繼日誌( relay log )到其他的 slave
– ( 4 )應用從 master 保存的二進制日誌事件( binlog events )
– ( 5 )提升一個 slave 為新的 master ;
– ( 6 )使其他的 slave 連接新的 master 進行復制;
master51
|
|
| | | | |
slave52 slave53 slave54 slave55 mgm56
備用主 備用主 Manager
一、配置所有數據節點主機之間可以互相以ssh密鑰對方式認證登陸
1.1 在每一臺數據庫服務器創建密鑰對,然後把公鑰拷貝給其他4臺數據庫服務器
[root@51 mysql]# ssh-keygen 創建密鑰對
[root@51 ~]# for i in 192.168.4.{52..56}; ssh-copy-id $i //同樣拷貝公鑰給其他4臺數據庫服務器
1.2 配置manager56主機 無密碼ssh登錄 所有數據節點主機
[root@56 ~]#ssh-keygen //創建密鑰對
[root@56 ~]#for i in 192.168.4.{51..55}; do ssh-copy-id $i; done
二、安裝軟件包
2.1 在所有主機(51-56)上安裝perl軟件包(在此我以51為例)
[root@51 ]# yum -y install perl-*.rpm
2.2 在所有數據節點主機上[51-56]安裝mha_node軟件包
[root@51 mha-soft-student]# yum -y install perl-DBD-mysql perl-DBI
[root@56 mha-soft-student]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
2.3 只在管理 "主機56" 上安裝mha_manager軟件包
[root@56 mha-soft-student]# yum -y install perl-ExtUtils- perl-CPAN
2.4 [root@56 mha-soft-student]# tar -zxvf mha4mysql-manager-0.56.tar.gz
[root@56 mha-soft-student]# cd mha4mysql-manager-0.56/
[root@56 mha4mysql-manager-0.56]# perl Makefile.PL
[root@56 mha4mysql-manager-0.56]# make && make install
三、配置主從同步,要求如下:
51 主庫 開半同步復制
52 從庫(備用主庫) 開半同步復制
53 從庫(備用主庫) 開半同步復制
54 從庫 不做備用主庫所以不用開半同步復制
55 從庫 不做備用主庫所以不用開半同步復制
56 管理主機
3.1 配置主庫51
[root@51 ~]# vim /etc/my.cnf
[mysqld]
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
server_id=51
log-bin=master51
binlog-format="mixed"
:wq
[root@51 ~]# systemctl restart mysqld
[root@51 ~]# ls /var/lib/mysql/master51.*
/var/lib/mysql/master51.000001 /var/lib/mysql/master51.index
[root@51 ~]# mysql -uroot -p123456
mysql> grant replication slave on . to harry@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
mysql> set global relay_log_purge=off; // 不自動刪除本機的中繼日誌文件
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 438 | | | |
+-----------------+----------+--------------+------------------+-------------------+
mysql> quit
3.2、備用master52的配置
[root@52 ~]# vim /etc/my.cnf
[mysqld]
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
server_id=52
log-bin=master52
binlog-format="mixed"
[root@52 ~]# ls /var/lib/mysql/master52.*
/var/lib/mysql/master52.000001 /var/lib/mysql/master52.index
[root@52 ~]# mysql -uroot -p123456
mysql> grant replication slave on . to harry@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
mysql> set global relay_log_purge=off; // 不自動刪除本機的中繼日誌文件
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host="192.168.4.51", \
-> master_user="harry",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=438;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: harry
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 438
Relay_Log_File: 52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.3、備用master53的配置
[root@53 ~]# vim /etc/my.cnf
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
server_id=53
log-bin=master53
binlog-format="mixed"
[root@53 ~]# systemctl restart mysqld
[root@53 ~]# ls /var/lib/mysql/master53.*
/var/lib/mysql/master53.000001 /var/lib/mysql/master53.index
[root@53 ~]# mysql -uroot -p123456
mysql> grant replication slave on . to harry@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
mysql> set global relay_log_purge=off; // 不自動刪除本機的中繼日誌文件
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host="192.168.4.51", \
-> master_user="harry",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=438;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: harry
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 438
Relay_Log_File: 53-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
mysql> quit;
3.4、配置從服務器54
[root@54 ~]# vim /etc/my.cnf
[mysqld]
server_id=54
:wq
[root@54 ~]# systemctl restart mysqld
mysql> change master to master_host="192.168.4.51", \
-> master_user="harry",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=438;
Query OK, 0 rows affected, 2 warnings (0.13 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: harry
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 438
Relay_Log_File: 54-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.5、配置從服務器55
[root@55 ~]# vim /etc/my.cnf
server_id=55
:wq
[root@55 ~]# systemctl restart mysqld
[root@55 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51", \
-> master_user="harry",
-> master_password="123456",
-> master_log_file="master51.000001",
-> master_log_pos=438;
Query OK, 0 rows affected, 2 warnings (0.04 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.4.51
Master_User: harry
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 438
Relay_Log_File: 55-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.6.2在客戶端測試主從同步配置
3.6.1 在主庫51上添加訪問數據的授權用戶
[root@51 ~]# mysql -uroot -p123456
mysql> grant all on gamedb.* to admin@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create database gamedb;
Query OK, 1 row affected (0.06 sec)
mysql> create table gamedb.t1 (id int);
mysql> insert into gamedb.t1 values(222);
Query OK, 1 row affected (0.03 sec)
mysql> insert into gamedb.t1 values(222);
Query OK, 1 row affected (0.04 sec)
然後在從庫上查看
3.6.3 在客戶端使用授權用戶連接從庫52-55,也能看到同樣的庫表及記錄
[root@52 ~]# mysql -uroot -p123456
mysql> select * from gamedb.t1;
+------+
| id |
+------+
| 222 |
| 222 |
+------+
四、編輯管理主機(56)主配置文件
[root@56 mha-soft-student]# cp mha4mysql-manager-0.56/bin/* /usr/local/bin/
[root@56 mha-soft-student]# mkdir /etc/mha_manager/
[root@56 mha-soft-student]# cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha_manager/
[root@56 ]# vim /etc/mha_manager/app1.cnf
[server default]
manager_workdir=/etc/mha_manager
manager_log=/etc/mha_manager.log
master_ip_failover_script=/usr/local/bin/master_ip_failover
ssh_user=root
ssh_port=22
repl_user=harry //主從同步用戶名
repl_password=123456 //主從同步密碼
user=root //連接數據庫用戶名
password=123456 //連接數據庫密碼
[server1]
hostname=192.168.4.51
candidate_master=1 // 設置為候選 master
port=3306
[server2]
hostname=192.168.4.52
candidate_master=1
port=3306
[server3]
hostname=192.168.4.53
candidate_master=1
port=3306
[server4]
hostname=192.168.4.54
no_master=1 // 不競選 master
port=3306
[server5]
hostname=192.168.4.55
no_master=1
port=3306
在管理節點上 通過 master_check_ssh 做 ssh 檢查
[root@56 mha_manager]# masterha_check_ssh --conf /etc/mha_manager/app1.cnf
測試主從同步狀態
**檢查主從同步時把app1.cnf文件中的此配置項#master_ip_failover_script=/usr/local/bin/master_ip_failover註釋掉,不然檢查失敗。
[root@56 mha_manager]# vim /etc/mha_manager/app1.cnf
#master_ip_failover_script=/usr/local/bin/master_ip_failover
[root@56 ~]# masterha_check_repl --conf=/etc/mha_manager/app1.cnf
四、測試高可用集群配置
4.1 在主庫上手動部署vip 地址 192.168.4.100
[root@51 ~]# ifconfig eth0:1 192.168.4.100/24
[root@51 ~]# ifconfig eth0:1
4.2 修改故障切換腳本 指定vip地址的部署信息
[root@56 ~]# vim /etc/mha_manager/master_ip_failover
my $vip = ‘192.168.4.100/24‘; # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
:wq
4.3 啟動管理服務,並查看服務狀態
開啟 MHA Manager 監控
– masterha_manager // 啟動命令
– --remove_dead_master_conf // 不在 app1.cnf 文件
裏刪除宕機的主庫的信息
– --ignore_last_failover // 忽略 .health 文件
[root@56 ~]# masterha_manager --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover
查看狀態 : masterha_check_status
[root@56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
app1 (pid:9399) is running(0:PING_OK), master:192.168.4.51
停止服務 : masterha_stop
[root@host56 bin]# masterha_stop --conf=/etc/mha_manager/app1.cnf
Stopped app1 successfully.
4.4 測試故障轉移
在主庫51 上執行 ]# shutdown -h now
4.5 在管理主機上查看服務狀態(如果服務停止了,手動啟動一下服務,再查看狀態)
[root@56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
app1 (pid:17507) is running(0:PING_OK), master:192.168.4.52
4.6 在52 本機查看是否獲取vip地址
[root@52 ~]# ip addr show | grep 192.168.4
inet 192.168.4.52/24 brd 192.168.4.255 scope global eth0
inet 192.168.4.100/24 brd 192.168.4.255 scope global secondary eth0:1
4.6 客戶端連接vip地址 ,訪問數據服務
[root@58]#mysql -h192.168.4.100 -uwebadmin -p123456
查看 VIP 地址
當主庫服務器宕機後,在備用 1 主庫數據庫服務器上查看 VIP 地址
[root@server0 ~]# ip addr show | grep vip 地址
手動配置 vip 地址
[root@server0 ~]# ifconfig ethX:1 x.x.x.x/32
mysql MHA集群的搭建