mysql高可用keepalived+mysql雙主mysql
MySQL的高可用方案通常有以下幾種:算法
keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD等,比較經常使用的是keepalived+雙主,MHA和PXC。sql
本節主要介紹了利用 keepalived 實現 MySQL 數據庫的高可用。數據庫
Keepalived+mysql雙主來實現MySQL-HA,咱們必須保證兩臺MySQL數據庫的數據徹底同樣,基本思路是兩臺MySQL互爲主從關係,經過Keepalived配置虛擬IP,實現當其中的一臺MySQL數據庫宕機後,應用可以自動切換到另一臺MySQL數據庫,保證系統的高可用。vim
生產環境中一臺mysql主機存在單點故障,因此咱們要確保mysql的高可用性,即兩臺MySQL服務器若是其中有一臺MySQL服務器掛掉後,另一臺能立馬接替其進行工做。後端
拓撲環境centos
OS:centos7-2緩存
Mysql版本:mysql 5.7.13服務器
Keepalived: keepalived-1.2.20網絡
Mysql-vip:192.168.0.200
Mysql-master1:192.168.182.132等於後面的192.168.0.100
Mysql-master2:192.168.182.134等於後面的192.168.0.160
1、 配置兩臺mysql主主同步
該過程的第一部分就是master記錄二進制日誌。在每一個事務更新數據完成以前,master在二日誌記錄這些改變。MySQL將事務寫入二進制日誌。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它本身的中繼日誌。首先,slave開始一個工做線程——I/O線程。I/O線程在master上打開一個普通的鏈接,而後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,若是已經同步了master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌一般會位於OS的緩存中,因此中繼日誌的開銷很小。
主主同步就是兩臺機器互爲主的關係,在任何一臺機器上寫入都會同步。
若mysql主機開啓了防火牆,須要關閉防火牆或建立規則。
1、修改MySQL配置文件
兩臺MySQL均要開啓binlog日誌功能,開啓方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項,兩臺MySQL的server-ID不能同樣,默認狀況下兩臺MySQL的serverID都是1,需將其中一臺修改成2便可。
# vim /etc/my.cnf
server_id=1
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
auto_increment-increment=2
auto_increment-offset=1
重啓mysqld服務
# systemctl restart mysqld
master2中有關複製的配置以下:
server_id = 2
binlog_format=mixed
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
auto-increment-increment=2
auto-increment-offset=2
重啓mysqld服務
# systemctl restart mysqld
注意:master1和master2只有server-id不一樣和 auto-increment-offset不一樣。
mysql中有自增加字段,在作數據庫的主主同步時須要設置自增加的兩個相關配置:auto_increment_offset和auto_increment_increment。
auto-increment-increment表示自增加字段每次遞增的量,其默認值是1。它的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,因此值設爲2。
auto-increment-offset是用來設定數據庫中自動增加的起點(即初始值),由於這兩能服務器都設定了一次自動增加值2,因此它們的起點必須得不一樣,這樣才能避免兩臺服務器數據同步時出現主鍵衝突,
注:能夠在my.cnf文件中添加「binlog_do_db=數據庫名」配置項(能夠添加多個)來指定要同步的數據庫
2、將master1設爲master2的主服務器
①在master1主機上建立受權帳戶,容許在master2(192.168.1182.134)主機上鍊接,並查看master1的當前binlog狀態信息
②在master2上將master1設爲自已的主服務器並開啓slave功能。
③設置防火牆策略
# systemctl stop firewalld.service
④查看從的狀態,mysql>show slave status\G;如下兩個值必須爲yes,表明從服務器能正常鏈接主服務器(重啓mysqld服務)
3、將master2設爲master1的主服務器
①在master2主機上建立受權帳戶,容許在master1(192.168.1.82.132)主機上鍊接,並查看master2的當前binlog狀態信息
②在master1上將master2設爲自已的主服務器並開啓slave功能。
③設置防火牆:
# systemctl stop firewalld.service
④查看從的狀態,如下兩個值必須爲yes,表明從服務器能正常鏈接主服務器
4、測試主主同步
在master1上建立要同步的數據庫如test_db,並在test_db中建立一張測試表如tab1
查看master2主機是否同步了master1上的數據變化
從上圖能夠看出master2同步了master的數據變化
在master2主機上向tab1表中插入數據
查看master1主機是否同步了master2上的數據變化
如今任何一臺MySQL上更新數據都會同步到另外一臺MySQL,MySQL同步完成。
注意:若主MYSQL服務器已經存在,只是後期才搭建從MYSQL服務器,在置配數據同步前應先將主MYSQL服務器的要同步的數據庫拷貝到從MYSQL服務器上(如先在主MYSQL上備份數據庫,再用備份在從MYSQL服務器上恢復)
下面咱們就完成keepalived的高可用性。
keepalived是集羣管理中保證集羣高可用的一個軟件解決方案,其功能相似於heartbeat,用來防止單點故障
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip,master會發組播(組播地址爲224.0.0.18),當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。vrrp模塊是來實現VRRP協議的。
2、keepalived的安裝配置
1、在master1和master2上安裝軟件包keepalived
安裝keepalived軟件包與服務控制
在編譯安裝Keepalived以前,必須先安裝內核開發包kernel-devel以及openssl-devel、popt-devel等支持庫。
若沒有安裝則經過rpm或yum工具進行安裝
#yum -y install kernel-devel openssl-devel popt-devel
編譯安裝Keepalived
注意:如不知道keepalived須要哪些依賴包,可到下載後的源碼解壓目錄下查看INSTALL 文件內容,安裝須要的依賴包,源碼安裝任何一個軟件都要養成查看源碼包文檔的習慣,好比INSTALL,README,doc等文檔,能夠得到不少有用的信息
使用keepalived服務
須要手動添加爲系統服務,這樣就可使用service、chkconfig工具來對keepalived服務程序進行管理了
Master2主機也完成keepalived安裝,與master1同樣,安裝過程略
注:若開啓了防火牆,須要關閉防火牆或建立規則。
2、修改Keepalived的配置文件
keepalived只有一個配置文件keepalived.conf,裏面主要包括如下幾個配置區域,分別是global_defs、vrrp_instance和virtual_server。
global_defs:主要是配置故障發生時的通知對象以及機器標識。
vrrp_instance:用來定義對外提供服務的VIP區域及其相關屬性。
virtual_server:虛擬服務器定義
master1主機上的keepalived.conf文件的修改:
vi /etc/keepalived/keepalived.conf:
! Configuration File for keepalived //!表示註釋
global_defs {
router_id MYSQL-1 //表示運行keepalived服務器的一個標識
}
vrrp_instance VI_1 {
state BACKUP //指定keepalived的角色,兩臺配置此處均是BACKUP,設爲BACKUP將根據優先級決定主或從
interface eth0 //指定HA監測網絡的接口
virtual_router_id 51 //虛擬路由標識,這個標識是一個數字(取值在0-255之間,用來區分多個instance的VRRP組播),同一個vrrp實例使用惟一的標識,確保和master2相同,同網內不一樣集羣此項必須不一樣,不然發生衝突。
priority 100 //用來選舉master的,要成爲master,該項取值範圍是1-255(在此範圍以外會被識別成默認值100),此處master2上設置爲50
advert_int 1 //發VRRP包的時間間隔,即多久進行一次master選舉(能夠認爲是健康查檢時間間隔)
nopreempt //不搶佔,即容許一個priority比較低的節點做爲master,即便有priority更高的節點啓動
authentication { //認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //VIP區域,指定vip地址
192.168.0.200 }
}
virtual_server 192.168.0.200 3306 { //設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開
delay_loop 2 //設置運行狀況檢查時間,單位是秒
lb_algo rr //設置後端調度算法,這裏設置爲rr,即輪詢算法
lb_kind DR //設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
persistence_timeout 60 //會話保持時間,單位是秒。這個選項對動態網頁是很是有用的,爲集羣系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。
protocol TCP //指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.0.100 3306 { //配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開
注:master2上此處改成192.168.1.102(即master2本機ip)
weight 3 //配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小爲了區分不一樣性能的服務器
notify_down /etc/keepalived/bin/mysql.sh //檢測到realserver的mysql服務down後執行的腳本
TCP_CHECK {
connect_timeout 3 //鏈接超時時間
nb_get_retry 3//重連次數
delay_before_retry 3 //重連間隔時間
connect_port 3306//健康檢查端口
}
}
}
master1主機上有關keepalived.conf文件的具體配置以下:
啓動keepalived 服務
#/etc/init.d/keepalived start
Master2主機上的keepalived.conf文件的修改:
可使用scp命令把server1主機上配置好的keepalived.conf文件拷貝到server2主機,只要作簡單修改便可,以下圖所示:
啓動keepalived 服務
#/etc/init.d/keepalived start
三、#mkdir /etc/keepalived/bin
Master2主機完成相同的操做
4、測試(在master1和master2分別執行ip addr 命令查看master1和master2對VIP(羣集虛擬IP)的控制權)
Master1主的查看結果:
Master2主的查看結果:
從上圖能夠看出master1是主服務器,master2爲備用服務器。
中止MySQL服務,看keepalived健康檢查程序是否會觸發咱們編寫的腳本
注意:若是虛擬IP沒有跳過去,可使用ps -aux | grep keepalived過濾出keepalived進程,而後是由kill -9 +進程號強制殺死進程
中止master1主機的mysql服務
# systemctl stop mysqld
Master2主的查看結果:
這說明在主服務上中止MySQL服務,觸發了咱們編寫的腳本,進行自動故障切換。
MySQL遠程登陸測試
咱們找一臺安裝有MySQL客戶端,而後登陸VIP,看是否能登陸,在登陸以前兩臺MySQL服務器都要受權容許從遠程登陸。例如:
在客戶端上測試登陸
客戶端訪問VIP地址,由master1主機提供響應的,由於master1當前是主服務器
客戶端的查詢請求是由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最新版本,利用多線程複製的方式能夠很大程度下降複製延遲;