當前位置:
首頁 > 知識 > Heartbeat MySQL雙主複製

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配置

Heartbeat MySQL雙主複製

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.%

Heartbeat MySQL雙主複製

注意:

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 創建賬號

Heartbeat MySQL雙主複製

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;

Heartbeat MySQL雙主複製

Heartbeat MySQL雙主複製

master01:

file:mysql-bin.000001

position:245

2.5 master02 my.cf配置配置

Heartbeat MySQL雙主複製

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

Heartbeat MySQL雙主複製

2.6 創建賬號

Heartbeat MySQL雙主複製

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;

Heartbeat MySQL雙主複製

Heartbeat MySQL雙主複製

master02:

file:mysql-bin.000001

position:245

三 啟動主從

3.1 手動同步

如果Master01和Master02已經存在數據,則在開啟主備複製之前,需要將Master01和Master02手動同步一次(/var/lib/mysql整個目錄打包tar.gz),具體方法略。

注意:本實驗都是重新安裝的MySQL,可直接啟動同步。

3.2 啟動Master01的slave功能

Heartbeat MySQL雙主複製

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狀態

Heartbeat MySQL雙主複製

Heartbeat MySQL雙主複製

3.3 啟動Master02的slave功能

Heartbeat MySQL雙主複製

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狀態

Heartbeat MySQL雙主複製

Heartbeat MySQL雙主複製

提示:

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

Heartbeat MySQL雙主複製

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

Heartbeat MySQL雙主複製

注意: 主機和備機之間進行心跳檢測,當備機無法檢測到主機的心跳,則開啟vip;

如果主機和備機都沒有掛掉,由於通信問題導致相互無法連接,則會出現裂腦,即主備都對外聲明了vip,導致數據出現故障 ,因此建議主機和備機間應該採用專門只是用於檢測心跳的網卡(網路),其他數據(業務)網路應該獨立於此心跳網路。

5.3 配置haresources

Heartbeat MySQL雙主複製

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

Heartbeat MySQL雙主複製

提示:關閉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 #驗證日誌

Heartbeat MySQL雙主複製

1 [root@master1 ~]# ifconfig #查看活的的vip

Heartbeat MySQL雙主複製

埠測試:tcping.exe 192.168.88.88 3306

Heartbeat MySQL雙主複製

6.2 master2啟動並驗證

1 [root@master2 ~]# systemctl start heartbeat.service
2 [root@master1 ~]# tail -f /var/log/ha-log #觀察master2節點啟動後的master1日誌

Heartbeat MySQL雙主複製

埠測試:tcping.exe 192.168.88.88 3306

Heartbeat MySQL雙主複製

1 [root@master1 ~]# shutdownr #模擬master1節點宕機
2 [root@master2 ~]# tail -f /var/log/ha-log #觀察master2節點的切換log

Heartbeat MySQL雙主複製

1 [root@master2 ~]# ifconfig #master2節點會自動接管vip

Heartbeat MySQL雙主複製

埠測試:tcping.exe 192.168.88.88 3306

Heartbeat MySQL雙主複製

提示:由於配置了auto_failback off,在master1節點恢復後資源依舊會保留至master2節點;

對於集群上節點之間的切換實質上是資源的接管,通常包括VIP分配回收,磁碟卸載掛載,以及服務的啟停等;

對於備用節點,其相應的共享磁碟狀態為不可讀寫,服務處於停止狀態;

Heartbeat現有項目已拆分,建議使用pacemaker+corosync,可參考RH436相關文檔。

七 其他優化

7.1 檢測腳本

heartbeat只檢測心跳,即可檢測設備是否宕機,然後宕機後進行切換,而不會檢測上層應用,如MySQL。可手動寫入一個腳本檢測服務狀態,如MySQL。若mysql服務宕掉,則kill掉heartbeat進程從而實現故障轉移(類似keepalived),參考腳本如下:

腳本一:# cat mysql_down.sh

Heartbeat MySQL雙主複製

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

Heartbeat MySQL雙主複製

腳本二:# cat mysql_down.sh

Heartbeat MySQL雙主複製

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

Heartbeat MySQL雙主複製

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:程序員小新人學習 |