MySQL高可用架構(gòu)MGR+ProxySQL+Keepalived

一.規(guī)劃

IP、操作系統(tǒng)、主機(jī)名、角色、軟件包版本、安裝方式等
【node1】
ip地址:10.10.1.211
OS:CentOS 7.6
主機(jī)名:vl7bjsqltest01
角色:master
MySQL版本:5.7.28
安裝方式:通用二進(jìn)制包

【node2】
ip地址:10.10.1.212
OS:CentOS 7.6
主機(jī)名:vl7bjsqltest02
角色:slave1
MySQL版本:5.7.28
安裝方式:通用二進(jìn)制包

【node3】
ip地址:10.10.1.213
OS:CentOS 7.6
主機(jī)名:vl7bjsqltest03
角色:slave2 & ProxySQL2
MySQL版本:5.7.28
Proxy版本:1.4.16
安裝方式:MySQL-通用二進(jìn)制包,ProxySQL-rpm,Keepalived-yum

【node4】
ip地址:10.10.1.214
OS:CentOS 7.6
主機(jī)名:vl7bjsqltest04
角色:ProxySQL1
Proxy版本:1.4.16
安裝方式:rpm,Keepalived-yum
VIP:10.10.1.215

二.MySQL節(jié)點(diǎn)基礎(chǔ)環(huán)境準(zhǔn)備

1.配置主機(jī)名

MGR環(huán)境中務(wù)必將hostname配置好
編輯四個(gè)主機(jī)名和ip映射關(guān)系

vim /etc/hosts

修改主機(jī)名

vim /etc/sysconfig/network

2.清理歷史環(huán)境

 rpm -qa |grep mariadb

如我這里打印出來的信息是mariadb-libs-5.5.60-1.el7_5.x86_64

rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

3.創(chuàng)建用戶和目錄

useradd mysql -s /sbin/nologin
id mysql

mkdir -p /app/database/
mkdir -p /data/3306/
mkdir -p /binlog/

chown -R mysql.mysql /app/ /data/ /binlog/

三.MySQL安裝

上傳tar.gz文件至/app/database/目錄,并解壓:

tar xf mysql-5.7.28-el7-x86_64.tar.gz

我們重命名為mysql

mv mysql-5.7.28-el7-x86_64/  mysql/

環(huán)境變量配置:

vim /etc/profile

添加一行:

export PATH=/app/database/mysql/bin:$PATH

生效配置:

source /etc/profile

驗(yàn)證:

mysql -V

初始化:

mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql --datadir=/data/3306/

基本配置文件,以master節(jié)點(diǎn)為例,不同節(jié)點(diǎn)server_id需要設(shè)置不同數(shù)字(之后還會(huì)增加MGR參數(shù)和其他參數(shù))

cat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/app/database/mysql
datadir=/data/3306
server_id=1   
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
EOF

準(zhǔn)備mysql啟動(dòng)腳本

cd /app/database/mysql/support-files/
cp mysql.server /etc/init.d/mysqld 

將腳本添加到systemd管理中

chkconfig --add mysqld

啟動(dòng)

systemctl start mysqld

mysql -uroot -p進(jìn)入,不需要輸入密碼
創(chuàng)建自己的賬號

create user 'wenjie.wang' identified by'123456';
grant all privileges on *.* to 'wenjie.wang'@'%' with grant option;

更改5.7版本的root密碼:

update mysql.user set authentication_string = password('123456') where user='root';

重啟mysql后生效

四.MGR配置文件

master節(jié)點(diǎn):

[mysqld]
user=mysql
datadir=/data/3306
basedir=/app/database/mysql
port=3306
socket=/data/3306/mysql.sock
pid-file=/data/3306/mysqld.pid
log-error=/data/3306/mysqlerr.log
innodb_file_per_table=1
skip_name_resolve=1
slow_query_log=1
slow_query_log_file=/data/3306/mysql-slow.log
long_query_time=1
symbolic-links=0
explicit_defaults_for_timestamp=1
log_bin=/binlog/mysqlbin
log_bin_index=/binlog/mysql-bin.index
binlog_format=row
sync_binlog=1
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="03f43914-7f38-4a00-919f-f748794c04ac"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="10.10.1.211:33061"
loose-group_replication_group_seeds="10.10.1.211:33061,10.10.1.212:33062,10.10.1.213:33063"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=on
loose-group_replication_enforce_update_everywhere_checks= off
[mysql]
socket=/data/3306/mysql.sock

slave節(jié)點(diǎn)配置文件只需要把loose-group_replication_local_address和server_id改成對應(yīng)的即可;
可以使用uuidgen獲取一個(gè)隨機(jī)uuid作為復(fù)制組的名稱。
[mysqld完整內(nèi)容截圖]


配置文件

五.開啟MGR

主節(jié)點(diǎn):
創(chuàng)建用戶

set sql_log_bin=0;
grant replication slave,replication client on *.* to repl@'localhost' identified by '123456';
grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123456';
grant replication slave,replication client on *.* to repl@'10.10.1.%' identified by '123456';
SET SQL_LOG_BIN=1;

開啟分布式復(fù)制

change master to master_user='repl',master_password='123456' for channel  'group_replication_recovery';

加載GR插件

install plugin group_replication soname 'group_replication.so';
show plugins;

啟動(dòng)復(fù)制程序

set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;

檢測組是否創(chuàng)建并已加入新成員

select * from performance_schema.replication_group_members;

從節(jié)點(diǎn):
創(chuàng)建用戶

set sql_log_bin=0;
grant replication slave,replication client on *.* to repl@'localhost' identified by '123456';
grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123456';
grant replication slave,replication client on *.* to repl@'10.10.1.%' identified by '123456';
SET SQL_LOG_BIN=1;

開啟分布式復(fù)制

change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery';

加載GR插件

install plugin group_replication soname 'group_replication.so';
show plugins;

啟動(dòng)復(fù)制程序

start group_replication;

檢測組是否創(chuàng)建并已加入新成員

select * from performance_schema.replication_group_members;

查看主節(jié)點(diǎn)UUID,并結(jié)合上一條語句的打印結(jié)果來判斷(8.0之后上面一條語句就夠了)

SHOW STATUS LIKE 'group_replication_primary_member';

如有事務(wù)沖突導(dǎo)致的組復(fù)制error,我們可以通過關(guān)閉組復(fù)制stop group_replication;
及reset master;解決問題
另外一旦想進(jìn)行可能會(huì)引起沖突的操作,記得關(guān)binlog執(zhí)行,執(zhí)行后再開啟,這樣有的事務(wù)就不會(huì)同步到從庫(多出現(xiàn)于授權(quán))

六.MGR同步驗(yàn)證

主節(jié)點(diǎn)創(chuàng)建測試數(shù)據(jù):

create database wwj;
use wwj;
create table tb(id int unsignedauto_increment primary key not null,age int not null);
insert into tb(age) values(35),(40);
master創(chuàng)建測試數(shù)據(jù)

從節(jié)點(diǎn)檢查:

select * from wwj.tb;

正常同步;


slave數(shù)據(jù)同步情況

移除節(jié)點(diǎn)可以:stop group_replication

七.主節(jié)點(diǎn)宕機(jī)測試

宕機(jī)前

select * from performance_schema.replication_group_members;
宕機(jī)前復(fù)制組情況
show status like‘group_replication_primary_member’;

查看當(dāng)前誰是master


宕機(jī)前master的uuid

根據(jù)當(dāng)前master的uuid和上面打印結(jié)果對比,可得知當(dāng)前master的主機(jī)名
這時(shí)候我們停止主節(jié)點(diǎn)服務(wù)
然后到從節(jié)點(diǎn)查看當(dāng)前master的uuid,果然變了:


宕機(jī)后master的uuid

再查看復(fù)制組:
宕機(jī)后復(fù)制組情況

當(dāng)前02節(jié)點(diǎn)為主;
此時(shí)重新開啟主節(jié)點(diǎn)服務(wù),然后重新加入組:

change master to master_user='repl',master_password='123456' for channel 'group_replication_recovery';
start group_replication;
重新加入復(fù)制組后

重新加入組成功,之后檢查主節(jié)點(diǎn)就是之前的02節(jié)點(diǎn)。
正式環(huán)境很難這樣直接加入,很可能slave執(zhí)行的事務(wù)gtid與master不一致,因此就需要停機(jī)時(shí)間將宕機(jī)節(jié)點(diǎn)重新同步。如果直接加入的話,后面可以通過查看一張表記錄來判斷落后多少事務(wù)。

select * from sys.gr_member_routing_candidate_status;

這個(gè)是由ProxySQL需要的腳本創(chuàng)建的表,在部署完成后(addition_to_sys.sql文件執(zhí)行完后)才可使用。

八.安裝ProxySQL

在node3和4上執(zhí)行
清理舊環(huán)境(如果之前安裝過)

rpm -qa |grep proxysql

再rpm -e --nodeps 來卸載;
安裝依賴:

yum -y install perl.x86_64
yum install -y libaio.x86_64
yum -y install net-tools.x86_64
yum install perl-DBD-MySQL -y

官網(wǎng)下載rpm
https://www.percona.com/downloads/proxysql/
我這里用的是proxysql-1.4.16-1.1.el7.x86_64.rpm

rpm -ivh proxysql-1.4.16-1.1.el7.x86_64.rpm

啟動(dòng)

systemctl start proxysql
netstat -anlp | grep proxysql

6032是ProxySQL的管理端口號,6033是對外服務(wù)的端口號

proxysql --help

然后node4需要按正常方法在本機(jī)二進(jìn)制安裝mysql。
通過6032管理接口進(jìn)入proxysql管理界面

mysql -uadmin -p -h127.0.0.1 -P6032 --prompt='proxysql> '
admin默認(rèn)密碼也是admin

初始化ProxySQL(即清空配置表中內(nèi)容并持久化):

delete from scheduler ;
delete from mysql_servers;
delete from mysql_users;
delete from mysql_query_rules;
delete from mysql_group_replication_hostgroups ;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
LOAD SCHEDULER TO RUNTIME;
SAVE SCHEDULER TO DISK;
 LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

九.ProxySQL用戶配置

在MySQL主庫添加給ProxySQL使用的監(jiān)控賬號以及管理賬號

mysql> create user 'monitor'@'%' identified by '123456';
mysql> grant all on *.* to 'monitor'@'%';
mysql> create user 'proxysql'@'%' identified by '123456';
mysql> grant all on *.* to 'proxysql'@'%';

實(shí)際上權(quán)限不用給這么大

GRANT USAGE,process,replication slave,replication client ON *.* TO 'monitor'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO  'proxysql'@'%';

即可

十.ProxySQL Cluster配置

在node3和4上都修改 /etc/proxysql.cnf (修改了admin_variables段、proxysql_servers段、mysql_variables段)
截取內(nèi)容參考:

datadir="/var/lib/proxysql"

admin_variables =
{

        admin_credentials="admin:admin;cluster_demo:123456"
        mysql_ifaces="0.0.0.0:6032"
        cluster_username="cluster_demo"
        cluster_password="123456"
        cluster_check_interval_ms=200
        cluster_check_status_frequency=100
        cluster_mysql_query_rules_save_to_disk=true
        cluster_mysql_servers_save_to_disk=true
        cluster_mysql_users_save_to_disk=true
        cluster_proxysql_servers_save_to_disk=true
        cluster_mysql_query_rules_diffs_before_sync=3
        cluster_mysql_servers_diffs_before_sync=3
        cluster_mysql_users_diffs_before_sync=3
        cluster_proxysql_servers_diffs_before_sync=3

}

proxysql_servers =
(

    {
        hostname="10.10.1.214"
        port=6032
        comment="proxysql214"
    },

    {
        hostname="10.10.1.213"
        port=6032
        comment="proxysql213_mysqlslave2"
    }
)

mysql_variables=

{
        threads=4
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
#       interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
        interfaces="0.0.0.0:6033"
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.7.28"
        connect_timeout_server=3000
# make sure to configure monitor username and password
# https://github.com/sysown/proxysql/wiki/Global-variables#mysql-monitor_username-mysql-monitor_password
        monitor_username="monitor"
        monitor_password="123456"
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server_msec=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}

注意:
如果想要讓proxysql.cnf文件里的配置在重啟proxysql服務(wù)后生效(即想要讓proxysql重啟時(shí)讀取并解析proxysql.cnf配置文件),則需要先刪除/var/lib/proxysql/proxysql.db數(shù)據(jù)庫文件,然后再重啟proxysql服務(wù)。
這樣就相當(dāng)于初始化啟動(dòng)proxysql服務(wù)了,會(huì)再次生產(chǎn)一個(gè)純凈的proxysql.db數(shù)據(jù)庫文件(如果之前配置了proxysql相關(guān)路由規(guī)則等,則就會(huì)被抹掉)。
如遇上本地proxysql管理連接不上,也需通過重建proxysql.db數(shù)據(jù)庫文件解決。

mv  /var/lib/proxysql/proxysql.db  /var/lib/proxysql/proxysql.db.bak
或 rm -f  /var/lib/proxysql/proxysql.db
systemctl restart proxysql.service

到兩個(gè)節(jié)點(diǎn)都確認(rèn)一下:

mysql -uadmin -p -h127.0.0.1 -P6032 --prompt='proxysql> '

查看ProxySQL集群節(jié)點(diǎn)信息:

select * from runtime_proxysql_servers ;
select * from proxysql_servers;

2個(gè)節(jié)點(diǎn)都正常顯示信息的話,就可以做其他的配置操作了

select hostname,port,comment,Uptime_s,last_check_ms from stats_proxysql_servers_metrics; 
select * from stats_proxysql_servers_metrics; 
proxysql集群信息

十一.ProxySQL配置

隨便在一個(gè)ProxySQL節(jié)點(diǎn)進(jìn)行配置

1.添加服務(wù)器列表

proxysql> select * from mysql_servers;   當(dāng)前應(yīng)是空值
proxysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(10,'10.10.1.212',3306,1,'master'),(10,'10.10.1.211',3306,1,'slave1'),(10,'10.10.1.213',3306,3,'slave2');    我這個(gè)地方備注寫的不對,211是master,212是slave1,忽略備注即可;
proxysql> load mysql servers to runtime;
proxysql> save mysql servers to disk;
proxysql> select * from mysql_servers;

備注:
(1)表mysql_servers:后端可以連接MySQL主機(jī)的列表
(2)所有節(jié)點(diǎn)都是ONLINE狀態(tài)
(3)slave2節(jié)點(diǎn)的查詢權(quán)重調(diào)整為3,為了讓更多的讀請求路由到這臺配置更好的主機(jī)上
(4)表mysql_servers常用字段說明,參考:https://blog.51cto.com/qiuyue/2413300
(5)在load mysql servers to runtime;后就可以到另一個(gè)ProxySQL節(jié)點(diǎn)通過select * from mysql_servers;查看信息,來驗(yàn)證集群是否正常同步;

從另一個(gè)proxysql節(jié)點(diǎn)查看mysql節(jié)點(diǎn)信息

2.配置和注冊監(jiān)控用戶monitor

因?yàn)橹耙呀?jīng)寫在了配置文件中,所以我們檢查即可,如果之前配置文件沒寫,則需要按如下方法配置:

proxysql> set mysql-monitor_username='monitor';
proxysql> set mysql-monitor_password='123456';
proxysql> load mysql variables to runtime;
proxysql> save mysql variables to disk;
proxysql> select * from global_variables where variable_name in ('mysql-monitor_username','mysql-monitor_password');
select * from monitor.mysql_server_connect_log order by time_start_us desc limit 6;
select * from monitor.mysql_server_ping_log order by time_start_us desc limit 6;

3.配置主從分組信息

查看表中的字段可使用命令

proxysql> show create table mysql_replication_hostgroups\G

配置分組,第一列是讀寫組,第二列是只讀組,第三列是注釋

proxysql> insert into mysql_replication_hostgroups values (10,20,'proxysql');
proxysql> load mysql servers to runtime;
proxysql> save mysql servers to disk;
proxysql> select * from mysql_replication_hostgroups;

可看到讀寫組的id

從另一個(gè)proxysql節(jié)點(diǎn)查看分組的信息
proxysql> select hostgroup_id,hostname,port,status,weight,comment from mysql_servers;

此時(shí)hostgroup_id會(huì)按照我們設(shè)置的顯示
此時(shí)再select * from mysql_servers;發(fā)現(xiàn)hostgroup_id也按照我們設(shè)置的改變
備注:ProxySQL會(huì)根據(jù)MySQL中read_only的取值將主機(jī)進(jìn)行分組,read_only=0的master節(jié)點(diǎn)被分配到編號為10的寫入組,而read_only=1的兩個(gè)slave節(jié)點(diǎn)則被分配到編號為20的讀取組


從另一個(gè)proxysql節(jié)點(diǎn)查看分組后mysql各節(jié)點(diǎn)信息

4.配置對外訪問用戶proxysql

proxysql> insert into mysql_users(username,password,default_hostgroup) values('proxysql','123456',10);
proxysql> load mysql users to runtime;
proxysql> save mysql users to disk;
proxysql> select * from mysql_users\G
當(dāng)前節(jié)點(diǎn)查看mysql用戶

另一個(gè)proxysql節(jié)點(diǎn)查看mysql用戶

區(qū)別于之前的mysql-monitor_username的查看方式
我們隨便進(jìn)入主節(jié)點(diǎn)或從節(jié)點(diǎn)

mysql -uproxysql -p -h10.10.1.214 -P6033 -e 'select @@hostname;'

最后打印的結(jié)果都是主節(jié)點(diǎn)主機(jī)名vl7bjsqltest02,即此時(shí)的master


查看當(dāng)前主節(jié)點(diǎn)

再試一下另一個(gè)proxysql節(jié)點(diǎn):

mysql -uproxysql -p -h10.10.1.213 -P6033 -e 'select @@hostname;'
從另一個(gè)proxysql節(jié)點(diǎn)查看當(dāng)前主節(jié)點(diǎn)

注:后續(xù)我們在mysql中創(chuàng)建的賬號,也需要通過這種方式添加到proxysql中。
如之前在mysql中添加過的賬號wenjie.wang:

proxysql> insert into mysql_users(username,password,default_hostgroup) values('wenjie.wang','123456',10);
proxysql> load mysql users to runtime;
proxysql> save mysql users to disk;
proxysql> select * from mysql_users\G

5.配置路由規(guī)則

proxysql> insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^select.*for update$',10,1),(1,'^select',20,1);
proxysql> load mysql query rules to runtime;
proxysql> save mysql query rules to disk;
proxysql> select rule_id,active,match_pattern,destination_hostgroup,apply from mysql_query_rules;
在另一個(gè)proxysql節(jié)點(diǎn)查看路由規(guī)則

十二.ProxySQL測試

1.讀寫分離測試

首先用mysql工具連入,測試正常讀寫:


heidisql連接信息

測試插入:


寫入測試

然后清空stats_mysql_query_digest表(兩個(gè)proxysql節(jié)點(diǎn)都要清空):
mysql -uadmin -p -h127.0.0.1 -P6032 --prompt='proxysql> '
proxysql> select * from stats_mysql_query_digest_reset;
proxysql> select * from stats_mysql_query_digest;

表stats_mysql_query_digest:SQL的執(zhí)行次數(shù)、時(shí)間消耗等

mysql -u'wenjie.wang' -p123456 -h10.10.1.214 -P6033  (再哪臺上執(zhí)行均可,或者用連接工具執(zhí)行也可以)
mysql> select * from wwj.tb;
mysql> insert into wwj.tb(age) values(612);
mysql> select * from wwj.tb for update;

再回到看stats_mysql_query_digest表中記錄

proxysql> select * from stats_mysql_query_digest;
SQL記錄

發(fā)現(xiàn)是按照配置正常讀寫分離的
(此時(shí)10.10.1.213節(jié)點(diǎn)是沒有SQL記錄的,因?yàn)镾QL記錄不會(huì)同步,只在當(dāng)前的proxysql節(jié)點(diǎn)進(jìn)行記錄)
事實(shí)上這種簡單的讀寫分離并不是我們想要的,正確的做法應(yīng)該是在系統(tǒng)運(yùn)行一段時(shí)間后將開銷較大的查詢分離出來

2. 負(fù)載均衡測試

對于查詢,我們有slave1和slave2兩個(gè)節(jié)點(diǎn)可供使用,即vl7bjsqltest02和vl7bjsqltest03
按照之前配置的權(quán)重,最后select會(huì)以1:3的比例分配到vl7bjsqltest02和vl7bjsqltest03上,如果比例不正確,應(yīng)該是需要重啟一下proxysql生效;

systemctl restrt proxysql.service
for i in {1..12}; do mysql -uproxysql -p123456 -h10.10.1.214 -P6033 -e 'select @@hostname' -s -N; done

選項(xiàng)說明:
(1)-s:以制表符作為分隔符打印結(jié)果
(2)-N:結(jié)果中不包含列名


proxysql節(jié)點(diǎn)1負(fù)載均衡測試

proxysql節(jié)點(diǎn)2負(fù)載均衡測試

可以看到符合1:3的比例。

3.故障轉(zhuǎn)移測試

單主模型腳本gr_sw_mode_checker.sh,
下載地址https://github.com/ZzzCrazyPig/proxysql_groupreplication_checker
或直接查看
https://github.com/ZzzCrazyPig/proxysql_groupreplication_checker/blob/master/gr_sw_mode_checker.sh
將下載的腳本gr_sw_mode_checker.sh放置至兩個(gè)proxysql節(jié)點(diǎn)的/var/lib/proxysql目錄中,并賦予執(zhí)行權(quán)限和修改屬主屬組:

chmod +x /var/lib/proxysql/gr_sw_mode_checker.sh
chown proxysql.proxysql /var/lib/proxysql/gr_sw_mode_checker.sh

下載addition_to_sys.sql,
下載地址https://github.com/lefred/mysql_gr_routing_check/ 打不開的話CSDN下載,或者查看自己簡書
用下載的sql文件在master節(jié)點(diǎn)創(chuàng)建表sys.gr_member_routing_candidate_status:

# mysql -uroot -p < /addition_to_sys.sql
mysql> select * from sys.gr_member_routing_candidate_status;

主節(jié)點(diǎn)和從節(jié)點(diǎn)顯示不同,見截圖
主:


主節(jié)點(diǎn)信息

從:


從節(jié)點(diǎn)信息

配置scheduler:

proxysql> insert into scheduler(active,interval_ms,filename,arg1,arg2,arg3,arg4) values(1,5000,'/var/lib/proxysql/gr_sw_mode_checker.sh',10,20,1,'/var/lib/proxysql/gr_sw_mode_checker.log');
proxysql> load scheduler to runtime;
proxysql> save scheduler to disk;
proxysql> select * from scheduler\G

問題排查可查看日志文件/var/lib/proxysql/gr_sw_mode_checker.log
執(zhí)行過程中發(fā)現(xiàn)scheduler并沒有同步到另一個(gè)proxysql節(jié)點(diǎn),需手動(dòng)創(chuàng)建;

查看MGR狀態(tài)信息:

proxysql> select hostgroup_id,hostname,port,status,weight,comment from mysql_servers;
節(jié)點(diǎn)信息(忽略注釋錯(cuò)誤)
mysql> select * from performance_schema.replication_group_members;
mysql> select if((select @@server_uuid)=(select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member'),1,0) as is_primary_mode,@@server_id;

主從顯示信息不同
主:


宕機(jī)前主節(jié)點(diǎn)信息

從:


宕機(jī)前從節(jié)點(diǎn)信息

模擬master服務(wù)故障:

systemctl stop mysqld.service

當(dāng)master節(jié)點(diǎn)意外宕機(jī)或下線,在滿足大多數(shù)節(jié)點(diǎn)存活的情況下,group內(nèi)部發(fā)起選舉,選出下一個(gè)可用的讀節(jié)點(diǎn),提升其為master節(jié)點(diǎn)。master節(jié)點(diǎn)選舉根據(jù)group內(nèi)剩余存活節(jié)點(diǎn)的UUID按字典升序排列,然后選擇排在最前的節(jié)點(diǎn)作為新的master節(jié)點(diǎn)。
我們在10.10.1.212上執(zhí)行

select if((select @@server_uuid)=(select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member'),1,0) as is_primary_mode,@@server_id;
node2晉升為master

此時(shí)MGR組中也不再有node1的信息


宕機(jī)后MGR信息
proxysql> select hostgroup_id,hostname,port,status,weight,comment from mysql_servers;
宕機(jī)后節(jié)點(diǎn)讀寫信息

會(huì)發(fā)現(xiàn)node1已變成只讀組,而node2新增一條記錄,允許寫入;
我們通過工具連接任意一個(gè)proxysql節(jié)點(diǎn)進(jìn)行寫入操作


宕機(jī)后寫入

發(fā)現(xiàn)對于用戶來說無感知

十三.MGR恢復(fù)

原master節(jié)點(diǎn)10.10.1.211恢復(fù)MySQL服務(wù):

systemctl start mysqld.service

重新加入復(fù)制組:

set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;

select * from performance_schema.replication_group_members;

select if((select @@server_uuid)=(select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member'),1,0) as is_primary_mode,@@server_id;

select * from sys.gr_member_routing_candidate_status;
恢復(fù)后節(jié)點(diǎn)情況

查看wwj.tb表數(shù)據(jù),發(fā)現(xiàn)宕機(jī)后用工具插入的那一條數(shù)據(jù)已同步
測試負(fù)載均衡:

for i in {1..12}; do mysql -uproxysql -p123456 -h10.10.1.214 -P6033 -e 'select @@hostname' -s -N; done
宕機(jī)后負(fù)載均衡

發(fā)現(xiàn)了仍為node2和node3以1:3的比例分?jǐn)偅?/p>

proxysql> delete from mysql_servers where hostgroup_id=20 and hostname='10.10.1.212'
proxysql> load mysql servers to runtime;
proxysql> save mysql servers to disk;
proxysql> select hostgroup_id,hostname,port,status,weight,comment from mysql_servers;

重啟proxysql后查看分?jǐn)?/p>

恢復(fù)后的負(fù)載均衡比例node4

發(fā)現(xiàn)連node3節(jié)點(diǎn)的ProxySQL,大比例分?jǐn)偟搅薾ode3,發(fā)現(xiàn)很少分?jǐn)偟絥ode1上,待后續(xù)研究,不過仍然保證了讀寫分離:


恢復(fù)后的負(fù)載均衡比例node3

后續(xù)補(bǔ)充,經(jīng)過大量的查詢后,才逐漸穩(wěn)定:
恢復(fù)后過了一段時(shí)間的負(fù)載均衡比例node3

十四.Keepalived搭建

centOS6.4以后的版本,官方鏡像收錄了keepalived,所以直接yum安裝即可

yum install -y keepalived

node4和node3均用eth0,計(jì)劃VIP用10.10.1.215
把原來/etc/keepalived/keepalived.conf的內(nèi)容全部刪除,直接用下面的:

! Configuration File for keepalived
 
#指定proxysql服務(wù)檢測腳本
vrrp_script chk_proxysql_port  {
script "/usr/bin/killall -0 proxysql"
interval 2 #腳本檢測頻率
weight -5 #腳本執(zhí)行成功與否,權(quán)重怎么計(jì)算
fall 2 #如果連續(xù)兩次檢測失敗,認(rèn)為節(jié)點(diǎn)服務(wù)不可用
rise 1 #如果連續(xù)2次檢查成功則認(rèn)為節(jié)點(diǎn)正常
}
 

vrrp_instance VI_1 {
state MASTER
interface eth0 #節(jié)點(diǎn)IP的網(wǎng)卡
virtual_router_id 215 #同一個(gè)instance相同
priority 100 # 優(yōu)先級,數(shù)值越大,優(yōu)先級越高
advert_int 1
authentication { #節(jié)點(diǎn)間的認(rèn)證,所有的必須一致
auth_type PASS
auth_pass Hirain_ha_215
}
virtual_ipaddress { #VIP,自定的,和外網(wǎng)的IP要一個(gè)網(wǎng)段
10.10.1.215/24
}
 
track_script { #指定前面腳本的名字
chk_proxysql_port
}
 
}

兩臺的區(qū)別是權(quán)重不同:priority 分別為100、98
然后啟動(dòng)keepalived:

systemctl start keepalived.service

查看ip


宕機(jī)前ip

用MySQL連接工具連接vip驗(yàn)證正常。

十五.ProxySQL宕機(jī)測試

systemctl stop proxysql.service
宕機(jī)后vip轉(zhuǎn)移到node3上

MySQL連接工具連接vip驗(yàn)證正常,用戶無感知
恢復(fù)時(shí)除了重啟proxysql以外還要重啟keepalived

故障總結(jié)如下
應(yīng)用無感知的情況:
1.MGR master故障:復(fù)制組選出新master,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,ProxySQL識別到新主,負(fù)載均衡比例變化;
2.MGR slave1故障:復(fù)制組master不變,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,ProxySQL負(fù)載均衡比例變化;
3.MGR slave2故障:復(fù)制組master不變,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,ProxySQL負(fù)載均衡比例變化;
4.ProxySQL專用節(jié)點(diǎn)故障:復(fù)制組不變,Keepalived的VIP漂移到MGR slave2節(jié)點(diǎn),即ProxySQL的node2上;
5.MGR 兩個(gè)從節(jié)點(diǎn)同時(shí)故障:復(fù)制組master不變,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,ProxySQL負(fù)載均衡比例變化;
6.MGR slave1和ProxySQL專用節(jié)點(diǎn)同時(shí)故障:復(fù)制組master不變,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,Keepalived的VIP漂移到MGR slave2節(jié)點(diǎn),即ProxySQL的node2上,ProxySQL負(fù)載均衡比例變化;
7.MGR master和ProxySQL專用節(jié)點(diǎn)同時(shí)故障:復(fù)制組選出新master,宕機(jī)節(jié)點(diǎn)踢出復(fù)制組,ProxySQL識別到新主,Keepalived的VIP漂移到MGR slave2節(jié)點(diǎn),即ProxySQL的node2上,負(fù)載均衡比例變化;
其余三種情況應(yīng)用有感知:
master和任一slave同時(shí)故障
proxysql兩個(gè)節(jié)點(diǎn)同時(shí)故障
任意三個(gè)節(jié)點(diǎn)同時(shí)故障

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

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

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