Docker方式創(chuàng)建keepalived連接MGR集群
前言
假設(shè)已經(jīng)搭建了MySQL8的MGR集群方式(一主兩從)。
MGR本身有故障轉(zhuǎn)移重新選舉新的主節(jié)點功能,但是上游的應(yīng)用程序需要自己手動修改數(shù)據(jù)庫連接地址重新指向主節(jié)點。
為了了能不用手動方式切換主節(jié)點需要中間代理訪問程序,提供的方案有很多例如 nginx、keepalived、proxysql等,這里我們先選擇使用keepalived,后期使用proxysql代理。
步驟
1. 安裝環(huán)境
安裝Docker和MGR 這里略過
2. 重新制作鏡像
登錄任意一個節(jié)點服務(wù)器,下載原始鏡像
docker pull osixia/keepalived:2.0.20
創(chuàng)建臨時容器
docker run --name keepalivedtest --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW -e KEEPALIVED_INTERFACE=enp6s0 --net=host -d osixia/keepalived:2.0.20
登錄進臨時容器
docker exec -it keepalivedtest /bin/bash
然后安裝mysql客戶端
apk add mysql mysql-client ...稍等片刻 ... 安裝完成后 退出容器 exit
從零時容器生成一個新的鏡像:mgr_keepalived
docker commit keepalivedtest mgr_keepalived:2.0.20
導(dǎo)出鏡像文件,上傳其他MGR節(jié)點服務(wù)器
docker save -o mgr_keepalived2.tar mgr_keepalived:2.0.20
3. 導(dǎo)入新鏡像
在每一個MGR節(jié)點服務(wù)器上導(dǎo)入鏡像
docker load -i mgr_keepalived2.tar
4. 創(chuàng)建容器
這里假設(shè)3臺服務(wù)器環(huán)境如下:
| 服務(wù)器 | 文件路徑 | 備注 |
|---|---|---|
| 192.168.1.246 | /apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh | 記得sh文件賦予可執(zhí)行權(quán)限,當(dāng)前MGR主節(jié)點 |
| 192.168.1.247 | /apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh | 從節(jié)點 |
| 192.168.1.248 | /apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh | 從節(jié)點 |
各服務(wù)器文件路徑都一致, mysql_master_check.sh 腳本文件內(nèi)容如下:
#!/bin/bash
# 替換以下變量為你的實際MySQL用戶、密碼和端口
MYSQL_USER="rpl_user"
MYSQL_PASS="請?zhí)顚戀~號密碼"
MYSQL_PORT="請?zhí)顚懚丝谔?
MYSQL_HOST="請?zhí)顚懝?jié)點主機IP"
# 檢查MySQL服務(wù)是否運行
if nc -z "$MYSQL_HOST" "$MYSQL_PORT"; then
echo "MySQL 服務(wù)在 $MYSQL_HOST:$MYSQL_PORT 上正在運行"
else
echo "MySQL 服務(wù)在 $MYSQL_HOST:$MYSQL_PORT 上未運行"
exit 1
fi
# 檢查當(dāng)前節(jié)點是否為主節(jié)點
IS_READONLY=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -P"$MYSQL_PORT" -h"$MYSQL_HOST" -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" | grep -c "ON")
if [[ $IS_READONLY -ne 0 ]]; then
echo "當(dāng)前節(jié)點為只讀狀態(tài),判定為從節(jié)點"
exit 1
fi
# 獲取當(dāng)前主機名并存儲在變量中
CURRENT_HOST=$(hostname)
IS_MASTER=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -P"$MYSQL_PORT" -h"$MYSQL_HOST" -e "
SELECT COUNT(1)
FROM performance_schema.replication_group_members
WHERE MEMBER_HOST ='$CURRENT_HOST'
AND MEMBER_STATE = 'ONLINE'
AND MEMBER_ROLE='PRIMARY';" | tail -n 1)
if [[ $IS_MASTER -eq 0 ]]; then
echo "當(dāng)前節(jié)點是從節(jié)點"
exit 1
else
echo "當(dāng)前節(jié)點是主節(jié)點"
exit 0
fi
各個節(jié)點上的文件注意
MYSQL_USER=“rpl_user”
MYSQL_PASS=“請?zhí)顚戀~號密碼”
MYSQL_PORT=“請?zhí)顚懚丝谔?rdquo;
MYSQL_HOST=“請?zhí)顚懝?jié)點主機IP”
這幾個變量的修改!
另外用戶 rpl_user是用于MGR復(fù)制用的,也可以填寫其他的用戶名,但是用戶的密碼認(rèn)證方式必須是之前老式的 mysql_native_password ,因為鏡像里面的mysql客戶端暫不支持MySQL8默認(rèn)的密碼認(rèn)證方式。
另外 MYSQL_USER 用戶必須具有訪問 performance_schema.replication_group_members 的權(quán)限,因為光靠"SHOW GLOBAL VARIABLES LIKE 'read_only';" 無法判定當(dāng)前MySQL節(jié)點是否為主節(jié)點
keepalived.conf 文件內(nèi)容大致如下:
vrrp_script chk_mysql {
script "/usr/local/bin/mysql_master_check.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface enp6s0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110
}
track_script {
chk_mysql
}
}
主要是如下幾個變量要注意:
interval 2 每隔2秒執(zhí)行一次
weight -5 腳本結(jié)果導(dǎo)致的優(yōu)先級變更,檢測失?。?code>腳本返回非0)則優(yōu)先級減5
fall 2 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) 默認(rèn)值為 3
rise 1 #檢測1次成功就算成功。但不修改優(yōu)先級 默認(rèn)值為 2
interface 當(dāng)前節(jié)點服務(wù)器的
網(wǎng)卡名稱priority 優(yōu)先級,
每一個節(jié)點上不一樣virtual_ipaddress 虛擬ip
virtual_router_id
共享相同虛擬IP的節(jié)點上該參數(shù)值必須一樣,
keepalived可以代理多個虛擬IP,每一個虛擬IP對應(yīng)的virtual_router_id值不可一樣。state 指定當(dāng)前keepalived的初始狀態(tài),這個可用是 MASTER 或者 BACKUP ,如果是BACKUP 則作為從節(jié)點,但是這個值會根據(jù)監(jiān)控腳本運行狀態(tài)改變優(yōu)先級從而導(dǎo)致狀MASTER /BACKUP 態(tài)切換
3臺節(jié)點服務(wù)器上創(chuàng)建容器如下:
docker run -d --name mgr8keepalived \ --cap-add=NET_ADMIN \ --cap-add=NET_BROADCAST \ --cap-add=NET_RAW \ --net=host \ -e KEEPALIVED_INTERFACE=enp6s0 \ -v /apps/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \ -v /apps/keepalived/mysql_master_check.sh:/usr/local/bin/mysql_master_check.sh \ mgr_keepalived:2.0.20 --loglevel debug --copy-service
變量 KEEPALIVED_INTERFACE 是指當(dāng)前節(jié)點服務(wù)器的網(wǎng)卡名稱,如果不想開啟debug模式去掉--loglevel debug
查看docker日志一般會有如下信息:
... Wed Jan 31 09:32:53 2024: Reset ARP config counter 0 Wed Jan 31 09:32:53 2024: Original arp_ignore 0 Wed Jan 31 09:32:53 2024: Original arp_filter 0 Wed Jan 31 09:32:53 2024: Original promote_secondaries 1 Wed Jan 31 09:32:53 2024: Reset promote_secondaries counter 0 Wed Jan 31 09:32:53 2024: Tracking VRRP instances = 0 Wed Jan 31 09:32:53 2024: (VI_1) Entering BACKUP STATE (init) Wed Jan 31 09:32:53 2024: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(11,12)] Wed Jan 31 09:32:53 2024: VRRP_Script(chk_mysql) succeeded Wed Jan 31 09:32:53 2024: (VI_1) Changing effective priority from 101 to 103 Wed Jan 31 09:32:57 2024: (VI_1) Receive advertisement timeout Wed Jan 31 09:32:57 2024: (VI_1) Entering MASTER STATE Wed Jan 31 09:32:57 2024: (VI_1) setting VIPs. Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110 Wed Jan 31 09:32:57 2024: (VI_1) Sending/queueing gratuitous ARPs on enp6s0 for 192.168.1.110 Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110 Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110 ...
可以使用虛擬IP 192.168.1.110 連上看下是否可以操作數(shù)據(jù)庫。
可以關(guān)閉一個MySQL實例看下keepalived的效果,是否還正常使用,虛擬IP此時是否浮動到新的主節(jié)點服務(wù)器上了。
注意:關(guān)閉一個MySQL實例后重新啟動,可能它不會自動加入集群,需要手動執(zhí)行 START GROUP_REPLICATION 重新加入集群。
到此這篇關(guān)于Docker方式創(chuàng)建keepalived連接MGR集群的文章就介紹到這了,更多相關(guān)docker mgr集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker報錯Operation?not?permitted問題的解決方法
剛開始接觸Docker的朋友經(jīng)常會遇到問題,下面這篇文章主要給大家介紹了關(guān)于Docker報錯Operation?not?permitted問題的解決方法,需要的朋友可以參考下2023-02-02
docker靈活的構(gòu)建PHP環(huán)境的實現(xiàn)
這篇文章主要介紹了docker靈活的構(gòu)建PHP環(huán)境的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
關(guān)于為Windows?Service?2019?使用?Docker的問題
最近收到領(lǐng)導(dǎo)通知,甲方需要將原來的服務(wù)器遷移到新的服務(wù)器,原來的服務(wù)器上安裝了很多的服務(wù),每次重啟之后總是有很多的問題需要人工大量的進行干預(yù),今天小編通過本文給大家介紹下Windows?Service?2019?使用?Docker的問題,需要的朋友參考下吧2022-05-05
在Docker Compose中獲取最新鏡像的多種方法總結(jié)
Docker 鏡像是 Docker 容器的基礎(chǔ),鏡像包含了應(yīng)用程序所需的所有文件和依賴,Docker-Compose 默認(rèn)不會自動拉取最新的鏡像版本,這可能會導(dǎo)致使用過時的鏡像,從而錯過重要的更新,為了確保 Docker-Compose 始終使用最新的鏡像,我們可以采用多種方法,以下將詳細(xì)介紹這些方法2024-08-08
如何修改docker官方鏡像內(nèi)部內(nèi)容并重新build鏡像
這篇文章主要介紹了如何修改docker官方鏡像內(nèi)部內(nèi)容并重新build鏡像問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

