CentOS 7.6安裝配置MySQL 5.7 GTID雙主複製+Keepalived實現高可用

1、相關概念介紹:node

一、GTID簡介:mysql

GTIDGlobal Transaction ID,全局事務ID,是一個已提交事務的編號,而且是一個全局惟一的編號。MySQL 5.6版本以後在主從複製類型上新增了GTID複製。經過GTID保證了每一個在master節點上提交的事務在集羣中有一個惟一的ID,這種方式強化了數據庫的主從一致性、故障恢復及容錯能力。sql

二、GTID工做原理:數據庫

GTID用於在binlog中惟一標識一個事務。當事務提交時,MySQL在寫binlog時,會先寫一個特殊的binlog event,類型爲GTID_Event,指定下一個事務的GTID,而後再寫事務的binlog。主從同步時GTID_Event和事務的binlog都會傳遞到slave節點,slave節點在執行時也用一樣的GTIDbinlog,這樣主從同步後,就可經過GTID肯定slave節點同步到的位置了。GTID使用master_auto_position=1代替了基於master_log_filemaster_log_pos的主從複製構建方式。vim

image.png

三、GTID組成:GTID=server_uuid:transaction_id安全

(1)server_uuidMySQL實例的惟一標識,每臺主機的server_uuid都不一樣(128位),保存在數據目錄下的auto.cnf文件中。MySQL第一次啓動時建立auto.cnf文件,並生成server_uuid,以後MySQL再次啓動時不會重複生成server_uuid,而是使用auto.cnf中的server_uuidbash

(2)transaction_id:事務提交時由系統順序分配的一個不會重複的序列號,表明了該實例上已經提交的事務數量,通常來講隨着事務提交遞增。網絡

備註:使用server_uuid:transaction_id共同組成一個GTID的好處是,因爲server_uuid惟一,即便一個集羣內多個節點同時寫入,也不會形成GTID衝突。session

四、GTID使用限制:架構

(1)不支持create table ... select語句

(2)不支持針對臨時表的操做,即create | drop temporary table

(3)不支持非事務存儲引擎(如:MyISAM

(4)不支持sql_slave_skip_counter

五、Keepalived簡介:

KeepalivedVRRP協議的軟件實現,原生設計是爲了高可用IPVS服務,能夠實現以下功能:

(1)基於VRRP協議完成地址流動

(2)VIP地址所在的IPVS集羣節點生成IPVS規則(在配置文件中預先定義)

(3)IPVS集羣的各RS作健康狀態檢測

(4)基於腳本調用接口,經過執行腳本完成腳本中定義的功能,進而影響集羣事務

Keepalived官網:https://www.keepalived.org/

六、Keepalived架構圖:

image.png

Keepalived啓動後,會生成WatchDogCheckersVRRP三個工做進程:

(1)WatchDog:負責監控CheckersVRRP進程

(2)Checkers:負責檢測主機健康狀態

(3)VRRP:負責當master節點上的服務不可用時,可經過VRRP將其切換到backup節點上

七、VRRP協議簡介:

VRRPVirtual Router Redundancy Protocol,虛擬路由冗餘協議。VRRP是一種路由容錯協議,也可稱爲備份路由協議。一個局域網內的全部主機都設置缺省路由,當網內主機發出的目的地址不在本網段時,報文將被經過缺省路由發往外部路由器,從而實現了主機與外部網絡的通訊。當缺省路由器down掉(即端口關閉)後,內部主機將沒法與外部通訊,若是路由器設置了VRRP,虛擬路由將啓用備份路由器,從而實現全網通訊。

八、VRRP相關術語簡介:

(1)虛擬路由器:由一個master路由器和多個backup路由器組成,主機將虛擬路由器看成默認網關

(2)VRID:虛擬路由器標識,有相同VRID的一組路由器構成一個虛擬路由器,取值範圍爲0~255

(3)master路由器:虛擬路由器中承擔報文轉發任務的路由器

(4)backup路由器:master路由器出現故障時,能代替master路由器工做的路由器

(5)虛擬IP地址:虛擬路由器的IP地址,一個虛擬路由器能夠擁有一個或多個IP地址

(6)虛擬MAC地址:一個虛擬路由器擁有一個虛擬MAC地址,虛擬MAC地址的格式爲00-00-5E-00-01-{VRID},一般狀況下,虛擬路由器迴應ARP請求使用的是虛擬MAC地址,只有虛擬路由器作特殊配置時,纔回應接口的真實MAC地址

(7)優先級:VRRP根據優先級來肯定虛擬路由器中每臺路由器的地位,取值範圍爲0~255,數值越小表示優先級越低,數值越大表示優先級越高,當數值爲0時,表示當前master節點放棄持有VIP,當數值爲255時,表示當前master節點的優先級最高且已持有VIP,因此VRRP的優先級可選取值範圍爲1~254

(8)非搶佔模式:若是backup路由器工做在非搶佔模式下,則只要master路由器沒有出現故障,backup路由器即便隨後被配置了更高的優先級也不會成爲master路由器

(9)搶佔模式:若是backup路由器工做在搶佔模式下,當它收到VRRP報文後,會將本身的優先級與通告報文中的優先級進行比較,若是本身的優先級比當前的master路由器的優先級高,就會主動搶佔成爲master路由器,不然將保持backup狀態

九、VRRP工做流程:

(1)虛擬路由器中的路由器根據優先級選舉出mastermaster路由器經過發送免費ARP報文,將本身的虛擬MAC地址通知給與它鏈接的設備或主機,從而承擔報文轉發任務;

(2)master路由器週期性發送VRRP報文,以公佈其配置信息(優先級等)和工做狀態;

(3)若是master路由器出現故障,虛擬路由器中的backup路由器將根據優先級從新選舉出新的master

(4)虛擬路由器狀態切換時,master路由器由一臺設備切換爲另外一臺設備,新的master路由器只是簡單地發送一個攜帶虛擬路由器的MAC地址和虛擬IP地址信息的免費ARP報文,這樣就能夠更新與它鏈接的主機或設備中的ARP相關信息。網絡中的主機感知不到master路由器已經切換爲另外一臺設備。

備註:backup路由器的優先級高於master路由器時,由backup路由器的工做模式(搶佔模式和非搶佔模式)決定是否從新選舉master


2、準備工做(如未特殊說明,在兩個節點中分別執行以下操做):

一、演示環境:

IP

操做系統

主機名

角色

軟件包版本

安裝方式

192.168.1.145

CentOS   7.6 x86_64

node1

master

Percona   Server5.7.26-29-log

Keepalived1.3.5-8

yum

192.168.1.146

CentOS   7.6 x86_64

node2

backup

Percona   Server5.7.26-29-log

Keepalived1.3.5-8

yum

備註:VIP192.168.1.130

二、集羣架構:

image.png

三、關閉SELinuxfirewalld

四、配置epel

五、配置percona源:

# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# yum repolist

# yum list | grep -i percona

六、配置節點時間同步

七、配置主機名

八、配置/etc/hosts文件:

# vim /etc/hosts

192.168.1.145 node1

192.168.1.146 node2


3、安裝配置Percona Server,實現GTID雙主複製(如未特殊說明,在兩個節點中分別執行以下操做):

一、安裝Percona Server# yum -y install Percona-Server-server-57

二、修改MySQL配置文件:

# mv /etc/my.cnf /etc/my.cnf.bak

# update-alternatives --install /etc/my.cnf my.cnf "/etc/percona-server.cnf" 200

# vim /etc/percona-server.conf.d/mysqld.cnf

master節點:

[mysqld]

port=3306

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

pid-file=/var/run/mysqld/mysqld.pid

log-error=/var/log/mysqld.log

lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

innodb_file_per_table=1

skip_name_resolve=1

slow_query_log=1

slow_query_log_file=mysql-slow.log

symbolic-links=0

explicit_defaults_for_timestamp=1

log_bin=mysql-bin

log_bin_index=mysql-bin.index

relay_log=relay-log

relay_log_index=relay-log.index

sync_binlog=1

innodb_flush_log_at_trx_commit=1

binlog_format=row

gtid_mode=on

enforce_gtid_consistency=on

server_id=1

備註:

(1)backup節點的server_id=2

(2)MySQL 5.7版本開始,gtid_mode支持動態修改,可取值爲:

a、off:不支持GTID事務,生成的是匿名事務,slave節點也只能應用匿名事務

b、off_permissive:生成的是匿名事務,slave節點能夠應用匿名事務和GTID事務

c、on_permissive:生成的是GTID事務,slave節點能夠應用匿名事務和GTID事務(此步驟操做完成後,master節點的二進制日誌就會變成GTID模式)

d、on:支持GTID事務,生成的是GTID事務,slave節點也只能應用GTID事務

注意:在生產環境中,可能有把傳統複製改成GTID複製模式的需求,gtid_mode雖然支持動態修改,但不支持跳躍式修改,好比從on_permissive修改成off是不能夠的

(3)enforce_gtid_consistency主要用於不讓違反GTID的操做執行,可取值爲:

a、off:容許全部操做

b、on:不容許有違反GTID的操做,且報錯

c、warnMySQL 5.7版本新增,容許全部操做,可是違反GTID的操做會提示警告

(4)MySQL 5.6版本中使用GTID複製模式,必需要開啓參數log_slave_updates=1,但在MySQL 5.7版本中使用gtid_executed系統表記錄已經執行的GTID集合信息,因此就不用開啓參數log_slave_updates=1,開啓的意義是把relay log中的日誌內容再次記錄到slave節點的本地binlog

三、初始化MySQL數據:# mysqld --initialize --user=mysql

備註:確保初始化前/var/lib/mysql目錄爲空,初始化完成後會在此目錄中生成各種文件

四、啓動MySQL服務:

# systemctl start mysqld.service

# ss -tunlp | grep mysqld

# systemctl enable mysqld.service

# systemctl status mysqld.service

五、查看root@localhost用戶的初始密碼:# grep password /var/log/mysqld.log

六、配置MySQL安全向導:# mysql_secure_installation

七、建立具備複製權限的用戶:

master節點:

# mysql -uroot -p

mysql> create user 'repluser1'@'192.168.1.%' identified by '123456';

mysql> grant replication slave on *.* to 'repluser1'@'192.168.1.%';

mysql> flush privileges;

mysql> show global variables like 'server_uuid';

備註:

(1)backup節點建立的複製用戶爲repluser2@192.168.1.%,不能與master節點中的用戶重名

(2)內容和/var/lib/mysql/auto.cnf文件中server-uuid的值一致

八、backup節點使用具備複製權限的用戶repluser1鏈接至master節點,並啓動複製線程:

mysql> change master to master_host='192.168.1.145',master_user='repluser1',master_password='123456',master_port=3306,master_auto_position=1;

mysql> start slave;

備註:

(1)start slave等同於分別執行start slave io_threadstart slave sql_thread

(2)stop slave表示中止主從複製線程

(3)重啓slave節點所在的主機,複製線程會自動啓動

mysql> show slave status\G

image.png

image.png

image.png

備註:

(1)只有當Slave_IO_RunningSlave_SQL_Running的值都爲Yes時,複製線程纔算啓動成功

(2)Seconds_Behind_master的值爲0,說明backup節點沒有落後於master節點

(3)複製時的詳細信息記錄在backup節點的錯誤日誌/var/log/mysqld.log

(4)backup節點start slave時,會計算show slave statusRetrieved_Gtid_SetExecuted_Gtid_Set的並集,而後將此GTID並集發送給master節點。master節點會使用backup節點請求的GTID集合和master節點自身的gtid_executed比較,把backup節點GTID集合裏缺失的事務所有發送給backup節點。若是backup節點缺失的GTID已經被master節點清除,則backup節點會提示1236錯誤,I/O線程中斷。

九、master節點使用具備複製權限的用戶repluser2鏈接至backup節點,並啓動複製線程:

mysql> change master to master_host='192.168.1.146',master_user='repluser2',master_password='123456',master_port=3306,master_auto_position=1;

mysql> start slave;

mysql> show slave status\G

image.png

image.png

image.png

十、查看GTID相關信息:

mysql> show master status\G

master節點:

image.png

backup節點:

image.png

mysql> show slave hosts;

master節點:

image.png

backup節點:

image.png

mysql> show slave status\G

mysql> show global variables like '%gtid%';

master節點:

image.png

backup節點:

image.png

備註:

(1)gtid_executed:當前實例上已經執行過的GTID集合,實際上包含了全部記錄到binlog中的事務。若是set sql_log_bin=0,執行的事務不會生成binlog事件,也不會記錄到gtid_executed中。執行reset master能夠將變量@@global.gtid_executed清空。

(2)gtid_owned:當前實例正在執行中的GTID,以及對應的線程ID

(3)gtid_purged:記錄當前實例執行過,但已被清除的GTID集合。gtid_purgedgtid_executed的子集。只有gtid_executed爲空時才能手動設置gtid_purged變量,此時會將gtid_executed更新爲和gtid_purged相同的值。

mysql> show variables like '%gtid%';

master節點:

image.png

backup節點:

image.png

備註:gtid_nextsession會話級別的變量,如何產生下一個GTID,可取值爲

(1)automatic:默認取值,在每次事務提交時自動生成新的GTID,它從當前已執行的GTID集合(即gtid_executed)中,找一個大於0的、未使用的transaction_id最小值做爲下個事務的GTID,同時在binlog的實際更新事務事件前插入一條set gtid_next事件,因此即便是同一個server_uuid,也不能經過transaction_id的大小來判斷事務的順序。

(2)anonymous:執行事務不會產生GTID

(3)顯示指定GTID:能夠指定任意合法的GTID,但不能是當前gtid_executed中已經包含的GTID

mysql> show processlist;

master節點:

image.png

backup節點:

image.png

十一、master節點建立測試數據:

mysql> create database db;

mysql> use db;

mysql> create table tb(id int unsigned auto_increment primary key not null,age int not null);

mysql> desc tb;

mysql> insert into tb(age) values(35),(40);

mysql> select * from tb;

image.png

十二、backup節點查看測試數據:

mysql> show databases like 'db';

image.png

mysql> select * from db.tb;

image.png

1三、backup節點建立測試數據:

mysql> insert into db.tb(age) values(60),(80);

mysql> select * from db.tb;

image.png

1四、master節點查看測試數據:

mysql> select * from db.tb;

image.png


4、安裝配置Keepalived,實現MySQL高可用(如未特殊說明,在兩個節點中分別執行以下操做):

一、安裝Keepalived# yum -y install keepalived

二、定義檢測MySQL服務的腳本:

# vim /etc/keepalived/chk_mysqld.sh

#!/bin/bash

n=$(ps -C mysqld --no-headers | wc -l)

if [ $n -eq 0 ]; then

systemctl stop keepalived.service

fi

# chmod +x /etc/keepalived/chk_mysqld.sh

# bash -n /etc/keepalived/chk_mysqld.sh

備註:經過Keepalived自帶的服務監控功能和自定義腳本實現MySQL故障自動轉移

三、master節點配置Keepalived

# cd /etc/keepalived

# mv keepalived.conf{,.bak}

# openssl rand -base64 7 --> IDDf1j+yfw==

# vim keepalived.conf

global_defs {

notification_email {

root@localhost

}

notification_email_from node1@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.1.100.88

}


vrrp_script chk_mysqld {

script "/etc/keepalived/chk_mysqld.sh"

interval 10

}


vrrp_instance VI_1 {

state BACKUP

nopreempt

interface ens160

virtual_router_id 50

priority 100

advert_int 5

authentication {

auth_type PASS

auth_pass IDDf1j+yfw==

}

virtual_ipaddress {

192.168.1.130

}

track_script {

chk_mysqld

}

}

備註:經常使用指令說明

(1)notification_email:收件箱

(2)notification_email_from:發件箱

(3)vrrp_mcast_group4VRRP多播地址,必須爲D類地址,便可用IP範圍爲224.0.0.0~239.255.255.255

(4)script:自定義檢查腳本路徑

(5)interval:自定義檢查腳本的執行時間間隔,單位爲秒

(6)vrrp_instance:配置虛擬路由器實例

(7)stateMASTERBACKUP,當前節點在此虛擬路由器上的初始狀態,只能有一個爲MASTER,其他的都應該爲BACKUP,此處都須要配置爲BACKUP

(8)nopreempt:定義工做模式爲非搶佔模式,默認爲搶佔模式

(9)preempt_delay:搶佔模式下,節點上線後觸發新選舉操做的延遲時長,單位爲秒

(10)interface:綁定當前虛擬路由器使用的物理接口

(11)virtual_router_id:當前虛擬路由器的惟一標識,取值範圍爲0~255,兩個節點必須一致

(12)priority:當前主機在此虛擬路由器中的優先級,取值範圍爲0~255

(13)advert_intVRRP通告心跳信息和優先級信息的時間間隔,單位爲秒

(14)auth_type:認證類型

(15)auth_pass:認證密碼,兩個節點必須一致

(16)virtual_ipaddressVIP地址

(17)可經過命令# man keepalived.conf查看keepalived.conf配置文件的詳細幫助文檔

四、backup節點配置Keepalived

# cd /etc/keepalived

# mv keepalived.conf{,.bak}

# vim keepalived.conf

global_defs {

notification_email {

root@localhost

}

notification_email_from node2@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node2

vrrp_mcast_group4 224.1.100.88

}


vrrp_script chk_mysqld {

script "/etc/keepalived/chk_mysqld.sh"

interval 10

}


vrrp_instance VI_1 {

state BACKUP

nopreempt

interface ens160

virtual_router_id 50

priority 98

advert_int 5

authentication {

auth_type PASS

auth_pass IDDf1j+yfw==

}

virtual_ipaddress {

192.168.1.130

}

track_script {

chk_mysqld

}

}

備註:masterbackup節點配置Keepalived時,要注意兩個節點的state都要採用BACKUP狀態,並且都是nopreempt非搶佔模式,經過優先級決定哪一個節點爲master節點,避免出現衝突,發生腦裂現象

五、master節點啓動Keepalived服務,並查看VIP信息:

# systemctl start keepalived.service

# systemctl enable keepalived.service

# systemctl status keepalived.service

# tail -f /var/log/messages

備註:從Keepalived啓動完成以後的日誌中能夠得出,VRRP_Instance(VI_1)首先變成BACKUP狀態,因爲192.168.1.145主機上的優先級高,狀態會從BACKUP升級爲MASTER,且chk_mysqld腳本執行成功,VIP已經綁定在master節點的ens160網卡上

# ip a l

image.png

六、backup節點啓動Keepalived服務:

# systemctl start keepalived.service

# systemctl enable keepalived.service

# systemctl status keepalived.service

# tail -f /var/log/messages

備註:從Keepalived啓動完成以後的日誌中能夠得出,VRRP_Instance(VI_1)變成BACKUP狀態,時刻準備接管master節點上的MySQL服務,且chk_mysqld腳本執行成功,但並無綁定VIP

# ip a l

image.png

七、測試使用VIP鏈接master節點:

(1)在任意一臺主機上安裝MySQL客戶端(此處爲192.168.1.144):# yum -y install mariadb

(2)masterbackup任意一個節點中建立登陸用戶root@192.168.1.%,並賦予權限:

mysql> create user 'root'@'192.168.1.%' identified by '123456';

mysql> grant all on *.* to 'root'@'192.168.1.%';

mysql> flush privileges;

(3)192.168.1.144主機上使用VIP鏈接master節點,並使用status命令查看當前數據庫狀態:

# mysql -uroot -p -h192.168.1.130

image.png

八、測試高可用:

(1)master節點模擬MySQL服務宕機:# systemctl stop mysqld.service

(2)master節點查看Keepalived服務、日誌及VIP信息:

# systemctl status keepalived.service  # tail -f /var/log/messages  # ip a l

image.png

備註:master節點已經自動中止Keepalived服務,且VIP沒有綁定在master節點的ens160網卡上

(3)backup節點查看Keepalived服務、日誌及VIP信息:

# systemctl status keepalived.service  # tail -f /var/log/messages  # ip a l

image.png

備註:backup節點的Keepalived已經變成MASTER狀態,且VIP漂移至backup節點的ens160網卡上

(4)192.168.1.144主機上使用VIP鏈接master節點,並使用status命令查看當前數據庫狀態:

# mysql -uroot -p -h192.168.1.130

image.png

備註:客戶端沒有受到任何影響,依舊可使用VIP鏈接已經變成MASTER狀態的backup節點

(5)master節點啓動MySQL服務:# systemctl start mysqld.service

(6)master節點啓動Keepalived服務:# systemctl start keepalived.service

備註:master節點的Keepalived已經變成BACKUP狀態,且chk_mysqld腳本執行成功,但因爲是非搶佔模式,因此VIP依舊綁定在backup節點的ens160網卡上

相關文章
相關標籤/搜索