日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MySQLMHA集群方案是怎樣的

本篇文章為大家展示了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)圖

MySQL MHA集群方案是怎樣的

1.3.2   MHA組內(nèi)架構(gòu)圖

復(fù)制組內(nèi)使用Keepalived + LVS :
MySQL MHA集群方案是怎樣的

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)圖

MySQL MHA集群方案是怎樣的 

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ù)庫的一致性就被改變了。

MySQL MHA集群方案是怎樣的

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