一、MHA介紹
????? MHA(Master HA)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復制架構提供了 automating master failover 功能。MHA 在監(jiān)控到 master 節(jié)點故障時,會提升其中擁有最新數(shù)據(jù)的 slave 節(jié)點成為新的master 節(jié)點,在此期間,MHA 會通過于其它從節(jié)點獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節(jié)點的在線切換功能,即按需切換 master/slave 節(jié)點。MHA 能夠在30秒內(nèi)實現(xiàn)故障切換,并能在故障切換中,最大可能的保證數(shù)據(jù)一致性。
????? MHA由兩部分組成:MHA Manager(管理節(jié)點)和MHA Node(數(shù)據(jù)節(jié)點)。管理節(jié)點可以單獨部署在一臺獨立的機器上來管理多個master-slave集群,也可以部署在一臺slave節(jié)點上。數(shù)據(jù)節(jié)點運行在每臺mysql服務器上。Manager會定期檢查master,若出現(xiàn)故障時,會自動將最新數(shù)據(jù)的slave提升為新的master,然后將其他的slave指向新的master。整個故障轉移程序完全透明。
????? 目前MHA主要支持一主多從的架構。要搭建MHA,要求一個復制集群中必須最少有三臺數(shù)據(jù)庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫。
二、MHA工作架構說明
展示了如何通過MHA Manager管理多組主從復制。可以將MHA工作原理總結為如下:

相較于其它HA軟件,MHA的目的在于維持MySQL Replication中Master庫的高可用性,其最大特點是可以修復多個Slave之間的差異日志,最終使所有Slave保持數(shù)據(jù)一致,然后從中選擇一個充當新的Master,并將其它Slave指向它。工作流程主要如下:
1)從宕機崩潰的master保存二進制日志事件(binlog events);
2)識別含有最新更新的slave;
3)應用差異的中繼日志(relay log)到其他的slave;
4)應用從master保存的二進制日志事件(binlog events);
5)提升一個slave為新的master;
6)使其他的slave連接新的master進行復制;
2.1 ???? MHA工作原理
1 從宕機崩潰的master保存二進制日志事件(binlog events)
?2識別含有最新更新的slave
?3應用差異的中繼日志(relay log)到其他的slave
?4應用從master保存的二進制日志事件(binlog events)
?5提升一個slave為新的master
?6使其他的slave連接新的master進行復制
2.2???? MHAManager工具包
? 1. masterha_check_ssh:檢查MHA的SSH配置狀況
??2. masterha_check_repl:檢查MySQL的復制狀況
??3. masterha_manager:啟動MHA
??4. masterha_check_status:檢測當前MHA運行狀態(tài)
??5. masterha_master_monitor:檢測master是否宕機
??6. masterha_master_switch:控制故障轉移(自動或手動)
? 7. masterha_conf_host:添加或刪除配置的server信息
??8. masterha_stop:關閉MHA
Node工具包(這些工具通常由MHAManager的腳本觸發(fā),無需人為操作)主要包括以下幾個工具:
save_binary_logs(保存二進制日志)???????????? 保存和復制master的二進制日志
apply_diff_relay_logs(應用差異中繼日志)?????識別差異的中繼日志事件并將其差異的事件應用于其他的slave
filter_mysqlbinlog????????????????????????? 去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs(清理中繼日志)?????????????? 清除中繼日志(不會阻塞SQL線程)
MHA如何保持數(shù)據(jù)的一致性呢?主要通過MHA node的以下幾個工具實現(xiàn),但是這些工具由mha manager觸發(fā):
save_binary_logs???????? 如果master的二進制日志可以存取的話,保存復制master的二進制日志,最大程度保證數(shù)據(jù)不丟失
apply_diff_relay_logs??? 相對于最新的slave,生成差異的中繼日志并將所有差異事件應用到其他所有的slave
注意:
對比的是relay log,relay log越新就越接近于master,才能保證數(shù)據(jù)是最新的。
purge_relay_logs刪除中繼日志而不阻塞sql線程
2.3?MHA處理過程
====== monitor node 監(jiān)控節(jié)點======
(1) 監(jiān)控所有節(jié)點,重點是master
(2) 監(jiān)控到master宕機(實例(ssh能),主機(ssh不能連))
(3) 監(jiān)控主從狀態(tài)
====== failover 故障轉移======
(3) 對比各節(jié)點的GTID號碼。
(3) 數(shù)據(jù)補償1:如果ssh能連,從節(jié)點立即保存自己缺失部分的二進制日志
(4) 選主:對比各節(jié)點的GTID號碼即可,選一個最接近于主庫數(shù)據(jù)的從節(jié)點,恢復缺失的日志,并將從庫切換為主庫stop slave? reset slave all
(5) 數(shù)據(jù)補償2:如果ssh不能連,計算兩個從庫的relaylog的差異,恢復到數(shù)據(jù)少的從庫中.
(6) 2號從庫change master to 到新主,開啟新的主從關系
====== 應用透明=====
(7) 使用vip機制實現(xiàn)應用透明
====== 補充功能======
(8) 自動修復主庫(加入集群)待開發(fā)...
(9) 二次數(shù)據(jù)補償?shù)膯栴}(binlog server)
(10) 提醒功能(send_report)
(11) 權重的問題
2.4????? MHA的優(yōu)勢
1)故障切換快
在主從復制集群中,只要從庫在復制上沒有延遲,MHA通??梢栽跀?shù)秒內(nèi)實現(xiàn)故障切換。9-10秒內(nèi)檢查到master故障,可以選擇在7-10秒關閉master以避免出現(xiàn)裂腦,幾秒鐘內(nèi),將差異中繼日志(relay log)應用到新的master上,因此總的宕機時間通常為10-30秒?;謴托碌膍aster后,MHA并行的恢復其余的slave。即使在有數(shù)萬臺slave,也不會影響master的恢復時間。DeNA在超過150個MySQL(主要5.0/5.1版本)主從環(huán)境下使用了MHA。當mater故障后,MHA在4秒內(nèi)就完成了故障切換。在傳統(tǒng)的主動/被動集群解決方案中,4秒內(nèi)完成故障切換是不可能的。
2)master故障不會導致數(shù)據(jù)不一致
當目前的master出現(xiàn)故障時,MHA自動識別slave之間中繼日志(relay log)的不同,并應用到所有的slave中。這樣所有的salve能夠保持同步,只要所有的slave處于存活狀態(tài)。和Semi-Synchronous Replication一起使用,(幾乎)可以保證沒有數(shù)據(jù)丟失。
3)無需修改當前的MySQL設置
MHA的設計的重要原則之一就是盡可能地簡單易用。MHA工作在傳統(tǒng)的MySQL版本5.0和之后版本的主從復制環(huán)境中。和其它高可用解決方法比,MHA并不需要改變MySQL的部署環(huán)境。MHA適用于異步和半同步的主從復制。啟動/停止/升級/降級/安裝/卸載MHA不需要改變(包擴啟動/停止)MySQL復制。當需要升級MHA到新的版本,不需要停止MySQL,僅僅替換到新版本的MHA,然后重啟MHA Manager就好了。
MHA運行在MySQL 5.0開始的原生版本上。一些其它的MySQL高可用解決方案需要特定的版本(比如MySQL集群、帶全局事務ID的MySQL等等),但并不僅僅為了master的高可用才遷移應用的。在大多數(shù)情況下,已經(jīng)部署了比較舊MySQL應用,并且不想僅僅為了實現(xiàn)Master的高可用,花太多的時間遷移到不同的存儲引擎或更新的前沿發(fā)行版。MHA工作的包括5.0/5.1/5.5的原生版本的MySQL上,所以并不需要遷移。
4)無需增加大量的服務器
MHA由MHA Manager和MHA Node組成。MHA Node運行在需要故障切換/恢復的MySQL服務器上,因此并不需要額外增加服務器。MHA Manager運行在特定的服務器上,因此需要增加一臺(實現(xiàn)高可用需要2臺),但是MHA Manager可以監(jiān)控大量(甚至上百臺)單獨的master,因此,并不需要增加大量的服務器。即使在一臺slave上運行MHA Manager也是可以的。綜上,實現(xiàn)MHA并沒用額外增加大量的服務。
5)無性能下降
MHA適用與異步或半同步的MySQL復制。監(jiān)控master時,MHA僅僅是每隔幾秒(默認是3秒)發(fā)送一個ping包,并不發(fā)送重查詢??梢缘玫较裨鶰ySQL復制一樣快的性能。
6)適用于任何存儲引擎
MHA可以運行在只要MySQL復制運行的存儲引擎上,并不僅限制于InnoDB,即使在不易遷移的傳統(tǒng)的MyISAM引擎環(huán)境,一樣可以使用MHA。
三、安裝Mysql
使用root創(chuàng)建用戶
useradd -m mysql
修改密碼
passwd mysql
下載https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.13-1.sles12.x86_64.rpm-bundle.tar
解壓
tar xvf mysql-8.0.13-1.sles12.x86_64.rpm-bundle.tar
mysql-community-server-8.0.13-1.sles12.x86_64.rpm
mysql-community-devel-8.0.13-1.sles12.x86_64.rpm
mysql-community-libs-8.0.13-1.sles12.x86_64.rpm
mysql-community-client-8.0.13-1.sles12.x86_64.rpm
mysql-community-common-8.0.13-1.sles12.x86_64.rpm
mysql-community-test-8.0.13-1.sles12.x86_64.rpm
3.1 ???? 安裝
先查詢是否安裝mysql
rpm -qa | grep -i mysql

如未安裝則跳過執(zhí)行安裝命令。
利用rpm卸載mysql
rpm -e --nodepsmysql-community-client-5.7.28-1.el7.x86_64
rpm -e --nodepsmysql-community-devel-5.7.28-1.el7.x86_64
rpm -e --nodeps mysql-community-libs-5.7.28-1.el7.x86_64
rpm -e --nodepsmysql-community-common-5.7.28-1.el7.x86_64
rpm -e --nodepsmysql-community-server-5.7.28-1.el7.x86_64
下面就利用安裝命令來安裝MySQL8.0x:
rpm -ivh mysql-community-common-8.0.13-1.sles12.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.13-1.sles12.x86_64.rpm
rpm -ivh mysql-community-client-8.0.13-1.sles12.x86_64.rpm
rpm -ivh mysql-community-server-8.0.13-1.sles12.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.13-1.sles12.x86_64.rpm
下面就利用安裝命令來安裝MySQL5.7x:
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm
3.2 ???? 創(chuàng)建用戶組和用戶
創(chuàng)建用戶組:groupadd mysql
創(chuàng)建用戶:useradd -r -g mysql mysql
注:由于SUSE采用的是rpm安裝,所以此系統(tǒng)已經(jīng)創(chuàng)建好了,可以跳過次步驟。如果無則使用上訴命令進行創(chuàng)建
給mysql用戶指定專用用戶組和用戶
首先創(chuàng)建data文件夾。(注:mysql的表文件都在這個目錄下)
這個data文件夾得根據(jù)硬盤的位置來
df -h

由于是本地虛擬機環(huán)境,生產(chǎn)環(huán)境可安裝實際硬盤目錄來創(chuàng)建data目錄。
mkdir -p /home/mysql/data
指定用戶和用戶組
cd /usr/local/
mkdir -p mysql
chown -R mysql mysql/
chgrp -R mysql mysql/
隨便也設置一下data的,注mysql目錄根據(jù)自己實際硬盤的要求更改目錄
cd /home/mysql
chgrp -R mysql tmp/
chown -R mysql tmp/
chown -R mysqlmysql/
chgrp-R mysql mysql/
3.3 ???? 初始化用戶
vim /etc/my.cnf 內(nèi)容如下
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
#設置數(shù)據(jù)存放位置
#basedir=/var/lib/mysql
datadir=/home/mysql/data
tmpdir=/home/mysql/tmp
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysql/mysqld.pid
port=3306
default_storage_engine=InnoDB
lower_case_table_names=1
innodb_buffer_pool_size = 1G
#事務日志文件大小,循環(huán)寫的方式,把數(shù)據(jù)文件的隨機IO轉為幾乎順序的IO,默認是兩個5M的文件,
#對于生產(chǎn)環(huán)境來說至少要幾百甚至上G的大小(需要重啟)
innodb_log_file_size = 512M
#內(nèi)存日志緩沖區(qū),在緩沖滿/事務提交/1秒鐘Innodb會刷寫緩沖區(qū)內(nèi)容到日志文件
innodb_log_buffer_size=16M
character-set-server = utf8mb4
collation-server = utf8mb4_bin
############## binlog ################
server-id = 130
log_bin = mysql-bin
binlog_format = row
sync_binlog = 1
expire_logs_days =7
#最大連接數(shù),默認是100,生產(chǎn)可設置500~5000,取決于服務器的負載能力,一般來說1000足夠
max_connections=1000
#mysql在服務端的線程緩存池存放的最大線程數(shù),并不是越大越好,通常并發(fā)在100-120可設置為20,
#并發(fā)在500-700,可設置200,256的上限值是個不錯的估值
thread_cache_size=256
#socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
#pid-file=/var/run/mysql/mysqld.pid
[client]
socket=/var/lib/mysql/mysql.sock
port=3306
執(zhí)行初始化命令:
sudo mysqld --initialize --user=mysql --datadir=/home/mysql/data/ --lc_messages=en_US

初始化成功,查看初始密碼
cat /var/log/mysql/mysqld.log | grep password

這個是密碼root@localhost: 9.sF=eBDO,k*
依次查看
啟動MySQL服務
systemctl start mysql
停止MySQL服務
systemctl stop mysql
配置為開機啟動
systemctl enable mysql
使用初始密碼登錄MySQL
mysql -u root -p

驗證登錄成功了,接下來修改root密碼
Mysql5.7x版本執(zhí)行以上命令:
修改密碼:set password=password("root");
登錄授權:grant all privileges on *.* to 'root'@'%' identified by 'root';
授權生效:flush privileges;
Mysql8.0x版本執(zhí)行以上命令:
第一次需要修改密碼
ALTER USER 'root'@'localhost' IDENTIFIEDWITH mysql_native_password BY 'root';
修改密碼:create user 'root'@'%' identified with mysql_native_password by'root';
登錄授權:grant all privileges on *.* to 'root'@'%' with grant option;
授權生效:flush privileges;
關閉防火墻
不同的MySQL直接要互相訪問,需要關閉Linux的防火墻
suse12下操作為:
關閉防火墻
systemctl stopSuSEfirewall2.service
取消開機啟動防火墻
systemctl disableSuSEfirewall2.service
開啟防火墻
systemctl enableSuSEfirewall2.service
開機啟動防火墻
systemctl startSuSEfirewall2.service
四、主從配置
4.1 ???? Master節(jié)點
查看server_id
show variables like 'server_id';
修改Master配置文件
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
server-id=130
sync-binlog=1 # 每次寫入都同步到binlog
binlog-ignore-db=performance_schema # 忽略不同步
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=sys
# binlog-do-db=test? #需要主從復制的數(shù)據(jù)庫
# 為每個session分配的內(nèi)存,在事務過程中用來存儲二進制日志的緩存
binlog_cache_size=1M
# 主從復制的格式(mixed,statement,row,默認格式是statement。建議是設置為row,主從復制時數(shù)據(jù)更加能夠統(tǒng)一)
binlog_format=row
# 設置二進制日志自動刪除/過期的天數(shù),避免占用磁盤空間。默認值為0,表示不自動刪除。
expire_logs_days=7
重啟服務
systemctl restart mysql
主庫給從庫授權
Mysql8.0x執(zhí)行以下命令
create user 'canal_repl_user'@'%' identified with mysql_native_password by '123456';
GRANT REPLICATION SLAVE ON *.* TO 'canal_repl_user'@'%';
flush privileges;

Mysql5.7x執(zhí)行以下命令
create user canal_repl_user;
grant replication slave on *.*? to canal_repl_user identified by '111111';
flush privileges;
show master status;

4.2 ???? Slave節(jié)點
修改Slave配置文件,設置為134
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
server-id=134
sync-binlog=1 # 每次寫入都同步到binlog
binlog-ignore-db=performance_schema # 忽略不同步
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=row
expire_logs_days=7
relay_log=mysql-relay-bin? #中繼日志名字
relay_log_purge=0
read_only=2
manager-slave節(jié)點
修改manager-slave配置文件, server-id設置為160
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
server-id=160
sync-binlog=1 # 每次寫入都同步到binlog
binlog-ignore-db=performance_schema # 忽略不同步
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=row
expire_logs_days=7
relay_log=mysql-relay-bin? #中繼日志名字
relay_log_purge=0
read_only=2
分別重啟節(jié)點Slave和節(jié)點manager-slave
systemctl restart mysql
注:三臺機器的配置可根據(jù)實際要求進行修改,網(wǎng)上一搜一大堆,這里不做過多的解釋,如有疑問請留言。
4.3 ???? 開啟同步
在Slave節(jié)點的MySQL命令行執(zhí)行如下命令:
change master to master_host='192.168.142.133',master_port=3306,master_user='canal_repl_user',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1072;
start slave;? // 開啟同步

查看主從復制信息
SHOW SLAVE STATUS\G;

create database syj_test defaultcharacter set utf8mb4 collate utf8mb4_bin;
create user 'syj_test'@'%' identified withmysql_native_password by 'syj_test';
grant all privileges on syj_test.* to'syj_test'@'%' with grant option;
flush privileges;
4.4 半同步復制
1)半同步復制配置參數(shù)說明
主庫半同步復制可配置的參數(shù)較少,可通過“show global variables like '%semi%';”查看


注意MySQL5.7的增強半同步較MySQL5.6多了如下兩參數(shù):
rpl_semi_sync_master_wait_for_slave_count: 至少有N個slave接收到日志,Default 1.
rpl_semi_sync_master_wait_point: AFTER_SYNC(5.7的默認值,寫入relaylog后,master commit), AFTER_COMMIT 等同于5.6的半同步。
2)主庫半同步復制狀態(tài)說明
主庫半同步復制狀態(tài)的參數(shù)較多,可通過“show global status like '%semi%';”查看。


3)主庫半同步復制狀態(tài)說明
登錄MySQL主庫,安裝半同步插件。
[if !supportLists]1.?????[endif]鏈接Mysql數(shù)據(jù)庫,安裝插件rpl_remi_sync_master install plugin rpl_semi_sync_master soname'semisynv_mster.so';
[if !supportLists]2.?????[endif]查看插件是否安裝show plugins;
[if !supportLists]3.?????[endif]啟用插件 set global rpl_semi_sync_master_enabled = ON; # 注意= 與字符和數(shù)字之間有空格,否則會報
[if !supportLists]4.?????[endif]安裝完成后,查看插件的狀態(tài)
半同步配置文件
#master
#my.cnf中
[mysqld]
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
安裝半同步插件
#master
install plugin rpl_semi_sync_master soname'semisync_master.so';
set global rpl_semi_sync_master_enabled =ON;
檢查是否生效:
select * from mysql.plugin;

show global status like '%semi%';??? ---查看主庫半同步復制的狀態(tài)參數(shù)

show global variables like '%semi%';?? ---查看主庫半同步復制的相關參數(shù)設置

配置從庫
進入數(shù)據(jù)庫,安裝并啟用插件rpl_semi_sync_slave,相關的操作可以參考配置主服務器的1&2
mysql> install pluginrpl_semi_sync_slave soname 'semisync_slave.so';
mysql> SET GLOBALrpl_semi_sync_slave_enabled = ON;
需要注意,在Master中使用的是master 模塊,在從服務器中使用的是slave模塊.
查看semi插件的狀態(tài)

show global status like '%semi%';??

半同步配置文件:
#my.cnf中
[mysqld]
rpl_semi_sync_slave_enabled = ON
如果在一個正在運行的Slave上開啟半同步復制的功能,那么在配置半同步以后,需要重啟停止Slave的I/O線程:
從庫上執(zhí)行:
#從庫上執(zhí)行
mysql> stop slave io_thread;???---停止IO線程
mysql> start slave io_thread;???---啟動IO線程
mysql> show slave status\G;
主庫上查看半同步狀態(tài)
查看主庫上面的半同步插件是否開啟,輸出如下,注意第一個參數(shù)clients的值變?yōu)?了(之前是0),表示主從半同步復制連接成功。
show global status like '%Rpl_semi_sync_master_clients%';

半同步測試
寫入數(shù)據(jù)之后在查看
#主庫
show global status like '%semi%';
測試半同步復制超時
stop slave io_thread;
#半同步失敗退化了異步
在主庫更新
insert into 表
show global status like '%semi%';

測試可知,從庫停止IO線程復制之后,第一次執(zhí)行insert操作時等待了10秒之后才提交完事務,但是第二次insert的操作就很快了。因為第一次等待從庫超時之后,半同步復制狀態(tài)自動轉換為異步了,所以第二次及以后都會很快了。
開啟從庫的IO線程復制狀態(tài)
start?slave io_thread;
再次查看主庫的半同步狀態(tài)
show global status like '%semi%';

4.5 MHA半同步復制說明
為了盡可能的減少主庫硬件損壞宕機造成的數(shù)據(jù)丟失,因此在配置MHA的同時建議配置成mysql的半同步復制。
注:mysql半同步插件是由google提供,具體位置/usr/local/mysql/lib/plugin下,一個是master用的semisync_master.so,一個是slave用的semisync_slave.so,下面我們就來具體配置一下。如果不清楚Plugin的目錄,用如下查找:
mysql>show variables like'%have_dynamic%';

SUSE系統(tǒng)異于常人,根據(jù)實際情況來操作
分別在主從節(jié)點上安裝相關的插件(master,slave1,slave2)在mysql上安裝插件需要數(shù)據(jù)庫支持動態(tài)載入。檢查是否支持,用如下檢測:
show variables like '%have_dynamic%';

所有mysql數(shù)據(jù)庫服務器,安裝半同步插件(semisync_master.so,semisync_slave.so):
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.30 sec)
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
其他mysql主機采用同樣的方法安裝。
#確保每臺mysql主機都正確安裝plugin:
mysql> show plugins;

#查看半同步相關信息:
show variables like '%rpl_semi_sync%';
注:若主mysql服務器已經(jīng)存在,只是后期才搭建從mysql服務器,在配置數(shù)據(jù)同步前應先將主mysql服務器的要同步的數(shù)據(jù)庫拷貝到從mysql服務器上(如先在主mysql上備份數(shù)據(jù)庫,再用備份在從mysql服務器上恢復)
這里配置可根據(jù)實際情況進行刪減
master mysql主機:
[root@master ~]# vim /etc/my.cnf
添加內(nèi)容如下:
server-id=130
log-bin=mysql-bin
binlog_format=row
log-bin-index=mysql-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
注: rpl_semi_sync_master_enabled=1 1表是啟用,0表示關閉 ,
rpl_semi_sync_master_timeout=10000
:毫秒單位 ,該參數(shù)主服務器等待確認消息10秒后,不再等待,變?yōu)楫惒椒绞健?/p>
注:relay_log_purge=0,禁止sql線程在執(zhí)行完一個relay log后自動將其刪除,對于MHA場景下,對于某些滯后從庫的恢復依賴于其他從庫的relay log,因此采取禁用自動刪除功能。
systemctl restart mysql
Slave1主機:
server-id=135
log-bin=mysql-bin
binlog_format=row
log-bin-index=mysql-bin.index
relay_log_purge=0
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1
systemctl restart mysql
Slave2主機:
server-id=136
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
read_only = 1
rpl_semi_sync_slave_enabled = 1
systemctl restart mysql
關于半同步參數(shù)說明值得關注
Rpl_semi_sync_master_status :顯示主服務是異步復制模式還是半同步復制模式
Rpl_semi_sync_master_clients:顯示有多少個從服務器配置為半同步復制模式
Rpl_semi_sync_master_yes_tx:顯示從服務器確認成功提交的數(shù)量
Rpl_semi_sync_master_no_tx:顯示從服務器確認不成功提交的數(shù)量
Rpl_semi_sync_master_tx_avg_wait_time:事務因開啟semi_sync,平均需要額外等待的時間
Rpl_semi_sync_master_net_avg_wait_time:事務進入等待隊列后,到網(wǎng)絡平均等待時間。
#查看半同步相關信息
mysql> show variables like'%rpl_semi_sync%';

mysql> show status like'%rpl_semi_sync%';

創(chuàng)建主從復制的賬號
create user 'canal_repl_user'@'%'identified with mysql_native_password by '123456';
GRANT REPLICATION SLAVE ON *.* TO'canal_repl_user'@'%';
flush privileges;
mysql> show master status;

在兩臺從機執(zhí)行以下命令:
change master to master_host='192.168.142.133',master_port=3306,master_user='canal_repl_user',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=841;
start slave;
查看Candicate
master和slave2兩個從服務器的狀態(tài)
SHOW SLAVE STATUS\G;

說明運行正常
#查看master服務器的半同步狀態(tài)
show status like '%rpl_semi_sync%';

五、MHA高可用環(huán)境部署記錄
5.1 ???? 機器環(huán)境
目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數(shù)據(jù)庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器。
| 機器名稱 | IP | 角色 |
| ---- | ---- | ---- |
| SUSE12-MySQL-Master | 192.168.142.133-Master | 主庫,寫入,數(shù)據(jù)節(jié)點 |
| SUSE12-MySQL-Slave | 192.168.142.135-Slave |? 從庫讀,數(shù)據(jù)節(jié)點,備選Master(candicate master)|
| SUSE12-MySQL-Slave-Manager | 192.168.142.136-Manager | 從庫,管理機讀,數(shù)據(jù)節(jié)點,也作為Manager server(即也作為manager節(jié)點) |