mysql高可用+keepalived
生產(chǎn)環(huán)境中一臺mysql主機(jī)存在單點故障,所以我們要確保mysql的高可用性,即倆臺mysql服務(wù)器如果其中有一臺mysql服務(wù)器掛掉后,另外一臺就能立刻接替進(jìn)行工作。
MYSQL的高可用方案一般有
Keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD等 比較常用的是keepalived+雙主MHA和PXC
這次主要介紹利用keepalived實現(xiàn)MYSQL數(shù)據(jù)庫的高可用。
基本思路:倆臺MYSQL互為主從關(guān)系(雙主),通過keepalived配置配置虛擬IP,實現(xiàn)當(dāng)其中一臺mysql掛機(jī)后,應(yīng)用能夠自動切換到另外一臺MYSQL數(shù)據(jù)庫,保證系統(tǒng)的高可用。
操作系統(tǒng)?Centos7.2
MYSQL版本 ?5.7
Keepalived:keepalived-1.2
Mysql-vip:192.168.0.100
Mysql-master1:192.168.0.7
Mysql-slave1:192.168.0.6
該過程的第一部分就是master記錄著二進(jìn)制日志。在每個事務(wù)更新數(shù)據(jù)完成之前,master在二日志記錄這些改變。Mysql將事務(wù)寫入二進(jìn)制日志,在事件寫入二進(jìn)制日志完成后,master通知存儲引擎提交事務(wù)。
下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程--I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。
Binlog dump process?從master的二進(jìn)制日志中讀取事件。?I/O線程將這些事件寫入中繼日志。
SQL slave thread?(SQL?從線程) 處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新slave的數(shù)據(jù),使其與master中的數(shù)據(jù)一致。只要該進(jìn)程與I/O線程保持一致,中繼日志通常位于OS緩存中,所以中繼日志的開銷很小。
主主同步就是倆臺機(jī)器互為主從關(guān)系,在任何一臺機(jī)器上寫入都會同步。
1:修改MYSQL配置文件
倆臺mysql均要開啟binlog?日志功能,開啟方法:在MYSQL配置文件加上
Log-bin=MYSQL-bin選項,倆臺mysql的server-ID不能一樣,默認(rèn)情況下server-ID都是1,需要其中slave修改為2即可。
一:master1中有關(guān)配置如下
| 1 2 3 4 5 6 7 8 9 10 11 | basedir?=?/usr/local/mysql datadir?=?/usr/local/mysql/data server_id?=?1 socket?=?/usr/local/mysql/mysql.sock log-error?=?/usr/local/mysql/data/mysqld.err 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 |
重啟mysql服務(wù)
Master2中有關(guān)復(fù)制配置如下
| 1 2 3 4 5 6 7 8 9 10 11 12 | [mysqld] basedir?=?/usr/local/mysql datadir?=?/usr/local/mysql/data server_id?=?2 socket?=?/usr/local/mysql/mysql.sock log-error?=?/usr/local/mysql/data/mysqld.err 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=2 |
重啟mysqld服務(wù)
二:將master1設(shè)為master2的主服務(wù)器
在master1主機(jī)上創(chuàng)建授權(quán)賬戶,允許在master2(192.168.0.6)主機(jī)上連接
| 1 2 | mysql>?grant?replication?slave?on?*.*?to?'rep@192.168.0.7'?identified?by?'123456'; Query?OK,?0?rows?affected,?1?warning?(0.01?sec) |
查看master1的當(dāng)前binlog狀態(tài)信息
在slave上將master設(shè)為自己的主服務(wù)器并開啟slave功能
| 1 2 | mysql>change,master,to,master_host='192.168.0.6',master_user='rep',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=451; Query?OK,?0?rows?affected,?2?warnings?(0.04?sec) |
| 1 2 | mysql>?start?slave; Query?OK,?0?rows?affected?(0.01?sec) |
查看從的狀態(tài),以下倆個值必須為yes,代表從服務(wù)器能正常連接主服務(wù)器
?Slave_IO_Running: Yes
?Slave_SQL_Running: Yes
mysql> show slave status\G;
三,將master2設(shè)為master1的主服務(wù)器
在slave主機(jī)上創(chuàng)建授權(quán)賬戶,允許在master(192.168.0.6)主機(jī)上連接
| 1 2 | mysql>?grant?replication?slave?on?*.*?to?'rep'@'192.168.0.6'?identified?by?'123456'; Query?OK,?0?rows?affected,?1?warning?(0.00?sec) |
查看slave的當(dāng)前binlog狀態(tài)信息
mysql> show master ?status;
在master上將slave設(shè)為自己的主服務(wù)器并開啟slave功能
| 1 2 | mysql>change,master,to?,master_host='192.168.0.7',master_user='rep',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154; Query?OK,?0?rows?affected,?2?warnings?(0.03?sec) |
查看從的狀態(tài)下,以下倆個值必須為yes代表從服務(wù)器能正常連接主服務(wù)器
四:測試主主同步
在master上創(chuàng)建數(shù)據(jù)庫?chai?看看slave是否同步
主的服務(wù)器
從的服務(wù)器驗證已經(jīng)同步過來
現(xiàn)在任何一臺MYSQL上更新數(shù)據(jù)同步到另一臺mysql?同步完成
注意:若主MYSQL服務(wù)器已經(jīng)存在,只是后期才搭建從MYSQL服務(wù)器,在配置數(shù)據(jù)同步前應(yīng)先主MYSQL服務(wù)器的要同步的數(shù)據(jù)庫拷貝到從MYSQL服務(wù)器上(如先在主MYSQL上備份數(shù)據(jù)庫,再用備份在從MYSQL服務(wù)器上恢復(fù)
接著完成keepalived的高可用性
Keepalived是集群管理中保證集群高可用的一個軟件解決方案,其功能類似與heartbeat?用來防止單點故障
keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虛擬路由冗余協(xié)議。
在VRRP中有兩組重要的概念:VRRP路由器和虛擬路由器,主控路由器和備份路由器。
VRRP路由器是指運行VRRP的路由器,是物理實體,虛擬路由器是指VRRP協(xié)議創(chuàng)建的,是邏輯概念。一組VRRP路由器協(xié)同工作,共同構(gòu)成一臺虛擬路由器。 Vrrp中存在著一種選舉機(jī)制,用以選出提供服務(wù)的路由即主控路由,其他的則成了備份路由。當(dāng)主控路由失效后,備份路由中會重新選舉出一個主控路由,來繼續(xù)工作,來保障不間斷服務(wù)。
二?keepalived安裝配置
1?在master和slave上安裝軟件包keepalived
安裝keepalived軟件包和服務(wù)控制
在編譯安裝keepalived之前,必須安裝內(nèi)核開發(fā)包?kernel-devel?以及?openssl-devel popt-devel?等支持
若沒有安裝通過rom或者yum工具安裝
編譯安裝keepalived
使用指定的linux內(nèi)核位置對keepalived進(jìn)行配置,并將安裝路徑制定為根目錄,這樣就無需額外創(chuàng)建連接文件,配置完成 依次執(zhí)行make make install?進(jìn)行安裝
使用keepalived服務(wù)
執(zhí)行make install操作之后 會自動生成/etc/init.d/keepalived腳本文件,但是需要手動添加為系統(tǒng)服務(wù),這樣就可以使用server chkconfig?工具對keepalived服務(wù)進(jìn)程管理了
2修改keepalived配置文件
keepalived?只有一個配置文件?keepalived.conf,里面主要包括以下幾個配置區(qū)域,分別是
global_defs、vrrp_instance?和?virtual_server。
global_defs:主要是配置故障發(fā)生時的通知對象以及機(jī)器標(biāo)識。
vrrp_instance:用來定義對外提供服務(wù)的?VIP?區(qū)域及其相關(guān)屬性。
virtual_server:虛擬服務(wù)器定義
master1?主機(jī)上的?keepalived.conf?文件的修改:
vi /etc/keepalived/keepalived.conf:
! Configuration File for keepalived //!表示注釋
global_defs {
router_id MYSQL-1 //表示運行?keepalived?服務(wù)器的一個標(biāo)識
}
vrrp_instance VI_1 {
?state BACKUP //指定?keepalived?的角色,兩臺配置此處均是?BACKUP,設(shè)為?BACKUP?將根據(jù)
優(yōu)先級決定主或從
?interface eth0 //指定?HA?監(jiān)測網(wǎng)絡(luò)的接口
virtual_router_id 51 //虛擬路由標(biāo)識,這個標(biāo)識是一個數(shù)字(取值在?0-255?之間,用來區(qū)分多個
instance?的?VRRP?組播),同一個?vrrp?實例使用唯一的標(biāo)識,
確保和?master2?相同,同網(wǎng)內(nèi)不同集群此項必須不同,否則發(fā)
生沖突。
?priority 100 //用來選舉?master?的,要成為?master,該項取值范圍是?1-255(在此范圍
之外會被識別成默認(rèn)值?100),此處?master2?上設(shè)置為?50
advert_int 1 //發(fā)?VRRP?包的時間間隔,即多久進(jìn)行一次?master?選舉(可以認(rèn)為是健康查
檢時間間隔)
nopreempt //不搶占,即允許一個?priority?比較低的節(jié)點作為?master,即使有?priority?更高
的節(jié)點啟動
?authentication { //認(rèn)證區(qū)域,認(rèn)證類型有?PASS?和?HA(IPSEC),推薦使用?PASS(密碼
只識別前?8?位)
auth_type PASS
auth_pass 1111
?}
virtual_ipaddress { //VIP?區(qū)域,指定?vip?地址
?192.168.0.100
?}
}
virtual_server 192.168.0.100 3306 { //設(shè)置虛擬服務(wù)器,需要指定虛擬?IP?地址和服務(wù)端口,
IP?與端口之間用空格隔開
delay_loop 2 //設(shè)置運行情況檢查時間,單位是秒
lb_algo rr //設(shè)置后端調(diào)度算法,這里設(shè)置為?rr,即輪詢算法
lb_kind DR //設(shè)置?LVS?實現(xiàn)負(fù)載均衡的機(jī)制,有?NAT、TUN、DR?三個模式可選
persistence_timeout 60 //會話保持時間,單位是秒。這個選項對動態(tài)網(wǎng)頁是非常有用的,
為集群系統(tǒng)中的?session?共享提供了一個很好的解決方案。
有了這個會話保持功能,用戶的請求會被一直分發(fā)到某個服務(wù)節(jié)點,
直到超過這個會話的保持時間。
?protocol TCP //指定轉(zhuǎn)發(fā)協(xié)議類型,有?TCP?和?UDP?兩種
real_server 192.168.1.101 3306 { //配置服務(wù)節(jié)點?1,需要指定?real server?的真實?IP?地址和
端口,IP?與端口之間用空格隔開
注:slave?上此處改為?192.168.0.7(即?slave?本機(jī)?ip)
weight 3 //配置服務(wù)節(jié)點的權(quán)值,權(quán)值大小用數(shù)字表示,數(shù)字越大,權(quán)值越高,設(shè)置權(quán)
值大小為了區(qū)分不同性能的服務(wù)器
notify_down /etc/keepalived/bin/mysql.sh //檢測到?realserver?的?mysql?服務(wù)?down?后執(zhí)行的
腳本
TCP_CHECK {
connect_timeout 3 //連接超時時間
nb_get_retry 3 //重連次數(shù)
delay_before_retry 3 //重連間隔時間
connect_port 3306//健康檢查端口
?}
?}
}
啟動?keepalived?服務(wù)
#/etc/init.d/keepalived start
3、master1?和?master2?上都添加此檢測腳本,作用是當(dāng)?mysql?停止工作時自動關(guān)閉本機(jī)的
keepalived,從而實現(xiàn)將故障機(jī)器踢出(因每臺機(jī)器上?keepalived?只添加了本機(jī)為?realserver).
當(dāng)?mysqld?正常啟動起來后,要手動啟動?keepalived?服務(wù)。
| 1 2 | #mkdir?/etc/keepalived/bin vi?/etc/keepalived/bin/mysql.sh,內(nèi)容如下: |
4、測試
在?master?和?slave?分別執(zhí)行?ipaddr show dev eno16777736?命令查看?master和?slave?對?VIP
(群集虛擬?IP)的控制權(quán)。
Master1?主的查看結(jié)果:
Slave查看結(jié)果 ?并在master停止mysql ?查看IP地址是否飄逸
總結(jié):
Keepalived+mysql?雙主一般來說,中小型規(guī)模的時候,采用這種架構(gòu)是最省事的。
在?master?節(jié)點發(fā)生故障后,利用?keepalived?的高可用機(jī)制實現(xiàn)快速切換到備用節(jié)點。
在這個方案里,有幾個需要注意的地方:
1.采用?keepalived?作為高可用方案時,兩個節(jié)點最好都設(shè)置成?BACKUP?模式,避免因為意外
情況下(比如腦裂)相互搶占導(dǎo)致往兩個節(jié)點寫入相同數(shù)據(jù)而引發(fā)沖突;
2.把兩個節(jié)點的?auto_increment_increment(自增步長)和?auto_increment_offset(自增起
始值)設(shè)成不同值。其目的是為了避免?master?節(jié)點意外宕機(jī)時,可能會有部分?binlog?未能
及時復(fù)制到?slave?上被應(yīng)用,從而會導(dǎo)致?slave?新寫入數(shù)據(jù)的自增值和原先?master?上沖突了,
因此一開始就使其錯開;當(dāng)然了,如果有合適的容錯機(jī)制能解決主從自增?ID?沖突的話,也可以不這么做;
3.slave?節(jié)點服務(wù)器配置不要太差,否則更容易導(dǎo)致復(fù)制延遲。作為熱備節(jié)點的?slave?服務(wù)器,
硬件配置不能低于?master?節(jié)點;
4.如果對延遲問題很敏感的話,可考慮使用?MariaDB?分支版本,或者直接上線?MySQL 5.7?最
新版本,利用多線程復(fù)制的方式可以很大程度降低復(fù)制延遲;
本文轉(zhuǎn)自柴鑫旺 51CTO博客,原文鏈接:http://blog.51cto.com/chaixinwang/2056772,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的mysql高可用+keepalived的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【干货】移动APP安全测试要点解析
- 下一篇: doget dopost 过滤器 乱码