MySQL+Keepalived實現雙機熱備

Keepalived雙機熱備

一、概述:

keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議

虛擬路由冗餘協議,可以認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由爲該vip),master會發組播,當backup收不到vrrp包時就認爲master宕掉了,這時就需要根據VRRP的優先級選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。

 

實驗思路:

主要介紹了利用keepalived實現 MySQL 數據庫的高可用。Keepalived+mysql雙主來實現MySQL-HA,我們必須保證兩臺MySQL數據庫的數據完全一樣,基本思路是兩臺MySQL互爲主從關係,通過Keepalived配置虛擬IP,實現當其中的一臺MySQL數據庫宕機後,應用能夠自動切換到另外一臺MySQL數據庫,保證系統的高可用

 

實驗環境:

操作系統:CentOS 7 x86_64

MySQL版本:mysql 5.7.13

Keepalived版本:keepalived-1.2.20

Mysql-vip地址:192.168.1.100

Mysql-master1地址:192.168.1.101

Mysql-master2地址:192.168.1.102

 

實驗拓撲:

wKioL1jYqLnCdiZ0ABAYHi2ZRQs919.png

二、搭建MySQL雙主同步環境

 

(1)準備工作

1、配置IP地址

master1地址爲192.168.1.101

master2地址爲192.168.1.102

2、設置master1master2的防火牆規則

[root@master1 ~]# firewall-cmd --permanent --add-port=3306/tcp
[root@master1 ~]# firewall-cmd --reload

2)修改mysql配置文件

1、在master1上設置:

[root@master1 ~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server_id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 1

重啓mysql服務:

[root@master2 ~]# systemctl restart mysqld

2、master2上設置

[root@master2~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server_id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 2

重啓mysql服務

[root@master2 ~]# systemctl restart mysqld

<-1->各個參數的解釋:

log-bin                  //啓用二進制日誌功能

binlog_format            //設置binlog日誌格式

Server-id                //給服務器分配一個獨一無二的ID編號

relay-log                //配置中繼日誌

relay-log-index          //配置中繼日誌

auto-increment-increment     //設置自增長字段每次遞增的值

auto-increment-offset        //用來設定數據庫中自動增長的起點(即起點值)

<-2->可以在my.cnf文件中添加“binlog_do_db=數據庫名”的配置項(可以添加多個)來指定要同步的數據庫。

(3)master1設置爲master2的主服務器

1、在master1主機上創建授權賬戶,允許在master2192.168.1.102)主機上連接

[root@master1 ~]# mysql -uroot -p
mysql> grant replication slave on *.* to 'rep'@'192.168.1.102' identified by '123456';

查看master1的當前binlog狀態信息

wKioL1jYqLqCv4kMAATKZX6O74A934.png

2、master2上將master1設爲自己的主服務器並開啓slave功能

mysql> change master to master_host='192.168.1.101',master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=453;
mysql> start slave;

wKiom1jYqMCxC-HtAAujrITaQCg789.png

<-->如果你是使用虛擬機並且兩臺master是克隆的,那麼Slave_IO Running的值可能爲NO,解決方法:修改master任意主機/usr/local/mysql/data/auto.cnf文件server-uuid面的值,確保兩臺主機的uuid不一樣。

(4)master2設爲master1的主服務器

1、master2主機上創建授權賬號,允許在master1192.168.1.101)主機上連接

mysql> grant replication slave on *.* to 'rep'@'192.168.1.101' identified by '123456';

查看master2的當前binlog狀態信息

wKiom1jYqMKhY6HRAATIoV6WF3Y593.png

2、master1上將master2設爲自己的主服務器並開啓slave功能。

mysql> change master to master_host='192.168.1.102',master_user='rep',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=453;
mysql> start slave;

查看從(master1)的狀態

wKioL1jYqMfjElZYAApN3Tad6tM957.png

(5)測試主主同步

1、master1上創建要同步的數據庫如test_db,並在test_db中創建一張測試表如tab1

mysql> create database test_db;
mysql> use test_db;
mysql> create table tab1(id int,name varchar(30));

查看master2主機是否同步了master1的數據變化

wKioL1jYqM6zOj2AAA80A1FZVwo327.png

2、master2主機上想tab1表中插入數據

mysql> insert into test_db.tab1(id,name) values (1,'zhangsan');
mysql> commit;

查看master1主機是否同步了master2上的數據變化

wKiom1jYqNDDaNyeAATQaYMScyA475.png

現在任何一臺MySQL上的數據都會同步到另一臺MySQL,主主同步環境搭建完成。

<-注意事項->:如果MySQL服務器已經存在,只是後期才搭建從服務器,在配置數據同步前應先將主MySQL服務器要同步的數據拷貝到從MySQL服務器(例如先備份主MySQL的數據庫,然後到從服務器上還原)

 

三、利用keepalived實現MySQL的高可用性

(1)master1master2上安裝keepalived軟件包

1、首先安裝kernel-devel以及openssl-develpopt-devel等支持庫。

[root@master1 ~]# yum -y install kernel-devel openssl-devel popt-devel

2、編譯安裝keepalived

[root@master1 keepalived-1.2.20]# cd keepalived-1.2.20/
[root@master1 keepalived-1.2.20]# tar zxf keepalived-1.2.20.tar.gz 
[root@master1 keepalived-1.2.20]# ./configure --prefix=/ && make && make install

<-->:如不知道keepalived需要哪些依賴包,可以進解壓後的源碼包目錄下查看INSTALL文件內容。

3、使用keepalived服務

編譯完成後,會自動生成/etc/init.d/keepalived腳本,但是還需要手動添加爲系統服務,這樣纔可以使用servicechkconfig工具來對keepalived服務程序進行管理。

wKiom1jYqNHjnlyLAAMIMNjDCGk055.png

4、centos7.2上安裝keepalieved防火牆的配置規則

[root@master1 ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 destination address=224.0.0.18 protocol value=ip accept"
[root@master1 ~]# firewall-cmd --reload

<--注!以上所有操作在master2上也要執行一遍-->

 

(2)修改keepalived的配置文件

Keepalived只有一個配置文件keepalived.conf,裏面包括以下幾個配置項

global_defs:主要是配置故障發生時的通知對象及機器標識。

vrrp_instance:用來定義對外提供服務的VIP區域及相關屬性

virtual_server:虛擬服務器定義

1、master1主機的keepalived.conf文件的修改:

[root@master1 ~]# vim /etc/keepalived/keepalived.conf

global_defs區域

wKioL1jYqNWC6dN6AAjN2LBBZDc239.png

vrrp_instance區域

wKiom1jYqNuRBqFeAAw7YFEgLEQ954.png

virtua_server區域

wKioL1jYqOTifobbAA2WDrWFuRQ620.png

啓動keepalived服務

[root@master1 ~]# /etc/init.d/keepalived start

2、master2主機上對keepalived.conf文件進行修改

wKioL1jYqOWQ9HUfAADpdUygfxQ872.png

Master2主機的keepalived.conf配置文件除了router_idpriorityreal_server三處不同,其他配置項都相同。

啓動keepalived服務

[root@master2 ~]# /etc/init.d/keepalived start

(3)master1master2添加檢測腳本

mysql停止工作時自動關閉本機的keepalived,實現將故障機器踢出(因爲每臺機器上keepalived只添加了本機爲realserver);當mysql正常啓動起來後,要手動啓動keepalived服務。

[root@master1 ~]# mkdir /etc/keepalived/bin
[root@master1 ~]# vim /etc/keepalived/bin/mysql.sh
#!/bin/bash
pkill keepalived
/sbin/ifdown eno16777736 && /sbin/ifup eno16777736
[root@master1 ~]# chmod +x /etc/keepalived/bin/mysql.sh

master2上完成相同的操作

(4)測試

1、master1master2上分別查看master1master2VIP(羣集虛擬IP)的控制權

master1主上查看結結果:

wKiom1jYqOjByxUPAAdSplrmOoQ709.png

master2主上查看結果:

wKioL1jYqOvDQHjRAAYuJSs20Y8552.png

從上圖可以看出master1是主服務器,master2爲備用服務器

2、測試停止MySQL服務,keepalived健康檢查是否會觸發腳本

停止master1主機的MySQL服務

[root@master1 ~]# systemctl stop mysqld

查看master1主結果:

wKiom1jYqO2Sa_QSAAXXdNYQskw944.png

Master2主的查看結果:

wKioL1jYqPHQirWSAAepV2NUchU499.png

這說明在主服務上停止MySQL服務,觸發了我們編寫的腳本,進行自動故障切換。

3、MySQL遠程登入測試

MySQL服務器授權允許遠程登入(兩臺主服務器都要授權)

mysql> grant all on *.* to root@'%' identified by 'pwd123';

在客戶端上測試登入

wKiom1jYqPiiqJAcAA3SethJY_0219.png

上圖說明客戶端訪問的VIP地址是由master1主機提供響應的,應爲master1當前是主服務器,

master1MySQL服務停止

[root@master1 ~]# systemctl stop mysqld

然後到客戶端執行下命令

wKioL1jYqPuQSLIzAAZlpbs-AOA636.png

上圖可以看到客戶端請求是由master2主機來響應的,說明故障切換成功

 

四、總結

Keepalived+mysql雙主一般來說,適用於中小型規模的的公司環境,因爲採用這種架構是最省事的。在master節點發生故障後,利用keepalived的高可用機制實現快速切換到備用節點。

 

在這個方案裏,有幾個需要注意的地方:

1、採用keepalived作爲高可用方案時,兩個節點最好都設置成BACKUP模式,避免因爲意外情況下(比如腦裂)相互搶佔導致往兩個節點寫入相同數據而引發衝突;

2、把兩個節點的auto_increment_increment(自增步長)和auto_increment_offset(自增起始值)設成不同值。其目的是爲了避免master節點意外宕機時,可能會有部分binlog未能及時複製到slave上被應用,從而會導致slave新寫入數據的自增值和原先master上衝突了,因此一開始就使其錯開;當然了,如果有合適的容錯機制能解決主從自增ID衝突的話,也可以不這麼做;

3slave節點服務器配置不要太差,否則更容易導致複製延遲。作爲熱備節點的slave服務器,硬件配置不能低於master節點;

4、如果對延遲問題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程複製的方式可以很大程度降低複製延遲;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章