MySQL數(shù)據(jù)庫(kù)--主主復(fù)制+keepalived高可用
作為一家“創(chuàng)意+整合+營(yíng)銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷方法,創(chuàng)造更大的價(jià)值。之前我們有學(xué)習(xí)過(guò)mysql的主從復(fù)制,主要是在工作環(huán)境當(dāng)中防止數(shù)據(jù)庫(kù)讀寫(xiě)在一臺(tái)數(shù)據(jù)庫(kù)上容易造成負(fù)載,實(shí)現(xiàn)讀寫(xiě)分離就是為了給服務(wù)器減輕工作壓力,就好比一個(gè)人的工作分成了兩個(gè)人來(lái)做,那么人也減輕了壓力。而且工作效率也提高了上去。但是要實(shí)現(xiàn)讀寫(xiě)分離的前提就是主從復(fù)制對(duì)吧?
主服務(wù)器為master;從服務(wù)器為slave。而我們今天帶來(lái)的和主從復(fù)制有點(diǎn)不一樣,多用與中小型公司,叫做主主復(fù)制。
注:在生產(chǎn)環(huán)境中一臺(tái)MySQL從在單點(diǎn)故障的缺陷,如果一旦發(fā)生意外,那么將會(huì)發(fā)生嚴(yán)重的后果,為公司造成嚴(yán)重的損失。
那么如果兩個(gè)的話那么將會(huì)效果好一點(diǎn);其中一臺(tái)宕掉,另一臺(tái)會(huì)馬上接替。
既然知道了主主復(fù)制的背景了,那么我們來(lái)了解下MySQL主主復(fù)制的原理以及思路:
1)開(kāi)啟二進(jìn)制日志文件bin_log、中繼日志文件relay-log、server-id號(hào)、以及auto-increment-offset和auto-increment-increment(自動(dòng)增長(zhǎng))
2)設(shè)置一個(gè)用戶并且賦予權(quán)限
3)查看二進(jìn)制文件和ID號(hào),以便后續(xù)制定master服務(wù)器
4)相互指定對(duì)方為master服務(wù)器
5)開(kāi)啟slave狀態(tài),{start slave}
6)查看sql和i/o狀態(tài)為yes便成功
以上屬于主主復(fù)制的基本思路;接下來(lái)我們演示一下,讓大家看的更直觀一些:
準(zhǔn)備環(huán)境:
兩臺(tái)mysql服務(wù)器: 版本5.7
master服務(wù)器< ip 192.168.1.10 >
master2服務(wù)器 < ip 192.168.1.20 >
一:配置master的配置文件修改內(nèi)容: vi /etc/my.cnf
log-bin = mysql-bin===========開(kāi)啟binlog日志
binlog_format = mixed========基于混合模式
server-id = 1==========ID號(hào)為1
relay-log = relay-bin==========開(kāi)啟中繼日志
relay-log-index = slave-relay-bin.index==========中繼日志的索引文件
auto-increment-increment = 2 =========整個(gè)架構(gòu)中的服務(wù)器臺(tái)數(shù)
auto-increment-offset = 1==========用來(lái)設(shè)定數(shù)據(jù)庫(kù)中自動(dòng)增長(zhǎng)的起點(diǎn)(即初始值)
完成后重啟MySQL服務(wù)
master2服務(wù)器也是如此:{需注意:}
之后重啟MySQL服務(wù)
二:設(shè)置一個(gè)用戶并且授予權(quán)限為后續(xù)的鏈接使用:
首先在master上設(shè)置:
三:查看下master的當(dāng)前binlog狀態(tài)信息:
在master2上面將master設(shè)置為自己的主服務(wù)其并且開(kāi)啟slave功能
四:查看下當(dāng)前的狀態(tài),一下兩個(gè)值必須為yes,代表master2正常鏈接master服務(wù)器
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
master2服務(wù)已經(jīng)成功,
接下來(lái)對(duì)master服務(wù)器進(jìn)行配置;
將master2設(shè)置為master的主服務(wù)器
master2上也進(jìn)行同樣的配置;當(dāng)然用戶可以變更
查看master2的binlog狀態(tài);
在master服務(wù)器上將master2設(shè)置為自己的主服務(wù)器并且開(kāi)啟slave功能;
查看master服務(wù)器的狀態(tài),一下兩個(gè)值必須為yes,代表從服務(wù)器可以鏈接主服務(wù)器
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
以上說(shuō)明master服務(wù)器也成功了。
那么接下來(lái)我們來(lái)測(cè)試下主主同步
在master上面創(chuàng)建要同步的數(shù)據(jù)庫(kù)tty,并且在tty當(dāng)中創(chuàng)建一張表tb1
那么我們來(lái)查看一下master2上面是否也會(huì)存在剛才創(chuàng)建的數(shù)據(jù)庫(kù)和表呢?
通過(guò)結(jié)果我們可以得知在master上創(chuàng)建的庫(kù)和表可以同步到master2上面,但是master2上的數(shù)據(jù)可以同步到master上面去嗎?
我們?cè)趍aster2上為tty庫(kù)中的tb1表中插點(diǎn)數(shù)據(jù)來(lái)驗(yàn)證一下:
我們來(lái)查看一下在master上面是否會(huì)有剛才在master2上面插入的兩條數(shù)據(jù)呢?
由此可見(jiàn)當(dāng)前我們的數(shù)據(jù)庫(kù)主主復(fù)制是成功的,
總結(jié)一下;
主主復(fù)制是兩臺(tái)MySQL服務(wù)互相讀寫(xiě)同步,互相備份的結(jié)果
注:若主MYSQL服務(wù)器已經(jīng)存在,只是后期才搭建從MYSQL服務(wù)器,在置配數(shù)據(jù)同步前應(yīng)先將主MYSQL服務(wù)器的要同步的數(shù)據(jù)庫(kù)拷貝到從MYSQL服務(wù)器上(如先在主MYSQL上備份數(shù)據(jù)庫(kù),再用備份在從MYSQL服務(wù)器上恢復(fù))
二:上面我們介紹了mysql的主主復(fù)制,但是如果這兩臺(tái)服務(wù)器其中有一臺(tái)突然宕機(jī)了該怎麼辦呢?這就需要我們的下一個(gè)要講述的環(huán)節(jié)了,也就是keepalived,實(shí)現(xiàn)這兩臺(tái)數(shù)據(jù)庫(kù)的負(fù)載均衡。如果有其中的一臺(tái)突然宕機(jī)之后那么另外的一臺(tái)將會(huì)接替,保證服務(wù)的不間斷性。
Keepalived的原理;
keepalived是集群管理中保證集群高可用的一個(gè)軟件解決方案,其功能類似于heartbeat,用來(lái)防止單點(diǎn)故障
keepalived是以VRRP協(xié)議為實(shí)現(xiàn)基礎(chǔ)的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議。
基于ARP協(xié)議進(jìn)行組播 發(fā)送的,即將N臺(tái)提供相同功能的路由器組成一個(gè)路由器組,這個(gè)組里面有一個(gè)master和多個(gè)backup,master上面有一個(gè)對(duì)外提供服務(wù)的vip,master會(huì)發(fā)組播(組播地址為224.0.0.18),當(dāng)backup收不到vrrp包時(shí)就認(rèn)為master宕掉了,這時(shí)就需要根據(jù)VRRP的優(yōu)先級(jí)來(lái)選舉一個(gè)backup當(dāng)master。這樣的話就可以保證路由器的高可用了。
Keepalived的基本模塊:
分別是core、check和vrrp
core模塊為keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析。
check負(fù)責(zé)健康檢查
vrrp模塊是來(lái)實(shí)現(xiàn)VRRP協(xié)議的
介紹完keepalived的功能以及模塊,接下來(lái)我們開(kāi)始在兩臺(tái)mysql上都配置keepalived
安裝keepalived軟件包與服務(wù)控制
在編譯安裝Keepalived之前,必須先安裝內(nèi)核開(kāi)發(fā)包kernel-devel以及openssl-devel、popt-devel等支持庫(kù)。
在這里通過(guò)yum安裝:
Yum -y install kernel-devel openssl-devel popt-devel
編譯安裝Keepalived
注意:在centos7.2上安裝keepalived不需要添加--with-kernel-dir
[root@localhost keepalived-1.2.20]# ./configure --prefix=/ && make && make install
使用keepalived服務(wù)
執(zhí)行make install操作之后,會(huì)自動(dòng)生成/etc/init.d/keepalived腳本文件,但還需要手動(dòng)添加為系統(tǒng)服務(wù),這樣就可以使用service、chkconfig工具來(lái)對(duì)keepalived服務(wù)程序進(jìn)行管理了。
Master 和master2 安裝keepalived的過(guò)程均如上圖所示,沒(méi)有任何差別,
注:如果在centos7.2上安裝keepalived防火墻的規(guī)則配置如下:
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 destination address=224.0.0.18 protocol value=ip accept"
success
[root@localhost ~]# firewall-cmd --reload
修改keepalived的配置文件:
keepalived只有一個(gè)配置文件keepalived.conf,里面主要包括以下幾個(gè)配置區(qū)域,分別是global_defs、vrrp_instance和virtual_server。
global_defs:主要是配置故障發(fā)生時(shí)的通知對(duì)象以及機(jī)器標(biāo)識(shí)。
vrrp_instance:用來(lái)定義對(duì)外提供服務(wù)的VIP區(qū)域及其相關(guān)屬性。
virtual_server:虛擬服務(wù)器定義
Master{keepalived}的主配置文件
啟動(dòng)keepalived服務(wù)
#/etc/init.d/keepalived start
Master2主機(jī)上的keepalived.conf文件的修改:
Master2主機(jī)的keepalived.conf文件配置與master1基本相同,只是router_id,priority,real_server三處不同,其他配置都相同
可以使用scp命令把server1主機(jī)上配置好的keepalived.conf文件拷貝到server2主機(jī),只要做簡(jiǎn)單修改即可,如下圖所示:
Master2的{keepalived}主配置文件
啟動(dòng)keepalived服務(wù)
#/etc/init.d/keepalived start
在上面當(dāng)中在notify_down指定腳本的路徑可以在不使用keepalived的時(shí)候殺死keepalived的進(jìn)程;
之后給腳本一個(gè)x的執(zhí)行權(quán)限
Chmod +x /etc/keepalived/bin/mysql.sh
這些工作完成之后可以驗(yàn)證我們之前的mysql+keepalived有沒(méi)有成功呢?
首先查看下vrrp的虛擬IP
那么master2上面呢?
在這里我們模擬master突然宕機(jī)之后看一看master2是否會(huì)接替master上面的vrrp漂移ip呢?
首先使用我們的腳本執(zhí)行以下;
之后呢在查看下master上面的vrrp漂移ip是否存在
可以看得出啦vrrp的漂移ip已經(jīng)不再master服務(wù)器上面了,那么master2上面呢?
可以看到master2成功的接替了master上面的vrrp的漂移ip了,說(shuō)明我們的高可用服務(wù)是成功的
在這里keepalived+mysql服務(wù)就講解到這里,但是呢在前面就曾說(shuō)過(guò),keepalived使用與小型的公司,在配置keepalived的時(shí)候需要有幾點(diǎn)的注意事項(xiàng):
1).采用keepalived作為高可用方案時(shí),兩個(gè)節(jié)點(diǎn)最好都設(shè)置成BACKUP模式,避免因?yàn)橐馔馇闆r下(比如腦裂)相互搶占導(dǎo)致往兩個(gè)節(jié)點(diǎn)寫(xiě)入相同數(shù)據(jù)而引發(fā)沖突;
2).把兩個(gè)節(jié)點(diǎn)的auto_increment_increment(自增步長(zhǎng))和auto_increment_offset(自增起始值)設(shè)成不同值。其目的是為了避免master節(jié)點(diǎn)意外宕機(jī)時(shí),可能會(huì)有部分binlog未能及時(shí)復(fù)制到slave上被應(yīng)用,從而會(huì)導(dǎo)致slave新寫(xiě)入數(shù)據(jù)的自增值和原先master上沖突了,因此一開(kāi)始就使其錯(cuò)開(kāi);當(dāng)然了,如果有合適的容錯(cuò)機(jī)制能解決主從自增ID沖突的話,也可以不這么做;
3).slave節(jié)點(diǎn)服務(wù)器配置不要太差,否則更容易導(dǎo)致復(fù)制延遲。作為熱備節(jié)點(diǎn)的slave服務(wù)器,硬件配置不能低于master節(jié)點(diǎn);
4).如果對(duì)延遲問(wèn)題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程復(fù)制的方式可以很大程度降低復(fù)制延遲;
這次為大家?guī)?lái)的是小型公司對(duì)mysql主要使用架構(gòu)方案;下次為大家?guī)?lái)的是中大型公司使用的架構(gòu)MMM,相信大家也有所了解,具體等下次我們細(xì)說(shuō)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。