在上一篇完成了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/soft
cd /root/soft
git clone https://github.com/kevin-hao/mha-node.git
cd mha-node/
perl Makefile.PL
make && 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/soft
git clone
cd mha-manager
perl Makefile.PL
make && make install
配置hosts檔案
vim /etc/hosts
192.168.1.92 mha-manager
192.168.1.151 mysql-master
192.168.1.152 mysql-slave01
192.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/conf
mkdir -p /application/mha/workstatus/app1
mkdir -p /application/mha/logs
cp /root/soft/mha-manager/samples/conf/* /application/mha/conf/
mkdir -p /application/mha/workstatus/app1
cd /application/mha/conf/
cp app1.cnf app1.cnf.ori
接下來這個檔案很重要,關系到能不能啟動mha。
vim app1.cnf
檔案内容
[server default]
port=3306
user=mha
password=123456
repl_user=repl
repl_password=repl
remote_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql #這個是Master-mysql主庫的binlog目錄别以為是本地目錄。
manager_workdir=/application/mha/workstatus/app1
manager_log=/application/mha/logs/app1.log
[server1]
hostname=mysql-master
[server2]
hostname=mysql-slave01
candidate_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-slave02
no_master=1 #設定之後不參與切換主,并且不需要在此從庫配置repl,否則需要配置。
配置全局配置檔案
cp masterha_default.cnf masterha_default.cnf.old
vim masterha_default.cnf
[server default]
log-level=debug
check_repl_delay=1
check_repl_filter=1
ping_interval=5
ping_type=CONNECT
設定relay log清除方式(在每個slave上)
在所有的salve上面配置relay log清除方式
mysql> set global relay_log_purge=0;
在crontab添加自動清理腳本示例如下
vim /etc/cron.d/purge_relay_logs
0 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.cnf
app1 (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-devel
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
内容如下:
! Configuration File for keepalived
global_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/bash
MYSQL=mysql
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=Www.vcolco.com
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done
啟動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已經配置完成。
轉載于:https://blog.51cto.com/diaozhuan/1893099