<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 14966字,需瀏覽 30分鐘

           ·

          2022-05-22 08:36

          這是悟空的第?147?篇原創(chuàng)文章

          官網(wǎng):www.passjava.cn

          業(yè)界流傳一句話:沒有做過運(yùn)維的程序員不是好架構(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 站不是出過一次事故么,2 小時(shí)才恢復(fù)過來,詳細(xì)可以看之前寫的文章。

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

          上次折騰完 ELK 日志檢索平臺(tái)后,開發(fā)環(huán)境可以正常查詢?nèi)罩玖恕W罱谧鱿到y(tǒng)高可用相關(guān)的工作,這次我來分享下 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è)提供給外部訪問,當(dāng)一個(gè)宕機(jī)后,另外一個(gè)可以繼續(xù)提供服務(wù),在沒有 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ì)于客戶端來說,不關(guān)心連接的是哪臺(tái) MySQL,訪問虛擬 IP 就可以了。
          • 流量切換:如果客戶端正在訪問的 MySQL 服務(wù)崩了后,keepalived 會(huì)用我們寫的腳本自動(dòng)重啟 MySQL,如果重啟失敗,腳本主動(dòng)停掉 keepalived,客戶端的流量就不會(huì)訪問到這臺(tái)服務(wù)器上的 MySQL 服務(wù),后續(xù)訪問的流量都會(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ù)制主要有以下流程:

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

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

          3. 同時(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 線程,用來給從庫(kù) I/O 線程傳 binlog;

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

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

          三、配置 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

          接下來我們配置 MySQL 的主從架構(gòu),需要注意的是后續(xù)搭建的主主架構(gòu)是基于主從架構(gòu)來的,區(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)前連接過來的從庫(kù)線程。

          SHOW?PROCESSLIST

          如下所示,Slave has read all relay log; wating for more updates,說明從庫(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 開啟主從復(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 開啟主從復(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)維或開發(fā)人員,由他們檢查服務(wù)器的狀態(tài)。

          6.2 使用 Keepalived 的原理

          Keepalived 提供了一個(gè)虛擬 IP (簡(jiǎn)稱 VIP),對(duì)外提供訪問。當(dāng)客戶端連接這個(gè)虛擬 IP 后,只會(huì)訪問其中一個(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ù)器的開機(jī)啟動(dòng)項(xiàng)中,將 Keepalived 服務(wù)設(shè)置為開機(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

          我們可以通過這個(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 容器。所以過幾秒后,重新查看容器狀態(tài),會(huì)看到 mysql 容器重新啟動(dòng)了。

          docker??ps

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

          查看執(zhí)行日志

          問題:每 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,說明 keepalived 已經(jīng)通過虛擬 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)沒有了。(控制臺(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 密碼不正確,無法登錄的問題

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

          apt-get?update

          apt?install?vim

          修改 mysql 配置文件

          vim?/etc/mysql/my.cnf

          添加一行配置,跳過 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 沒有映射 mysql 文件夾

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

          拷貝 mysql 文件夾

          7.3 mysql data 文件夾沒有權(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ò)信息來進(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 沒有這個(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)問題

          切換回 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)限。

          參考資料:

          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 -

          瀏覽 68
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱逼导航| 亚洲成人电影无码 | 婷婷综合视频 | 三级经典在线视频 | 麻豆综合久久 |