1. 程式人生 > >基於keepalived搭建mysql雙主高可用

基於keepalived搭建mysql雙主高可用

目錄

  • 概述
  • 環境準備
  • keepalived搭建
  • mysql搭建
  • mysql雙主搭建
  • mysql雙主高可用搭建

概述

    傳統(不借助中介軟體)的資料庫主從搭建,如果主節點掛掉了,從節點只能讀取無法寫入,只能把人肉去恢復故障,既不想引用中介軟體也不想人肉恢復故障,可以折中選擇雙主方案,本文將介紹通過keepalived搭建mysql雙主方案。

    本例中vip為:172.16.0.169,  兩臺mysql例項伺服器ip分別為:172.16.0.1和172.16.0.2

環境準備

  1. 最小化安裝centos7
  2. mysql-5.7.23
  3. keepalived 1.4.5
  4. 虛擬ip(下文簡稱vip):172.16.0.169

keepalived搭建

    點選檢視keepalived搭建教程,博主親自操作過來的,如有疑問歡迎隨時私信或者評論

mysql單機搭建

    點選檢視mysql搭建教程,博主親自操作過來的,如有疑問歡迎隨時私信或者評論

雙主搭建

    本方案僅限兩臺均是全新安裝的mysql

,如果是舊mysql例項和新mysql例項改為雙主,在新mysql例項中記得匯入舊mysql例項的資料,另外可能同步複製還會報異常,自行解決一下。

環境安裝檢查

  1. 兩臺mysql例項均可以訪問
  2. keepalived可以正常漂移

資料庫配置更改

#vim /etc/my.cnf

    進入mysql配置修改一下配置:

  1. server-id 兩臺mysql要不一樣,一般是ip最後一位。注意命名規範不要加下劃線/中橫線/點等特殊符號
  2. #skip_slave_start = 1  註釋掉這個配置

建立複製賬號

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.0.%' identified by 'repl_password';
mysql> flush privileges;
mysql> select @@server_id;

兩臺mysql分別執行以上語句,語句解析:

  1. 建立mysql複製賬號
  2. repl_user: 複製許可權賬號的使用者名稱,可自行更改
  3. 172.16.0.%: 此處使用的萬用字元,也可以寫固定ip,可同步的mysql例項ip
  4. repl_password: 複製許可權賬號的密碼,自行更改
  5. select @@server_id; 查詢出的結果一定要不一樣

配置互為主備   

mysql> CHANGE MASTER TO MASTER_HOST="對方ip", MASTER_USER="repl_user", MASTER_PASSWORD="repl_password", MASTER_PORT=3316, MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;

兩臺mysql分別執行以上sql,語句解析:

  1. 互相設定對方為主節點,自己為備節點
  2. MASTER_HOST:對方ip
  3. MASTER_USER:對方複製許可權賬號使用者名稱,即上一步設定的使用者名稱
  4. MASTER_PASSWORD:對方複製許可權賬號密碼,即上一步設定的密碼
  5. MASTER_PORT:對方mysql例項的埠, 如果開了防火牆一定要記得開啟埠
  6. show slave status\G; 注意檢視Slave_IO_Running 和 Slave_SQL_Running 狀態如果有一個為no 就代表配置失敗

檢查點:

  1. Master_Host: 是否是對方ip
  2. Master_User: 是否是對方的複製賬號的使用者名稱
  3. Master_Port: 是否是對方mysql例項的埠號
  4. Last_SQL_Errno:最近sql錯誤條數,正常情況為0
  5. Last_SQL_Error:最新sql錯誤詳細資訊,正常情況為空

如果有異常,根據異常資訊解決掉問題後,執行一下命令

mysql> stop slave;
mysql> reset master;

兩臺mysql分別執行以上命令,再執行一下上一步的配置。

驗證

  1. 在任意一臺mysql建立資料庫,另一臺也會同步到
  2. 在任意一臺mysql建立表,另一臺也會同步到
  3. 在任意一臺mysql表中插入資料,另一臺也會同步到

雙主高可用

修改keepalived配置

# vim /etc/keepalived/keepalived.conf

配置內容如下:

! Configuration File for keepalived
global_defs {
router_id MYSQL-1 ## 名稱自定義,兩臺機器需要不一樣
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 60
priority 100    # 兩臺機器需要一個大一個小,數值大的先啟動,哪臺先啟動vip會先在哪臺機器
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.0.169    # 填寫自己的vip
}
}

virtual_server 172.16.0.169 3316 {  # 填寫自己的vip 和mysql埠
delay_loop 2
#lb_algo rr
#lb_kind DR
persistence_timeout 60
protocol TCP
real_server 172.16.0.1 3316 { # 填寫mysql伺服器真實ip 和mysql埠
weight 3
notify_down /etc/keepalived/checkmysql.sh  # 檢查mysql是否存活指令碼,根據指令碼位置自行填寫
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3316  # mysql的埠號
}
}
}

注意: 上面配置註釋的部分,兩臺機器根據實際情況修改,配置檔案中的註釋一定要去掉,以免出現奇怪問題

編寫mysql監測指令碼

#vim  /etc/keepalived/checkmysql.sh

指令碼內容如下:

#!/bin/sh
datetime=`date +20\%y\%m\%d_\%H\%M\%S`
isok=$(/usr/local/mysql/bin/mysql -h localhost -u資料庫賬號 -p資料庫密碼 -P資料庫埠 -S /tmp/mysql3316.sock 2>/dev/null  -e 'select 1' |sed -n '2p')
function error_query(){
systemctl stop keepalived
echo $datetime  >> /etc/keepalived/keepalived.log
echo "mysql down, keepalived 切換" >> /etc/keepalived/keepalived.log
}
echo "isok: $isok"  >> /etc/keepalived/keepalived.log
if [ "$isok" != "1" ]
then
error_query
fi

注意:根據實際情況調整指令碼中的中文部分

給指令碼賦許可權:

# chmod +x /etc/keepalived/*.sh

驗證

    一定要先閱讀博文[centos7 下原始碼安裝keepalived踩坑記],根據這篇博文中"操作keepalived"章節操作keepalived

  1. 兩臺伺服器分別啟動keepalived, 注意先啟動keepalived配置中priority 數值大的
  2. 停掉vip所在機器的mysql例項,檢視另外一臺機器ip是否有vip了

兩臺機器記得交叉驗證,以免有問題, 如果不能正常漂移,請認真檢查操作步驟,是否和本文一致