通過KeepAlived搭建MySQL雙主模式的Mysql集群圖文教程
MySQL主主互備模式架構(gòu)圖
主要設(shè)計思路是通過MySQL Replication技術(shù)將兩臺MySQL Server互相將對方作為自己的Master,自己又同時作為對方的Slave來進(jìn)行復(fù)制。這樣就實現(xiàn)了高可用構(gòu)架中的數(shù)據(jù)同步功能,同時,將采用KeepAlived來實現(xiàn)Mysql的自動failovero在這個構(gòu)架中,雖然兩臺MySQL Server互為主從,但同一時刻只有一個MySQL Server可讀寫,另一個MysQL Server只能進(jìn)行讀操作,這樣可保證數(shù)據(jù)的一致性。

MySQL主主互備環(huán)境說明
操作系統(tǒng):redhat MySQL : mysql8.0.42 Keepalived : Keepalived2.2.8 兩臺主機(jī):172.16.213.181(DB1)、172.16.213.189 ( DB2 )
無損半同步復(fù)制—搶占模式過程
配置過程
- 配置之前關(guān)閉防火墻和selinux。也可放行
- 在進(jìn)行互相備份的時候,需要將數(shù)據(jù)庫保持一致
如果DB1上已經(jīng)有mysql數(shù)據(jù),那么在執(zhí)行主主互備之前,需要將DB1和DB2上兩個mysql的數(shù)據(jù)保持同步。首先在DB1上備份mysql數(shù)據(jù),執(zhí)行如下SQL語句:
mysql>FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec)
不要退出這個終端,否則這個鎖就失效了。在不退出終端的情況下,再開啟一個終端直接打包壓縮數(shù)據(jù)文件。這里通過打包mysql文件來完成數(shù)據(jù)的備份,操作過程如下:
[root@DB1 ~]# cd /usr/local/mysql [root@DB1 mysql]# tar zcvf data.tar.gz data [root@DB1 mysql]# scp data.tar.gz DB2:/usr/local/mysql
將數(shù)據(jù)傳輸?shù)紻B2后,依次重啟DB1和DB2上面的mysql。
注意,兩個庫如果是直接拷貝而來,需要修改任意一個庫的UUID, UUID在mysql的data目錄下對應(yīng)的auto.cnf文件中。兩個庫的UUID不能相同。
- 修改mysql的配置文件為無損半同步復(fù)制(yum安裝的方式,配置文件在/etc/my.cnf)
- 主節(jié)點服務(wù)器DB1配置如下:
[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock log-error=/usr/local/mysql/logs/mysqld.log pid-file=/usr/local/mysql/logs/mysqld.pid gtid_mode=ON #方便維護(hù) enforce_gtid_consistency=ON #確保復(fù)制正確性 server-id = 1 #節(jié)點的標(biāo)識 log-bin=mysql-bin #啟用mysql-bin日志文件 relay-log = mysql-relay-bin #啟用中繼日志文件 replicate-wild-ignore-table=mysql.% #忽略備份系統(tǒng)庫 replicate-wild-ignore-table=test.% #忽略備份表 replicate-wild-ignore-table=information_schema.% #忽略備份表 plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" #加載指定的插件 rpl_semi_sync_source_enabled=1 #開啟插件 rpl_semi_sync_replica_enabled=1 #開啟插件 log_replica_updates=ON
- 備節(jié)點服務(wù)器DB2配置如下:
[mysqld] datadir=/usr/local/mysql/data socket=/tmp/mysql.sock log-error=/usr/local/mysql/logs/mysqld.log pid-file=/usr/local/mysql/logs/mysqld.pid gtid_mode=ON #方便維護(hù) enforce_gtid_consistency=ON #確保復(fù)制正確性 server-id = 2 #節(jié)點的標(biāo)識 log-bin=mysql-bin #啟用mysql-bin日志文件 relay-log = mysql-relay-bin #啟用中繼日志文件 replicate-wild-ignore-table=mysql.% #忽略備份系統(tǒng)庫 replicate-wild-ignore-table=test.% #忽略備份表 replicate-wild-ignore-table=information_schema.% #忽略備份表 plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" #加載指定的插件 rpl_semi_sync_source_enabled=1 #開啟插件 rpl_semi_sync_replica_enabled=1 #開啟插件 log_replica_updates=ON
- 主節(jié)點創(chuàng)建數(shù)據(jù)庫備份用戶(修改為自己的網(wǎng)段)
CREATE USER 'repl_user'@'192.168.123.%' IDENTIFIED WITH mysql_native_password BY 'Fe216474@';
- 主節(jié)點執(zhí)行授權(quán)(修改為自己的網(wǎng)段)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
- 備用服務(wù)器運行實現(xiàn)主從復(fù)制的腳本(在備用節(jié)點的mysql中執(zhí)行,記得修改為自己配置的信息)
CHANGE REPLICATION SOURCE TO SOURCE_HOST = '192.168.123.129', #主節(jié)點配置ip SOURCE_USER = 'repl_user', #主節(jié)點創(chuàng)建的用戶 SOURCE_PASSWORD = 'Fe216474@', #主節(jié)點創(chuàng)建的密碼 SOURCE_AUTO_POSITION = 1;
- 啟動備用服務(wù)器DB2從庫并查看是否啟動成功
START SLAVE; mysql> SHOW SLAVE STATUS\G;
當(dāng)如下顯示則表示開啟從主復(fù)制了。現(xiàn)在是DB2->DB1的復(fù)制

- 主到從的復(fù)制。從庫執(zhí)行下面命令,創(chuàng)建復(fù)制用戶,和進(jìn)行授權(quán)(修改為自己的信息)
CREATE USER 'repl_user'@'192.168.123.%' IDENTIFIED WITH mysql_native_password BY 'Fe216474@';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
- 執(zhí)行腳本實現(xiàn)主復(fù)制從
CHANGE REPLICATION SOURCE TO SOURCE_HOST = '192.168.123.100',#從節(jié)點的ip SOURCE_USER = 'repl_user', #從節(jié)點創(chuàng)建的用戶 SOURCE_PASSWORD = 'Fe216474@', SOURCE_AUTO_POSITION = 1;

- 通過yum的方式安裝keepalived
yum install keepalived
進(jìn)入配置文件目錄下
cd /etc/keepalived/
- 需要檢測mysql的狀態(tài)所以需要先導(dǎo)入腳本check_slave.pl(記得修改密碼信息,配置)
#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
# CONFIG VARIABLES
$SBM = 120;
$db = "mysql";
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "123456";
# SQL query
$query = "show slave status";
$dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 });
if (!defined($dbh)) {
exit 1;
}
$sqlQuery = $dbh->prepare($query);
$sqlQuery->execute;
$Slave_IO_Running = "";
$Slave_SQL_Running = "";
$Seconds_Behind_Master = "";
while (my $ref = $sqlQuery->fetchrow_hashref()) {
$Slave_IO_Running = $ref->{'Slave_IO_Running'};
$Slave_SQL_Running = $ref->{'Slave_SQL_Running'};
$Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};
}
$sqlQuery->finish;
$dbh->disconnect();
if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) {
exit 1;
} else {
if ( $Seconds_Behind_Master > $SBM ) {
exit 1;
} else {
exit 0;
}
}
緊接著修改keepalived.conf配置文件,記得更換為自己的網(wǎng)卡(通過ifconfig查看)
- 從節(jié)點的keepalive.conf配置:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_httpd {
script "killall -0 httpd"
interval 2
}
vrrp_instance HA_1 {
state BACKUP #主節(jié)點是MASTER
interface ens33 #記得更換為自己的網(wǎng)卡ifconfig查看
virtual_router_id 80
priority 80 #主節(jié)點的權(quán)重需要設(shè)置高一些
advert_int 2
authentication {
auth_type PASS
auth_pass qwaszx
}
notify_master "/etc/keepalived/master.sh "
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
track_script {
check_httpd
}
virtual_ipaddress {
192.168.123.80/24 dev ens33 #記得更換為自己的網(wǎng)卡ifconfig查看
}
}- 主節(jié)點的keepalive.conf配置:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_httpd {
script "killall -0 httpd"
interval 2
}
vrrp_instance HA_1 {
state MASTER #
interface ens33 #記得更換為自己的網(wǎng)卡ifconfig查看
virtual_router_id 80
priority 100 #主節(jié)點的權(quán)重需要設(shè)置高一些
advert_int 2
authentication {
auth_type PASS
auth_pass qwaszx
}
notify_master "/etc/keepalived/master.sh "
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
track_script {
check_httpd
}
virtual_ipaddress {
192.168.123.80/24 dev ens33 #記得更換為自己的網(wǎng)卡ifconfig查看
}
}驗證數(shù)據(jù)備份
- 在從庫創(chuàng)建數(shù)據(jù)庫

- 主庫查看是否存在

ok了,完美實現(xiàn)主從同步
- 驗證數(shù)據(jù)庫的備份轉(zhuǎn)移
主庫執(zhí)行代碼systemctl stop mysqld.service ,停止數(shù)據(jù)庫的服務(wù)

從庫查看日志信息

- 遠(yuǎn)程登錄mysql,驗證故障切換
如果你要創(chuàng)建用戶,記得關(guān)閉/etc/my.cnf中的下圖所示,備份創(chuàng)建用戶:


當(dāng)吧DB1斷開后:
[root@localhost keepalived]# systemctl stop mysqld.service
遠(yuǎn)端查詢數(shù)據(jù)庫顯示:

自動切換完畢
無損半同步復(fù)制—不搶占模式過程
和上述搶占模式配置相同,只是根據(jù)優(yōu)先級進(jìn)行選舉主庫從庫,只需要改兩個地方如下所示:
- keepalive.conf配置文件都改為BACKUP,然后加上nopreempt

- 重啟keepalived服務(wù)
systemctl restart keepalived
總結(jié)
到此這篇關(guān)于通過KeepAlived搭建MySQL雙主模式的Mysql集群的文章就介紹到這了,更多相關(guān)KeepAlived搭建Mysql集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用MySQL MySqldump命令導(dǎo)出數(shù)據(jù)時的注意事項
這篇文章主要介紹了使用MySQL MySqldump命令導(dǎo)出數(shù)據(jù)時的注意事項,很實用的經(jīng)驗總結(jié),需要的朋友可以參考下2014-07-07
深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵
這篇文章主要介紹了深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
關(guān)于mysql中innodb的count優(yōu)化問題分享
關(guān)于mysql中innodb的count優(yōu)化問題,有需要的朋友可以參考下2013-02-02
MySQL全文索引在數(shù)據(jù)庫中的應(yīng)用和優(yōu)勢(模糊查詢不用like+%)
全文索引技術(shù)可以有效地從大量文本中檢索信息,適用于搜索引擎和電商平臺等場景,InnoDB從MySQL5.6開始支持全文索引,使用倒排索引實現(xiàn),全文檢索分為自然語言搜索、布爾搜索和查詢擴(kuò)展搜索三種模式,全文索引提高了模糊查詢的效率,優(yōu)化了基于文本的搜索查詢2024-09-09
MySQL跨實例進(jìn)行數(shù)據(jù)查詢的項目實踐
本文介紹了MySQL的FEDERATED引擎,該引擎允許在不切換數(shù)據(jù)庫實例的情況下進(jìn)行跨實例數(shù)據(jù)查詢,具有一定的參考價值,感興趣的可以了解一下2025-05-05
MySQL中刪除重復(fù)數(shù)據(jù)的簡單方法
這篇文章主要介紹了MySQL中刪除重復(fù)數(shù)據(jù)的簡單方法,比起一般的NOT IN語句的效率更為高,需要的朋友可以參考下2015-05-05

