SUSE12 MySQL高可用架構 MHA環(huán)境 部署

一、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

masterslave2兩個從服務器的狀態(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é)點) |

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容