Docker方式創(chuàng)建keepalived連接MGR集群
前言
假設(shè)已經(jīng)搭建了MySQL8的MGR集群方式(一主兩從)。
MGR本身有故障轉(zhuǎn)移重新選舉新的主節(jié)點(diǎn)功能,但是上游的應(yīng)用程序需要自己手動(dòng)修改數(shù)據(jù)庫(kù)連接地址重新指向主節(jié)點(diǎn)。
為了了能不用手動(dòng)方式切換主節(jié)點(diǎn)需要中間代理訪(fǎng)問(wèn)程序,提供的方案有很多例如 nginx、keepalived、proxysql等,這里我們先選擇使用keepalived,后期使用proxysql代理。
步驟
1. 安裝環(huán)境
安裝Docker和MGR 這里略過(guò)
2. 重新制作鏡像
登錄任意一個(gè)節(jié)點(diǎn)服務(wù)器,下載原始鏡像
docker pull osixia/keepalived:2.0.20
創(chuàng)建臨時(shí)容器
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
登錄進(jìn)臨時(shí)容器
docker exec -it keepalivedtest /bin/bash
然后安裝mysql客戶(hù)端
apk add mysql mysql-client ...稍等片刻 ... 安裝完成后 退出容器 exit
從零時(shí)容器生成一個(gè)新的鏡像:mgr_keepalived
docker commit keepalivedtest mgr_keepalived:2.0.20
導(dǎo)出鏡像文件,上傳其他MGR節(jié)點(diǎn)服務(wù)器
docker save -o mgr_keepalived2.tar mgr_keepalived:2.0.20
3. 導(dǎo)入新鏡像
在每一個(gè)MGR節(jié)點(diǎn)服務(wù)器上導(dǎo)入鏡像
docker load -i mgr_keepalived2.tar
4. 創(chuàng)建容器
這里假設(shè)3臺(tái)服務(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é)點(diǎn) |
192.168.1.247 | /apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh | 從節(jié)點(diǎn) |
192.168.1.248 | /apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh | 從節(jié)點(diǎn) |
各服務(wù)器文件路徑都一致, mysql_master_check.sh 腳本文件內(nèi)容如下:
#!/bin/bash # 替換以下變量為你的實(shí)際MySQL用戶(hù)、密碼和端口 MYSQL_USER="rpl_user" MYSQL_PASS="請(qǐng)?zhí)顚?xiě)賬號(hào)密碼" MYSQL_PORT="請(qǐng)?zhí)顚?xiě)端口號(hào)" MYSQL_HOST="請(qǐng)?zhí)顚?xiě)節(jié)點(diǎn)主機(jī)IP" # 檢查MySQL服務(wù)是否運(yùn)行 if nc -z "$MYSQL_HOST" "$MYSQL_PORT"; then echo "MySQL 服務(wù)在 $MYSQL_HOST:$MYSQL_PORT 上正在運(yùn)行" else echo "MySQL 服務(wù)在 $MYSQL_HOST:$MYSQL_PORT 上未運(yùn)行" exit 1 fi # 檢查當(dāng)前節(jié)點(diǎn)是否為主節(jié)點(diǎn) 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é)點(diǎn)為只讀狀態(tài),判定為從節(jié)點(diǎn)" exit 1 fi # 獲取當(dāng)前主機(jī)名并存儲(chǔ)在變量中 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é)點(diǎn)是從節(jié)點(diǎn)" exit 1 else echo "當(dāng)前節(jié)點(diǎn)是主節(jié)點(diǎn)" exit 0 fi
各個(gè)節(jié)點(diǎn)上的文件注意
MYSQL_USER=“rpl_user”
MYSQL_PASS=“請(qǐng)?zhí)顚?xiě)賬號(hào)密碼”
MYSQL_PORT=“請(qǐng)?zhí)顚?xiě)端口號(hào)”
MYSQL_HOST=“請(qǐng)?zhí)顚?xiě)節(jié)點(diǎn)主機(jī)IP”
這幾個(gè)變量的修改!
另外用戶(hù) rpl_user是用于MGR復(fù)制用的,也可以填寫(xiě)其他的用戶(hù)名,但是用戶(hù)的密碼認(rèn)證方式必須是之前老式的 mysql_native_password
,因?yàn)殓R像里面的mysql客戶(hù)端暫不支持MySQL8默認(rèn)的密碼認(rèn)證方式。
另外 MYSQL_USER 用戶(hù)必須具有訪(fǎng)問(wèn) performance_schema.replication_group_members 的權(quán)限
,因?yàn)楣饪?br />"SHOW GLOBAL VARIABLES LIKE 'read_only';"
無(wú)法判定當(dāng)前MySQL節(jié)點(diǎn)是否為主節(jié)點(diǎn)
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 } }
主要是如下幾個(gè)變量要注意:
interval 2 每隔2秒執(zhí)行一次
weight -5 腳本結(jié)果導(dǎo)致的優(yōu)先級(jí)變更,檢測(cè)失?。?code>腳本返回非0)則優(yōu)先級(jí)減5
fall 2 #檢測(cè)連續(xù)2次失敗才算確定是真失敗。會(huì)用weight減少優(yōu)先級(jí)(1-255之間) 默認(rèn)值為 3
rise 1 #檢測(cè)1次成功就算成功。但不修改優(yōu)先級(jí) 默認(rèn)值為 2
interface 當(dāng)前節(jié)點(diǎn)服務(wù)器的
網(wǎng)卡名稱(chēng)
priority 優(yōu)先級(jí),
每一個(gè)節(jié)點(diǎn)上不一樣
virtual_ipaddress 虛擬ip
virtual_router_id
共享相同虛擬IP的節(jié)點(diǎn)上該參數(shù)值必須一樣
,
keepalived可以代理多個(gè)虛擬IP,每一個(gè)虛擬IP對(duì)應(yīng)的virtual_router_id值不可一樣。state 指定當(dāng)前keepalived的初始狀態(tài),這個(gè)可用是 MASTER 或者 BACKUP ,如果是BACKUP 則作為從節(jié)點(diǎn),但是這個(gè)值會(huì)根據(jù)監(jiān)控腳本運(yùn)行狀態(tài)改變優(yōu)先級(jí)從而導(dǎo)致?tīng)頜ASTER /BACKUP 態(tài)切換
3臺(tái)節(jié)點(diǎn)服務(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é)點(diǎn)服務(wù)器的網(wǎng)卡名稱(chēng),如果不想開(kāi)啟debug模式去掉--loglevel debug
查看docker日志一般會(huì)有如下信息:
... 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ù)庫(kù)。
可以關(guān)閉一個(gè)MySQL實(shí)例看下keepalived的效果,是否還正常使用,虛擬IP此時(shí)是否浮動(dòng)到新的主節(jié)點(diǎn)服務(wù)器上了。
注意:關(guān)閉一個(gè)MySQL實(shí)例后重新啟動(dòng),可能它不會(huì)自動(dòng)加入集群,需要手動(dòng)執(zhí)行 START GROUP_REPLICATION
重新加入集群。
到此這篇關(guān)于Docker方式創(chuàng)建keepalived連接MGR集群的文章就介紹到這了,更多相關(guān)docker mgr集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何通過(guò)Dockerfile 創(chuàng)建 kali-novnc
這篇文章主要介紹了如何通過(guò)Dockerfile 創(chuàng)建 kali-novnc,在Dockerfile所在目錄運(yùn)行相關(guān)命令操作即可完成,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04Docker 教程之存出和載入鏡像,移除及鏡像實(shí)現(xiàn)原理
這篇文章主要介紹了Docker 教程之存出和載入鏡像,移除及鏡像實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2016-12-12centos搭建部署docker環(huán)境的詳細(xì)步驟
Docker 將程序與程序的運(yùn)行環(huán)境打包在一起,從而避免了復(fù)雜的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于centos搭建部署docker環(huán)境的詳細(xì)步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07docker容器下配置jupyter notebook的操作
這篇文章主要介紹了docker容器下配置jupyter notebook的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03docker的基本使用及使如何用Docker 運(yùn)行D435i
這篇文章主要介紹了docker的基本使用及使如何用Docker 運(yùn)行D435i,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11Docker部署Mysql8的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Mysql8的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07docker安裝elasticsearch和kibana的方法步驟
這篇文章主要介紹了docker安裝elasticsearch和kibana的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06