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
實驗拓撲:
二、搭建MySQL雙主同步環境:
(1)準備工作
1、配置IP地址
master1地址爲192.168.1.101;
master2地址爲192.168.1.102。
2、設置master1和master2的防火牆規則
[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主機上創建授權賬戶,允許在master2(192.168.1.102)主機上連接
[root@master1 ~]# mysql -uroot -p mysql> grant replication slave on *.* to 'rep'@'192.168.1.102' identified by '123456';
查看master1的當前binlog狀態信息
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;
<-注->如果你是使用虛擬機並且兩臺master是克隆的,那麼Slave_IO Running的值可能爲NO,解決方法:修改master任意主機/usr/local/mysql/data/auto.cnf文件server-uuid後面的值,確保兩臺主機的uuid不一樣。
(4)將master2設爲master1的主服務器
1、在master2主機上創建授權賬號,允許在master1(192.168.1.101)主機上連接
mysql> grant replication slave on *.* to 'rep'@'192.168.1.101' identified by '123456';
查看master2的當前binlog狀態信息
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)的狀態
(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的數據變化
2、在master2主機上想tab1表中插入數據
mysql> insert into test_db.tab1(id,name) values (1,'zhangsan'); mysql> commit;
查看master1主機是否同步了master2上的數據變化
現在任何一臺MySQL上的數據都會同步到另一臺MySQL,主主同步環境搭建完成。
<-注意事項->:如果MySQL服務器已經存在,只是後期才搭建從服務器,在配置數據同步前應先將主MySQL服務器要同步的數據拷貝到從MySQL服務器(例如先備份主MySQL的數據庫,然後到從服務器上還原)
三、利用keepalived實現MySQL的高可用性
(1)在master1和master2上安裝keepalived軟件包
1、首先安裝kernel-devel以及openssl-devel、popt-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腳本,但是還需要手動添加爲系統服務,這樣纔可以使用service、chkconfig工具來對keepalived服務程序進行管理。
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區域
vrrp_instance區域
virtua_server區域
啓動keepalived服務
[root@master1 ~]# /etc/init.d/keepalived start
2、在master2主機上對keepalived.conf文件進行修改
Master2主機的keepalived.conf配置文件除了router_id、priority和real_server三處不同,其他配置項都相同。
啓動keepalived服務
[root@master2 ~]# /etc/init.d/keepalived start
(3)爲master1和master2添加檢測腳本
當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、在master1和master2上分別查看master1和master2對VIP(羣集虛擬IP)的控制權
在master1主上查看結結果:
在master2主上查看結果:
從上圖可以看出master1是主服務器,master2爲備用服務器
2、測試停止MySQL服務,keepalived健康檢查是否會觸發腳本
停止master1主機的MySQL服務
[root@master1 ~]# systemctl stop mysqld
查看master1主結果:
Master2主的查看結果:
這說明在主服務上停止MySQL服務,觸發了我們編寫的腳本,進行自動故障切換。
3、MySQL遠程登入測試
爲MySQL服務器授權允許遠程登入(兩臺主服務器都要授權)
mysql> grant all on *.* to root@'%' identified by 'pwd123';
在客戶端上測試登入
上圖說明客戶端訪問的VIP地址是由master1主機提供響應的,應爲master1當前是主服務器,
將master1的MySQL服務停止
[root@master1 ~]# systemctl stop mysqld
然後到客戶端執行下命令
上圖可以看到客戶端請求是由master2主機來響應的,說明故障切換成功
四、總結
Keepalived+mysql雙主一般來說,適用於中小型規模的的公司環境,因爲採用這種架構是最省事的。在master節點發生故障後,利用keepalived的高可用機制實現快速切換到備用節點。
在這個方案裏,有幾個需要注意的地方:
1、採用keepalived作爲高可用方案時,兩個節點最好都設置成BACKUP模式,避免因爲意外情況下(比如腦裂)相互搶佔導致往兩個節點寫入相同數據而引發衝突;
2、把兩個節點的auto_increment_increment(自增步長)和auto_increment_offset(自增起始值)設成不同值。其目的是爲了避免master節點意外宕機時,可能會有部分binlog未能及時複製到slave上被應用,從而會導致slave新寫入數據的自增值和原先master上衝突了,因此一開始就使其錯開;當然了,如果有合適的容錯機制能解決主從自增ID衝突的話,也可以不這麼做;
3、slave節點服務器配置不要太差,否則更容易導致複製延遲。作爲熱備節點的slave服務器,硬件配置不能低於master節點;
4、如果對延遲問題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程複製的方式可以很大程度降低複製延遲;