MySQL高可用架構搭建實戰

来源:https://www.cnblogs.com/88223100/archive/2022/06/25/MySQL-high-availability-architecture-builds-actual-combat.html
-Advertisement-
Play Games

對於 MySQL 資料庫作為各個業務系統的存儲介質,在系統中承擔著非常重要的職責,如果資料庫崩了,那麼對於讀和寫資料庫的操作都會受到影響。如果不能迅速恢復,對業務的影響是非常大的。本文我將分享MySQL 雙主 + Keepalived 的高可用落地和踩坑之路。 ...


 

前言

 

對於 MySQL 資料庫作為各個業務系統的存儲介質,在系統中承擔著非常重要的職責,如果資料庫崩了,那麼對於讀和寫資料庫的操作都會受到影響。如果不能迅速恢復,對業務的影響是非常大的。本文我將分享MySQL 雙主 + Keepalived 的高可用落地和踩坑之路。

 

一、方案選擇

 

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

 

 

 

 

1、MySQL 資料庫的主主模式

 

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

 

2、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 的主主架構,其實原理就是兩台伺服器互為主從,雙向複製。而複製的原理如下。

 

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

 

  • 主庫將數據的改變記錄到 binlog 中;

 

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

 

  • 同時主庫為每個 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 跑的,所以我將環境的鏡像打包後,還原到我的虛擬機上面。

 

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,從節點

     

     

     

    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 容器。

     

    2、修改從節點配置文件

     

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

     

    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、鎖主庫的表

    FLUSH TABLES WITH READ LOCK。

    5、查看二進位日誌文件的位置

     

     

     

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

     

    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 文件,如下圖所示:

  

 

 

   7、解除鎖定表

 

UNLOCK TABLES

  8、從節點還原資料庫

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

  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;

  10、啟動從資料庫的複製線程

 

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

START salve;

  11、查看從資料庫的同步狀態

SHOW slave status \G

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

 

 

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

SHOW PROCESSLIST

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

 

 

 

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

  12、驗證同步功能

 

下麵驗證下主從節點之間是否能正常同步數據。

 

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

 

刷新下從節點,發現從節點自動創建了 member 表。如下圖所示。

 

然後在主節點插入一條數據,刷新從節點後,發現從節點也自動創建了一條數據。

 

 

 

五、配置主主架構

 

1、步驟

 

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

 

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

 

  • 查看二進位日誌文件和位置信息。

 

  • 在節點 node1 上設置主從複製的信息,包括 ip,port,用戶名,密碼,二進位日誌文件和位置信息。

 

  • node1 開啟主從複製,查看主從複製狀態。

 

  2、node2 節點上的操作

 

1)停止同步

 

STOP slave

 

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;

3)查看二進位日誌文件和位置信息

 

SHOW MASTER STATUS

 

 

 4)開啟主從複製

start slave

5)查看同步狀態

 

 

 

3、node 1 節點上的操作

 

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;

2)啟動從資料庫的複製線程

START salve

3)查看從資料庫的同步狀態

 

SHOW slave status \G

 

 

 

4、測試主主同步

 

node2 的 member 表增加一條數據 (2,zzz),node1 上同步成功。

 

 

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

 

 

 

六、搭建 keepalived 環境

 

1、Keepalived 的應用場景

 

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

 

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

 

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

 

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

 

2、使用 Keepalived 的原理

 

 

 

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

 

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

 

 

 

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}

      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 服務設置為開機自啟動(未寫)。

       

      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、啟動 keepalived

 

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

       

7、測試 keepalived 是否會重啟 mysql

 

  • 停止 node2 上的 mysql 容器

    docker stop 8cc

    查看 keepalived 狀態,提示移除了 mysql 服務。

     

     

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

    docker  ps

    • 查看 keepalived 狀態,執行 restart_mysql 成功

    •  

      • 查看執行日誌

       

       

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

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

 

 

 

七、遇到的坑

 

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';

    重啟容器

     2、沒有映射 mysql 文件夾

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

    拷貝 mysql 文件夾

     3、mysql data 文件夾沒有許可權

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

    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

    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

     

    作者丨悟空聊架構

    來源丨公眾號:悟空聊架構(ID:PassJava666)

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/MySQL-high-availability-architecture-builds-actual-combat.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Zookeeper3.7源碼剖析 能力目標 掌握Zookeeper中Session的管理機制 能基於Client進行Debug測試Session創建/刷新操作 能搭建Zookeeper集群源碼配置 掌握集群環境下Leader選舉啟動過程 能說出Zookeeper選舉過程中的概念 能說出Zookeep ...
  • 表弟大學快畢業了,學了一個學期Python居然還不會寫學生管理系統,真的給我丟臉啊,教他又不肯學,還讓我直接給他寫,我真想兩巴掌上去,最終還是寫了給他,誰讓他是我表弟呢,關鍵時候還是得幫他一把! 寫完了放在那也是放著,所以今天分享給大家吧! 話不多說,咱們直接開始吧! 代碼解析 一、登錄頁面 1、定 ...
  • 領域邏輯 & 應用邏輯 如前所述,領域驅動設計中的業務邏輯分為兩部分(層):領域邏輯和應用邏輯: 領域邏輯由系統的核心領域規則組成,應用邏輯實現應用特定的用例 雖然定義很明確,但實現起來可能並不容易。您可能無法決定哪些代碼應該位於應用程式層,哪些代碼應該位於領域層。本節試圖解釋其中的差異 多個應用程 ...
  • 用例演示 - 創建實體 本節將演示一些示例用例並討論可選場景。 創建實體 從實體/聚合根類創建對象是實體生命周期的第一步。聚合/聚合根規則和最佳實踐部分 建議為Entity類創建一個主構造函數,以保證創建一個有效的實體。因此,無論何時我們需要創建實體的實例,我們都應該使用那個構造函數 參見下麵的問題 ...
  • 痞子衡嵌入式半月刊: 第 57 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 2022年6月初合宙新上市了 Air32F103 系列 MCU, 分 Air32F103CBT6 和 Air32F103CCT6 兩個型號, 分別是 32K RAM + 128K FLASH 和 32K RAM + 256K FLASH, 支持的最高主頻216MHz, 可以Pin2Pin替換STM3... ...
  • ## 電腦性能設置 優化設置一:開啟卓越性能 其實,win10系統中有一個卓越性能的隱藏設置,它可以讓我們的電腦,在現有配置的情況下,發揮出最優良的性能。 1、 同時按住“win+R”打開運行視窗,輸入“powershell”並點擊“確定” 2、 打開命令提示符頁面後,輸入並執行以下字元,就會出現 ...
  • 寫在前面: 這幾天留校,在做一個電機驅動的項目,使用的是合肥傑發的平臺,車規級晶元AC7801/11系列晶元。 但在進行模擬和程式燒錄的時候遇到了各種問題,藉助這個機會,私下裡總結了常見的模擬與燒錄程式常見的幾種方式,以及相關的操作,希望對大家有幫助。 單片機ISP、IAP和ICP幾種燒錄方式的區別 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...