實戰 MySQL 高可用架構

語言: CN / TW / HK

這是悟空的第  147  篇原創文章

官網:www.passjava.cn

你好,我是悟空。

業界流傳一句話:沒有做過運維的程式設計師不是好架構師。

不知是真是假。

前言

對於 MySQL 資料庫作為各個業務系統的儲存介質,在系統中承擔著非常重要的職責,如果資料庫崩了,那麼對於讀和寫資料庫的操作都會受到影響。如果不能迅速恢復,對業務的影響是非常大的。之前 B 站不是出過一次事故麼,2 小時才恢復過來,詳細可以看之前寫的文章。

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

上次折騰完 ELK 日誌檢索平臺後,開發環境可以正常查詢日誌了。最近在做系統高可用相關的工作,這次我來分享下 MySQL 雙主 + Keepalived 的高可用落地和踩坑之路。

一文帶你搭建一套 ELK Stack 日誌平臺

一、方案選擇

對於 MySQL 的高可用,主要分為兩步,配置 MySQL 主主模式和 keepalived 軟體。拓撲圖如下所示:

MySQL 資料庫的主主模式

兩個資料庫分別部署在兩臺伺服器上,相互同步資料,但是隻有一個提供給外部訪問,當一個宕機後,另外一個可以繼續提供服務,在沒有 keepalived 軟體的幫助下,只能手動切換

keepalived 監測、自動重啟、流量切換

  • 檢測和重啟:兩臺伺服器上都部署 keepalived 軟體,定時檢測 MySQL 服務是否正常,如果一個數據庫服務崩了,keepalived 會用指令碼嘗試重啟 mysql 服務。

  • 備份:兩個 keepalived 服務都提供了虛擬 IP 供客戶端使用,但是流量只會轉到一臺 MySQL 服務上。

  • 虛擬 IP:keepalived 配置好了後,會有一個 虛擬 IP,對於客戶端來說,不關心連線的是哪臺 MySQL,訪問虛擬 IP 就可以了。

  • 流量切換:如果客戶端正在訪問的 MySQL 服務崩了後,keepalived 會用我們寫的指令碼自動重啟 MySQL,如果重啟失敗,指令碼主動停掉 keepalived,客戶端的流量就不會訪問到這臺伺服器上的 MySQL 服務,後續訪問的流量都會切到另外一臺 MySQL 服務。

檢測和重啟的原理如下所示:

需要配置的內容如下:

  • 兩臺 Ubuntu 伺服器上啟動 MySQL 容器。

  • 配置 MySQL 主從複製架構。

  • 將 MySQL 主從改為主主複製架構。

  • 兩臺伺服器搭建 keepalived 環境監控 MySQL 和自動重啟 MySQL。

二、主主複製的原理

對於 MySQL 的主主架構,其實原理就是兩臺伺服器互為主從,雙向複製。而複製的原理如下:

主從複製主要有以下流程:

  1. 主庫將資料的改變記錄到 binlog 中;

  2. 從庫會在一定時間間隔內對master 的 binlog 進行檢查,如果發生改變,則開始一個 I/O Thread 請求讀取 master 中 binlog ;

  3. 同時主庫為每個 I/O 執行緒啟動一個 dump 執行緒,用於向其傳送二進位制事件,並儲存至從節點本地的中繼日誌中,從庫將啟動 SQL 執行緒從中繼日誌中讀取二進位制日誌,在本地重放,使得其資料和主節點的保持一致,最後 I/O Thread 和 SQL Thread 將進入睡眠狀態,等待下一次被喚醒;

大白話就是:

從庫會生成兩個執行緒,一個 I/O 執行緒,一個 SQL 執行緒;

I/O 執行緒會去請求主庫的 binlog,並將得到的 binlog 寫到本地的 relay-log (中繼日誌)檔案中;

主庫會生成一個 dump 執行緒,用來給從庫 I/O 執行緒傳 binlog;

SQL 執行緒,會讀取 relay log 檔案中的日誌,並解析成 SQL 語句逐一執行;

接下來我們先把 MySQL 的基礎環境在兩臺 Ubuntu 伺服器上搭建好,後續操作都是基於這個來做的。

三、配置 MySQL 環境

作為演示,我在本機啟動了兩臺 Ubuntu 虛擬機器,安裝有 docker。因為我們的測試和生產環境是用 Docker 跑的,所以我將環境的映象打包後,還原到我的虛擬機器上面。

3.1 備份和還原 mysql 映象

儲存測試環境的 mysql 映象

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

sudo chmod 777 mysql.tar

兩臺機器匯入映象

sudo docker load -i mysql.tar

啟動容器,需要注意的是需要對映本地資料夾。

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 表示後臺執行,46b 代表映象 id。

進入容器,連線 mysql,node1的mysql 密碼是 123456,node2 是 123456

# 查詢容器 id
docker ps

# 進入 mysql 容器
docker exec -it <容器 id> /bin/bash

# 連線 mysql
mysql -u root -p

接下來我們配置 MySQL 的主從架構,需要注意的是後續搭建的主主架構是基於主從架構來的,區別就是修改了一部分配置。

四、配置 MySQL 的主從架構

拓撲結構:

  • 192.168.56.11 node1,主節點

  • 192.168.56.12 node2,從節點

4.1 修改主節點配置檔案

修改 /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

建立 /home/hss/mysql/data/log/mysql-bin 資料夾

建立 /home/hss/mysql/data/log/relay-bin  資料夾

給兩個資料夾加上 777 許可權,然後重啟 MySQL 容器。

4.2 修改從節點配置檔案

和主節點配置類似,需要修改 server_id = 12

4.3 新增主節點 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 鎖主庫的表

FLUSH TABLES WITH READ LOCK;

4.5 檢視二進位制日誌檔案的位置

記住 File 和 Position,後面會用到。這裡 File = mysql-bin.000008,Position = 1020。

4.6 備份資料庫,匯出為指令碼檔案

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 從節點還原資料庫

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

4.9 設定同步資訊

在 MySQL 命令列視窗中執行以下命令設定同步資訊。這裡就是配置主資料庫的 IP 地址、Port、使用者名稱、密碼,二進位制檔名,偏移量。

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 啟動從資料庫的複製執行緒

在 MySQL 命令列視窗中執行以下命令啟動從資料庫的複製執行緒。

START salve;

4.11 檢視從資料庫的同步狀態

SHOW slave status \G

如果 Slave_IO_Running 和 Slave_SQL_Running 顯示 Yes,就表示啟動同步成功。如下圖所示:

在主庫上執行以下命令顯示當前連線過來的從庫執行緒。

SHOW PROCESSLIST

如下所示,Slave has read all relay log; wating for more updates,說明從庫已經同步完了。

使用上面的兩個命令,我們可以判斷當前的複製情況。

4.12 驗證同步功能

下面驗證下主從節點之間是否能正常同步資料。

主節點建立 testdb 資料庫和 member 表。

重新整理下從節點,發現從節點自動建立了 member 表。如下圖所示。

然後在主節點插入一條資料,重新整理從節點後,發現從節點也自動建立了一條資料。

五、配置主主架構

5.1 步驟

配置主主架構就是在主從架構中交換下配置資訊。步驟如下:

  • 在節點 node2 上建立複製賬戶。

  • 檢視二進位制日誌檔案和位置資訊。

  • 在節點 node1 上設定主從複製的資訊,包括 ip,port,使用者名稱,密碼,二進位制日誌檔案和位置資訊。

  • node1 開啟主從複製,檢視主從複製狀態

5.2 node2 節點上的操作

5.2.1 停止同步

STOP slave

5.2.2 新增主節點 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 檢視二進位制日誌檔案和位置資訊

SHOW MASTER STATUS

5.2.4 開啟主從複製

start slave

5.2.5 檢視同步狀態

5.3 node 1 節點上的操作

5.3.1 設定同步資訊

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 啟動從資料庫的複製執行緒

START salve

5.3.3 檢視從資料庫的同步狀態

SHOW slave status \G

5.4 測試主主同步

node2 的 member 表增加一條資料 (2,zzz),node1 上同步成功

node 1 的 member 表增加一條資料(3,aaa),node2 上同步成功

六、搭建 keepalived 環境

6.1 Keepalived 的應用場景

Keepalived 軟體在主主架構中,可以配置成兩種應用場景:

  • ① 當這臺伺服器上的 keepalived 發現 MySQL 服務崩了後, 立刻停掉 這臺伺服器上 keepalived 自己,這樣流量就會自動切到另外一臺 keepalived 伺服器。

  • ② 當這臺伺服器上的 keepalived 發現 MySQL 服務崩了後,立刻嘗試 重啟 MySQL 服務 ,如果重啟失敗,則停掉 keepalived 自己。和第一種方案的區別是會嘗試重啟 MySQL 服務。

這裡我配置成第二種功能場景,保障 MySQL 服務的高可用。另外可以配置 MySQL 服務異常時,傳送郵件給運維或開發人員,由他們檢查伺服器的狀態。

6.2 使用 Keepalived 的原理

Keepalived 提供了一個虛擬 IP (簡稱 VIP),對外提供訪問。當客戶端連線這個虛擬 IP 後,只會訪問其中一個 MySQL。MySQL 節點故障後,keepalived 執行指令碼進行重啟,如果重啟失敗,指令碼自動停掉 keepalived,備用節點自動切換為主節點。

keepalived 檢測和重啟的流程圖如下:

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

執行結果如下所示:

編譯 keepalived 軟體

sudo make && make install

執行結果如下所示:

對於 Ubuntu ,需要做一點特別的改動,建立連結

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 檢視當前的網絡卡,比如我的伺服器上是 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檔案新增到伺服器的開機啟動項中,將 Keepalived 服務設定為開機自啟動(未寫)。

6.5 修改配置檔案

備份配置檔案

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

修改配置檔案

sudo vim /etc/keepalived/keepalived.conf

配置檔案的內容如下:

global_defs {
router_id MYSQL_HA #當前節點名
}
vrrp_script restart_mysql {
script "/usr/local/keepalived/restart_mysql.sh" #重啟 mysql 容器
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP #兩臺配置節點均為BACKUP
interface enp0s8 #繫結虛擬IP的網路介面
virtual_router_id 51 #VRRP組名,兩個節點的設定必須一樣,以指明各個節點屬於同一VRRP組
priority 101 #節點的優先順序,另一臺優先順序改低一點
advert_int 1 #組播資訊傳送間隔,兩個節點設定必須一樣
nopreempt #不搶佔,只在優先順序高的機器上設定即可,優先順序低的機器不設定
authentication { #設定驗證資訊,兩個節點必須一致
auth_type PASS
auth_pass 123456
}
track_script {
restart_mysql #檢測 mysql 狀態,如果失敗,則重啟 mysql 容器
}
virtual_ipaddress { #指定虛擬IP,兩個節點設定必須一樣
192.168.56.88
}
}
virtual_server 192.168.56.88 3306 { #linux虛擬伺服器(LVS)配置
delay_loop 2 #每個2秒檢查一次real_server狀態
lb_algo wrr #LVS排程演算法,rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS叢集模式 ,NAT|DR|TUN
persistence_timeout 60 #會話保持時間
protocol TCP #使用的協議是TCP還是UDP

real_server 192.168.56.11 3306 {
weight 3 #權重
TCP_CHECK {
connect_timeout 10 #連線超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 3306 #健康檢查埠
}
}
}

編寫異常處理指令碼

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

內容如下,

#!/bin/bash
# 定義變數,重啟 mysql 容器
START_MYSQL="docker restart mysql"
# 定義變數,停止 mysql 容器
STOP_MYSQL="docker stop mysql"
# 定義變數,日誌檔案路徑
LOG_FILE="/usr/local/keepalived/logs/mysql-check.log"
# 定義變數,檢查 mysql 服務是否正常的命令
HAPS=`ps -C mysqld --no-header |wc -l`
# 列印當前時間到日誌檔案
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
# 列印提示資訊到日誌檔案
echo "check mysql status" >> $LOG_FILE
# 檢查資料庫狀態,如何返回 0,則重啟 mysql 容器,然後休眠 3s 後,再次檢測 mysql 狀態,如果還是返回 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

給指令碼分配許可權

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

建立 logs 資料夾,給 logs 資料夾分配許可權

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

重新載入配置檔案

sudo systemctl daemon-reload

6.6 啟動 keepalived

6.6.1 啟動兩臺伺服器上的 keepalived

啟動 node2 節點:

sudo pkill keepalived

sudo systemctl start keepalived

sudo systemctl status keepalived

啟動 node1 節點:

pkilll keepalived

sudo systemctl status keepalived

我們可以通過這個命令檢視 keepalived 程序

ps -ef | grep keepalived

檢視日誌

sudo cat /var/log/syslog

6.7 測試 keepalived 是否會重啟 mysql

停止 node2 上的 mysql 容器

docker stop 8cc

檢視 keepalived 狀態,提示移除了 mysql 服務。

因為 keepalived 會每 2s 檢查一次 MySQL 的狀態,發現 MySQL 異常後,就會重啟 mysql 容器。所以過幾秒後,重新檢視容器狀態,會看到 mysql 容器重新啟動了。

docker  ps

檢視 keepalived 狀態,執行 restart_mysql 成功

檢視執行日誌

問題:每 2s 會列印一次,檔案可能會很大。需要執行定期刪除。

6.8 測試 MySQL 節點切換

驗證下當 MySQL 重啟失敗後,keepalived 自動停止後,客戶端連線的 MySQL 是否會自動切到另外一個 MySQL 節點上。

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

可以連線上,然後執行以下命令,檢視當前虛擬 ip 連線的是哪個資料庫

SHOW VARIABLES LIKE '%hostname%'

可以看到連線的是 node2 的容器的 id,說明 keepalived 已經通過虛擬 ip 連線到 node2 的 mysql 了,是正常工作的,node2 現在是作為主節點,node1 作為備用節點。

由於本地環境重新啟動  MySQL 都是成功的,不會停掉 keepalived 服務。出於演示目的,我就直接停掉 keepalived 服務。

pkill keepalived

執行下面這個命令可以檢視 keepalived 程序,發現已經沒有了。(控制檯顯示的 grep --color=auto keepalived 表示是查詢命令)

ps -ef | grep keepalived

重新查詢客戶端的連線資訊,發現已經切換到 92b (node1)機器上的 mysql 了。

SHOW VARIABLES LIKE '%hostname%'

再次檢視 node1 上 keepalived 上的狀態,再發送資訊給

sudo systemctl status keepalived

七、遇到的坑

7.1 密碼不正確,無法登入的問題

密碼不正確,設定跳過密碼驗證

apt-get update

apt install vim

修改 mysql 配置檔案

vim /etc/mysql/my.cnf

新增一行配置,跳過 mysql 密碼驗證

skip-grant-tables

重啟容器

docker restart 9e6

重新計入 mysql 容器,連線 mysql,不需要密碼就可以連線上 mysql。

mysql

修改登入密碼

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

重啟容器

7.2 沒有對映 mysql 資料夾

cd /home/hss/mysql/etc
sudo chmod 777 mysql -R

拷貝 mysql 資料夾

7.3 mysql data 資料夾沒有許可權

 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

配置內容如下:

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

執行更新

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.

解決方案:

按照這個報錯資訊來進行降級,等號後面就是提示資訊裡括號的版本資訊。

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

啟動 keepalived 報錯

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

再次啟動,提示另外一個錯誤。

解決方案,因為 ubuntu 沒有這個命令 /etc/rc.d/init.d/functions,所以需要新增一個命令連結

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

install gcc 出現問題

切換回 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

啟動 keepalived 報錯 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
}

執行指令碼失敗

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.

給指令碼新增許可權。

參考資料:

https://weread.qq.com/web/reader/bd032100721bc56bbd056ff

https://weread.qq.com/web/reader/85a329405d039885a68ca85

https://blog.csdn.net/Sebastien23/article/details/114260591

https://www.cnblogs.com/zhangxingeng/p/10595058.html

https://blog.csdn.net/u012599988/article/details/82152224

https://blog.csdn.net/lupengfei1009/article/details/86514445

https://blog.csdn.net/temotemo/article/details/79445694

https://blog.csdn.net/qq_38491310/article/details/86510666

- END -

寫了兩本 PDF, 回覆  分散式  或  PDF  載。

我的 JVM 專欄已上架,回覆  JVM  領取

我是悟空, 期待與你一起升級打怪變強,我們下期見。