標籤:mysql mha keepalived
在上一篇完成了Mysql的半同步配置。
連結:在Centos7玩轉Mysql半同步和keepalived+MHA(一),本篇則繼續完成MHA+keepalived的配置。
| 角色 |
IP |
OS |
MySQL |
MHA |
| mha-manager |
192.168.1.92 |
CentOS 7 |
無 |
mha-manager mha-node |
| mysql-master |
192.168.1.151 |
CentOS 7 |
mysql-master |
mha-node |
| mysql-slave01 |
192.168.1.152 |
CentOS 7 |
mysql-slave |
mha-node |
| mysql-slave02 |
192.168.1.153 |
CentOS 7 |
mysql-slave |
mha-node |
在所有的伺服器上面安裝mha-node。
安裝依賴
yum install perl-DBD-MySQL perl-Module-Install cpan perl-DBI -y
從git上面拉取mha-node安裝包
mkdir /root/softcd /root/softgit clone https://github.com/kevin-hao/mha-node.gitcd mha-node/perl Makefile.PLmake && make install
再強調一遍,四台伺服器全部要安裝node。
下面配置MHA manager
安裝依賴
yum install -y perl perl-Config-Tiny perl-Email-Date-Forma perl-Log-Dispatch perl-MIME-Liteperl-MIME-Types perl-Mail-Sender perl-Mail-Sendmail perl-MailTools perl-Parallel-ForkManagerperl-Params-Validate perl-Time-HiRes perl-TimeDate
從git上面拉取mha-manager安裝包
cd /root/softgit clone cd mha-managerperl Makefile.PLmake && make install
配置hosts檔案
vim /etc/hosts192.168.1.92 mha-manager192.168.1.151 mysql-master192.168.1.152 mysql-slave01192.168.1.153 mysql-slave02 scp /etc/hosts [email protected]:/etc/ scp /etc/hosts [email protected]:/etc/ scp /etc/hosts [email protected]:/etc/
在主庫mysql和參與選舉的從庫中配置mha監控使用者和repl同步處理的使用者,不參與選舉的從庫可以不用配置。
mysql> grant all privileges on *.* to ‘mha‘@‘192.168.1.%‘ identified by ‘123456‘;mysql> grant replication slave on *.* to ‘repl‘@‘192.168.1.%‘ identified by ‘repl‘;mysql> flush privileges;
注意:關於參與選舉的從庫也要配置這兩個使用者的原因在於主庫宕機的時候,從庫要提升為主庫,repl是繼續和剩下的從庫保持主從關係,mha監控使用者是為了,mha可以繼續監視,從而可以讓修複了的原主庫作為新的備庫上線。
規範MHA目錄
mkdir -p /application/mha/confmkdir -p /application/mha/workstatus/app1mkdir -p /application/mha/logscp /root/soft/mha-manager/samples/conf/* /application/mha/conf/mkdir -p /application/mha/workstatus/app1cd /application/mha/conf/cp app1.cnf app1.cnf.ori
接下來這個檔案很重要,關係到能不能啟動mha。
vim app1.cnf
檔案內容
[server default]port=3306user=mhapassword=123456repl_user=replrepl_password=replremote_workdir=/var/log/mha/app1master_binlog_dir=/var/lib/mysql #這個是Master-mysql主庫的binlog目錄別以為是本地目錄。manager_workdir=/application/mha/workstatus/app1manager_log=/application/mha/logs/app1.log[server1]hostname=mysql-master[server2]hostname=mysql-slave01candidate_master=1 #參與主庫選舉check_repl_delay=0 #預設情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢複需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master[server3]hostname=mysql-slave02no_master=1 #設定之後不參與切換主,並且不需要在此從庫配置repl,否則需要配置。
配置全域設定檔
cp masterha_default.cnf masterha_default.cnf.oldvim masterha_default.cnf[server default]log-level=debugcheck_repl_delay=1check_repl_filter=1ping_interval=5ping_type=CONNECT設定relay log清除方式(在每個slave上)
在所有的salve上面配置relay log清除方式
mysql> set global relay_log_purge=0;
在crontab添加自動清理指令碼樣本如下
vim /etc/cron.d/purge_relay_logs0 4 * * * /usr/bin/purge_relay_logs --user=root --password=xxx --disable_relay_log_purge --port=3306 --workdir=/var/lib/mysql/ >>/application/mha/logs/purge_relay_logs.log 2>&1
檢查配置分別用masterha_check_ssh和masterha_check_repl
masterha_check_ssh --conf=/application/mha/conf/app1.cnf
看到[info] All SSH connection tests passed successfully.字樣代表ssh是通的。
masterha_check_repl --conf=/application/mha/conf/app1.cnf
看到MySQL Replication Health is OK.字樣代表資料庫之間同步是沒有問題的。
啟動
nohup masterha_manager --conf=/application/mha/conf/app1.cnf --remove_dead_master_conf --ignore_last_failover </dev/null 2>&1 &
啟動參數解釋:
–remove_dead_master_conf 該參數代表當發生主從切換後,老的主庫的ip將會從設定檔中移除。
–ignore_last_failover 在預設情況下,如果MHA檢測到連續發生宕機,且兩次宕機間隔不足8小時的話,則不會進行Failover,之所以這樣限制是為了避免ping-pong效應。該參數代表忽略上次MHA觸發切換產生的檔案,預設情況下,MHA發生切換後會在日誌目錄,本樣本會在/application/mha/workstatus/app1產生app1.failover.complete檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換,除非在切換後刪除該檔案,為了方便,這裡設定為–ignore_last_failover。
檢查MHA manager狀態
masterha_check_status --conf=/application/mha/conf/app1.cnfapp1 (pid:43568) is running(0:PING_OK), master:mysql-master
測試
到151上面關掉資料庫,在92也就是mha-manager上面tail -f /application/mha/logs/app1.log可以查看切換日誌
切換完成後到153的mysql上面使用show slave status\G;查看master是不是已經變成了152。
關於測試的一些說明,在測試過程中如果想驗證資料是否有丟失,可以採用sysbench進行壓測,通過安裝percona-toolkit的pt-table-checksum來檢查資料一致性,如果發現有不一致的資料,可以使用pt-table-sync 工具來修複。
關於二次三次測試
當主庫宕了之後,修複好之後,在151上面啟動。在mha-manager伺服器上面使用
grep -i "All other slaves should start" manager.log
(不需要鎖表)或者登陸到新主庫152上面show master status;(需要鎖表和解鎖)查看位置和binlog檔案資訊。
在151上面做change master操作
change master to master_host=‘192.168.1.152‘,master_user=‘repl‘,master_password=‘repl‘,master_port=3306,master_log_file=‘master-bin.00000X‘,master_log_pos=XXXX;
然後start slave;查看同步資訊show slave status\G;。
回到mha-manager伺服器,停掉mha
masterha_stop --conf=/application/mha/conf/app1.cnf
然後編輯app1.cnf,由於運行是採用了–remove_dead_master_conf這個參數,發現server1不見了,添加進去,並把
candidate_master=1
check_repl_delay=0
加入到master下面,作為新主庫的從庫,並參與選舉。
然後啟動mha,就完成了一輪測試。
---------------------------分割線---------------------------------
下面配置keepalived,先停掉mha
masterha_stop --conf=/application/mha/conf/app1.cnf
在151和152上面安裝keepalived。
yum install -y gcc kernel-devel openssl-devel popt-develyum install -y keepalived
vim /etc/keepalived/keepalived.conf
內容如下:
! Configuration File for keepalivedglobal_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server smtp.126.com smtp_connect_timeout 30 router_id LVS_DEVEL}vrrp_script Monitor_mysql { script "/etc/keepalived/scripts/monitor_mysql.sh" interval 1 weight 2 }track_script { Monitor_mysql }vrrp_instance VI_1 { state BACKUP #主備都配置為BACKUP模式 interface eno16777736 #虛擬機器是這個,用ip addr查看自己網卡 virtual_router_id 51 #主備必須相同 priority 100 advert_int 1 authentication { auth_type PASS #主備必須相同 auth_pass 1111 #主備必須相同 } virtual_ipaddress { 192.168.1.150 #也可以配置多個虛擬IP #192.168.200.18 }}
配置監控mysql指令碼
注意:這裡採用的是其中一種關掉keepalived的方法,還可以通過配置MHA的master_ip_failover指令碼,指定keepalived相關設定,然後在app1.cnf裡面添加
master_ip_failover_script= /路徑/master_ip_failover來控制keepalived進程。
mkdir -p /etc/keepalived/scripts/vim /etc/keepalived/scripts/monitor_mysql.sh
內容如下:
#!/bin/bashMYSQL=mysqlMYSQL_HOST=127.0.0.1MYSQL_PORT=3306MYSQL_USER=rootMYSQL_PASSWORD=Www.vcolco.comCHECK_TIME=3#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0MYSQL_OK=1function check_mysql_helth (){$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show status;" >/dev/null 2>&1if [ $? = 0 ] ;then MYSQL_OK=1else MYSQL_OK=0fi return $MYSQL_OK}while [ $CHECK_TIME -ne 0 ]do let "CHECK_TIME -= 1" check_mysql_helthif [ $MYSQL_OK = 1 ] ; then CHECK_TIME=0 exit 0fiif [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]then pkill keepalivedexit 1fisleep 1done
啟動151和152的keepalived
systemctl start keepalived
在分別在151和152上面查看ip
ip a
發現優先順序高的151正在使用150這個VIP(虛IP),而152沒有。
測試keepalived可以使用pkill keepalived掉151的keepalived進程。然後去152上面使用ip a查看VIP是否漂移。
到此Mysql半同步+MHA+keepalived已經配置完成。
本文出自 “叼磚小書童” 部落格,請務必保留此出處http://newbye.blog.51cto.com/5197506/1893099
在Centos7玩轉Mysql半同步和keepalived+MHA(二)