MySQL+keepalived主主復(fù)制完整部署流程
前言
在現(xiàn)代信息化系統(tǒng)中,數(shù)據(jù)庫(kù)的高可用性與數(shù)據(jù)一致性是保障業(yè)務(wù)持續(xù)穩(wěn)定運(yùn)行的核心要素。MySQL 作為廣泛使用的關(guān)系型數(shù)據(jù)庫(kù),其單點(diǎn)故障可能導(dǎo)致業(yè)務(wù)中斷,而主主復(fù)制架構(gòu)結(jié)合 Keepalived 高可用方案,能夠有效提升系統(tǒng)的容錯(cuò)能力與負(fù)載均衡能力。
本文檔詳細(xì)闡述了基于 MySQL 主主復(fù)制與 Keepalived 實(shí)現(xiàn)高可用集群的完整部署流程,涵蓋 MySQL 的編譯安裝、主主復(fù)制配置以及 Keepalived 的安裝與監(jiān)控腳本設(shè)置。通過該方案,可實(shí)現(xiàn)兩臺(tái) MySQL 服務(wù)器互為主從,保證數(shù)據(jù)雙向同步,同時(shí)借助 Keepalived 提供的虛擬 IP(VIP)機(jī)制,實(shí)現(xiàn)故障自動(dòng)切換,確保數(shù)據(jù)庫(kù)服務(wù)的持續(xù)可用,適用于對(duì)數(shù)據(jù)一致性和服務(wù)連續(xù)性有較高要求的業(yè)務(wù)場(chǎng)景。
1 MySQL編譯安裝
# 環(huán)境準(zhǔn)備 yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake ? # 創(chuàng)建 MySQL 專用用戶 useradd -s /sbin/nologin mysql ? # 源碼解壓與依賴 tar zxvf mysql-5.7.17.tar.gz -C /opt tar zxvf boost_1_59_0.tar.gz -C /usr/local/ mv /usr/local/boost_1_59_0 /usr/local/boost ? # CMake 編譯配置 cd /opt/mysql-5.7.17/ ------------------------------------------------------------------------------------------------------------ cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=/usr/local/boost \ -DWITH_SYSTEMD=1 ------------------------------------------------------------------------------------------------------------ # 編譯安裝 make -j 4 && make install ?? 注意:如果 CMake 出錯(cuò),解決后需刪除 `CMakeCache.txt` 再重新執(zhí)行 ? # 權(quán)限授權(quán) chown -R mysql:mysql /usr/local/mysql/ chown mysql:mysql /etc/my.cnf ? # 環(huán)境變量設(shè)置 echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile ? # 數(shù)據(jù)庫(kù)初始化 cd /usr/local/mysql/bin/ ------------------------------------------------------------------------------------------------------------ ./mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data ------------------------------------------------------------------------------------------------------------ # 啟動(dòng)服務(wù) cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ systemctl daemon-reload systemctl start mysqld.service systemctl enable mysqld netstat -anpt | grep 3306 ? # 賬號(hào)密碼設(shè)置 mysqladmin -u root -p password "123456" ? # 登入 mysql -u root -p123456
2 配置主主復(fù)制
# 修改配置文件/etc/my.cnf # 主1配置 vim /etc/my.cnf ------------------------------------------------------------------------------------------------------------ [client] port = 3306 socket=/usr/local/mysql/mysql.sock default-character-set=utf8 ? [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 70 log_bin = /usr/local/mysql/data/master-bin binlog_do_db = test # 僅同步test庫(kù)(可選) binlog_ignore_db = mysql # 忽略mysql系統(tǒng)庫(kù)(可選) relay_log = /usr/local/mysql/data/slave-bin log_slave_updates = 1 # 允許從庫(kù)日志被其他從庫(kù)同步(主主必需) auto_increment_offset = 1 auto_increment_increment = 2 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES ? [mysql] port = 3306 default-character-set=utf8 socket=/usr/local/mysql/mysql.sock auto-rehash ------------------------------------------------------------------------------------------------------------ ? # 主2配置 vim /etc/my.cnf ------------------------------------------------------------------------------------------------------------ [client] port = 3306 socket=/usr/local/mysql/mysql.sock default-character-set=utf8 ? [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 71 log_bin = /usr/local/mysql/data/master-bin binlog_do_db = test # 僅同步test庫(kù)(可選) binlog_ignore_db = mysql # 忽略mysql系統(tǒng)庫(kù)(可選) relay_log = /usr/local/mysql/data/slave-bin log_slave_updates = 1 # 允許從庫(kù)日志被其他從庫(kù)同步(主主必需) auto_increment_offset = 2 auto_increment_increment = 2 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES ? [mysql] port = 3306 default-character-set=utf8 socket=/usr/local/mysql/mysql.sock auto-rehash ------------------------------------------------------------------------------------------------------------ # 重啟MySQL systemctl restart mysqld ? # 主1上創(chuàng)建賬號(hào)(允許主2訪問) mysql -uroot -p123456 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.10.71' IDENTIFIED BY '123456'; flush privileges; ? # 主2上創(chuàng)建賬號(hào)(允許主1訪問) mysql -uroot -p123456 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.10.70' IDENTIFIED BY '123456'; flush privileges; ------------------------------------------------------------------------------------------------------------ ? # 配置主從同步 # 查看 主2 的二進(jìn)制日志狀態(tài) show master status; ? # 在主1上配置 CHANGE MASTER TO MASTER_HOST='192.168.10.71', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=154; ? # 啟動(dòng)從庫(kù)且查看同步狀態(tài) start slave; show slave status\G ------------------------------------------------------------------------------------------------------------ # 查看 主1 的二進(jìn)制日志狀態(tài) show master status; ? # 在主2上配置 CHANGE MASTER TO MASTER_HOST='192.168.10.70', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=154; ? # 啟動(dòng)從庫(kù)且查看同步狀態(tài) start slave; show slave status\G
3 安裝keepalived
# 安裝 Keepalived
yum install -y keepalived
============================================================================================================
# 配置主1的 Keepalived
vim /etc/keepalived/keepalived.conf
------------------------------------------------------------------------------------------------------------
global_defs {
router_id MYSQL_HA # 唯一標(biāo)識(shí)
}
?
# 監(jiān)控MySQL的腳本(關(guān)鍵:檢測(cè)MySQL是否存活)
vrrp_script check_mysql {
script "/etc/keepalived/check_mysql.sh" # 腳本路徑
interval 2 # 每2秒檢測(cè)一次
weight -20 # 檢測(cè)失敗時(shí)優(yōu)先級(jí)減20
}
?
vrrp_instance VI_1 {
state MASTER # 節(jié)點(diǎn)A為默認(rèn)主節(jié)點(diǎn)
interface ens160 # 網(wǎng)卡名稱(根據(jù)實(shí)際情況修改)
virtual_router_id 51 # 虛擬路由ID(兩節(jié)點(diǎn)需一致)
priority 100 # 優(yōu)先級(jí)(節(jié)點(diǎn)A > 節(jié)點(diǎn)B)
advert_int 1 # 心跳間隔1秒
?
# 認(rèn)證配置
authentication {
auth_type PASS
auth_pass 1111
}
?
# 虛擬IP(VIP)
virtual_ipaddress {
192.168.10.110/24
}
?
# 引用監(jiān)控腳本
track_script {
check_mysql
}
}
------------------------------------------------------------------------------------------------------------
?
# 配置主2的 Keepalived
vim /etc/keepalived/keepalived.conf
------------------------------------------------------------------------------------------------------------
global_defs {
router_id MYSQL_HA # 唯一標(biāo)識(shí)
}
?
# 監(jiān)控MySQL的腳本(關(guān)鍵:檢測(cè)MySQL是否存活)
vrrp_script check_mysql {
script "/etc/keepalived/check_mysql.sh" # 腳本路徑
interval 2 # 每2秒檢測(cè)一次
weight -20 # 檢測(cè)失敗時(shí)優(yōu)先級(jí)減20
}
?
vrrp_instance VI_1 {
state BACKUP # 節(jié)點(diǎn)A為默認(rèn)主節(jié)點(diǎn)
interface ens160 # 網(wǎng)卡名稱(根據(jù)實(shí)際情況修改)
virtual_router_id 51 # 虛擬路由ID(兩節(jié)點(diǎn)需一致)
priority 90 # 優(yōu)先級(jí)(節(jié)點(diǎn)A > 節(jié)點(diǎn)B)
advert_int 1 # 心跳間隔1秒
?
# 認(rèn)證配置
authentication {
auth_type PASS
auth_pass 1111
}
?
# 虛擬IP(VIP)
virtual_ipaddress {
192.168.10.110/24
}
?
# 引用監(jiān)控腳本
track_script {
check_mysql
}
}
============================================================================================================
# 編寫檢測(cè)腳本(2個(gè)主都需要)
vim /etc/keepalived/check_mysql.sh
------------------------------------------------------------------------------------------------------------
# 在腳本開頭添加日志路徑
LOG_FILE="/var/log/check_mysql.log"
echo "[$(date +'%F %T')] 開始檢測(cè)MySQL" >> $LOG_FILE
?
# 在關(guān)鍵步驟添加日志
MYSQL_CMD="/usr/local/mysql/bin/mysql"
$MYSQL_CMD -uroot -p'123456' -e "exit" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[$(date +'%F %T')] MySQL連接失敗,嘗試重啟" >> $LOG_FILE
systemctl restart mysqld
sleep 3
$MYSQL_CMD -uroot -p'123456' -e "exit" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[$(date +'%F %T')] MySQL重啟失敗,停止Keepalived" >> $LOG_FILE
systemctl stop keepalived
fi
fi
---------------------------------------------------------------------------------------4 測(cè)試
4.1 測(cè)試主主復(fù)制
主1插入數(shù)據(jù),主2同步成功

4.2 測(cè)試故障切換
1、MySQL和keepalived都是開啟的狀態(tài),將主1 MySQL停止后,看看VIP會(huì)不會(huì)漂移到 主2



5 總結(jié)
本文檔圍繞 MySQL 主主復(fù)制與 Keepalived 高可用集群搭建展開,完成了從環(huán)境準(zhǔn)備到最終高可用架構(gòu)部署的全流程說明:
MySQL 編譯安裝:通過源碼編譯方式安裝 MySQL,完成環(huán)境依賴配置、用戶創(chuàng)建、編譯參數(shù)設(shè)置、權(quán)限分配及初始化操作,為后續(xù)主主復(fù)制奠定基礎(chǔ)。
主主復(fù)制配置:通過修改兩臺(tái)服務(wù)器的 MySQL 配置文件,設(shè)置不同的 server-id、自增偏移與步長(zhǎng),避免數(shù)據(jù)沖突;并通過創(chuàng)建復(fù)制賬號(hào)、配置主從關(guān)系,實(shí)現(xiàn)兩臺(tái) MySQL 服務(wù)器之間的雙向數(shù)據(jù)同步,確保數(shù)據(jù)一致性。
Keepalived 部署:安裝 Keepalived 服務(wù),分別配置主從節(jié)點(diǎn)的 keepalived.conf 文件,定義虛擬路由 ID、虛擬 IP 及優(yōu)先級(jí);編寫 MySQL 監(jiān)控腳本,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)存活狀態(tài)的檢測(cè),當(dāng)主節(jié)點(diǎn)故障時(shí)自動(dòng)切換至從節(jié)點(diǎn),保障服務(wù)高可用。
通過上述步驟,構(gòu)建了一套兼具數(shù)據(jù)同步與故障自動(dòng)切換能力的 MySQL 高可用集群,可有效提升數(shù)據(jù)庫(kù)服務(wù)的穩(wěn)定性與可靠性。
到此這篇關(guān)于MySQL+keepalived主主復(fù)制完整的文章就介紹到這了,更多相關(guān)MySQL+keepalived主主復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
到此這篇關(guān)于MySQL+keepalived主主復(fù)制完整部署流程的文章就介紹到這了,更多相關(guān)MySQL+keepalived主主復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析MySQL數(shù)據(jù)類型 DECIMAL
這篇文章主要介紹了MySQL數(shù)據(jù)類型 DECIMAL的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09
MySQL查詢優(yōu)化的5個(gè)實(shí)用技巧
這篇文章主要介紹了MySQL查詢優(yōu)化的5個(gè)實(shí)用技巧,從數(shù)據(jù)類型、字符集、子查詢等角度分析了MySQL查詢優(yōu)化的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12
MySQL數(shù)據(jù)庫(kù)重命名的快速且安全方法(3種)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)重命名的快速且安全方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Mysql實(shí)現(xiàn)增量恢復(fù)的方法詳解
本文給大家分享的是如何實(shí)現(xiàn)mysql增量恢復(fù)的場(chǎng)景以及具體實(shí)現(xiàn)方法,有需要的小伙伴可以參考下2018-07-07
mysql 5.7.18 安裝配置方法圖文教程(CentOS7)
這篇文章主要為大家詳細(xì)介紹了CentOS 7下mysql 5.7.18 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
3種高效的Tags標(biāo)簽系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)方案分享
這篇文章主要介紹了3種高效的Tags標(biāo)簽系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)方案分享,現(xiàn)在主流的博客、CMS系統(tǒng)都有一個(gè)標(biāo)簽系統(tǒng),本文就探討它的數(shù)據(jù)庫(kù)設(shè)計(jì)方式,需要的朋友可以參考下2014-07-07
mysql優(yōu)化的重要參數(shù) key_buffer_size table_cache
MySQL服務(wù)器端的參數(shù)有很多,但是對(duì)于大多數(shù)初學(xué)者來說,眾多的參數(shù)往往使得我們不知所措,但是哪些參數(shù)是需要我們調(diào)整的,哪些對(duì)服務(wù)器的性能影響最大呢2016-05-05
安裝MySQL時(shí),輸入mysqld --install后,顯式該文件已存在問題
這篇文章主要介紹了安裝MySQL時(shí),輸入mysqld --install后,顯式該文件已存在問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

