實(shí)戰(zhàn) MySQL 高可用架構(gòu)

前言

對(duì)于 MySQL 數(shù)據(jù)庫(kù)作為各個(gè)業(yè)務(wù)系統(tǒng)的存儲(chǔ)介質(zhì),在系統(tǒng)中承擔(dān)著非常重要的職責(zé)掌猛,如果數(shù)據(jù)庫(kù)崩了盏浙,那么對(duì)于讀和寫數(shù)據(jù)庫(kù)的操作都會(huì)受到影響。如果不能迅速恢復(fù)荔茬,對(duì)業(yè)務(wù)的影響是非常大的废膘。之前 B 站不是出過(guò)一次事故么,2 小時(shí)才恢復(fù)過(guò)來(lái)慕蔚,詳細(xì)可以看之前寫的文章丐黄。

B 站崩了,總結(jié)下「高可用」和「異地多活」

上次折騰完 ELK 日志檢索平臺(tái)后孔飒,開(kāi)發(fā)環(huán)境可以正常查詢?nèi)罩玖斯喙搿W罱谧鱿到y(tǒng)高可用相關(guān)的工作艰争,這次我來(lái)分享下 MySQL 雙主 + Keepalived 的高可用落地和踩坑之路。

一文帶你搭建一套 ELK Stack 日志平臺(tái)

一桂对、方案選擇

對(duì)于 MySQL 的高可用甩卓,主要分為兩步,配置 MySQL 主主模式和 keepalived 軟件蕉斜。拓?fù)鋱D如下所示:


MySQL 數(shù)據(jù)庫(kù)的主主模式

兩個(gè)數(shù)據(jù)庫(kù)分別部署在兩臺(tái)服務(wù)器上逾柿,相互同步數(shù)據(jù),但是只有一個(gè)提供給外部訪問(wèn)宅此,當(dāng)一個(gè)宕機(jī)后鹿寻,另外一個(gè)可以繼續(xù)提供服務(wù),在沒(méi)有 keepalived 軟件的幫助下诽凌,只能手動(dòng)切換

keepalived 監(jiān)測(cè)毡熏、自動(dòng)重啟、流量切換

檢測(cè)和重啟:兩臺(tái)服務(wù)器上都部署 keepalived 軟件侣诵,定時(shí)檢測(cè) MySQL 服務(wù)是否正常痢法,如果一個(gè)數(shù)據(jù)庫(kù)服務(wù)崩了,keepalived 會(huì)用腳本嘗試重啟 mysql 服務(wù)杜顺。

備份:兩個(gè) keepalived 服務(wù)都提供了虛擬 IP 供客戶端使用财搁,但是流量只會(huì)轉(zhuǎn)到一臺(tái) MySQL 服務(wù)上。

虛擬 IP:keepalived 配置好了后躬络,會(huì)有一個(gè) 虛擬 IP尖奔,對(duì)于客戶端來(lái)說(shuō),不關(guān)心連接的是哪臺(tái) MySQL穷当,訪問(wèn)虛擬 IP 就可以了提茁。

流量切換:如果客戶端正在訪問(wèn)的 MySQL 服務(wù)崩了后,keepalived 會(huì)用我們寫的腳本自動(dòng)重啟 MySQL馁菜,如果重啟失敗茴扁,腳本主動(dòng)停掉 keepalived,客戶端的流量就不會(huì)訪問(wèn)到這臺(tái)服務(wù)器上的 MySQL 服務(wù)汪疮,后續(xù)訪問(wèn)的流量都會(huì)切到另外一臺(tái) MySQL 服務(wù)峭火。

檢測(cè)和重啟的原理如下所示:

需要配置的內(nèi)容如下:

兩臺(tái) Ubuntu 服務(wù)器上啟動(dòng) MySQL 容器。

配置 MySQL 主從復(fù)制架構(gòu)智嚷。

將 MySQL 主從改為主主復(fù)制架構(gòu)卖丸。

兩臺(tái)服務(wù)器搭建 keepalived 環(huán)境監(jiān)控 MySQL 和自動(dòng)重啟 MySQL。

二盏道、主主復(fù)制的原理

對(duì)于 MySQL 的主主架構(gòu)稍浆,其實(shí)原理就是兩臺(tái)服務(wù)器互為主從,雙向復(fù)制。而復(fù)制的原理如下:

主從復(fù)制主要有以下流程:

主庫(kù)將數(shù)據(jù)的改變記錄到 binlog 中粹湃;

從庫(kù)會(huì)在一定時(shí)間間隔內(nèi)對(duì)master 的 binlog 進(jìn)行檢查恐仑,如果發(fā)生改變,則開(kāi)始一個(gè) I/O Thread 請(qǐng)求讀取 master 中 binlog 为鳄;

同時(shí)主庫(kù)為每個(gè) I/O 線程啟動(dòng)一個(gè) dump 線程裳仆,用于向其發(fā)送二進(jìn)制事件,并保存至從節(jié)點(diǎn)本地的中繼日志中孤钦,從庫(kù)將啟動(dòng) SQL 線程從中繼日志中讀取二進(jìn)制日志歧斟,在本地重放,使得其數(shù)據(jù)和主節(jié)點(diǎn)的保持一致偏形,最后 I/O Thread 和 SQL Thread 將進(jìn)入睡眠狀態(tài)静袖,等待下一次被喚醒;


大白話就是:

從庫(kù)會(huì)生成兩個(gè)線程,一個(gè) I/O 線程,一個(gè) SQL 線程;

I/O 線程會(huì)去請(qǐng)求主庫(kù)的 binlog俊扭,并將得到的 binlog 寫到本地的 relay-log (中繼日志)文件中;

主庫(kù)會(huì)生成一個(gè) dump 線程,用來(lái)給從庫(kù) I/O 線程傳 binlog;

SQL 線程,會(huì)讀取 relay log 文件中的日志,并解析成 SQL 語(yǔ)句逐一執(zhí)行;

接下來(lái)我們先把 MySQL 的基礎(chǔ)環(huán)境在兩臺(tái) Ubuntu 服務(wù)器上搭建好队橙,后續(xù)操作都是基于這個(gè)來(lái)做的。

三萨惑、配置 MySQL 環(huán)境

作為演示捐康,我在本機(jī)啟動(dòng)了兩臺(tái) Ubuntu 虛擬機(jī),安裝有 docker庸蔼。因?yàn)槲覀兊臏y(cè)試和生產(chǎn)環(huán)境是用 Docker 跑的解总,所以我將環(huán)境的鏡像打包后,還原到我的虛擬機(jī)上面姐仅。

3.1 備份和還原 mysql 鏡像

保存測(cè)試環(huán)境的 mysql 鏡像

sudo docker save -o mysql.tar hcr:5000/hschub/hscmysql:0.0.2

sudo chmod 777 mysql.tar

兩臺(tái)機(jī)器導(dǎo)入鏡像

sudo docker load -i mysql.tar

啟動(dòng)容器花枫,需要注意的是需要映射本地文件夾。

sudo docker run -p 3306:3306 --name mysql \

-v /home/hss/mysql/data:/var/lib/mysql \

-v /home/hss/mysql/etc/mysql:/etc/mysql \

-e MYSQL_ROOT_PASSWORD='123456' \

-d 46b

-v 代表映射的文件夾掏膏,-d 表示后臺(tái)運(yùn)行劳翰,46b 代表鏡像 id。

進(jìn)入容器壤追,連接 mysql磕道,node1的mysql 密碼是 123456,node2 是 123456

# 查詢?nèi)萜?id

docker ps

# 進(jìn)入 mysql 容器

docker exec -it <容器 id> /bin/bash

# 連接 mysql

mysql -u root -p

接下來(lái)我們配置 MySQL 的主從架構(gòu)行冰,需要注意的是后續(xù)搭建的主主架構(gòu)是基于主從架構(gòu)來(lái)的,區(qū)別就是修改了一部分配置伶丐。

四悼做、配置 MySQL 的主從架構(gòu)

拓?fù)浣Y(jié)構(gòu):

192.168.56.11 node1,主節(jié)點(diǎn)

192.168.56.12 node2哗魂,從節(jié)點(diǎn)


4.1 修改主節(jié)點(diǎn)配置文件

修改

/home/hss/mysql/etc/mysql/my.cnf 文件

server_id = 11

log_bin = /var/lib/mysql/log/mysql-bin

binlog-ignore-db=mysql

binlog_format= mixed

sync_binlog=100

log_slave_updates = 1

binlog_cache_size=32m

max_binlog_cache_size=64m

max_binlog_size=512m

relay_log = /var/lib/mysql/log/relay-bin

relay_log_index = /var/lib/mysql/log/relay-bin.index

master_info_repository=TABLE

relay-log-info-repository=TABLE

relay-log-recovery

創(chuàng)建

/home/hss/mysql/data/log/mysql-bin 文件夾

創(chuàng)建

/home/hss/mysql/data/log/relay-bin 文件夾

給兩個(gè)文件夾加上 777 權(quán)限肛走,然后重啟 MySQL 容器。

4.2 修改從節(jié)點(diǎn)配置文件

和主節(jié)點(diǎn)配置類似录别,需要修改 server_id = 12

4.3 添加主節(jié)點(diǎn) mysql 賬戶信息

CREATE USER 'vagrant'@'192.168.56.12' IDENTIFIED BY 'vagrant';

ALTER USER 'vagrant'@'192.168.56.12' IDENTIFIED WITH mysql_native_password BY 'vagrant';

GRANT REPLICATION SLAVE ON *.* TO 'vagrant'@'192.168.56.12';

FLUSH PRIVILEGES;

4.4 鎖主庫(kù)的表

FLUSH TABLES WITH READ LOCK;

4.5 查看二進(jìn)制日志文件的位置


記住 File 和 Position朽色,后面會(huì)用到邻吞。這里 File = mysql-bin.000008,Position = 1020葫男。

4.6 備份數(shù)據(jù)庫(kù)抱冷,導(dǎo)出為腳本文件

cd /var/lib/mysql

mkdir backup

mysqldump -uroot -P3306 --all-databases --triggers --routines --events > /var/lib/mysql/backup/all_databases.sql

查看掛載目錄下是否有生成 all_databases.sql 文件,如下圖所示:


4.7 解除鎖定表

UNLOCK TABLES

4.8 從節(jié)點(diǎn)還原數(shù)據(jù)庫(kù)

mysql -uroot -p -hlocalhost -P3306 < /var/lib/mysql/backup/all_databases.sql

4.9 設(shè)置同步信息

在 MySQL 命令行窗口中執(zhí)行以下命令設(shè)置同步信息梢褐。這里就是配置主數(shù)據(jù)庫(kù)的 IP 地址旺遮、Port、用戶名盈咳、密碼耿眉,二進(jìn)制文件名,偏移量鱼响。

CHANGE MASTER TO MASTER_HOST='192.168.56.11',

MASTER_PORT=3306,

MASTER_USER='vagrant',

MASTER_PASSWORD='vagrant',

MASTER_LOG_FILE='mysql-bin.000008',

MASTER_LOG_POS=1020;

4.10 啟動(dòng)從數(shù)據(jù)庫(kù)的復(fù)制線程

在 MySQL 命令行窗口中執(zhí)行以下命令啟動(dòng)從數(shù)據(jù)庫(kù)的復(fù)制線程鸣剪。

START salve;

4.11 查看從數(shù)據(jù)庫(kù)的同步狀態(tài)

SHOW slave status \G

如果 Slave_IO_Running 和 Slave_SQL_Running 顯示 Yes,就表示啟動(dòng)同步成功丈积。如下圖所示:


在主庫(kù)上執(zhí)行以下命令顯示當(dāng)前連接過(guò)來(lái)的從庫(kù)線程西傀。

SHOW PROCESSLIST

如下所示,Slave has read all relay log; wating for more updates桶癣,說(shuō)明從庫(kù)已經(jīng)同步完了拥褂。

使用上面的兩個(gè)命令,我們可以判斷當(dāng)前的復(fù)制情況牙寞。


4.12 驗(yàn)證同步功能

下面驗(yàn)證下主從節(jié)點(diǎn)之間是否能正常同步數(shù)據(jù)饺鹃。

主節(jié)點(diǎn)創(chuàng)建 testdb 數(shù)據(jù)庫(kù)和 member 表。

刷新下從節(jié)點(diǎn)间雀,發(fā)現(xiàn)從節(jié)點(diǎn)自動(dòng)創(chuàng)建了 member 表悔详。如下圖所示。

然后在主節(jié)點(diǎn)插入一條數(shù)據(jù)惹挟,刷新從節(jié)點(diǎn)后茄螃,發(fā)現(xiàn)從節(jié)點(diǎn)也自動(dòng)創(chuàng)建了一條數(shù)據(jù)。


五连锯、配置主主架構(gòu)

5.1 步驟

配置主主架構(gòu)就是在主從架構(gòu)中交換下配置信息归苍。步驟如下:

在節(jié)點(diǎn) node2 上創(chuàng)建復(fù)制賬戶。

查看二進(jìn)制日志文件和位置信息运怖。

在節(jié)點(diǎn) node1 上設(shè)置主從復(fù)制的信息拼弃,包括 ip,port摇展,用戶名吻氧,密碼,二進(jìn)制日志文件和位置信息。

node1 開(kāi)啟主從復(fù)制盯孙,查看主從復(fù)制狀態(tài)

5.2 node2 節(jié)點(diǎn)上的操作

5.2.1 停止同步

STOP slave

5.2.2 添加主節(jié)點(diǎn) mysql 賬戶信息

CREATE USER 'vagrant'@'192.168.56.11' IDENTIFIED BY 'vagrant';

ALTER USER 'vagrant'@'192.168.56.11' IDENTIFIED WITH mysql_native_password BY 'vagrant';

GRANT REPLICATION SLAVE ON *.* TO 'vagrant'@'192.168.56.11';

FLUSH PRIVILEGES;

5.2.3 查看二進(jìn)制日志文件和位置信息

SHOW MASTER STATUS


5.2.4 開(kāi)啟主從復(fù)制

start slave

5.2.5 查看同步狀態(tài)

5.3 node 1 節(jié)點(diǎn)上的操作

5.3.1 設(shè)置同步信息

CHANGE MASTER TO MASTER_HOST='192.168.56.12',

MASTER_PORT=3306,

MASTER_USER='vagrant',

MASTER_PASSWORD='vagrant',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=2453;

5.3.2 啟動(dòng)從數(shù)據(jù)庫(kù)的復(fù)制線程

START salve

5.3.3 查看從數(shù)據(jù)庫(kù)的同步狀態(tài)

SHOW slave status \G


5.4 測(cè)試主主同步

node2 的 member 表增加一條數(shù)據(jù) (2鲁森,zzz),node1 上同步成功


node 1 的 member 表增加一條數(shù)據(jù)(3振惰,aaa)歌溉,node2 上同步成功


六、搭建 keepalived 環(huán)境

6.1 Keepalived 的應(yīng)用場(chǎng)景

Keepalived 軟件在主主架構(gòu)中报账,可以配置成兩種應(yīng)用場(chǎng)景:

① 當(dāng)這臺(tái)服務(wù)器上的 keepalived 發(fā)現(xiàn) MySQL 服務(wù)崩了后研底,立刻停掉這臺(tái)服務(wù)器上 keepalived 自己,這樣流量就會(huì)自動(dòng)切到另外一臺(tái) keepalived 服務(wù)器透罢。

② 當(dāng)這臺(tái)服務(wù)器上的 keepalived 發(fā)現(xiàn) MySQL 服務(wù)崩了后榜晦,立刻嘗試重啟 MySQL 服務(wù),如果重啟失敗羽圃,則停掉 keepalived 自己乾胶。和第一種方案的區(qū)別是會(huì)嘗試重啟 MySQL 服務(wù)。

這里我配置成第二種功能場(chǎng)景朽寞,保障 MySQL 服務(wù)的高可用识窿。另外可以配置 MySQL 服務(wù)異常時(shí),發(fā)送郵件給運(yùn)維或開(kāi)發(fā)人員脑融,由他們檢查服務(wù)器的狀態(tài)喻频。

6.2 使用 Keepalived 的原理


Keepalived 提供了一個(gè)虛擬 IP (簡(jiǎn)稱 VIP),對(duì)外提供訪問(wèn)肘迎。當(dāng)客戶端連接這個(gè)虛擬 IP 后甥温,只會(huì)訪問(wèn)其中一個(gè) MySQL。MySQL 節(jié)點(diǎn)故障后妓布,keepalived 執(zhí)行腳本進(jìn)行重啟姻蚓,如果重啟失敗,腳本自動(dòng)停掉 keepalived匣沼,備用節(jié)點(diǎn)自動(dòng)切換為主節(jié)點(diǎn)狰挡。

keepalived 檢測(cè)和重啟的流程圖如下:


6.3 安裝 keepalived 軟件

安裝依賴、獲取 keepalived 安裝包释涛、解壓安裝包加叁、刪除安裝包。

# 安裝依賴

sudo apt-get install -y libssl-dev

sudo apt-get install -y openssl

sudo apt-get install -y libpopt-dev

sudo apt-get install -y libnl-dev

sudo apt-get install -y libnl-3-dev

sudo apt-get install -y libnl-genl-3.dev

sudo apt-get install daemon

sudo apt-get install libc-dev

sudo apt-get install libnfnetlink-dev

sudo apt-get install gcc

# 獲取 keepalived 安裝包

cd /usr/local

sudo su

sudo wget

https://www.keepalived.org/software/keepalived-2.2.2.tar.gz

# 解壓安裝包

sudo tar -zxvf keepalived-2.2.2.tar.gz

# 刪除安裝包

mv keepalived-2.2.2 keepalived

配置 keepalived 軟件

cd keepalived

./configure --prefix=/usr/local/keepalived --disable-dependency-tracking

執(zhí)行結(jié)果如下所示:


編譯 keepalived 軟件

sudo make && make install

執(zhí)行結(jié)果如下所示:


對(duì)于 Ubuntu 枢贿,需要做一點(diǎn)特別的改動(dòng)殉农,創(chuàng)建鏈接

mkdir -p /etc/rc.d/init.d

ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions

拷貝配置文件

sudo mkdir /etc/sysconfig

sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

sudo cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/

sudo cp /usr/local/keepalived/sbin/keepalived /sbin/

sudo mkdir /etc/keepalived

sudo cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

修改配置文件

/etc/keepalived/keepalived.conf

daemon keepalived ${KEEPALIVED_OPTIONS}

改為

daemon -- keepalived ${KEEPALIVED_OPTIONS}

6.4 添加虛擬 IP

先用 ifconfig 查看當(dāng)前的網(wǎng)卡,比如我的服務(wù)器上是 enp0s8局荚。

ip addr del 192.168.56.88 dev enp0s8:1

ifconfig enp0s8:1 192.168.56.88 broadcast 192.168.56.255 netmask 255.255.255.0 up

route add -host 192.168.56.88 dev enp0s8:1

將命令寫到 /usr/local/script/vip.sh文件中。最好將 /usr/local/script/vip.sh文件添加到服務(wù)器的開(kāi)機(jī)啟動(dòng)項(xiàng)中,將 Keepalived 服務(wù)設(shè)置為開(kāi)機(jī)自啟動(dòng)(未寫)耀态。

6.5 修改配置文件

備份配置文件

sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

修改配置文件

sudo vim /etc/keepalived/keepalived.conf

配置文件的內(nèi)容如下:

global_defs {

router_id MYSQL_HA #當(dāng)前節(jié)點(diǎn)名

}

vrrp_script restart_mysql {

script "

/usr/local/keepalived/restart_mysql.sh" #重啟 mysql 容器

interval 2

weight 2

}

vrrp_instance VI_1 {

state BACKUP #兩臺(tái)配置節(jié)點(diǎn)均為BACKUP

interface enp0s8 #綁定虛擬IP的網(wǎng)絡(luò)接口

virtual_router_id 51 #VRRP組名轮傍,兩個(gè)節(jié)點(diǎn)的設(shè)置必須一樣,以指明各個(gè)節(jié)點(diǎn)屬于同一VRRP組

priority 101 #節(jié)點(diǎn)的優(yōu)先級(jí),另一臺(tái)優(yōu)先級(jí)改低一點(diǎn)

advert_int 1 #組播信息發(fā)送間隔首装,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣

nopreempt #不搶占创夜,只在優(yōu)先級(jí)高的機(jī)器上設(shè)置即可,優(yōu)先級(jí)低的機(jī)器不設(shè)置

authentication { #設(shè)置驗(yàn)證信息仙逻,兩個(gè)節(jié)點(diǎn)必須一致

auth_type PASS

auth_pass 123456

}

track_script {

restart_mysql #檢測(cè) mysql 狀態(tài)驰吓,如果失敗,則重啟 mysql 容器

}

virtual_ipaddress { #指定虛擬IP,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣

192.168.56.88

}

}

virtual_server 192.168.56.88 3306 { #linux虛擬服務(wù)器(LVS)配置

delay_loop 2 #每個(gè)2秒檢查一次real_server狀態(tài)

lb_algo wrr #LVS調(diào)度算法,rr|wrr|lc|wlc|lblc|sh|dh

lb_kind DR #LVS集群模式 ,NAT|DR|TUN

persistence_timeout 60 #會(huì)話保持時(shí)間

protocol TCP #使用的協(xié)議是TCP還是UDP

real_server 192.168.56.11 3306 {

weight 3 #權(quán)重

TCP_CHECK {

connect_timeout 10 #連接超時(shí)時(shí)間

nb_get_retry 3 #重連次數(shù)

delay_before_retry 3 #重連間隔時(shí)間

connect_port 3306 #健康檢查端口

}

}

}

編寫異常處理腳本

sudo vim /usr/local/keepalived/restart_mysql.sh

內(nèi)容如下系奉,

#!/bin/bash

# 定義變量檬贰,重啟 mysql 容器

START_MYSQL="docker restart mysql"

# 定義變量,停止 mysql 容器

STOP_MYSQL="docker stop mysql"

# 定義變量缺亮,日志文件路徑

LOG_FILE="

/usr/local/keepalived/logs/mysql-check.log"

# 定義變量翁涤,檢查 mysql 服務(wù)是否正常的命令

HAPS=`ps -C mysqld --no-header |wc -l`

# 打印當(dāng)前時(shí)間到日志文件

date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE

# 打印提示信息到日志文件

echo "check mysql status" >> $LOG_FILE

# 檢查數(shù)據(jù)庫(kù)狀態(tài),如何返回 0萌踱,則重啟 mysql 容器葵礼,然后休眠 3s 后,再次檢測(cè) mysql 狀態(tài)并鸵,如果還是返回 0鸳粉,則停止 keepalived。

if [ $HAPS -eq 0 ];then

echo $START_MYSQL >> $LOG_FILE

$START_MYSQL >> $LOG_FILE 2>&1

sleep 3

if [ `ps -C mysqld --no-header |wc -l` -eq 0 ];then

echo "start mysql failed, killall keepalived" >> $LOG_FILE

killall keepalived

fi

fi

給腳本分配權(quán)限

sudo chmod +x /usr/local/keepalived/restart_mysql.sh

創(chuàng)建 logs 文件夾园担,給 logs 文件夾分配權(quán)限

sudo mkdir /usr/local/keepalived/logs

sudo chmod +x /usr/local/keepalived/logs -r

重新加載配置文件

sudo systemctl daemon-reload

6.6 啟動(dòng) keepalived

6.6.1 啟動(dòng)兩臺(tái)服務(wù)器上的 keepalived

啟動(dòng) node2 節(jié)點(diǎn):

sudo pkill keepalived

sudo systemctl start keepalived

sudo systemctl status keepalived


啟動(dòng) node1 節(jié)點(diǎn):

pkilll keepalived

sudo systemctl status keepalived


我們可以通過(guò)這個(gè)命令查看 keepalived 進(jìn)程

ps -ef | grep keepalived


查看日志

sudo cat /var/log/syslog

6.7 測(cè)試 keepalived 是否會(huì)重啟 mysql

停止 node2 上的 mysql 容器

docker stop 8cc

查看 keepalived 狀態(tài)届谈,提示移除了 mysql 服務(wù)。


因?yàn)?keepalived 會(huì)每 2s 檢查一次 MySQL 的狀態(tài)粉铐,發(fā)現(xiàn) MySQL 異常后疼约,就會(huì)重啟 mysql 容器。所以過(guò)幾秒后蝙泼,重新查看容器狀態(tài)程剥,會(huì)看到 mysql 容器重新啟動(dòng)了。

docker ps


查看 keepalived 狀態(tài)汤踏,執(zhí)行 restart_mysql 成功


查看執(zhí)行日志


問(wèn)題:每 2s 會(huì)打印一次织鲸,文件可能會(huì)很大。需要執(zhí)行定期刪除溪胶。

6.8 測(cè)試 MySQL 節(jié)點(diǎn)切換

驗(yàn)證下當(dāng) MySQL 重啟失敗后搂擦,keepalived 自動(dòng)停止后,客戶端連接的 MySQL 是否會(huì)自動(dòng)切到另外一個(gè) MySQL 節(jié)點(diǎn)上哗脖。

首先用 mysql 客戶端工具 navicat 連接虛擬 ip 地址瀑踢,賬號(hào)和密碼就是 node 1 和 node2 的 mysql 賬號(hào)密碼(root/123456)


可以連接上扳还,然后執(zhí)行以下命令,查看當(dāng)前虛擬 ip 連接的是哪個(gè)數(shù)據(jù)庫(kù)

SHOW VARIABLES LIKE '%hostname%'

可以看到連接的是 node2 的容器的 id橱夭,說(shuō)明 keepalived 已經(jīng)通過(guò)虛擬 ip 連接到 node2 的 mysql 了氨距,是正常工作的,node2 現(xiàn)在是作為主節(jié)點(diǎn)棘劣,node1 作為備用節(jié)點(diǎn)俏让。


由于本地環(huán)境重新啟動(dòng) MySQL 都是成功的,不會(huì)停掉 keepalived 服務(wù)茬暇。出于演示目的首昔,我就直接停掉 keepalived 服務(wù)。

pkill keepalived

執(zhí)行下面這個(gè)命令可以查看 keepalived 進(jìn)程糙俗,發(fā)現(xiàn)已經(jīng)沒(méi)有了勒奇。(控制臺(tái)顯示的 grep --color=auto keepalived 表示是查找命令)

ps -ef | grep keepalived


重新查詢客戶端的連接信息,發(fā)現(xiàn)已經(jīng)切換到 92b (node1)機(jī)器上的 mysql 了臼节。

SHOW VARIABLES LIKE '%hostname%'


再次查看 node1 上 keepalived 上的狀態(tài)撬陵,再發(fā)送信息給

sudo systemctl status keepalived


七、遇到的坑

7.1 密碼不正確网缝,無(wú)法登錄的問(wèn)題

密碼不正確巨税,設(shè)置跳過(guò)密碼驗(yàn)證

apt-get update

apt install vim

修改 mysql 配置文件

vim /etc/mysql/my.cnf

添加一行配置,跳過(guò) mysql 密碼驗(yàn)證

skip-grant-tables

重啟容器

docker restart 9e6

重新計(jì)入 mysql 容器粉臊,連接 mysql草添,不需要密碼就可以連接上 mysql。

mysql


修改登錄密碼

update mysql.user set authentication_string=PASSWORD('123456') where User='root';

重啟容器

7.2 沒(méi)有映射 mysql 文件夾

cd /home/hss/mysql/etc

sudo chmod 777 mysql -R

拷貝 mysql 文件夾

7.3 mysql data 文件夾沒(méi)有權(quán)限

sudo chmod 777 /home/hss/mysql/data -R

7.4 安裝依賴包失敗

sudo apt-get install -y libnl-dev libnl-3-dev libnl-genl-3.dev

Reading package lists... Done

Building dependency tree

Reading state information... Done

Note, selecting 'libnl-genl-3-dev' for regex 'libnl-genl-3.dev'

Package libnl-dev is not available, but is referred to by another package.

This may mean that the package is missing, has been obsoleted, or

is only available from another source

E: Package 'libnl-dev' has no installation candidate

解決方案:更新包

sudo apt-get -y update

7.5 更新包失敗

Err:15 https://download.docker.com/linux/ubuntu bionic Release Could not wait for server fd - select (11: Resource temporarily unavailable) [IP: 198.18.0.39 443] Reading package lists... Done E: The repository 'https://download.docker.com/linux/ubuntu bionic Release' no longer has a Release file. N: Updating from such a repository can't be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details.

解決方案:

修改配置文件

sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup

sudo vim /etc/apt/sources.list

配置內(nèi)容如下:

deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse

執(zhí)行更新

sudo apt-get update

依賴包版本太高

apt-get install libnl-dev

The following packages have unmet dependencies:

libnl-3-dev : Depends: libnl-3-200 (= 3.2.21-1ubuntu4.1) but 3.2.29-0ubuntu3 is to be installed

Conflicts: libnl-dev but 1.1-8ubuntu1 is to be installed

libnl-genl-3-dev : Depends: libnl-genl-3-200 (= 3.2.21-1ubuntu4.1) but 3.2.29-0ubuntu3 is to be installed

E: Unable to correct problems, you have held broken packages.

解決方案:

按照這個(gè)報(bào)錯(cuò)信息來(lái)進(jìn)行降級(jí)扼仲,等號(hào)后面就是提示信息里括號(hào)的版本信息远寸。

sudo apt-get install libnl-3-200=3.2.21-1ubuntu4.1

sudo apt-get install libnl-genl-3-200=3.2.21-1ubuntu4.1

啟動(dòng) keepalived 報(bào)錯(cuò)

root@node1:/usr/local/keepalived/etc/keepalived# service keepalived restart

Failed to restart keepalived.service: Unit keepalived.service is masked.

root@node1:/usr/local/keepalived/etc/keepalived# systemctl status keepalived.service

● keepalived.service

Loaded: masked (/dev/null; bad)

Active: inactive (dead)

Condition: start condition failed at Wed 2022-05-11 02:40:46 UTC; 1 day 3h ago


解決方案:

systemctl unmask sshd

再次啟動(dòng),提示另外一個(gè)錯(cuò)誤屠凶。


解決方案驰后,因?yàn)?ubuntu 沒(méi)有這個(gè)命令

/etc/rc.d/init.d/functions,所以需要添加一個(gè)命令鏈接

mkdir -p /etc/rc.d/init.d

ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions

install gcc 出現(xiàn)問(wèn)題

切換回 ubuntu 官方源

sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup2

sudo mv /etc/apt/sources.list.backup /etc/apt/sources.list

sudo apt-get update

sudo apt-get install gcc


啟動(dòng) keepalived 報(bào)錯(cuò) keepalived_script

WARNING - default user 'keepalived_script' for script execution does not exist - please create.

解決方案:

配置文件的 global_defs 配置里面增加 script_user root

global_defs {

script_user rot

}

執(zhí)行腳本失敗

May 16 03:50:54 node1 Keepalived_vrrp[19855]: WARNING - script '/usr/local/keepalived/restart_mysql.sh' is not executable for uid:gid 0:0 - disabling.

May 16 03:50:54 node1 Keepalived_vrrp[19855]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.

給腳本添加權(quán)限矗愧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灶芝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唉韭,更是在濱河造成了極大的恐慌夜涕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属愤,死亡現(xiàn)場(chǎng)離奇詭異女器,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)住诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門驾胆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涣澡,“玉大人,你說(shuō)我怎么就攤上這事俏拱∈钏埽” “怎么了吼句?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锅必,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惕艳,道長(zhǎng)搞隐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任远搪,我火速辦了婚禮劣纲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谁鳍。我一直安慰自己癞季,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布倘潜。 她就那樣靜靜地躺著绷柒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涮因。 梳的紋絲不亂的頭發(fā)上废睦,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音养泡,去河邊找鬼嗜湃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澜掩,可吹牛的內(nèi)容都是我干的购披。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肩榕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刚陡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起点把,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橘荠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后郎逃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哥童,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年褒翰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贮懈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匀泊。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朵你,靈堂內(nèi)的尸體忽然破棺而出各聘,到底是詐尸還是另有隱情,我是刑警寧澤抡医,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布躲因,位于F島的核電站,受9級(jí)特大地震影響忌傻,放射性物質(zhì)發(fā)生泄漏大脉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一水孩、第九天 我趴在偏房一處隱蔽的房頂上張望镰矿。 院中可真熱鬧,春花似錦俘种、人聲如沸秤标。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苍姜。三九已至,卻和暖如春荐类,著一層夾襖步出監(jiān)牢的瞬間怖现,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工玉罐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈嗤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓吊输,卻偏偏與公主長(zhǎng)得像饶号,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子季蚂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • (一)雙機(jī)方案 1. 工作流程圖 2. 服務(wù)器環(huán)境 簡(jiǎn)述:目前雙機(jī)環(huán)境要求有四臺(tái)服務(wù)器茫船,并預(yù)分配兩個(gè)虛擬ip地址 ...
    sunam閱讀 1,938評(píng)論 0 2
  • 1. 統(tǒng)一環(huán)境配置(構(gòu)建Kubernetes基礎(chǔ)系統(tǒng)鏡像防止后面逐臺(tái)安裝) 此處為加固印象,本人重新構(gòu)建扭屁,技術(shù)嘛算谈,...
    bear_small閱讀 697評(píng)論 0 4
  • 2021-08-09: POJO類中布爾類型的變量,命名時(shí)不要加is料滥,否則部分框架解析時(shí)會(huì)引起序列化錯(cuò)誤然眼。(因?yàn)樵?..
    windUtterance閱讀 1,076評(píng)論 0 3
  • 1.安裝harbor、haproxy和keepalived 安裝docker葵腹,上傳腳本docker-install...
    dongyading閱讀 419評(píng)論 0 0
  • ▲單獨(dú)架構(gòu)的小伙伴看這里:(學(xué)習(xí)杰哥視頻的作業(yè)第19-20天) 1高每、使用docker-compose制作nginx...
    一心1977閱讀 416評(píng)論 0 0