Heartbeat MySQL雙主複製
一 基礎環境
節點
系統版本
MySQL版本
業務IP
心跳IP
Master01
CentOS 7.5
MySQL 5.6
192.168.88.100
192.168.77.100
Master02
CentOS 7.5
MySQL 5.6
192.168.88.101
192.168.77.101
VIP
192.168.88.88
關閉防火牆及SELinux;
配置NTP時鐘同步。
二 實際部署
2.1 安裝MySQL
1 [root@master1 ~]# yum list installed | grep mysql #查看是否存在其他MySQL組件
2 [root@master1 ~]# yum -y remove mysql* #為避免衝突引,卸載已存在的組件
3 [root@master1 ~]# yum -y install mariadb mariadb-server
4 [root@master1 ~]# systemctl start mariadb.service
注意:以上操作在Master02主機上也需要執行。
2.2 初始化MySQL
1 [root@master1 ~]# mysql_secure_installation #設置root密碼
2 [root@master1 ~]# systemctl restart mariadb.service
注意:以上操作在Master02主機上也需要執行。
2.3 master01 my.cf配置
1 [root@master1 ~]# vi /etc/my.cnf
2 [mysqld]
3 ……
4 server-id=1 #設置主伺服器master的id
5 log-bin=mysql-bin #配置二進位變更日誌命名格式
6 replicate-wild-ignore-table=mysql.%
7 replicate-wild-ignore-table=test.%
8 replicate-wild-ignore-table=information_schema.%
注意:
master開啟二進位日誌後默認記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的資料庫甚至指定的表的操作,具體在mysql配置文件的[mysqld]可添加修改如下選項:
方法一:
不同步哪些資料庫:
1 binlog-ignore-db = mysql
2 binlog-ignore-db = test
3 binlog-ignore-db = information_schema
只同步哪些資料庫,除此之外,其他不同步
1 binlog-do-db = mysqltest
方法二:
建議採用以下方式配置過濾:
1 replicate-wild-ignore-table=mysql.% #從庫配置不同步表
2 replicate-wild-do-table=test.% #從庫配置需要同步的表
提示:不要在主庫使用binlog-ignore-db和binlog-do-db,也不要在從庫使用replicate-wild-ignore和replicate-wild-do-table。
2.4 創建賬號
1 [root@master1 ~]# mysql -uroot -p
2 Enter password:
3 MariaDB [(none)]> grant replication slave on *.* to "repl_user"@"192.168.88.101" identified by "x12345678";
4 MariaDB [(none)]> grant all privileges on *.* to "root"@"192.168.88.%" identified by "x120952576" with grant option;
5 MariaDB [(none)]> flush privileges;
6 [root@master1 ~]# systemctl restart mariadb.service
7 [root@master1 ~]# mysql -uroot -p
8 Enter password:
9 MariaDB [(none)]> show master status;
master01:
file:mysql-bin.000001
position:245
2.5 master02 my.cf配置配置
1 [root@master2 ~]# vi /etc/my.cnf
2 [mysqld]
3 server-id=2 #設置主伺服器master的id
4 log-bin=mysql-bin #配置二進位變更日誌命名格式
5 replicate-wild-ignore-table=mysql.%
6 replicate-wild-ignore-table=test.%
7 replicate-wild-ignore-table=information_schema.%
8 read_only=1
2.6 創建賬號
1 [root@master2 ~] mysql -uroot -p
2 Enter password:
3 MariaDB [(none)]> grant replication slave on *.* to "repl_user"@"192.168.88.100" identified by "x12345678";
4 MariaDB [(none)]> grant all privileges on *.* to "root"@"192.168.88.%" identified by "x120952576" with grant option;
5 MariaDB [(none)]> flush privileges;
6 [root@master2 ~]# systemctl restart mariadb.service
7 [root@master2 ~]# mysql -uroot -p
8 Enter password:
9 MariaDB [(none)]> show master status;
master02:
file:mysql-bin.000001
position:245
三 啟動主從
3.1 手動同步
如果Master01和Master02已經存在數據,則在開啟主備複製之前,需要將Master01和Master02手動同步一次(/var/lib/mysql整個目錄打包tar.gz),具體方法略。
注意:本實驗都是重新安裝的MySQL,可直接啟動同步。
3.2 啟動Master01的slave功能
1 [root@master1 ~]# mysql -uroot -p
2 Enter password:
3 MariaDB [(none)]> change master to master_host="192.168.88.101",
4 master_user="repl_user",
5 master_password="x12345678",
6 master_log_file="mysql-bin.000001",
7 master_port=3306,
8 master_log_pos=245;
9 MariaDB [(none)]> start slave;
10 MariaDB [(none)]> show slave statusG #查看slave狀態
3.3 啟動Master02的slave功能
1 [root@Master02 ~]# mysql -uroot -p
2 Enter password:
3 MariaDB [(none)]> change master to master_host="192.168.88.100",
4 master_user="repl_user",
5 master_password="x12345678",
6 master_log_file="mysql-bin.000001",
7 master_log_pos=245;
8 MariaDB [(none)]> start slave;
9 MariaDB [(none)]> show slave statusG #查看slave狀態
提示:
slave的I/O和SQL線程都已經開始運行,而且Seconds_Behind_Master不再是NULL。日誌的位置增加了,意味著一些事件被獲取並執行了。如果你在master上進行修改,你可以在slave上看到各種日誌文件的位置的變化,同樣,你也可以看到資料庫中數據的變化。
四 安裝Heartbeat
略,見《002.Heartbeat部署及httpd高可用》中的Heartbeat安裝部分。
提示:相關安裝及主機名等準備步驟參考《002.Heartbeat部署及httpd高可用》即可。
五 配置Heartbeat
5.1 配置authkeys
1 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/authkeys
2 auth 3
3 3 md5 Yes!
5.2 配置Heartbeat
1 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/ha.cf
2 logfile /var/log/ha-log #記錄Heartbeat其他相關日誌信息
3 logfacility local0 #設置heartbeat的日誌,這裡用的是系統日誌
4 keepalive 2 #設定心跳(監測)時間間隔為2秒
5 deadtime 15 #宣告死亡時間
6 warntime 10 #心跳延時時間
7 initdead 60 #初始化時間
8 udpport 694 #用於通信的UDP埠
9 bcast eth1 #接受廣播心跳的網卡介面
10 ucast eth1 192.168.77.101 #置對方機器心跳檢測的IP
11 auto_failback off #關閉自動切回恢復正常的主節點
12 node master1.yewu.com #集群節點的名稱,必須匹配uname -n的結果。
13 node master2.yewu.com
14 ping 192.168.88.1
15 respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail
注意: 主機和備機之間進行心跳檢測,當備機無法檢測到主機的心跳,則開啟vip;
如果主機和備機都沒有掛掉,由於通信問題導致相互無法連接,則會出現裂腦,即主備都對外聲明了vip,導致數據出現故障 ,因此建議主機和備機間應該採用專門只是用於檢測心跳的網卡(網路),其他數據(業務)網路應該獨立於此心跳網路。
5.3 配置haresources
1 [root@master1 ~]# ll /usr/local/heartbeat/etc/ha.d/resource.d/ #查看現有資源類型
2 [root@master1 ~]# vi /usr/local/heartbeat/etc/ha.d/haresources
3 master1.yewu.com IPaddr::192.168.88.88/24/eth0 mariadb
4 [root@master1 ~]# scp /usr/local/heartbeat/etc/ha.d/{ha.cf,haresources,authkeys} 192.168.88.101:/usr/local/heartbeat/etc/ha.d/ #將所有配置複製至master2節點
5 [root@master2 ~]# vi /usr/local/heartbeat/etc/ha.d/ha.cf
6 ucast eth1 192.168.77.100 #置對方機器心跳檢測的IP
7 [root@master1 ~]# systemctl stop mariadb.service
8 [root@master1 ~]# systemctl disable mariadb.service
9 [root@master2 ~]# systemctl stop mariadb.service
10 [root@master2 ~]# systemctl disable mariadb.service
提示:關閉MySQL啟動及自啟動,從而使mariadb基於Heartbeat資源形式喚醒;
Heartbeat的haresources調用/etc/init.d下的腳本來啟動資源,基於CentOS7系統不存在此腳本,可手動寫入一個啟動腳本,MariaDB的啟動腳本可留言索要,兩個腳本都可用。
六 驗證Heartbeat
6.1 master1單節點啟動驗證
1 [root@master1 ~]# systemctl start heartbeat.service
2 [root@master1 ~]# systemctl enable heartbeat.service
3 [root@master1 ~]# tail -f /var/log/ha-log #驗證日誌
1 [root@master1 ~]# ifconfig #查看活的的vip
埠測試:tcping.exe 192.168.88.88 3306
6.2 master2啟動並驗證
1 [root@master2 ~]# systemctl start heartbeat.service
2 [root@master1 ~]# tail -f /var/log/ha-log #觀察master2節點啟動後的master1日誌
埠測試:tcping.exe 192.168.88.88 3306
1 [root@master1 ~]# shutdownr #模擬master1節點宕機
2 [root@master2 ~]# tail -f /var/log/ha-log #觀察master2節點的切換log
1 [root@master2 ~]# ifconfig #master2節點會自動接管vip
埠測試:tcping.exe 192.168.88.88 3306
提示:由於配置了auto_failback off,在master1節點恢復後資源依舊會保留至master2節點;
對於集群上節點之間的切換實質上是資源的接管,通常包括VIP分配回收,磁碟卸載掛載,以及服務的啟停等;
對於備用節點,其相應的共享磁碟狀態為不可讀寫,服務處於停止狀態;
Heartbeat現有項目已拆分,建議使用pacemaker+corosync,可參考RH436相關文檔。
七 其他優化
7.1 檢測腳本
heartbeat只檢測心跳,即可檢測設備是否宕機,然後宕機後進行切換,而不會檢測上層應用,如MySQL。可手動寫入一個腳本檢測服務狀態,如MySQL。若mysql服務宕掉,則kill掉heartbeat進程從而實現故障轉移(類似keepalived),參考腳本如下:
腳本一:# cat mysql_down.sh
1 #!/bin/sh
2 #****************************************************************#
3 # ScriptName: mysql_down.sh
4 # Author: xhy
5 # Create Date: 2018-12-20 16:40
6 # Modify Author: xhy
7 # Modify Date: 2018-12-20 16:40
8 # Version:
9 #***************************************************************#
10 Date=$(date +%F" "%T)
11 IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk "{print $1}")
12 Mail="baojingtongzhi@163.com"
13 pkill keepalived
14 echo "$Date $IP The mysql service failure,kill keepalived." |mail -s "Master-Backup MySQL Monitor" $Mail
腳本二:# cat mysql_down.sh
1 #!/bin/sh
2 #****************************************************************#
3 # ScriptName: mysql_down.sh
4 # Author: xhy
5 # Create Date: 2018-12-20 16:40
6 # Modify Author: xhy
7 # Modify Date: 2018-12-20 16:40
8 # Version:
9 #***************************************************************#
10 MYSQL=/usr/bin/mysql
11 MYSQL_HOST=localhost
12 MYSQL_USER=root
13 MYSQL_PASSWORD=x120952576
14 date=`date +%y%m%d-%H:%M:`
15 echo $date
16 $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
17 #$mysqlclient --host=$host --port=$port--user=$user --password=$password -e"show databases;" > /dev/null 2>&1
18 if [ $? == 0 ]
19 then
20 echo " $host mysql login successfully "
21 exit 0
22 else
23 echo " $host mysql login faild"
24 /etc/init.d/heartbeat stop
25 exit 2
26 fi
7.2 定時檢測任務
1 [root@master2 ~]# crontab -e
2 */1 * * * * /root/mysql_down.sh >>/root/check_mysql.log
參考文檔:https://blog.csdn.net/yabingshi_tech/article/details/51483196
作者: 木二
出處: http://www.cnblogs.com/itzgr/
※諫言給那些想學Python的人,建議收藏後細看!
※SpringBoot2.0完美整合Dubbo
TAG:程序員小新人學習 |