基於keepalived搭建mysql雙主高可用

目錄

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

概述

    傳統(不借助中間件)的數據庫主從搭建,若是主節點掛掉了,從節點只能讀取沒法寫入,只能把人肉去恢復故障,既不想引用中間件也不想人肉恢復故障,能夠折中選擇雙主方案,本文將介紹經過keepalived搭建mysql雙主方案。mysql

    本例中vip爲:172.16.0.169,  兩臺mysql實例服務器ip分別爲:172.16.0.1和172.16.0.2sql

轉帖請註明來源: https://my.oschina.net/u/2342969/blog/2963153數據庫

環境準備

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

keepalived搭建

    點擊查看keepalived搭建教程,博主親自操做過來的,若有疑問歡迎隨時私信或者評論apache

mysql單機搭建

    點擊查看mysql搭建教程,博主親自操做過來的,若有疑問歡迎隨時私信或者評論vim

雙主搭建

    本方案僅限兩臺均是全新安裝的mysql,若是是舊mysql實例和新mysql實例改成雙主,在新mysql實例中記得導入舊mysql實例的數據,另外可能同步複製還會報異常,自行解決一下。centos

環境安裝檢查

  1. 兩臺mysql實例都可以訪問
  2. keepalived能夠正常漂移

數據庫配置更改

#vim /etc/my.cnf

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

  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,語句解析:ide

  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 就表明配置失敗

檢查點:oop

  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了

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

相關文章
相關標籤/搜索