新聞中心
本篇文章為大家展示了MySQL MHA集群方案是怎樣的,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
在蒲縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),蒲縣網(wǎng)站建設(shè)費(fèi)用合理。
MySQL MHA集群方案調(diào)研
1 MHA集群的基本概念
1.1 基本概念
MHA是由日本Mysql專家用Perl寫的一套Mysql故障切換方案以保障數(shù)據(jù)庫的高可用性,它的功能是能在0-30s之內(nèi)實(shí)現(xiàn)主Mysql故障轉(zhuǎn)移(failover),
MHA故障轉(zhuǎn)移可以很好的幫我們解決從庫數(shù)據(jù)的一致性問題,同時(shí)最大化挽回故障發(fā)生后的數(shù)據(jù)。MHA里有兩個(gè)角色一個(gè)是node節(jié)點(diǎn) 一個(gè)是manager節(jié)點(diǎn),要實(shí)現(xiàn)這個(gè)MHA,必須最少要三臺(tái)數(shù)據(jù)庫服務(wù)器,一主多備,即一臺(tái)充當(dāng)master,一臺(tái)充當(dāng)master的備份機(jī),另外一臺(tái)是從屬機(jī)。
官方資料網(wǎng)站:
https://code.google.com/p/mysql-master-ha/w/list
https://code.google.com/p/mysql-master-ha/wiki/Tutorial
1.2 MHA保證數(shù)據(jù)一致性原理
在基于MySQL復(fù)制的MHA集群架構(gòu)中,當(dāng)Master發(fā)生故障時(shí),MHA 通過如下步驟來保證數(shù)據(jù)的一致性:
(1) 找出同步最成功的一臺(tái)從服務(wù)器(也就是與主服務(wù)器數(shù)據(jù)最接近的那臺(tái)從服務(wù)器)。
(2) 如果主機(jī)還能夠訪問,從主服務(wù)器上找回最新從機(jī)與主機(jī)間的數(shù)據(jù)差異。
(3) 在每一臺(tái)從服務(wù)器上操作,確定他們?nèi)鄙倌男〆vents,并分別進(jìn)行補(bǔ)充。
(4) 將最新的一臺(tái)從服務(wù)器提升為主服務(wù)器后。
(5) 將其它從服務(wù)器重新指向新的主服務(wù)器。
雖然MHA試圖從宕機(jī)的主服務(wù)器上保存二進(jìn)制日志,但并不是總是可行的。例如,如果主服務(wù)器硬件故障或無法通過ssh訪問,MHA沒法保存二進(jìn)制日志,只進(jìn)行故障轉(zhuǎn)移而丟失最新數(shù)據(jù)。
結(jié)合半同步復(fù)制,可以大大降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。MHA可以與半同步復(fù)制結(jié)合起來,如果只有一個(gè)slave已經(jīng)收到了最新的二進(jìn)制日志,MHA可以將最新的二進(jìn)制日志應(yīng)用于其他所有的slave服務(wù)器上,因此他們彼此保持一致性。
1.3 MHA集群架構(gòu)圖
1.3.1 MHA總體架構(gòu)圖
1.3.2 MHA組內(nèi)架構(gòu)圖
復(fù)制組內(nèi)使用Keepalived + LVS :
1.4 MHA集群的優(yōu)點(diǎn)
1.4.1 Master自動(dòng)監(jiān)控和故障轉(zhuǎn)移
在當(dāng)前已存在的主從復(fù)制環(huán)境中,MHA可以監(jiān)控master主機(jī)故障,并且故障自動(dòng)轉(zhuǎn)移。即使有一些slave沒有接受新的relay log events,MHA也會(huì)從最新的slave自動(dòng)識(shí)別差異的relay log events,并apply差異的event到其他slaves。因此所有的slave都是一致的。 MHA秒級(jí)別故障轉(zhuǎn)移, 另外,在配置文件里可以配置一個(gè)slave優(yōu)先成為Master。
當(dāng)遷移新的master之后,并行恢復(fù)其他slave。即使有成千上萬的slave,也不會(huì)影響恢復(fù)master時(shí)間,slave也很快完成。整個(gè)過程無需DBA干預(yù)。
1.4.2 在線切換Master到不同主機(jī)
在很多情況下,有必要將master轉(zhuǎn)移到其他主機(jī)上(如替換raid控制器,提升master機(jī)器硬件等等)。這并不是master崩潰,但是計(jì)劃維護(hù)必須去做。計(jì)劃維護(hù)導(dǎo)致downtime,必須盡可能快的恢復(fù)。快速的master切換和優(yōu)雅的阻塞寫操作是必需的,MHA提供了這種方式。優(yōu)雅的master切換, 0.5-2秒內(nèi)阻塞寫操作。在很多情況下0.5-2秒的downtime是可以接受的,并且即使不在計(jì)劃維護(hù)窗口。這意味著當(dāng)需要更換更快機(jī)器,升級(jí)高版本時(shí),dba可以很容易采取動(dòng)作。
1.4.3 Master 宕機(jī)不會(huì)導(dǎo)致主從數(shù)據(jù)不一致性
當(dāng)master 宕后,MHA自動(dòng)識(shí)別slave間relay logevents的不同,然后應(yīng)用與不同的slave,最終所有slave都同步。結(jié)合通過半同步一起使用,幾乎沒有任何數(shù)據(jù)丟失。
1.4.4 MHA部署不影響當(dāng)前環(huán)境設(shè)置
MHA最重要的一個(gè)設(shè)計(jì)理念就是盡可能使用簡單。其只要是在主從環(huán)境下,MHA集群無需改變現(xiàn)有部署便可部署,無論是在同步和半同步環(huán)境都可以用。啟動(dòng)/停止/升級(jí)/降級(jí)/安裝/卸載 MHA都不用改變mysql主從(如啟動(dòng)/停止)。而它集群方案需要改變mysql部署設(shè)置。
當(dāng)需要升級(jí)MHA到新版本時(shí),不需要停止mysql,僅僅更新HMA版本,然后重新啟動(dòng)MHAmanger即可。
1.4.5 增加集群組簡單快捷
MHA 包含MHA Manager和MHA node。一個(gè)MHA Manager可以管理多個(gè)MHA node集群組。增加集群組時(shí),對(duì)新增的集群組配置復(fù)制,并且更新MHA Manager的配置即可。對(duì)現(xiàn)有的集群組基本無影響。增加集群組數(shù)量也不會(huì)對(duì)MHA Manager有太大負(fù)擔(dān)。Manager可以單獨(dú)部署一臺(tái)機(jī)器,也可以運(yùn)行在slaves中的一臺(tái)機(jī)器上。
1.4.6 性能無影響
MHA監(jiān)控Master不發(fā)送大的查詢,主從復(fù)制性能不受影響。本案例通過自定義腳本,定期嘗試登陸Master 如果登陸失敗,即實(shí)施故障切換。這么監(jiān)控辦法,對(duì)性能基本沒什么影響。
1.4.7 適用任何存儲(chǔ)引擎
Mysql不僅僅適用于事務(wù)安全的innodb引擎,在主從中適用的引擎,MHA都可以適用。即使用遺留環(huán)境的mysiam引擎,不進(jìn)行遷移,也可以用MHA。
1.4.8 故障透明轉(zhuǎn)移(業(yè)務(wù)層面)
MHA可通常有兩種方式實(shí)現(xiàn)業(yè)務(wù)層面的透明故障轉(zhuǎn)移:一種是虛擬IP地址,MHA結(jié)合Keepalived 和LVS,當(dāng)群集內(nèi)的數(shù)據(jù)庫進(jìn)行故障轉(zhuǎn)移時(shí),對(duì)外提供服務(wù)的虛擬IP也進(jìn)行轉(zhuǎn)移;第二種是全局配置文件,通過配置MHA的master_ip_failover_script 、master_ip_online_change_script參數(shù)來實(shí)現(xiàn)。
1.4.9 讀寫分離
MHA的Master為可讀寫,而備用Master和Slave都可用于查詢,分擔(dān)讀壓力。
1.5 MHA集群缺點(diǎn)
1.5.1 重新加入集群需要人工操作
Master down掉后,如需重新加入集群,需要手工執(zhí)行命令切換。
1.5.2 備用Master數(shù)據(jù)一致性風(fēng)險(xiǎn)
備用的Master 默認(rèn)是可寫的,如果不設(shè)置為read only,存在數(shù)據(jù)不一致性的風(fēng)險(xiǎn)。并且read-only對(duì)super用戶不起作用。
1.5.3 存在數(shù)據(jù)同步時(shí)延
由于使用了MySQL的復(fù)制,而MySQL的復(fù)制是存在延遲的。MySQL的復(fù)制延遲主要是因?yàn)镸aster多線程對(duì)Slave單線程的遲延。
2 MHA部署案例
2.1 案例說明
為了實(shí)現(xiàn)更好的效果,本實(shí)驗(yàn)使用四臺(tái)機(jī)器。使用MySQL的半同步復(fù)制,保證數(shù)據(jù)的完整性。結(jié)合Keepalived和LVS 實(shí)現(xiàn)IP故障透明轉(zhuǎn)移和讀寫分離。需要說明的是一旦主服務(wù)器宕機(jī),備份機(jī)即開始充當(dāng)master提供服務(wù),如果主服務(wù)器上線也不會(huì)再成為master了,因?yàn)槿绻@樣數(shù)據(jù)庫的一致性就被改變了。
2.2 架構(gòu)圖
IP | 主機(jī) | 用途說明 |
192.168.0.11 | Master | Master,Keepalived HA的Master |
192.168.0.12 | Slave1(備用Master) | 備用Master,Keepalived HA的BACKUP,LVS均衡負(fù)載主機(jī) |
192.168.0.13 | Slave2 | Slave,LVS均衡負(fù)載主機(jī) |
192.168.0.14 | MHA Manager | MHA集群的管理主機(jī) |
192.168.0.20 | 虛擬IP地址 | MHA集群寫VIP地址 |
192.168.0.21 | 虛擬IP地址 | MHA集群讀VIP地址 |
3 安裝MySQL MHA
(1)首先用ssh-keygen實(shí)現(xiàn)四臺(tái)主機(jī)之間相互免密鑰登錄
(2)安裝MHAmha4mysql-node,mha4mysql-manager 軟件包
(3)建立master,slave1,slave2之間主從復(fù)制
(4)管理機(jī)manager上配置MHA文件
(5)masterha_check_ssh工具驗(yàn)證ssh信任登錄是否成功
(6)masterha_check_repl工具驗(yàn)證mysql復(fù)制是否成功
(7)啟動(dòng)MHA manager,并監(jiān)控日志文件
(8)測(cè)試master(156)宕機(jī)后,是否會(huì)自動(dòng)切換
3.1 配置SSH登錄無需密碼
在MHA所有主機(jī)中生成rsa加密認(rèn)證,并配置為相互訪問無需密碼
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.11
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.12
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.13
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.14
3.2 安裝MySQL
在3個(gè)MySQL主從節(jié)點(diǎn)上安裝MySQL軟件。
3.2.1 卸載系統(tǒng)自帶的MySQL
rpm -qa mysql
rpm -e mysql-devel
rpm -e mysql
3.2.2 安裝cmake編譯包
cd /media/RHEL_6.4\ x86_64\ Disc\ 1/Packages/
rpm -ivh cmake-2.6.4-5.el6.x86_64.rpm
cd /root
3.2.3 解壓和編譯MySQL軟件
tar zxvf mysql-5.6.19.tar.gz
cd /root/mysql-5.6.19
mkdir -p /usr/local/mysql/data
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data
make && make install
3.2.4 創(chuàng)建mysql用戶和組
groupadd mysql
useradd -r -g mysql mysql
(5)初始化MySQL
cd /usr/local/mysql
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
./bin/mysqld_safe --user=mysql &
cp support-files/mysql.server /etc/init.d/mysql.server
3.2.5 設(shè)置環(huán)境變量
vi ~/.bash_profile
PATH加上:
:/usr/local/mysql/bin
source ~/.bash_profile
3.2.6 修改MySQL配置
cp /usr/local/mysql/my.cnf /etc/
vi /etc/my.cnf
log_bin # mha3不會(huì)是master,因此不用該參數(shù)
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 1 #主從同步需要
socket = /tmp/mysql.sock
3.2.7 修改MySQL登錄權(quán)限
重啟MySQL :service mysql.server restart
GRANT ALL ON *.* TO root@localhost IDENTIFIED BY 'revenco123' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'revenco123' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO root@mha1 IDENTIFIED BY 'revenco123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3.3 配置MySQL的主從關(guān)系
3.3.1 修改MySQL的配置文件
(1)修改MASTER上的/etc/my.cnf,加入:
server_id=1
log_bin
(2)修改SLAVE1(備用MASTER)上的/etc/my.cnf,加入:
server_id=2
log_bin
(3)修改SLAVE2上的/etc/my.cnf,加入:
server_id=3
3.3.2 授權(quán)復(fù)制權(quán)限
(1)在master上授權(quán)
mysql> grant replication slave on *.* to repl@'192.168.0.%' identified by 'repl';
(2)在備選master上授權(quán):
mysql> grant replication slave on *.* to repl@'192.168.0.%' identified by 'repl';
3.3.3 切換到主從復(fù)制模式
(1)在Master查看當(dāng)前使用的二進(jìn)制日志名稱和位置
mysql> show master status;
記錄下 “File”和“Position”即當(dāng)前主庫使用的二進(jìn)制日志名稱和位置。
(2)切換到從庫模式
在Slave1(備用Master)和Slave2 上切換到從庫模式
mysql> change master to master_host="mha1",master_user="repl",master_password="repl",master_log_file="mha1-bin.000005",master_log_pos=120;
master_log_file和 master_log_pos 是上面記下的東西。
(3)啟動(dòng)復(fù)制
在Slave1(備用Master)和slave2上啟用復(fù)制:
mysql>start slave;
(6)在slave2上設(shè)置為只讀
mysql>set global read_only=1
注意:read-only對(duì)super權(quán)限的用戶不起作用
3.3.4 檢查主從庫的復(fù)制狀態(tài)
(1)查看出庫的狀態(tài)
mysql>show master status\G;
(2)查看從庫的狀態(tài)
mysql>show slave status\G;
#如果 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 則說明主從配置成功。
#還可以到master上執(zhí)行 Mysql>show global status like “rpl%”;
如果Rpl_semi_sync_master_clients 是2說明半同步復(fù)制正常
3.3.5 日志同步格式
日志的同步格式有3種:
(1)基于SQL語句的復(fù)制(statement-based replication, SBR)
(2)基于行的復(fù)制(row-based replication, RBR)
(3)混合模式復(fù)制(mixed-based replication, MBR)
相應(yīng)地,binlog的格式也有三種:STATEMENT,ROW,MIXED。 MBR 模式中,SBR 模式是默認(rèn)的。為了數(shù)據(jù)的一致性,建議選擇ROW或MIXED模式。
比如,有函數(shù):
CREATE DEFINER = 'root'@'%' FUNCTION f_test2
(
pid int
)
RETURNS int(11)
BEGIN
insert into t1 values (pid,sysdate());
RETURN 1;
END
在主庫執(zhí)行 select f_test2(8)后,在主庫和各個(gè)從庫上,插入的sysdate()的值是不同的;
3.4 配置MySQL半同步復(fù)制
配置MySQL半同步復(fù)制的前提是已經(jīng)配置了MySQL的復(fù)制。半同步復(fù)制工作的機(jī)制處于同步和異步之間,Master的事務(wù)提交阻塞,只要一個(gè)Slave已收到該事務(wù)的事件且已記錄。它不會(huì)等待所有的Slave都告知已收到,且它只是接收,并不用等其完全執(zhí)行且提交。
在故障切換的時(shí)候,Master和Slave1(備用Master)都有可能成為Master或Slave,因此這兩個(gè)服務(wù)器上都要安裝'semisync_master.so'和'semisync_slave.so'。
3.4.1 配置Master和Slave1(備用Master)
(1)安裝半同步插件
(作為Master時(shí)需要安裝的插件)
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
(作為Slave時(shí)需要安裝的插件)
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
(2)設(shè)置參數(shù)
(作為Master時(shí)需要設(shè)置的參數(shù))
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=1000;
mysql> show global status like 'rpl%';
(作為Slave時(shí)需要設(shè)置的參數(shù))
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
(3)修改配置文件
為了讓mysql在重啟時(shí)自動(dòng)加載該功能,在/etc/my.cnf 加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
3.4.2 配置Slave2
(1)安裝半同步插件
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
(2)設(shè)置參數(shù)
mysql> set global rpl_semi_sync_slave_enabled=1;
(3)修改配置文件
在/etc/my.cnf中加入:
rpl_semi_sync_slave_enabled=1
3.4.3 檢查半同步復(fù)制狀態(tài)
可以到master上執(zhí)行 Mysql>show global status like 'rpl%';
如果Rpl_semi_sync_master_clients 是2.說明半同步復(fù)制正常
3.5 安裝MHA軟件
MHA有個(gè)不方便的地方是,無論宕機(jī)導(dǎo)致的master切換還是手動(dòng)切換master, 原來的master都不在MHA架構(gòu)內(nèi)了,重新啟動(dòng)也不會(huì)加入,必須手動(dòng)加入。手動(dòng)加入的步驟類似,先把當(dāng)前master數(shù)據(jù)復(fù)制到要加入的機(jī)器,然后change master,再start slave, 關(guān)鍵在做這一過程中,系統(tǒng)不能寫入,這點(diǎn)要人命。
一個(gè)MHA主機(jī)可以管理多個(gè)MySQL復(fù)制組,安裝MHA需要先安裝DBD-MySQL,為了安裝DBD-MySQL方便,先安裝yum工具。
3.5.1 配置yum工具
vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
#baseurl=ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/SRPMS/
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[rhel-source-beta]
name=Red Hat Enterprise Linux $releasever Beta - $basearch - Source
#baseurl=ftp://ftp.redhat.com/pub/redhat/linux/beta/$releasever/en/os/SRPMS/
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
3.5.2 安裝DBD-MySQL包
umount /dev/cdrom
mount /dev/cdrom /mnt
yum clean all
yum list
yum install perl-DBD-MySQL
3.5.3 在所有服務(wù)器上安裝MHA Node
cd /root
tar zxvf mha4mysql-node-0.54.tar.gz
cd mha4mysql-node-0.54
perl Makefile.PL
make
make install
3.5.4 在管理機(jī)安裝MHA Manager
(1)下載和安裝必要的包
下載地址:http://apt.sw.be/redhat/el6/en/i386/extras/RPMS/perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
(2)安裝必要的包
rpm -ivh perl-Params-Validate-0.92-3.el6.x86_64.rpm
rpm –ivh perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm
rpm –ivh perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
rpm –ivh perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
(3)安裝MHA manager軟件
cd /mnt/Packages
cd /root
tar zxvf mha4mysql-manager-0.55.tar.gz
cd mha4mysql-manager-0.55
perl Makefile.PL
make
make install
3.6 配置MHA
在MHA Manager上創(chuàng)建MHA配置
[root@mha4 ~]# more /etc/masterha/app1.cnf
[server default]
# mysql user and password
user=root
password=revenco123
ssh_user=root
repl_user=repl
repl_password=repl
ping_interval=1
shutdown_script=""
# working directory on the manager
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
# working directory on MySQL servers
remote_workdir=/var/log/masterha/app1
[server1]
hostname=mha1
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server2]
hostname=mha2
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server3]
hostname=mha3
master_binlog_dir=/usr/local/mysql/data
no_master=1
注釋:具體的參數(shù)請(qǐng)查看官方文檔
https://code.google.com/p/mysql-master-ha/wiki/Parameters
3.7 檢查MHA配置
在MHA Manager上執(zhí)行
masterha_check_ssh --conf=/etc/masterha/app1.cnf
masterha_check_repl --conf=/etc/masterha/app1.cnf
如果報(bào)錯(cuò),請(qǐng)檢查配置。
問題1 :
Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl/5.10.1/MHA/BinlogManager.pm line 99.
mysqlbinlog version not found!
解決辦法:
#vi ~/.bashrc或vi /etc/bashrc,然后在文件末尾添加
PATH="$PATH:/usr/local/mysql/bin"
export PATH
source /etc/bashrc
問題2:
Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'mha2' (using password: YES)
解決辦法: 查看用戶表。
RANT ALL PRIVILEGES ON *.* TO root@mha1 IDENTIFIED BY 'revenco123' WITH GRANT OPTION;
3.8 開啟MHA
啟動(dòng)管理節(jié)點(diǎn)進(jìn)程
masterha_manager --conf=/etc/masterha/app1.cnf &
注:停止和啟動(dòng)MHA服務(wù),不影響MySQL對(duì)外提供服務(wù)。
4 配置自動(dòng)故障切換
當(dāng)MHA群集內(nèi)的數(shù)據(jù)庫進(jìn)行故障轉(zhuǎn)移時(shí),對(duì)外提供服務(wù)的虛擬IP也進(jìn)行轉(zhuǎn)移;本實(shí)驗(yàn)案例通過使用Keepalived + LVS的方法,實(shí)現(xiàn)讀寫分離,IP故障透明轉(zhuǎn)移。
寫分離,Master和Slave1(備用Master)共用一個(gè)寫虛擬IP,任何時(shí)刻,只能有一臺(tái)機(jī)可寫,正常情況下,寫操作在Master執(zhí)行,當(dāng)Master down機(jī)后,MHA把Slave1(備用Master)提升為Master,此后,Slave1(備用Master)可寫,當(dāng)Master修復(fù)起來后,它成為Slave,仍然是Slave1(備用Master)可寫。除非人工干預(yù),將修復(fù)后的Master提升為Master。
讀分離,Slave1(備用Master)和Slave2 共用一個(gè)讀虛擬IP。采用LVS的輪詢算法,輪流訪問Slave1(備用Master)和Slave2,如果其中一臺(tái)不可訪問,則訪問另外一臺(tái)服務(wù)器。
注意:一旦主服務(wù)器宕機(jī),備份機(jī)即開始充當(dāng)master提供服務(wù),如果主服務(wù)器上線也不會(huì)再成為master了,因?yàn)槿绻@樣數(shù)據(jù)庫的一致性就被改變了。
4.1 安裝Keepalived
在Master和Slave1(備份Master)上安裝Keepalived
4.1.1 解壓和編譯keepalived
rpm -ivh openssl-devel-1.0.0-27.el6.x86_64
tar zxvf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure --prefix=/usr/local/keepalived
編譯后看到三個(gè)yes才算成功如果出現(xiàn)兩個(gè)yes或者一個(gè)應(yīng)該要檢查下內(nèi)核軟連接做對(duì)了沒有:
Use IPVS Framework : Yes #必須為YES
IPVS sync daemon support : Yes #必須為YES
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes #必須為YES
Use VRRP VMAC : Yes
4.1.2 安裝keepalived
make
make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir -pv /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
service keepalived restart
4.2 配置Keepalived
整個(gè)MHA使用keepalived 的"HA + LVS"模式,在mha1和mha2 上配置 Keepalived HA 模式,即下面代碼的“vrrp_instance VI_1”實(shí)例組;在mha2和mha3 上配置 Keepalived LVS 模式,即下面代碼的“vrrp_instance VI_2”實(shí)例組。兩個(gè)主機(jī)配置的都是“state BACKUP”,但優(yōu)先級(jí)priority 不同。配置如下:
4.2.1 配置Master主機(jī)上的keepalived
[root@mha1 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id mha1
}
vrrp_script check_mysql {
script "/usr/local/keepalived/bin/keepalived_check_mysql.sh"
interval 3
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_sync_group VG2 {
group {
VI_2
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass revenco123
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.0.20
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass revenco1234
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.0.21
}
}
virtual_server 192.168.0.21 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.0.12 80 {
weight 3
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.13 80 {
weight 3
TCP_CHECK {
connect_timeout 3
}
}
}
}
4.2.2 配置Slave1(備用Master)上的keepalived
[root@mha2 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id mha2
}
vrrp_script check_mysql {
script "/usr/local/keepalived/bin/keepalived_check_mysql.sh"
interval 3
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_sync_group VG2 {
group {
VI_2
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass revenco123
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.0.20
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 150
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass revenco1234
}
track_script {
check_mysql
}
virtual_ipaddress {
192.168.0.21
}
}
virtual_server 192.168.0.21 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.0.12 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.13 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
}
}
}
4.2.3 檢測(cè)mysql狀態(tài)腳本配置
在兩臺(tái)Keepalived主機(jī)上,配置檢測(cè)mysql狀態(tài)腳本(兩臺(tái)mysql一樣的配置),腳本文件要實(shí)現(xiàn)的功能大體為:只要檢測(cè)到mysql服務(wù)停止keepalived服務(wù)也停止 ,因?yàn)閗eepalived是通過組播方式告訴本網(wǎng)段自己還活著當(dāng)mysql服務(wù)停止后keepalived還依然運(yùn)行 這時(shí)就需要停止keepalived讓另一個(gè)主機(jī)獲得虛擬IP,可以在后臺(tái)運(yùn)行這個(gè)腳本 也可以在keepalived配置文件加入這個(gè)腳本,本實(shí)驗(yàn)把該腳本配置在keepalived配置文件中。
腳本文件名: /usr/local/keepalived/bin/keepalived_check_mysql.sh
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=revenco123
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
/etc/init.d/keepalived stop
exit 1
fi
sleep 1
done
4.3 安裝LVS
使用LVS技術(shù)要達(dá)到的目標(biāo)是:通過LVS提供的負(fù)載均衡技術(shù)和Linux操作系統(tǒng)實(shí)現(xiàn)一個(gè)高性能、高可用的服務(wù)器群集,它具有良好可靠性、可擴(kuò)展性和可操作性。從而以低廉的成本實(shí)現(xiàn)最優(yōu)的服務(wù)性能。本實(shí)驗(yàn)通過使用LVS軟件,在Slave1(備用Master)和Slave2上實(shí)現(xiàn)讀負(fù)載均衡。
4.3.1 LVS服務(wù)器端的安裝配置
Keepalived 附帶了LVS的功能,因此LVS服務(wù)器端的配置是直接在Keepalived的配置文件中配置的,Keepalived的配置文件的“virtual_server”部分的配置,便是LVS的配置。具體請(qǐng)查看Keepalived的配置文件的“virtual_server”部分。
4.3.2 LVS的真實(shí)機(jī)配置
在本實(shí)驗(yàn)案例中,LVS的真實(shí)機(jī)是Slave1(備用Master)和Slave2
在lvs的DR和TUn模式下,用戶的訪問請(qǐng)求到達(dá)真實(shí)服務(wù)器后,是直接返回給用戶的,而不再經(jīng)過前端的Director Server,因此,就需要在每個(gè)Real server節(jié)點(diǎn)上增加虛擬的VIP地址,這樣數(shù)據(jù)才能直接返回給用戶,增加VIP地址的操作可以通過創(chuàng)建腳本的方式來實(shí)現(xiàn),創(chuàng)建文件/etc/init.d/lvsrs,腳本內(nèi)容如下
[root@mha3 ~]# more /etc/init.d/lvsrs
#!/bin/bash
#description : Start Real Server
VIP=192.168.0.21
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo " Start LVS of Real Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Director server"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
4.4 防火墻配置
vim /etc/iptables
/etc/init.d/iptables restart
# 允許vrrp協(xié)議通過
5 測(cè)試HA和LVS
5.1 測(cè)試停止和啟動(dòng)keepalived服務(wù)對(duì)HA和LVS集群的的影響
(1). 啟動(dòng)mha1,mha2的keepalived,訪問兩個(gè)VIP所訪問的主機(jī)。
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha1;對(duì)于VIP2,輪流訪問mha2和mha3。
(2). 關(guān)閉mha1的keepalived
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha2;對(duì)于VIP2,輪流訪問mha2和mha3。
(3). 再啟動(dòng)mha1的keepalived
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha2;對(duì)于VIP2,輪流訪問mha2和mha3。
(4). 關(guān)閉mha2的keepalived
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha1;對(duì)于VIP2,輪流訪問mha2和mha3。
(5). 再啟動(dòng)mha2的keepalived
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha1;對(duì)于VIP2,輪流訪問mha2和mha3。
(6). 重復(fù)一次“1--5”步驟。
測(cè)試結(jié)果:測(cè)試結(jié)果相同。
(7). 同時(shí)關(guān)閉mha1,mha2的keepalived
測(cè)試結(jié)果:兩個(gè)VIP都不能訪問。
5.2 測(cè)試停止和啟動(dòng)集群對(duì)應(yīng)的服務(wù),對(duì)HA和LVS的影響
測(cè)試的服務(wù)為httpd:
(沒有加腳本,讓httpd服務(wù)器停止,keepalived服務(wù)也停止。如果是Mysql服務(wù)器是有相應(yīng)的腳本的)
(1). 啟動(dòng)mha1,mha2的keepalived 和httpd服務(wù),訪問兩個(gè)VIP所訪問的主機(jī)。
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha1;對(duì)于VIP2,輪流訪問mha2和mha3。
(2). 關(guān)閉mha1的httpd
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha2;對(duì)于VIP2,輪流訪問mha2和mha3。
(3). 再啟動(dòng)mha1的httpd
測(cè)試結(jié)果:對(duì)于VIP1,訪問mha2;對(duì)于VIP2,輪流訪問mha2和mha3。
(4). 關(guān)閉mha2的httpd
測(cè)試結(jié)果:對(duì)于VIP1,無法訪問;對(duì)于VIP2,訪問mha3。
(應(yīng)該在keepalive中定期檢測(cè)httpd服務(wù),httpd服務(wù)停止,那么keepalived服務(wù)也停止,讓mha1作為Master,那樣VIP1就可以訪問mha1,而不是現(xiàn)在的“無法訪問”)
(5). 再啟動(dòng)mha2的httpd
測(cè)試結(jié)果:對(duì)于VIP1,恢復(fù)訪問mha2;對(duì)于VIP2,輪流訪問mha2和mha3。
(6). 關(guān)閉mha3的httpd
測(cè)試結(jié)果:對(duì)于VIP1 無任何影響;對(duì)于VIP2,訪問mha2。
(7). 再啟動(dòng)mha3的httpd
測(cè)試結(jié)果:對(duì)于VIP1 無任何影響;對(duì)于VIP2,輪流訪問mha2和mha3。
(8). 同時(shí)關(guān)閉mha1,mha2的httpd
測(cè)試結(jié)果:兩個(gè)VIP都不能訪問。
5.3 測(cè)試寫VIP的高可用性
(1)先使用mha-w-vip 連接到mha集群,查看所連接的數(shù)據(jù)庫主機(jī)信息。
mysql -uroot -ptest123 -h 172.20.52.252
use mysql
select host,user,password from user;
(2)關(guān)閉當(dāng)前的master 的mysql服務(wù)。
(3)查看mha-w-vip(寫VIP) 連接是否可連接到mha集群,當(dāng)前連接是否斷掉。
(4)測(cè)試結(jié)果:停止master上的mysql服務(wù)后,3秒內(nèi)進(jìn)行切換 "寫VIP"。當(dāng)master上的mysql服務(wù)down后,備用master成為master,集群可用。當(dāng)原master恢復(fù)后,需要手工把它切換到復(fù)制狀態(tài)。
只能做到連接的高可用性,做不到會(huì)話級(jí)別的高可用性。即,down后,原有的會(huì)話將斷開,然后馬上重新連接。
5.4 測(cè)試讀VIP的均衡負(fù)載
輪流停止備用master和、slave,然后使用讀vip連接后,查看當(dāng)前所連接的庫的主機(jī)信息。
(1)先使用mha-r-vip (讀VIP)連接到mha集群,查看所連接的數(shù)據(jù)庫主機(jī)信息。
mysql -uroot -ptest -h 172.20.52.253
use mysql
select host,user,password from user;
(2)打開多個(gè)會(huì)話,重復(fù)上一步。
(3)查看各個(gè)會(huì)話是連接到哪個(gè)主機(jī)上。
(4)測(cè)試結(jié)果:備用master、slave都在線時(shí),輪流訪問。
5.5 測(cè)試讀VIP的高可用性
(1)先使用mha-r-vip (讀VIP)連接到mha集群,查看所連接的數(shù)據(jù)庫主機(jī)信息。
mysql -uroot -ptest123 -h mha1-r-vip
use mysql
select host,user,password from user;
(2)輪流停止備用master和slave,然后使用讀vip連接后,查看當(dāng)前所連接的庫的主機(jī)信息。
(3)測(cè)試結(jié)果:備用master、slave任何一臺(tái)的mysql服務(wù)down掉,集群都可讀。
5.6 測(cè)試數(shù)據(jù)同步
在主庫上執(zhí)行創(chuàng)建庫、表、并插入數(shù)據(jù),查看備用master和slave的數(shù)據(jù)同步情況。
(1)在主庫上執(zhí)行創(chuàng)建庫、表、并插入數(shù)據(jù)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> create table t1 (id int ,name varchar(20));
ERROR 1046 (3D000): No database selected
mysql> use test;
Database changed
mysql> create table t1 (id int ,name varchar(20));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t1 values (1,'a');
Query OK, 1 row affected (0.02 sec)
mysql> insert into t1 values (2,'b');
(2)登錄備庫,查看數(shù)據(jù)
Use test
Select * from t1;
(3)測(cè)試結(jié)果:
備用master slave都能馬上自動(dòng)同步數(shù)據(jù)。(后臺(tái)在毫秒級(jí)別上完成同步)
5.7 測(cè)試備用master、slave的只讀
測(cè)試把備用master和slave設(shè)置為read_only后,效果如何
(1)設(shè)置為只讀
set global read_only=1;
(2)登錄并插入數(shù)據(jù)
Mysql –uroot –prtest123 –D test
Insert into t1 values(1,’a’);
插入成功
(3)創(chuàng)建普通用戶
GRANT ALL ON test.* TO test@'%' IDENTIFIED BY 'test' WITH GRANT OPTION;
GRANT ALL ON test* TO test@localhost IDENTIFIED BY 'test' WITH GRANT OPTION;
(3)登錄并插入數(shù)據(jù)
Mysql –utest–ptest–D test
Insert into t1 values(1,’a’);
插入失敗
(4)測(cè)試結(jié)果:read_only對(duì)super用戶無影響,對(duì)普通用戶能起到限制作用。
5.8 測(cè)試只讀(read_only)是否會(huì)影響復(fù)制功能
主庫
mysql -utest-ptest-D test
insert into t1 values(3,'c');
備用master、slave查詢:
select * from t1;
測(cè)試
備用master、slave插入:
mysql -utest -ptest -D test
insert into t1 values(4,'d');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
結(jié)論:在備用master、slave設(shè)置只讀,可限制備用master、slave的寫功能,并且不影響主從復(fù)制功能。
5.9 測(cè)試原master恢復(fù)后,讓原master(mha1)一直為slave
原master恢復(fù)后,如果想讓原master(mha1)一直為slave,需要做以下:
1). 需要更改mha manager文件中mha1的順序。
2). 刪除 rm /var/log/masterha/app1/app1.failover.complete
3). 再次啟動(dòng)mha manager進(jìn)程
4). 讓mha2的keepalived為HA 的Master,mha1為"BACKUP"狀態(tài),保證“寫vip”是關(guān)聯(lián)到Master上的。
5). 修改讀VIP。讀VIP為mha1、mha3(原mha2、mha3)
6). 設(shè)置原master(mha1)為read_only
7). 檢查 show slave status \G; show master status;
5.10 測(cè)試原master恢復(fù)后,讓原master(mha1)重新成為Master
原master恢復(fù)后,如果想讓原master(mha1)重新成為Master,需要做以下:
1). 在mha manager上,手工把mha1切換為Master。
2). 設(shè)置備用master(mha2)為read_only.
3). 刪除 rm /var/log/masterha/app1/app1.failover.complete
4). 重新啟動(dòng)mha manager進(jìn)程。
5). 讓mha1的keepalived為HA 的Master,mha2為"BACKUP"狀態(tài),保證“寫vip”是關(guān)聯(lián)到Master上的。
6). 檢查 show slave status \G; show master status;
5.11 測(cè)試手工切換master到備用master
(1).停止master_manager進(jìn)程:masterha_stop --conf=/etc/app1.cnf
(2).執(zhí)行切換命令,可根據(jù)需要執(zhí)行使用不同的參數(shù)。
主庫down的情況
masterha_master_switch --master_state=dead --conf=/etc/conf/masterha/app1.cnf --dead_master_host=mha2
非交互式故障轉(zhuǎn)移
masterha_master_switch --master_state=dead --conf=/etc/conf/masterha/app1.cnf --dead_master_host=mha2 --new_master_host=mha1 --interactive=0
在線切換,切換后原來的主庫不要
masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf --new_master_host=mha1
在線切換,切換后原來的主庫變成從庫
masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.cnf --new_master_host=mha1 --orig_master_is_new_slave
5.12 測(cè)試數(shù)據(jù)庫的備份與還原
導(dǎo)出:
mysqldump -uroot -p123456 test > test_20140704.sql
導(dǎo)入:
mysql -uroot -ptest123 test< test_20140704.sql
測(cè)試結(jié)果:在主庫執(zhí)行導(dǎo)入,從庫自動(dòng)同步數(shù)據(jù)。
5.13 測(cè)試創(chuàng)建存儲(chǔ)過程是否會(huì)同步到備用master和slave
在Master上創(chuàng)建存儲(chǔ)過程`f_test`,然后在備用master和slave上創(chuàng)建,如果提示存儲(chǔ)過程已存在,則說明創(chuàng)建存儲(chǔ)過程也會(huì)同步到備用master和slave。
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `f_test`(
IN p_id int,
IN p_name varchar(20)
)
begin
insert into t1 values(p_id,p_name);
END;
$$
DELIMITER ;
測(cè)試結(jié)果:創(chuàng)建存儲(chǔ)過程也會(huì)同步到備用master和slave。
5.14 測(cè)試存儲(chǔ)過程內(nèi)修改數(shù)據(jù)是否會(huì)同步
在master上執(zhí)行
call f_test(4,'d');(f_test的功能是插入一條記錄到t1)
查詢select * from t1;
在備用master和slave查詢select * from t1;
數(shù)據(jù)與Master上一致,存儲(chǔ)過程內(nèi)修改數(shù)據(jù)會(huì)同步。
測(cè)試結(jié)果:存儲(chǔ)過程內(nèi)修改數(shù)據(jù)會(huì)同步。
6 異常處理
6.1 主從復(fù)制錯(cuò)誤處理
mysql主從復(fù)制,經(jīng)常會(huì)遇到錯(cuò)誤而導(dǎo)致slave端復(fù)制中斷,這個(gè)時(shí)候一般就需要人工干預(yù),跳過錯(cuò)誤才能繼續(xù)。跳過錯(cuò)誤有兩種方式:
6.1.1 跳過指定數(shù)量的事務(wù)
mysql> stop slave;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳過一個(gè)事務(wù)
mysql>slave start
6.1.2 修改mysql的配置文件
通過slave_skip_errors參數(shù)來跳所有錯(cuò)誤或指定類型的錯(cuò)誤
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯(cuò)誤
#slave-skip-errors=all #跳過所有錯(cuò)誤
6.1.3 MHA函數(shù)同步
Mysql 對(duì)函數(shù)的同步有限制。只有被明確聲明為DETERMINISTIC或NO SQL 或READS SQL DATA的函數(shù),才可以創(chuàng)建,并可自動(dòng)同步到從庫,否則創(chuàng)建函數(shù)會(huì)失敗??梢酝ㄟ^設(shè)置參數(shù)“set global log_bin_trust_function_creators = 1”,使得函數(shù)能創(chuàng)建成功,并同步到從庫。此參數(shù)只有在開啟log-bin的情況下才有用。log_bin_trust_function_creators=0的情況下,需要有SUPER權(quán)限,并且不包含修改數(shù)據(jù)的SQL,才能創(chuàng)建函數(shù)。
(1)測(cè)試正常主從復(fù)制情況下,函數(shù)的創(chuàng)建
mysql> set global log_bin_trust_function_creators = 1;
CREATE DEFINER = 'root'@'%' FUNCTION f_test2
(
pid int
)
RETURNS int(11)
BEGIN
insert into t1 values (pid,sysdate());
RETURN 1;
END
測(cè)試結(jié)果:在主從環(huán)境下,如果函數(shù)沒有聲明DETERMINISTIC或NO SQL 或READS SQL DATA,創(chuàng)建函數(shù)失敗。
(2)強(qiáng)行聲明為DETERMINISTIC或NO SQL 或READS SQL DATA的函數(shù)測(cè)試
CREATE DEFINER = 'root'@'%' FUNCTION f_test2
(
pid int
)
RETURNS int(11)
DETERMINISTIC
BEGIN
insert into t1 values (pid,sysdate());
RETURN 1;
END
測(cè)試結(jié)果:可以創(chuàng)建成功,并且可同步到從庫。但無法執(zhí)行該函數(shù),執(zhí)行時(shí)報(bào)錯(cuò)。
(3)把global log_bin_trust_function_creators = 1后,不聲明函數(shù)的為DETERMINISTIC或NO SQL 或READS SQL DATA屬性。
mysql> set global log_bin_trust_function_creators = 0;
創(chuàng)建函數(shù)成功,也可以同步到從庫(開啟bin-log的從庫必須做同樣的參數(shù)配置)。
在主庫執(zhí)行函數(shù)
mysql> select f_test2(7);
mysql> select * from t1;
在主庫的t1表有插入記錄,并且有同步到從庫。
6.1.4 存儲(chǔ)過程同步
binlog_format = STATEMEN 的情況下:
創(chuàng)建存儲(chǔ)過程p_test1,自動(dòng)同步到從庫,并不需要“set global log_bin_trust_function_creators = 1;”,由此看出,存儲(chǔ)過程的復(fù)制時(shí)安全的;執(zhí)行call p_test1(14);數(shù)據(jù)完全同步到從庫。如果是函數(shù),并不完全同步,sysdate()獲取的值不同。
p_test1代碼:
DELIMITER |
CREATE DEFINER = 'root'@'%' PROCEDURE p_test1
(
pid int
)
BEGIN
declare v_time datetime;
set v_time = sysdate();
insert into t1 values (pid,v_time);
END|
DELIMITER ;
測(cè)試結(jié)果:結(jié)合函數(shù)同步的測(cè)試情況,可得出:
在binlog_format = STATEMEN的情況下,執(zhí)行存儲(chǔ)過程時(shí),后臺(tái)采用binlog_format =ROW的方式同步日志;而執(zhí)行函數(shù)時(shí),后臺(tái)采用binlog_format =STATEMEN的方式同步日志。
7 MHA日常維護(hù)
(1)查看ssh登陸是否成功
masterha_check_ssh --conf=/etc/masterha/app1.cnf
(2)查看復(fù)制是否建立好
masterha_check_repl --conf=/etc/masterha/app1.cnf
(3)啟動(dòng)mha
nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log < /dev/null 2>&1 &
當(dāng)有slave節(jié)點(diǎn)宕掉的情況是啟動(dòng)不了的,加上--ignore_fail_on_start即使有節(jié)點(diǎn)宕掉也能啟動(dòng)mha
nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start > /tmp/mha_manager.log < /dev/null 2>&1 &
(4)檢查啟動(dòng)的狀態(tài)
masterha_check_status --conf=/etc/masterha/app1.cnf
(5)停止mha
masterha_stop --conf=/etc/masterha/app1.cnf
(6)failover后下次重啟
每次failover切換后會(huì)在管理目錄生成文件app1.failover.complete ,下次在切換的時(shí)候會(huì)發(fā)現(xiàn)有這個(gè)文件導(dǎo)致切換不成功,需要手動(dòng)清理掉。
rm -rf /masterha/app1/app1.failover.complete
也可以加上參數(shù)--ignore_last_failover
(7)手動(dòng)在線切換
1).手動(dòng)切換時(shí)需要將在運(yùn)行的mha停掉后才能切換??梢酝ㄟ^如下命令停止mha
masterha_stop --conf=/etc/app1.cnf
2).執(zhí)行切換命令
手工failover場(chǎng)景,master死掉,但是masterha_manager沒有開啟,可以通過手工failover:
masterha_master_switch --master_state=dead --conf=/etc/app1.cnf --dead_master_host=host1 --new_master_host=host5
或者
masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=host1 --orig_master_is_new_slave
或者
masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=host1 --orig_master_is_new_slave --running_updates_limit=10000 --interactive=0
參數(shù)解釋
--orig_master_is_new_slave切換時(shí)加上此參數(shù)是將原master變?yōu)閟lave節(jié)點(diǎn),如果不加此參數(shù),原來的master將不啟動(dòng),需要設(shè)置在配置文件中配置repl_user 、repl_password參數(shù) 。
--running_updates_limit=10000 切換時(shí)候選master如果有延遲的話,mha切換不能成功,加上此參數(shù)表示延遲在此時(shí)間范圍內(nèi)都可切換(單位為s),但是切換的時(shí)間長短是由recover時(shí)relay日志的大小決定。
--interactive=0,切換時(shí)是否互交,默認(rèn)是互交的?;ソ坏囊馑季褪且氵x擇一些選項(xiàng),如根據(jù)提示輸入“yes or no”。
--master_state=alive master在線切換,需要如下條件,第一,在所有slave上IO線程運(yùn)行;第二,SQL線程在所有的slave上正常運(yùn)行;第三,在所有的slaves上 Seconds_Behind_Master 要小于等于 running_updates_limit seconds;第四,在master上,在show processlist輸出結(jié)果上,沒有更新查詢操作多于running_updates_limit seconds。
在備庫先執(zhí)行DDL,一般先stop slave,一般不記錄mysql日志,可以通過set SQL_LOG_BIN = 0實(shí)現(xiàn)。然后進(jìn)行一次主備切換操作,再在原來的主庫上執(zhí)行DDL。這種方法適用于增減索引,如果是增加字段就需要額外注意。
上述內(nèi)容就是MySQL MHA集群方案是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:MySQLMHA集群方案是怎樣的
分享網(wǎng)址:http://www.dlmjj.cn/article/piheps.html