一 基礎環境 節點 系統版本 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.1 ...
一 基礎環境
二 實際部署
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;

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;

三 啟動主從
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 status\G #查看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 status\G #查看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


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


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

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


七 其他優化
7.1 檢測腳本
heartbeat只檢測心跳,即可檢測設備是否宕機,然後宕機後進行切換,而不會檢測上層應用,如MySQL。可手動寫入一個腳本檢測服務狀態,如MySQL。若mysql服務宕掉,則kill掉heartbeat進程從而實現故障轉移(類似keepalived),參考腳本如下: 腳本一:# cat mysql_down.sh1 #!/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="[email protected]" 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