一.軟件簡介
MHA是用prel編寫的一套非常流行和使用的MySQL高可用解決方案軟件,它的作用是保證MySQL主從復(fù)制集群中主庫的高可用性,同時保證整個集群的業(yè)務(wù)不受影響趴俘。MHA能夠在較短的時間內(nèi)實現(xiàn)自動故障檢測和故障轉(zhuǎn)移歇式,通常在10-30秒以內(nèi);在復(fù)制框架中,MHA能夠很好地解決復(fù)制過程中的數(shù)據(jù)一致性問題牙捉,由于不需要在現(xiàn)有的replication中添加額外的服務(wù)器竹揍,僅需要一個manager節(jié)點,而一個Manager能管理多套復(fù)制邪铲,所以能大大地節(jié)約服務(wù)器的數(shù)量;另外芬位,安裝簡單,無性能損耗带到,以及不需要修改現(xiàn)有的復(fù)制部署也是它的優(yōu)勢之處昧碉。
MHA還提供在線主庫切換的功能,能夠安全地切換當(dāng)前運行的主庫到一個新的主庫中(通過將從庫提升為主庫),大概0.5-2秒內(nèi)即可完成揽惹。
MHA由兩部分組成:MHA Manager(管理節(jié)點)和MHA Node(數(shù)據(jù)節(jié)點)被饿。MHA Manager可以獨立部署在一臺獨立的機器上管理多個Master-Slave集群,也可以部署在一臺Slave上搪搏。當(dāng)Master出現(xiàn)故障時狭握,它可以自動將最新數(shù)據(jù)的Slave提升為新的Master,然后將所有其他的Slave重新指向新的Master。整個故障轉(zhuǎn)移過程對應(yīng)用程序是完全透明的疯溺。在主從復(fù)制集群架構(gòu)中论颅,MHA方案能夠很好地解決主從復(fù)制宕機切換過程中業(yè)務(wù)持續(xù)服務(wù)和數(shù)據(jù)一致性的問題。
二.MHA架構(gòu)圖
三.工作流程
1)把宕機的master二進制日志保存下來囱嫩。
2)找到binlog位置點最新的slave恃疯。
3)在binlog位置點最新的slave上用relay log(差異日志)修復(fù)其它slave。
4)將宕機的master上保存下來的二進制日志恢復(fù)到含有最新位置點的slave上挠说。
5)將含有最新位置點binlog所在的slave提升為master澡谭。
6)將其它slave重新指向新提升的master,并開啟主從復(fù)制。
四.MHA工具介紹
MHA軟件由兩部分組成蛙奖,Manager工具包和Node工具包潘酗,具體的說明如下:
#下載tar包解壓后可以查看
Manager工具包主要包括以下幾個工具:
masterha_check_ssh #檢查MHA的ssh-key
masterha_check_repl #檢查主從復(fù)制情況
masterha_manger #啟動MHA
masterha_check_status #檢測MHA的運行狀態(tài)
masterha_master_monitor #檢測master是否宕機
masterha_master_switch #手動故障轉(zhuǎn)移
masterha_conf_host #手動添加server信息
masterha_secondary_check #建立TCP連接從遠程服務(wù)器
masterha_stop #停止MHA
Node工具包主要包括以下幾個工具:
save_binary_logs #保存宕機的master的binlog
apply_diff_relay_logs #識別relay log的差異
filter_mysqlbinlog #防止回滾事件
purge_relay_logs #清除中繼日志
MHA優(yōu)點總結(jié)
1)Masterfailover and slave promotion can be done very quickly
自動故障轉(zhuǎn)移快
2)Mastercrash does not result in data inconsistency
主庫崩潰不存在數(shù)據(jù)一致性問題
3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
不需要對當(dāng)前mysql環(huán)境做重大修改
4)Noneed to increase lots of servers
不需要添加額外的服務(wù)器(僅一臺manager就可管理上百個replication)
5)Noperformance penalty
性能優(yōu)秀,可工作在半同步復(fù)制和異步復(fù)制雁仲,當(dāng)監(jiān)控mysql狀態(tài)時仔夺,僅需要每隔N秒向master發(fā)送ping包(默認3秒),所以對性能無影響攒砖。你可以理解為MHA的性能和簡單的主從復(fù)制框架性能一樣缸兔。
6)Works with any storage engine
只要replication支持的存儲引擎,MHA都支持吹艇,不會局限于innodb
五.環(huán)經(jīng)準(zhǔn)備以及地址分配
主機名 | wanIP | lanIP | 角色 |
---|---|---|---|
db01 | 10.0.0.151 | 172.16.1.151 | 主庫,MHA客戶端 |
db02 | 10.0.0.152 | 172.16.1.152 | 從庫,MHA客戶端 |
db03 | 10.0.0.153 | 172.16.1.153 | 從庫,MHA客戶端 |
db04 | 10.0.0.154 | 172.16.1.154 | 從庫,MHA客戶端 |
MHA-manager | 10.0.0.152 | 172.16.1.152 | MHA服務(wù)端 |
六.基于GTID的MAH
傳統(tǒng)主從復(fù)制
1.主庫要開啟binlog惰蜜,從庫不用開啟binlog
2.主庫要有中從復(fù)制用戶,從庫不需要創(chuàng)建主從復(fù)制用戶
3.主庫server_id=5,從庫只要不等于5即可受神,從庫之間可以相同
基于MHA的主從復(fù)制
1.主庫要開啟binlog抛猖,從庫也要開啟binlog
2.主庫要創(chuàng)建主從復(fù)制用戶,從庫也必須創(chuàng)建主從復(fù)制用戶
3.主庫server_id=5鼻听,從庫只要不等于5即可财著,從庫之間必須不相同
從庫隨時會被提升為新的主庫
1.基于GTID的主從復(fù)制
#主庫配置
mysql> show variables like '%gtid%';
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| binlog_gtid_simple_recovery | OFF |
| enforce_gtid_consistency | OFF |## 開啟
| gtid_executed | |
| gtid_mode | OFF |## 開啟
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| simplified_binlog_gtid_recovery | OFF |
+---------------------------------+-----------+
[root@db01 data]# vim /etc/my.cnf
[mysqld]
gtid_mode=on
enforce_gtid_consistency
log-bin=mysql-bin
binlog_format=row
log-slave-updates
relay_log_purge = 0
skip_name_resolve
server_id=1 #剩余從庫配置需要修改server_id ,從庫server_id不能相同。
#需要配置log-slave-updates參數(shù)的場景
1.級聯(lián)復(fù)制
2.雙主+keepalived
3.gtid
[root@db01 data]# /etc/init.d/mysqld restart‘
#創(chuàng)建主從復(fù)制用戶
mysql> grant replication slave on *.* to rep@'%' identified by '123';
#從庫執(zhí)行change master
change master to
master_host='10.0.0.151', #剩余從庫需要只需修改ip
master_user='rep',
master_password='123',
master_auto_position=1;
#開啟主從復(fù)制
mysql> start slave;
#檢查主從復(fù)制狀態(tài)
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000004 | 191 | | | 6b898418-23ec-11ea-9271-000c29e98743:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
2.關(guān)閉所有數(shù)據(jù)庫自動清除relay log 的功能
- 主庫要關(guān)閉
- 從庫也要關(guān)閉
- 臨時+永久關(guān)閉
#臨時關(guān)閉自動清除relay log功能(所有庫)
mysql> set global relay_log_purge = 0;
#永久關(guān)閉自動清除relay log功能(所有庫)
[root@db01 data]# vim /etc/my.cnf
relay_log_purge = 0
注意:只需要登錄數(shù)據(jù)庫執(zhí)行臨時設(shè)置即可撑碴,my.cnf中已經(jīng)配置全局設(shè)置
3.從庫要設(shè)置為只讀 開啟read-only功能
- 主庫不開啟
- 從庫要開啟
- 臨時開啟
#臨時開啟只讀功能(所有從庫)
mysql> set global read_only=1;
4.部署MHA
下載mha軟件
mha官網(wǎng):https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
服務(wù)安裝
[root@db01 ~]# ll
-rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# ll
-rw-r--r-- 1 root root 87119 Dec 16 08:35 mha4mysql-manager-0.56-0.el6.noarch.rpm
-rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# ll
-rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db04 ~]# ll
-rw-r--r-- 1 root root 36326 Dec 16 08:35 mha4mysql-node-0.56-0.el6.noarch.rpm
# 安裝node
[root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db04 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
#安裝manager
[root@db02 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm
#創(chuàng)建MHA管理用戶(所有庫都要創(chuàng)建撑教。這里主庫創(chuàng)建即可以實現(xiàn)同步)
mysql> grant all on *.* to mha@'%' identified by 'mha';
#做命令的軟鏈接(默認的二進制安裝的路徑是在/usr/bin下,mha設(shè)置路徑與官方一致)
[root@db01 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db01 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
[root@db02 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db02 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
[root@db03 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db03 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
[root@db04 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db04 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
#創(chuàng)建密鑰對
[root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.151
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.152
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.153
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.154
----
[root@db02 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.151
[root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.152
[root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.153
[root@db02 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.154
----
[root@db03 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.151
[root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.152
[root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.153
[root@db03 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.154
----
[root@db04 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.151
[root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.152
[root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.153
[root@db04 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.154
# 寫MHA配置文件
[root@db02 ~]# mkdir /etc/mha
[root@db02 ~]# mkdir /etc/mha/app1
[root@db02 ~]# vim /etc/mha/app1.cnf
#全局配置醉拓,如果有多個集群可以配置單獨的default.cnf文件
[server default]
manager_log=/etc/mha/app1/manager.log
manager_workdir=/etc/mha/app1
master_binlog_dir=/application/mysql/data #路徑不一致的服務(wù)可以對應(yīng)配置在對應(yīng)的標(biāo)簽位置
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=rep
ssh_user=root
ssh_port=22
[server1]
hostname=10.0.0.151
port=3306
#master_binlog_dir=/usr/local/mysql/data #舉例說明伟姐,沒有不一致的情況可以忽略。
[server2]
#candidate_master=1
#check_repl_delay=0
hostname=10.0.0.152
port=3306
[server3]
hostname=10.0.0.153
port=3306
[server4]
hostname=10.0.0.154
port=3306
## 啟動前測試
[root@db02 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Mon Dec 16 12:12:11 2019 - [info] All SSH connection tests passed successfully.
[root@db02 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
#啟動MHA
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
#檢測MHA啟動狀態(tài)
[root@db02 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:121442) is running(0:PING_OK), master:10.0.0.151
#停止MHA
[root@db02 ~]# masterha_stop --conf=/etc/mha/app1.cnf
###如果條件允許可以將MHA服務(wù)單獨安裝在一臺服務(wù)器,安裝步驟如下:
單獨安裝的服務(wù)器不需要安裝mysql服務(wù)端廉嚼,只需要安裝mysql的客戶端玫镐。
1)安裝node
[root@db05 ~]# yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
2)安裝manager
[root@db05 ~]# yum -y localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm
3) 創(chuàng)建MHA管理用戶(所有庫都要創(chuàng)建。這里主庫創(chuàng)建即可以實現(xiàn)同步)
mysql> grant all on *.* to mha@'%' identified by 'mha';
4)做命令的軟鏈接(默認的二進制安裝的路徑是在/usr/bin下怠噪,mha設(shè)置路徑與官方一致)
[root@db05 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db05 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql
5)創(chuàng)建密鑰對
[root@db05 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db05 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.151
[root@db05 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.152
[root@db05 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.153
[root@db05 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 10.0.0.154
# 寫MHA配置文件
[root@db05 ~]# mkdir /etc/mha
[root@db05 ~]# vim /etc/mha/app1.cnf
#全局配置恐似,如果有多個集群可以配置單獨的default.cnf文件
[server default]
manager_log=/etc/mha/app1/manager.log
manager_workdir=/etc/mha/app1
master_binlog_dir=/application/mysql/data #路徑不一致的服務(wù)可以對應(yīng)配置在對應(yīng)的標(biāo)簽位置
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=rep
ssh_user=root
ssh_port=22
[server1]
hostname=10.0.0.151
port=3306
#master_binlog_dir=/usr/local/mysql/data #舉例說明,沒有不一致的情況可以忽略傍念。
[server2]
#candidate_master=1
#check_repl_delay=0
hostname=10.0.0.152
port=3306
[server3]
hostname=10.0.0.153
port=3306
[server4]
hostname=10.0.0.154
port=3306
## 啟動前測試
[root@db05 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Mon Dec 16 12:12:11 2019 - [info] All SSH connection tests passed successfully.
[root@db05 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
#啟動MHA
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
#檢測MHA啟動狀態(tài)
[root@db02 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:121442) is running(0:PING_OK), master:10.0.0.151
MHA啟動命令詳解
#后臺管理進程
nohup
#MHA啟動命令腳本
masterha_manager
#指定配置文件
--conf=/etc/mha/app1.cnf
#從配置文件中矫夷,移除宕機的主庫信息
--remove_dead_master_conf
#忽略最后一次切換
--ignore_last_failover
#MHA工作機制:在MHA做完一次切換后,會在工作目錄(/etc/mha/app1)中憋槐,會生成`app1.failover.complete`,可以理解是鎖文件双藕,8小時之內(nèi),不會做第二次切換阳仔。另外忧陪,每次切換都會自動殺死服務(wù)進程并且清空日志,所以需要在宕機恢復(fù)中注意操作的順序。
MHA配置文件詳解
#這里并沒有配置所有的參數(shù)嘶摊,后期可自行根據(jù)需要添加
[server default]
#設(shè)置manager的工作目錄
manager_workdir=/etc/mha/app1
#設(shè)置manager的日志
manager_log=/etc/mha/app1/manager.log
#設(shè)置master 保存binlog的位置延蟹,以便MHA可以找到master的日志,我這里的也就是mysql的數(shù)據(jù)目錄
master_binlog_dir=/application/mysql/data/
#設(shè)置自動failover時候的切換腳本
master_ip_failover_script= /usr/local/bin/master_ip_failover
#設(shè)置手動切換時候的切換腳本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
#設(shè)置mysql中root用戶的密碼叶堆,這個密碼是前文中創(chuàng)建監(jiān)控用戶的那個密碼
password=123
#設(shè)置監(jiān)控用戶root
user=root
#設(shè)置監(jiān)控主庫阱飘,發(fā)送ping包的時間間隔,嘗試三次沒有回應(yīng)的時候自動進行failover
ping_interval=1
#設(shè)置遠端mysql在發(fā)生切換時binlog的保存位置
remote_workdir=/tmp
#設(shè)置復(fù)制用戶的密碼
repl_password=123
#設(shè)置復(fù)制環(huán)境中的復(fù)制用戶名
repl_user=rep
#設(shè)置發(fā)生切換后發(fā)送的報警的腳本
report_script=/usr/local/send_report
#一旦MHA到server02的監(jiān)控之間出現(xiàn)問題虱颗,MHA Manager將會嘗試從server03登錄到server02
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_port=3306
#設(shè)置故障發(fā)生后關(guān)閉故障主機腳本(該腳本的主要作用是關(guān)閉主機放在發(fā)生腦裂,這里沒有使用)
shutdown_script=""
#設(shè)置ssh的登錄用戶名
ssh_user=root
[server1]
hostname=10.0.0.151
port=3306
[server2]
hostname=10.0.0.152
port=3306
#設(shè)置為候選master沥匈,如果設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會將此從庫提升為主庫忘渔,即使這個主庫不是集群中事件最新的slave高帖。
candidate_master=1
#默認情況下如果一個slave落后master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master辨萍,因為對于這個slave的恢復(fù)需要花費很長時間棋恼,通過設(shè)置check_repl_delay=0,MHA觸發(fā)切換在選擇一個新的master的時候?qū)雎詮?fù)制延時,這個參數(shù)對于設(shè)置了candidate_master=1的主機非常有用锈玉,因為這個候選主在切換的過程中一定是新的master
check_repl_delay=0
5.MHA集群恢復(fù)
1.修復(fù)宕機的主庫,啟動數(shù)據(jù)庫
[root@db01 ~]# /etc/init.d/mysqld start
2.在日志中义起,找到change master語句
[root@db02 ~]# grep -i 'change master to' /etc/mha/app1/manager.log
3.拿著change master語句在舊主庫中執(zhí)行
CHANGE MASTER TO MASTER_HOST='10.0.0.152', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123';
4.開啟主從復(fù)制
start slave;
5.修復(fù)MHA配置文件
[server_1]
hostname=10.0.0.151
port=3306
[server_2]
hostname=10.0.0.152
port=3306
[server_3]
hostname=10.0.0.153
port=3306
[server_4]
hostname=10.0.0.154
port=3306
6.啟動MHA
[root@db02 mha]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
腳本修復(fù)MAH
#!/bin/bash
change=`ssh 10.0.0.152 "grep -i 'change master to' /etc/mha/app1/manager.log"|awk -F: '{print $NF}'|sed
's#xxx#123#g'`
/etc/init.d/mysqld start
mysql -e "$change start slave;"
ssh 10.0.0.152 '\cp /etc/mha/app1.cnf.ori /etc/mha/app1.cnf'
#腳本執(zhí)行完成后手動啟動MHA服務(wù)
[root@db02 mha]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
注意:不建議將MHA的啟動也寫入腳本中拉背,這樣會清空日志記錄
七.傳統(tǒng)主從復(fù)制MHA
注意:這里基于之前的環(huán)境進行修改既可完成轉(zhuǎn)換
1.停止MHA
[root@db02 ~]# masterha_stop --conf=/etc/mha/app1.cnf
2.取消所有從庫的身份
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> reset slave all;
Query OK, 0 rows affected (0.01 sec)
3.注釋GTID相關(guān)參數(shù)
#主庫從庫都需要修改
[mysqld]
#gtid_mode=ON
#enforce_gtid_consistency
#log-slave-updates
4.重啟數(shù)據(jù)庫
[root@db04 ~]# /etc/init.d/mysqld restart
5.記錄主庫的binlog和position
mysql> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000008 | 120 |
+------------------+----------+
6.在從庫上執(zhí)行,change master語句
change master to
master_host='10.0.0.151',
master_user='rep',
master_password='123',
master_log_file='mysql-bin.000008',
master_log_pos=120;
7.開啟主從復(fù)制
mysql> start slave;
8.查看主從復(fù)制狀態(tài)
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
9.啟動MHA
[root@db02 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
10.查看MHA狀態(tài)
[root@db02 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:33304) is running(0:PING_OK), master:10.0.0.151
八.MHA選主
(1) 如果判斷從庫(position或者GTID),數(shù)據(jù)有差異,最接近于Master的slave,成為備選主默终。
(2) 如果判斷從庫(position或者GTID)數(shù)據(jù)一致,MHA切換在數(shù)據(jù)一致的情況下椅棺,默認查找配置文件中的server標(biāo)簽,server標(biāo)簽越小齐蔽,優(yōu)先級越高两疚。
(3) 如果設(shè)定有權(quán)重(candidate_master=1),按照權(quán)重強制指定備選主。
1. 默認情況下如果一個slave落后master 100M的relay logs的話含滴,即使有權(quán)重,也會失效诱渤。
2. 如果check_repl_delay=0的化,即使落后很多日志,也強制選擇其為備選主。
標(biāo)簽配置如下:
[server4]
hostname=10.0.0.154
port=3306
candidate_master=1
check_repl_delay=0
注意:生產(chǎn)場景中不建議這樣使用谈况,relay logs相差太大也就意味著丟失數(shù)據(jù)勺美。
九. VIP管理
1.管理vip的方式:keepalived
使用keppalived方式實現(xiàn)vip管理存在很多問題,并且費用較高碑韵。
-
1.如何保證赡茸,一定從151切到153
- 在MHA的配置文件中,加入候選主庫的參數(shù)
candidate_master=1 check_repl_delay=0
-
2.如何保證53一定是數(shù)據(jù)最新的從庫
- 半同步
-
3.影響主庫性能祝闻,超時就恢復(fù)成異步復(fù)制
- 買配置高的機器(磁盤性能高占卧,內(nèi)存/cpu:1核2G、2核4G、4核8G)
- 半同步復(fù)制的從庫华蜒,不提供服務(wù)
- 費用高舷蒲,花錢多
2.管理vip的方式:MHA自帶腳本
說明:如果條件允許建議單獨使用管理節(jié)點,方便讀寫分離以及處理binlog保存的問題友多。
#自帶管理腳本牲平?(tar包解壓之后可以查看)
[root@db05 ~/mha4mysql-manager-0.56/samples/scripts]# ll
total 32
-rwxr-xr-x 1 4984 users 3648 Apr 1 2014 master_ip_failover #vip管理腳本
-rwxr-xr-x 1 4984 users 9870 Apr 1 2014 master_ip_online_change
-rwxr-xr-x 1 4984 users 11867 Apr 1 2014 power_manager
-rwxr-xr-x 1 4984 users 1360 Apr 1 2014 send_report
1.上傳管理腳本
[root@db05 /etc/mha/app1]# ll
-rwxr-xr-x 1 root root 2253 Dec 31 11:03 master_ip_failover
2.添加vip
#在該行下面添加如下四行
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
...............
my $vip = '10.0.0.157/24';
my $key = '0';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
3.處理權(quán)限問題與格式問題
[root@db05 ~]# chmod +x /etc/mha/app1/master_ip_failover
[root@db05 ~]# yum install -y dos2unix
[root@db05 ~]# dos2unix /etc/mha/app1/master_ip_failover
dos2unix: converting file /etc/mha/app1/master_ip_failover to Unix format ...
4.修改配置文件
[root@db05 /etc/mha]# vim app1.cnf
[server default]
master_ip_failover_script=/etc/mha/app1/master_ip_failover
5.停止MHA
[root@db05 ~]# masterha_stop --conf=/etc/mha/app1.cnf
6.啟動MHA
[root@db05 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 &
7.手動添加vip
[root@db01 ~]# ifconfig eth0:0 10.0.0.157/24
[root@db01 ~]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:93:da:62 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.151/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.157/24 brd 10.0.0.255 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe93:da62/64 scope link
valid_lft forever preferred_lft forever
3.MHA VIP管理切換測試
#模擬程序連接誒數(shù)據(jù)庫vip
[root@db05 ~]# vim insert.sh
#!/bin/bash
num=1
while true;do
mysql -uroot -p123 -h10.0.0.157 -e 'insert into rep.rep values('"$num"');commit;'
let num++
sleep 1
done
#啟動程序
[root@db05 ~]# sh a.sh
#關(guān)閉db02和db03的IO線程,之后再開啟域滥,實現(xiàn)漂移至db04
mysql> stop slave io_thread;
MHA VIP管理實現(xiàn)自動化恢復(fù)集群
#每臺機器上放recover
#!/bin/bash
#old_master=`ssh 10.0.0.52 "sed -nr 's#^Master (.*)\(.*!$#\2#gp' /etc/mha/app1/manager.log"`
change=`ssh 10.0.0.52 "grep -i 'change master to' /etc/mha/app1/manager.log"|awk -F: '{print $NF}'|sed 's#xxx#123#g'`
/etc/init.d/mysqld start
mysql -uroot -p123 -e "$change start slave;"
ssh 10.0.0.155'\cp /etc/mha/app1.cnf.ori /etc/mha/app1.cnf'
#引用recover腳本配置
[root@db05 ~]# vim /etc/mha/app1/master_ip_failover
......
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
`ssh $ssh_user\@$orig_master_host \" /bin/sh /server/scripts/recovery_mha.sh \"`;
}
......
MHA binlog server
說明:mha高可用存在兩個問題:1.relaylog自動清除纵柿。2.binlog保存問題,如果出現(xiàn)斷電启绰,斷網(wǎng)昂儒,主節(jié)點binlog日志如何實時保存的問題。
之前已經(jīng)設(shè)置了禁止relaylog自動清除委可,這里就來解決binlog保存的問題渊跋。
#添加一個binlog server
[root@db05 ~]# vim /etc/mha/app1.cnf
....
[binlog1]
no_master=1
hostname=10.0.0.155
master_binlog_dir=/data/mysql/binlog/
#創(chuàng)建實時備份binlog的目錄
[root@db05 ~]# mkdir /data/mysql/binlog/ -p
#實時拉取binlog
[root@db05 ~]# cd /data/mysql/binlog/
[root@db03 binlog]# mysqlbinlog -R --host=10.0.0.157 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
total 4
-rw-r----- 1 root root 120 Dec 31 18:25 mysql-bin.000001
十.MySQL中間件Atlas
Atlas簡介
Atlas是由 Qihoo 360公司W(wǎng)eb平臺部基礎(chǔ)架構(gòu)團隊開發(fā)維護的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上着倾,修改了大量bug拾酝,添加了很多功能特性。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上卡者,修改了大量bug蒿囤,添加了很多功能特性。
讀寫分離中間件產(chǎn)品
1.Atlas
2.mysql-proxy(官方)
3.mycat
Atlas主要功能
- 1.讀寫分離
- 2.從庫負載均衡
- 3.IP過濾
- 4.自動分表
- 5.DBA可平滑上下線DB
- 6.自動摘除宕機的DB
相對于官方的優(yōu)勢
- 1.將主流程中所有Lua代碼用C重寫崇决,Lua僅用于管理接口
- 2.重寫網(wǎng)絡(luò)模型材诽、線程模型
- 3.實現(xiàn)了真正意義上的連接池
- 4.優(yōu)化了鎖機制,性能提高數(shù)十倍
Atlas安裝和配置
官方提供的Atlas有兩種:
1)Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
2)Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm
這里我們只需要下載普通的即可恒傻。
#下載安裝二進制包
[root@db05 ~]# wget httpss://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
#安裝
[root@db05 ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:Atlas-2.2.1-1 ################################# [100%]
Atlas配置文件說明
[root@db05 /usr/local/mysql-proxy]# ll
total 0
drwxr-xr-x 2 root root 75 Dec 18 11:38 bin #工具命令
drwxr-xr-x 2 root root 22 Dec 18 11:43 conf #配置文件
drwxr-xr-x 3 root root 331 Dec 18 11:38 lib #庫文件
drwxr-xr-x 2 root root 6 Dec 17 2014 log #日志文件
編輯配置文件
說明:應(yīng)用服務(wù)默認使用連接數(shù)據(jù)庫的端口為3306,這里就需要將集群的數(shù)據(jù)庫的端口統(tǒng)一改為3307或者其他端口脸侥,Atlas的工作端口應(yīng)使用3306。之前的配置均為3306,這里需要自行修改后綁定端口盈厘,重新建立主從關(guān)系進行使用睁枕。
#密碼加密
[root@db05 /usr/local/mysql-proxy]# cd bin/
[root@db05 /usr/local/mysql-proxy/bin]# ll
total 44
-rwxr-xr-x 1 root root 9696 Dec 17 2014 encrypt
-rwxr-xr-x 1 root root 23564 Dec 17 2014 mysql-proxy
-rwxr-xr-x 1 root root 1552 Dec 17 2014 mysql-proxyd
-rw-r--r-- 1 root root 6 Dec 17 2014 VERSION
[root@db05 /usr/local/mysql-proxy/bin]# ./encrypt 123
3yb5jEku5h4=
[root@db05 /usr/local/mysql-proxy/bin]# ./encrypt mha
O2jBXONX098=
#配置文件配置如下
[root@db05 ~]# vim /usr/local/mysql-proxy/conf/test.cnf #配置Atlas多實例,啟動多個配置文件即可
[mysql-proxy]
#帶#號的為非必需的配置項目
#管理接口的用戶名
admin-username = user
#管理接口的密碼
admin-password = pwd
#Atlas后端連接的MySQL主庫的IP和端口扑庞,可設(shè)置多項譬重,用逗號分隔
proxy-backend-addresses = 10.0.0.157:3307 #注意:一般使用直接配置vip地址。
#Atlas后端連接的MySQL從庫的IP和端口罐氨,@后面的數(shù)字代表權(quán)重臀规,用來作負載均衡,若省略則默認為1栅隐,可設(shè)置多項塔嬉,用逗號分隔
proxy-read-only-backend-addresses = 10.0.0.151:3307,10.0.0.153:3307,10.0.0.154:3307
#用戶名與其對應(yīng)的加密過的MySQL密碼玩徊,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2為示例谨究,將其替換為你的MySQL的用戶名和加密密碼恩袱!
pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=
#設(shè)置Atlas的運行方式,設(shè)為true時為守護進程方式胶哲,設(shè)為false時為前臺方式畔塔,一般開發(fā)調(diào)試時設(shè)為false,線上運行時設(shè)為true,true后面不能有空格鸯屿。
daemon = true
keepalive = true
#工作線程數(shù)澈吨,對Atlas的性能有很大影響,可根據(jù)情況適當(dāng)設(shè)置
event-threads = 8
#日志級別寄摆,分為message谅辣、warning、critical婶恼、error校镐、debug五個級別
log-level = error
#日志存放的路徑
log-path = /usr/local/mysql-proxy/log
#SQL日志的開關(guān)专钉,可設(shè)置為OFF脾歇、ON午衰、REALTIME,OFF代表不記錄SQL日志检痰,ON代表記錄SQL日志包归,REALTIME代表記錄SQL日志且實時寫入磁盤,默認為OFF
sql-log = ON
#慢日志輸出設(shè)置铅歼。當(dāng)設(shè)置了該參數(shù)時,則日志只輸出執(zhí)行時間超過sql-log-slow(單位:ms)的日志記錄换可。不設(shè)置該參數(shù)則輸出全部日志椎椰。
sql-log-slow = 10
#實例名稱,用于同一臺機器上多個Atlas實例間的區(qū)分
instance = test #注意:如果管理多實例沾鳄,請于配置文件保持一致
#Atlas監(jiān)聽的工作接口IP和端口
proxy-address = 0.0.0.0:3306 #如果管理多Atlars實例慨飘,配置端口不能沖突
#Atlas監(jiān)聽的管理接口IP和端口
admin-address = 0.0.0.0:2345 #如果管理多Atlas實例,配置端口不能沖突
#分表設(shè)置译荞,此例中person為庫名瓤的,mt為表名,id為分表字段吞歼,3為子表數(shù)量圈膏,可設(shè)置多項,以逗號分隔篙骡,若不分表則不需要設(shè)置該項
#tables = person.mt.id.3
#默認字符集稽坤,設(shè)置該項后客戶端不再需要執(zhí)行SET NAMES語句
charset = utf8
#允許連接Atlas的客戶端的IP丈甸,可以是精確IP,也可以是IP段尿褪,以逗號分隔睦擂,若不設(shè)置該項則允許所有IP連接,否則只允許列表中的IP連接
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP)杖玲,若有LVS且設(shè)置了client-ips則此項必須設(shè)置顿仇,否則可以不設(shè)置
#lvs-ips = 192.168.1.1
啟動Atlas
[root@db05 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
連接測試
#連接工作接口
[root@db01 ~]# mysql -urep -p123 -h10.0.0.155 -P3306
#連接管理接口
[root@db05 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
管理操作命令解釋
實際操作
mysql> select * from backends;
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.157:3307 | up | rw |
| 2 | 10.0.0.151:3307 | up | ro |
| 3 | 10.0.0.153:3307 | up | ro |
| 4 | 10.0.0.154:3307 | up | ro |
+-------------+-----------------+-------+------+
4 rows in set (0.00 sec)
mysql> set offline 3;
+-------------+-----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+---------+------+
| 3 | 10.0.0.153:3307 | offline | ro |
+-------------+-----------------+---------+------+
1 row in set (0.00 sec)
mysql> select * from backends;
+-------------+-----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+---------+------+
| 1 | 10.0.0.157:3307 | up | rw |
| 2 | 10.0.0.151:3307 | up | ro |
| 3 | 10.0.0.153:3307 | offline | ro |
| 4 | 10.0.0.154:3307 | up | ro |
+-------------+-----------------+---------+------+
4 rows in set (0.00 sec)
mysql> set online 3;
+-------------+-----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+---------+------+
| 3 | 10.0.0.153:3307 | unknown | ro |
+-------------+-----------------+---------+------+
1 row in set (0.00 sec)
mysql> set online 3;
+-------------+-----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+---------+------+
| 3 | 10.0.0.153:3307 | unknown | ro |
+-------------+-----------------+---------+------+
1 row in set (0.00 sec)
mysql> select * from backends;
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.157:3307 | up | rw |
| 2 | 10.0.0.151:3307 | up | ro |
| 3 | 10.0.0.153:3307 | up | ro |
| 4 | 10.0.0.154:3307 | up | ro |
+-------------+-----------------+-------+------+
4 rows in set (0.00 sec)
mysql> add master 10.0.0.152:3307;
Empty set (0.00 sec)
mysql> select * from backends;
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.157:3307 | up | rw |
| 2 | 10.0.0.152:3307 | up | rw |
| 3 | 10.0.0.153:3307 | up | ro |
| 4 | 10.0.0.154:3307 | up | ro |
| 5 | 10.0.0.151:3307 | up | ro |
+-------------+-----------------+-------+------+
5 rows in set (0.00 sec)
mysql> add master 10.0.0.152:3307;
mysql> select * from backends; #并未寫入配置文件
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.157:3307 | up | rw |
| 2 | 10.0.0.152:3307 | up | rw |
| 3 | 10.0.0.153:3307 | up | ro |
| 4 | 10.0.0.154:3307 | up | ro |
| 5 | 10.0.0.151:3307 | up | ro |
+-------------+-----------------+-------+------+
mysql> save config #寫入配置文件。