mysql 集群操作系统_高性能MySQL集群详解(二)
一.通過(guò)Keepalived搭建MySQL雙主模式的高可用集群系統(tǒng)
1.MySQL Replication介紹:
MySQL Replication是MySQL自身提供的一個(gè)主從復(fù)制功能,其實(shí)也就是一臺(tái)MySQL服務(wù)器(稱(chēng)為Slave)從另一臺(tái)MySQL服務(wù)器(稱(chēng)為Master)上復(fù)制日志,然后解析日志并應(yīng)用到自身的過(guò)程。MySQL Replication是單向、異步復(fù)制,基本復(fù)制過(guò)程為:Master服務(wù)器首先將更新寫(xiě)入二進(jìn)制日志文件,并維護(hù)文件的一個(gè)索引以跟蹤日志的循環(huán),這些日志文件可以發(fā)送到Slave服務(wù)器進(jìn)行更新。當(dāng)一臺(tái)Slave服務(wù)器連接Master服務(wù)器時(shí),它從Master服務(wù)器日志中讀取上一次成功更新的位置。然后Slave服務(wù)器開(kāi)始接收從上一次完成更新后發(fā)生的所有更新,所有更新完成,將等待主服務(wù)器通知新的更新。
MySQL Replication支持鏈?zhǔn)綇?fù)制,也就是說(shuō)Slave服務(wù)器下還可以再鏈接Slave服務(wù)器,同時(shí)Slave服務(wù)器也可以充當(dāng)Master服務(wù)器角色。這里需要注意的是,在MySQL主從復(fù)制中,所有表的更新必須在Master服務(wù)器上進(jìn)行,Slave服務(wù)器僅能提供查詢(xún)操作。
基于單向復(fù)制的MySQL Replication技術(shù)有如下優(yōu)點(diǎn):
□增加了MySQL應(yīng)用的健壯性,如果Master服務(wù)器出現(xiàn)問(wèn)題,可以隨時(shí)切換到Slave服務(wù)器,繼續(xù)提供服務(wù)。
■可以將MySQL讀、寫(xiě)操作分離,寫(xiě)操作只在Master服務(wù)器完成,讀操作可在多個(gè)Slave服務(wù)器上完成,由于Master服務(wù)器和Slave服務(wù)器是保持?jǐn)?shù)據(jù)同步的,因此不會(huì)對(duì)前端業(yè)務(wù)系統(tǒng)產(chǎn)生影響。同時(shí),通過(guò)讀、寫(xiě)的分離,可以大大降低MySQL的運(yùn)行負(fù)荷。
□在網(wǎng)絡(luò)環(huán)境較好,業(yè)務(wù)量不是很大的環(huán)境中,Slave服務(wù)器同步數(shù)據(jù)非???#xff0c;基本可以達(dá)到實(shí)時(shí)同步,并且,Slave服務(wù)器在同步過(guò)程中不會(huì)干擾Master服務(wù)器。
MySQL Replication支持多種類(lèi)型的復(fù)制方式,常見(jiàn)的有基于語(yǔ)句的復(fù)制、基于行的復(fù)制和混合類(lèi)型的復(fù)制。下面分別進(jìn)行介紹。
(1)基于語(yǔ)句的復(fù)制
MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率很高?;痉绞绞?#xff1a;在Master服務(wù)器上執(zhí)行的SQL語(yǔ)句,在Slave服務(wù)器上再次執(zhí)行同樣的語(yǔ)句。而一旦發(fā)現(xiàn)沒(méi)法精確復(fù)制時(shí),會(huì)自動(dòng)選擇基于行的復(fù)制。
(2)基于行的復(fù)制
基本方式為:把Master服務(wù)器上改變的內(nèi)容復(fù)制過(guò)去,而不是把SQL語(yǔ)句在從服務(wù)器上執(zhí)行一遍,從MySQL5.0開(kāi)始支持基于行的復(fù)制。
(3)混合類(lèi)型的復(fù)制
其實(shí)就是上面兩種類(lèi)型的組合,默認(rèn)采用基于語(yǔ)句的復(fù)制,如果發(fā)現(xiàn)基于語(yǔ)句的復(fù)制無(wú)法精確完成,就會(huì)采用基于行的復(fù)制。
2.MySQL Replication實(shí)現(xiàn)原理:
MySQL Replication是一個(gè)從Master復(fù)制到一臺(tái)或多臺(tái)Slave的異步過(guò)程,在Master與Slave之間實(shí)現(xiàn)整個(gè)復(fù)制過(guò)程主要由三個(gè)線(xiàn)程來(lái)完成,其中一個(gè)IO線(xiàn)程在Master端,另兩個(gè)線(xiàn)程(SQL線(xiàn)程和IO線(xiàn)程)在Slave端。
要實(shí)現(xiàn)MySQL Replication,首先在Master服務(wù)器上打開(kāi)MySQL的Binary Log(產(chǎn)生二進(jìn)制日志文件)功能,因?yàn)檎麄€(gè)復(fù)制過(guò)程實(shí)際上就是Slave從Master端獲取該日志,然后在自身上將二進(jìn)制文件解析為SQL語(yǔ)句并完全順序地執(zhí)行SQL語(yǔ)句所記錄的各種操作。更詳細(xì)的過(guò)程如下。
1)首先Slave上的IO線(xiàn)程連接上Master,然后請(qǐng)求從指定日志文件的指定位置或者從最開(kāi)始的日志位置之后的日志內(nèi)容。
2)Master在接收到來(lái)自Slave的IO線(xiàn)程請(qǐng)求后,通過(guò)自身的IO線(xiàn)程,根據(jù)請(qǐng)求信息讀取指定日志位置之后的日志信息,并返回給Slave端的IO線(xiàn)程。返回信息中除了日志所包含的信息之外,還包括此次返回的信息在Master端對(duì)應(yīng)的Binary Log文件的名稱(chēng)以及在Binary Log中的位置。
3)Slave的IO線(xiàn)程接收到信息后,將獲取到的日志內(nèi)容依次寫(xiě)入Slave端的Relay Log文件(類(lèi)似于mysql-relay-bin.xxxxxx)的最后,并且將讀取到的Master端的Binary Log的文件名和位置記錄到一個(gè)名為master-info的文件中,以便在下一次讀取的時(shí)候能迅速定位開(kāi)始往后讀取日志信息的位置。
4)Slave的SQL線(xiàn)程在檢測(cè)到Relay Log文件中新增加了內(nèi)容后,會(huì)馬上解析該Relay Log文件中的內(nèi)容,將日志內(nèi)容解析為SQL語(yǔ)句,然后在自身執(zhí)行這些SQL,由于是在Master端和Slave端執(zhí)行了同樣的SQL操作,所以?xún)啥说臄?shù)據(jù)是完全一樣的。至此整個(gè)復(fù)制過(guò)程結(jié)束。
3.MySQL Replication常用架構(gòu)
MySQL Replication技術(shù)在實(shí)際應(yīng)用中有多種實(shí)現(xiàn)架構(gòu),常見(jiàn)的有:
☆一主一次,即一臺(tái)Master服務(wù)器和一臺(tái)Slave服務(wù)器。這是最常見(jiàn)的架構(gòu)。
★一主多從,即一臺(tái)Master服務(wù)器和兩臺(tái)或兩臺(tái)以上Slave服務(wù)器,經(jīng)常用在寫(xiě)操作不頻繁、查詢(xún)量比較大的業(yè)務(wù)環(huán)境中。
☆主主互備,又稱(chēng)雙主互備,即兩臺(tái)MySQL Server互相將對(duì)方作為自己的Master,自己又同時(shí)作為對(duì)方的Slave來(lái)進(jìn)行復(fù)制。主要用于對(duì)MySQL寫(xiě)操作要求比較高的環(huán)境中,避免了MySQL單點(diǎn)故障。
★雙主多從,其實(shí)就是雙主互備,然后再加上多臺(tái)Slave服務(wù)器。主要用于對(duì)MySQL寫(xiě)操作要求比較高,同時(shí)查詢(xún)量比較大的環(huán)境中。
其實(shí)可以根據(jù)具體的情況靈活地將Master/Slave結(jié)構(gòu)進(jìn)行變化組合,但萬(wàn)變不離其宗,在進(jìn)行MySQL Replication的各種部署之前,必須遵守的規(guī)則如下:
◇同一時(shí)刻只能有一臺(tái)Master服務(wù)器進(jìn)行寫(xiě)操作。
◆一臺(tái)Master服務(wù)器可以有多臺(tái)Slave服務(wù)器。
◇無(wú)論是Master服務(wù)器還是Slave服務(wù)器,都要確保各自的ServerID唯一,否則雙主互備就會(huì)出現(xiàn)問(wèn)題。
◆一臺(tái)Slave服務(wù)器可以將其從Master服務(wù)器獲得的更新信息傳遞給其他的Slave服務(wù)器。
4.MySQL主主互備模式架構(gòu)
企業(yè)級(jí)MySQL集群具備高可用、可擴(kuò)展、易管理、低成本的特點(diǎn)。下面將介紹企業(yè)環(huán)境中經(jīng)常應(yīng)用的一個(gè)解決方案,即MySQL的雙主互備架構(gòu),主要設(shè)計(jì)思路是通過(guò)MySQL Replication技術(shù)將兩臺(tái)MySQL Server互相將對(duì)方作為自己的Master,自己又同時(shí)作為對(duì)方的Slave來(lái)進(jìn)行復(fù)制。這樣就實(shí)現(xiàn)了高可用架構(gòu)中的數(shù)據(jù)同步功能,同時(shí),將采用Keepalived來(lái)實(shí)現(xiàn)MySQL的自動(dòng)failover。在這種架構(gòu)中,雖然兩臺(tái)MySQL Server互為主從,但同一時(shí)刻只能有一臺(tái)MySQL Server可讀寫(xiě),而另一臺(tái)MySQL Server只能進(jìn)行讀操作,這樣可保證數(shù)據(jù)的一致性。整個(gè)架構(gòu)如下圖:
5.MySQL主主互備模式配置
MySQL主從復(fù)制的配置還是比較簡(jiǎn)單的,僅僅需要修改MySQL配置文件即可,這里要配置的是主主互備模式,但配置過(guò)程和一主一從結(jié)構(gòu)是完全一樣的,配置環(huán)境如下:
主機(jī)名? ? ? 操作系統(tǒng)版本? ? ??MySQL版本? ? 主機(jī)IP? ? MySQL VIP
DB1(Master)??CentOS release 6.7? mysql-5.1.73? 10.0.0.35? 10.0.0.40
DB2(Slave)? ?CentOS release 6.7? mysql-5.1.73? 10.0.0.36
1.修改MySQL配置文件
在默認(rèn)情況下,MySQL的配置文件是/etc/my.cnf,首先修改DB1主機(jī)的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下內(nèi)容:
server-id=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
然后修改DB2主機(jī)的配置文件,在/etc/my.cnf文件中的“[mysqld]”段添加如下內(nèi)容:
server-id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
其中,server-id是節(jié)點(diǎn)標(biāo)識(shí),主、從節(jié)點(diǎn)不能相同,必須全局唯一。log-bin表示開(kāi)啟MySQL的binlog日志功能。“mysql-bin”表示日志文件的命名格式,會(huì)生成文件名為mysql-bin.000001、mysql-bin.000002等的日志文件。relay-log用來(lái)定義relay-log日志文件的命名格式。replicate-wild-ignore-table是個(gè)復(fù)制過(guò)濾選項(xiàng),可以過(guò)濾不需要復(fù)制的數(shù)據(jù)庫(kù)或表,例如“mysql.%”表示不復(fù)制MySQL庫(kù)下的所有對(duì)象,其他以此類(lèi)推。與此對(duì)應(yīng)的是replicate-wild-do-table選項(xiàng),用來(lái)指定需要復(fù)制的數(shù)據(jù)庫(kù)或表。
這里需要注意的是,不要在主庫(kù)上使用binlog-do-db或binlog-ignore-db選項(xiàng),也不要在從庫(kù)上使用replicate-do-db或replicate-ignore-db選項(xiàng),因?yàn)檫@樣可能產(chǎn)生跨庫(kù)更新失敗的問(wèn)題。推薦在從庫(kù)使用replicate-wild-do-table和replicate-wild-ignore-table兩個(gè)選項(xiàng)來(lái)解決復(fù)制過(guò)濾問(wèn)題。
2.手動(dòng)同步數(shù)據(jù)庫(kù)
如果DB1上已經(jīng)有MySQL數(shù)據(jù),那么在執(zhí)行主主互備之前,需要將DB1和DB2上兩個(gè)MySQL的數(shù)據(jù)保持同步,首先在DB1上備份MySQL數(shù)據(jù),執(zhí)行如下SQL語(yǔ)句:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)
不要退出這個(gè)終端,否則這個(gè)鎖就失效了。在不退出終端的情況下,再開(kāi)啟一個(gè)終端直接打包壓縮數(shù)據(jù)文件或使用mysqldump工具導(dǎo)出數(shù)據(jù)。這里通過(guò)打包mysql文件來(lái)完成數(shù)據(jù)的備份,操作過(guò)程如下:
[root@db1 ~]# cd /var/lib/
[root@db1 ~]# tar zcvf mysql.tar.gz mysql
[root@db1 ~]# scp mysql.tar.gz db2:/var/lib/
將數(shù)據(jù)傳輸?shù)紻B2后,依次重啟DB1和DB2上面的MySQL。
3.創(chuàng)建復(fù)制用戶(hù)并授權(quán)
首先在DB1的MySQL庫(kù)中創(chuàng)建復(fù)制用戶(hù),操作過(guò)程如下:
mysql> grant replication slave on *.* to 'repl_user'@'10.0.0.36' identified by 'repl_passwd';
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File? ? ? ? ? ? ?| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |? ? ?1698 |? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |
+------------------+----------+--------------+------------------+
然后在DB2的MySQL庫(kù)中將DB1設(shè)為自己的主服務(wù)器,操作如下:
mysql> change master to master_host='10.0.0.35',master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=1698;
這里需要注意master_log_file和master_log_pos兩個(gè)選項(xiàng),這兩個(gè)選項(xiàng)的值剛好是在DB1上通過(guò)SQL語(yǔ)句“show master status”查詢(xún)到的結(jié)果。
接著就可以在DB2上啟動(dòng)slave服務(wù)了,可執(zhí)行如下SQL命令:
mysql> start slave;
查看DB2上slave的運(yùn)行狀態(tài):
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.35
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1698
Relay_Log_File: mysql-relay-bin.000016
Relay_Log_Pos: 411
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1698
Relay_Log_Space: 711
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
通過(guò)查看slave的運(yùn)行狀態(tài)可以發(fā)現(xiàn),一切運(yùn)行正常,這里需要重點(diǎn)關(guān)注的是Slave_IO_Running和Slave_SQL_Running,這兩個(gè)就是在Slave節(jié)點(diǎn)上運(yùn)行的主從復(fù)制線(xiàn)程,正常情況下這兩個(gè)值都應(yīng)該為Yes。另外,還需要注意的是Slave_IO_State、Master_Host、Master_Log_File、Read_Master_Log_Pos、Relay_Log_File、Relay_Log_Pos和Relay_Master_Log_File幾個(gè)選項(xiàng),可以查看出MySQL復(fù)制的運(yùn)行原理及執(zhí)行規(guī)律。最后還有一個(gè)Replicate_Wild_Ignore_Table選項(xiàng),這個(gè)是之前在my.cnf中添加過(guò)的,通過(guò)此選項(xiàng)的輸出值可以知道過(guò)濾了哪些數(shù)據(jù)庫(kù)。
到這里,從DB1到DB2的MySQL主從復(fù)制已經(jīng)完成。接下來(lái)開(kāi)始配置從DB2到DB1的MySQL主從復(fù)制,這個(gè)配置過(guò)程與上面的過(guò)程完全一樣,首先在DB2的MySQL庫(kù)中創(chuàng)建復(fù)制用戶(hù),操作如下:
mysql>grant replication slave on *.* to 'repl_user'@'10.0.0.35' identified by 'repl_passwd';
mysql>show master status;
然后在DB1的MySQL庫(kù)中將DB2設(shè)為自己的主服務(wù)器,操作如下:
mysql>change master to master_host='10.0.0.36',master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=266;
最后,就可以在DB1上啟動(dòng)slave服務(wù)了,可以執(zhí)行如下SQL命令:
mysql>start slave;
查看DB1上slave的運(yùn)行狀態(tài),Slave_IO_Running和Slave_SQL_Running都是Yes狀態(tài),表明DB1上復(fù)制服務(wù)運(yùn)行正常。至此,MySQL雙主模式的主從復(fù)制配置完畢。
6.配置Keepakived實(shí)現(xiàn)MySQL雙主高可用
在進(jìn)行高可用配置之前,首先需要在DB1和DB2服務(wù)器上安裝Keepalived軟件。我這里是直接yum安裝,關(guān)于keepalived的安裝這里不再說(shuō)明,直接進(jìn)入Keepalived的配置過(guò)程。下面是DB1服務(wù)器上/etc/keepalived/keepalived.conf文件的內(nèi)容。
[root@db1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_mysqld {
script "/etc/keepalived/mysqlcheck/slave.sh"? #檢測(cè)MySQL復(fù)制狀態(tài)的腳本
interval 2
weight 21
}
vrrp_instance HA_1 {
state BACKUP? ? ? ? ? ? #在DB1和DB2上均配置為BACKUP
interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt? ? ? ? ? ? ? #不搶占模式,只在優(yōu)先級(jí)高的機(jī)器上設(shè)置即可,優(yōu)先級(jí)低的機(jī)器可不設(shè)置
authentication {
auth_type PASS
auth_pass aaaavvv
}
track_script {
check_mysqld
}
virtual_ipaddress {
10.0.0.40/24 dev eth0? ? #MySQL的對(duì)外服務(wù)Ip,即VIP
}
}
其中,/etc/keepalived/mysqlcheck/slave.sh文件的內(nèi)容為:
[root@db1 mysqlcheck]# cat slave.sh
#!/bin/bash
#Date: 2017-07-16
#Mail: 1135757611@qq.com
#Function: 監(jiān)控mysql主從同步
#
. /etc/init.d/functions
Slave_IO=`/usr/bin/mysql -uroot -e "show slave status\G;" | grep -i " Slave_IO_R"|awk -F ": " '{print $2}'`
Slave_SQL=`/usr/bin/mysql -uroot -e "show slave status\G;" | grep -i "Slave_SQL_R"|awk -F ": " '{print $2}'`
if [[ $Slave_IO = 'Yes' &&? $Slave_SQL = 'Yes' ]]
then
action "Slave is Running" /bin/true
MYSQL_SLAVE_STATUS=0
else
action "Slave is not Running" /bin/false
MYSQL_SLAVE_STATUS=1
fi
exit $MYSQL_SLAVE_STATUS
使用前要保證此腳本有執(zhí)行權(quán)限。
接著將Keepalived.conf文件中priority值修改為90。由于配置的是不搶占模式,因此,還需要去掉nopreempt選項(xiàng)。
在完成所有配置后,分別在DB1和DB2上啟動(dòng)Keepalived服務(wù),在正常情況下VIP地址應(yīng)該運(yùn)行在DB1服務(wù)器上。
7.測(cè)試MySQL主從同步功能
為了驗(yàn)證MySQL的復(fù)制功能,可以編寫(xiě)一個(gè)簡(jiǎn)單的程序進(jìn)行測(cè)試,也可以通過(guò)遠(yuǎn)程客戶(hù)端登錄進(jìn)行測(cè)試。這里通過(guò)一個(gè)MySQL客戶(hù)端,然后利用MySQL的VIP地址登錄,看能否登錄,并在登錄后進(jìn)行讀、寫(xiě)操作,看看DB1和DB2之間能否實(shí)現(xiàn)數(shù)據(jù)同步。由于采用遠(yuǎn)程登錄測(cè)試,因此DB1和DB2兩臺(tái)MySQL服務(wù)器都要事先做好授權(quán),允許從遠(yuǎn)程登錄。
1.在遠(yuǎn)程客戶(hù)端通過(guò)VIP登錄測(cè)試
首先通過(guò)遠(yuǎn)程MySQL客戶(hù)端命令行登錄VIP為“10.0.0.40”的數(shù)據(jù)庫(kù),操作如下:
[root@zabbix ~]# mysql -u test -h 10.0.0.40 -pyan123
Welcome to the MySQL monitor.? Commands end with ; or \g.
Your MySQL connection id is 51298
Server version: 5.1.73-log Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like "%hostname%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname? ? ? | db1? ?|
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "%server_id%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id? ? ?| 1? ? ?|
+---------------+-------+
1 row in set (0.01 sec)
從SQL輸出結(jié)果看,可以通過(guò)VIP登錄,并且登錄了DB1服務(wù)器。
2.數(shù)據(jù)復(fù)制功能測(cè)試
接著上面的SQL操作過(guò)程,通過(guò)遠(yuǎn)程的MySQL客戶(hù)端連接VIP,進(jìn)行讀、寫(xiě)操作測(cè)試,操作過(guò)程如下:
mysql> create database bbs;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database? ? ? ? ? ?|
+--------------------+
| information_schema |
| bbs? ? ? ? ? ? ? ? |
| blog? ? ? ? ? ? ? ?|
| mysql? ? ? ? ? ? ? |
| test? ? ? ? ? ? ? ?|
| wordpress? ? ? ? ? |
+--------------------+
6 rows in set (0.00 sec)
mysql> use bbs;
Database changed
mysql> create table user (id int,email varchar(80),password varchar(40) not null);
Query OK, 0 rows affected (0.20 sec)
mysql> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| user? ? ? ? ? |
+---------------+
1 row in set (0.01 sec)
mysql> insert into user (id,email,password) values(1,"bbs@163.com","aa1234");
Query OK, 1 row affected (0.00 sec)
這個(gè)過(guò)程創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)bbs,然后在bbs庫(kù)中創(chuàng)建了一張表user。為了驗(yàn)證數(shù)據(jù)是否復(fù)制到DB2主機(jī)上,登錄DB2主機(jī)的MySQL命令行,查詢(xún)過(guò)程如下:
[root@db2 ~]# mysql
mysql> show databases;
+--------------------+
| Database? ? ? ? ? ?|
+--------------------+
| information_schema |
| bbs? ? ? ? ? ? ? ? |
| blog? ? ? ? ? ? ? ?|
| mysql? ? ? ? ? ? ? |
| wordpress? ? ? ? ? |
+--------------------+
5 rows in set (0.00 sec)
mysql> use bbs;
Database changed
mysql> show tables;
+---------------+
| Tables_in_bbs |
+---------------+
| user? ? ? ? ? |
+---------------+
1 row in set (0.00 sec)
mysql> select * from user;
+------+-------------+----------+
| id? ?| email? ? ? ?| password |
+------+-------------+----------+
|? ? 1 | bbs@163.com | aa1234? ?|
+------+-------------+----------+
1 row in set (0.00 sec)
從SQL輸出結(jié)果看,剛才創(chuàng)建的庫(kù)和表都已經(jīng)同步到了DB2服務(wù)器上。其實(shí)也可以直接登錄DB2服務(wù)器,然后執(zhí)行數(shù)據(jù)庫(kù)的讀、寫(xiě)操作,看數(shù)據(jù)能否迅速同步到DB1的MySQL數(shù)據(jù)庫(kù)中。
8.測(cè)試Keepalived實(shí)現(xiàn)MySQL故障轉(zhuǎn)移
為了測(cè)試Keepalived實(shí)現(xiàn)的故障轉(zhuǎn)移功能,需要模擬一些故障,比如,可以通過(guò)斷開(kāi)DB1主機(jī)的網(wǎng)絡(luò)、關(guān)閉DB1主機(jī)、關(guān)閉DB1上MySQL服務(wù)等各種操作實(shí)現(xiàn)。這里在DB1服務(wù)器上關(guān)閉MySQL的日志接收功能,以此來(lái)模擬DB1上MySQL的故障。由于在DB1和DB2服務(wù)器上都添加了監(jiān)控MySQL運(yùn)行狀態(tài)的腳本slave.sh,因此當(dāng)關(guān)閉DB1的MySQL日志接收功能后,Keepalived會(huì)立刻檢測(cè)到,接著執(zhí)行切換操作。
1.停止DB1服務(wù)器的日志接收功能
首先在遠(yuǎn)程MySQL客戶(hù)端以VIP地址登錄MySQL系統(tǒng),不用退出這個(gè)連接,然后在DB1服務(wù)器的MySQL命令行執(zhí)行如下操作:
[root@db1 ~]# mysql
mysql> stop slave;
2.在遠(yuǎn)程客戶(hù)端測(cè)試
繼續(xù)在剛才打開(kāi)的遠(yuǎn)程MySQL連接中執(zhí)行命令,操作如下:
mysql> select * from user;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select * from user;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:? ? 62855
Current database: bbs
+------+-------------+----------+
| id? ?| email? ? ? ?| password |
+------+-------------+----------+
|? ? 1 | bbs@163.com | aa1234? ?|
+------+-------------+----------+
1 row in set (0.24 sec)
mysql> show variables like "%hostname%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname? ? ? | db2? ?|
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like "%server_id%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id? ? ?| 2? ? ?|
+---------------+-------+
1 row in set (0.00 sec)
從這個(gè)操作過(guò)程可以看出,在Keepalived切換后,之前的session連接失效,所以第一查詢(xún)命令失敗。然后重新執(zhí)行查詢(xún)命令,MySQL會(huì)執(zhí)行重新連接,隨后輸出了查詢(xún)結(jié)果,從后面兩個(gè)SQL的查詢(xún)結(jié)果可知,MySQL服務(wù)已經(jīng)從DB1服務(wù)器切換到DB2服務(wù)器。Keepalived的切換過(guò)程非常迅速,整個(gè)過(guò)程大概持續(xù)1~3s,重新切換到新的服務(wù)器后,之前所有的MySQL連接失效,重新連接可以恢復(fù)正常。
接著,重新打開(kāi)DB1上MySQL的日志接收功能,可以發(fā)現(xiàn)Keepalived將不再執(zhí)行切換操作,因?yàn)樯厦鎸eepalived配置為不搶占模式,此時(shí),MySQL服務(wù)將一直在DB2服務(wù)器上運(yùn)行,直到DB2主機(jī)或服務(wù)出現(xiàn)故障才再次進(jìn)行切換操作。這樣做的原因是在數(shù)據(jù)庫(kù)環(huán)境下,每次切換的代價(jià)很大,因而關(guān)閉了Keepalived的主動(dòng)搶占模式。
總結(jié)
以上是生活随笔為你收集整理的mysql 集群操作系统_高性能MySQL集群详解(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bootstrap 新闻列表_kuapi
- 下一篇: mysql libs 冲突_mysql-