1. 程式人生 > 實用技巧 >基於keepalived配置資料庫主從實現高可用

基於keepalived配置資料庫主從實現高可用

基於keepalived配置資料庫主從實現高可用

使用keepalived來監聽埠,實現資料庫的高可用。實現效果,其中一臺資料庫伺服器突然出故障或關機時,應該不影響應用正常執行,等待伺服器啟動之後,資料能夠自動同步,保持資料一致性。

主從配置

架構圖及原理

  1. 主從狀態下,必須保證業務資料實際寫入Master資料庫,Slave資料庫只承擔讀的作用;
  2. Master 資料庫只要發生變化,立馬記錄到Binary log日誌檔案中;
  3. Slave資料庫啟動一個I/O thread連線Master資料庫,請求Master變化的二進位制日誌;
  4. Slave I/O獲取到的二進位制日誌,儲存到自己的Relay log 日誌檔案中;
  5. Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那麼就更新資料。

資料庫資源

資料庫資料庫IP節點
Gbase1 192.168.0.52 Master
Gbase2 192.168.0.53 Slave

配置步驟

主master配置

  1. 修改配置檔案,新增以下內容(gs.cnf)
server-id=1
log-bin=gbase-log #開啟binlog日誌
binlog_fromat=row

重啟資料庫 2. 重啟資料庫並登陸資料庫 #建立同步用的賬號

set SQL_LOG_BIN=0;
CREATE USER 'save'@'%' IDENTIFIED WITH gbase_native_password BY '123456';
#新增許可權
grant replication slave on *.* to 'save'@'%' ;
#重新整理許可權(使立即生效)
flush privileges;
set SQL_LOG_BIN=1;
3、獲取binlog檔名和POS

SHOW MASTER STATUS;

配置從slave庫

  1. 修改配置檔案,新增以下內容(gs.cnf)
server-id=2
log-bin=gbase-log   #開啟binlog日誌
binlog_fromat=row # 設定binlog日誌格式

重啟資料庫 2. 登陸資料庫,根據主master庫的binlog檔名和POS進行同步配置

#先停止同步
stop slave;
#同步資訊配置
CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_USER='save',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='bin-log.000003',
MASTER_LOG_POS=817;
#啟動slave同步
start slave;
#檢視同步狀態

show slave status\G;

基於keepalived實現高可用

  1. 下載安裝包
  2. 解壓到指定目錄 tar -zxvf keepalived-1.2.2.tar.gz
  3. 執行安裝檢測
./configure --prefix=/usr/local/keepalived

錯誤程式碼

configure: error:
   OpenSSL is not properly installed on your system. !!!
   Can not include OpenSSL headers files.   

解決方法

正常如果能夠連網路執行一下命令即可,但是由於是內網,通過yum直接安裝缺少的包是安裝不了的

yum install -y openssl openssl-devel

所以這種環境下只能通過下載離線的相關包。下載地址如下,這個網站rpm包比較齊全,可以收藏一下

[[linux核心相關包下載]

分別下載並安裝:

keepalived-1.3.5-1.ns7_4.mips64el.rpm
net-snmp-5.7.2-28.ns7_4.2.mips64el.rpm
net-snmp-agent-libs-5.7.2-28.ns7_4.2.mips64el.rpm
net-snmp-libs-5.7.2-28.ns7_4.2.mips64el.rpm
openssl-1.0.2k-12.ns7_4.2.mips64el.rpm
openssl-devel-1.0.2k-12.ns7_4.2.mips64el.rpm
openssl-libs-1.0.2k-12.ns7_4.2.mips64el.rpm
 rpm -ivh example.rpm

配置keepalived

實現原理,主從伺服器都設定同一個虛擬ip,如果兩臺伺服器都開啟了了資料庫服務,則會根據keepalived的priority設定的優先順序跳轉到優先順序高的伺服器,keepalived服務通過監聽資料庫埠,如果監聽發現該埠已經關閉,則需要關閉keepalived服務,此時ip自動漂移到備用伺服器。

keepalived 相關操作

systemctl start keepalived #啟動服務
systemctl stop keepalived #停止服務
systemctl status keepalived # 檢視keepalived狀態
systemctl restart keepalived # 重啟服務

修改預設keepalived.conf

vim /etc/keepalived/keepalived.conf

vrrp_script check_port {#建立一個vrrp_script指令碼,檢查配置
    script "/etc/keepalived/check_port.sh 5258" #配置監聽的埠
    interval 3 #檢查指令碼的頻率,單位(秒)
}
vrrp_instance VI_1 {
   state MASTER  #配置為BACKUP節點,一般有三個配置可選MASTER(主機)、BACKUP(備機)
   interface ens33 #ifconfig確定
   virtual_router_id 51 #路由器標識,MASTER和BACKUP必須是一致的
   priority 100 #定義優先順序,數字越大,優先順序越高,在同一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序。這樣MASTER故障恢復後,就可以將VIP資源再次搶回來
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 123456
   }
   virtual_ipaddress {
       192.168.11.25 # 虛擬ip
   }
   track_script {
	check_port #執行指定vrrp_script指令碼
    }
}

check_port.sh指令碼

#!/bin/bash
#keepalived 監控埠指令碼
CHK_PORT=$1
echo $CHK_PORT
if [ "$CHK_PORT" != "" ];then

	PORT_PROCESS=`lsof -i:$CHK_PORT|grep LISTEN|wc -l`
	if [ $PORT_PROCESS -eq 0 ];then
	echo "Port $CHK_PORT Is Not Used,End."
	
	sleep 2
		PORT_PROCESS=`lsof -i:$CHK_PORT|grep LISTEN|wc -l`
		if [ $PORT_PROCESS -eq 0 ];then
		#停止keepalived服務
		systemctl stop keepalived.service
		fi
	fi
else
	echo "Check Port Cant Be Empty!"
fi

驗證結果

  1. 首先啟動兩臺伺服器的資料庫、keepalived服務。
  2. 連線指定虛擬 ip 訪問資料庫,此時應該先跳轉到優先順序高的 master 伺服器。
  3. 此時關閉優先順序高的資料庫伺服器,通過虛擬ip訪問資料庫,此時應該跳轉到 Slave 伺服器。
  4. 再次開啟主資料庫伺服器,通過虛擬 ip 訪問資料庫,此時再次跳轉到 master 伺服器。

配置過程中遇到的問題及解決方法

shell指令碼一直不行

執行shell指令碼一直執行不了,提示結束符錯誤,後面將裡面內容只保留了幾行,還是有錯,

解決2

最後解決辦法,將指令碼內容copy,然後新建一個指令碼。才能夠正常執行。 原因:由於開始的指令碼是從windows機器拷貝進去的,可能由於中間編碼存在一些問題,所以一直報錯。

keepalived監聽指令碼一直執行不了

解決方法

  1. 需要確定該指令碼能夠正常執行,所以需要手動執行一下看指令碼是否有錯。
  2. 檢視系統tail -f /var/log/messages 監控主機日誌。 /etc/keepalived/check_port.sh exited due to signal 15 3.vrrp_script{}中的interval時間需大於指令碼中的sleep時間,開始兩個時間設定成一樣大小了。

資料庫突然主從同步不了

show slave status /G; 檢視slave狀態

Slave_IO_Running: Yes
Slave_SQL_Running: No
而且出現了1062錯誤,還提示
Last_SQL_Error: Error 'Duplicate entry '1020202' for key 'PRIMARY'' on query. Default database: 'bug'. Query: 'insert into testtable (id,mid,pid) values (1020202,1001,0)'

很顯然,由於主庫重啟導致 從庫資料不同步而且主鍵衝突。檢視error 日誌發現error日誌檔案變得好大,比以前大了將近好幾倍, tail -f gbase_error.log 最開始檢視到的是這條資訊。 此時由於我在測試時兩邊資料不一致導致。後面用新建的一個庫來測試正常。 如查出現錯誤,會導造主從複製破壞,此時將不能同步資料,需要手工處理,把兩邊資料保持一致後,再重新設定同步節點。並針對於一些錯誤程式碼,可以選中跳過,否則主從同步容易停止。 修改gs.cnf slave-skip-errors = 1062 (忽略所有的1062錯誤) 並需要對從庫進行資料恢復,保持主從資料庫一致性。

總結

這一次設定的主從資料庫是用的國產資料庫gbase的,但是他是基於mysql的,所以主從的原來和mysql是一模一樣的。我們只要掌握了mysql的基礎,就能夠用同樣的方式配置出來gbase的主從。操作資料庫時一定要注意備份。慎用rm -rf /xxx 命令。不然真的要刪庫跑路了。

推薦:sublime外掛