基於keepalived配置資料庫主從實現高可用
基於keepalived配置資料庫主從實現高可用
使用keepalived來監聽埠,實現資料庫的高可用。實現效果,其中一臺資料庫伺服器突然出故障或關機時,應該不影響應用正常執行,等待伺服器啟動之後,資料能夠自動同步,保持資料一致性。
主從配置
架構圖及原理
- 主從狀態下,必須保證業務資料實際寫入Master資料庫,Slave資料庫只承擔讀的作用;
- Master 資料庫只要發生變化,立馬記錄到Binary log日誌檔案中;
- Slave資料庫啟動一個I/O thread連線Master資料庫,請求Master變化的二進位制日誌;
- Slave I/O獲取到的二進位制日誌,儲存到自己的Relay log 日誌檔案中;
- Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那麼就更新資料。
資料庫資源
資料庫 | 資料庫IP | 節點 |
---|---|---|
Gbase1 | 192.168.0.52 | Master |
Gbase2 | 192.168.0.53 | Slave |
配置步驟
主master配置
- 修改配置檔案,新增以下內容(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庫
- 修改配置檔案,新增以下內容(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實現高可用
- 下載安裝包
- 解壓到指定目錄 tar -zxvf keepalived-1.2.2.tar.gz
- 執行安裝檢測
./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
驗證結果
- 首先啟動兩臺伺服器的資料庫、keepalived服務。
- 連線指定虛擬 ip 訪問資料庫,此時應該先跳轉到優先順序高的 master 伺服器。
- 此時關閉優先順序高的資料庫伺服器,通過虛擬ip訪問資料庫,此時應該跳轉到 Slave 伺服器。
- 再次開啟主資料庫伺服器,通過虛擬 ip 訪問資料庫,此時再次跳轉到 master 伺服器。
配置過程中遇到的問題及解決方法
shell指令碼一直不行
執行shell指令碼一直執行不了,提示結束符錯誤,後面將裡面內容只保留了幾行,還是有錯,
解決2
最後解決辦法,將指令碼內容copy,然後新建一個指令碼。才能夠正常執行。 原因:由於開始的指令碼是從windows機器拷貝進去的,可能由於中間編碼存在一些問題,所以一直報錯。
keepalived監聽指令碼一直執行不了
解決方法
- 需要確定該指令碼能夠正常執行,所以需要手動執行一下看指令碼是否有錯。
- 檢視系統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外掛