一.規(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);

從節(jié)點(diǎn)檢查:
select * from wwj.tb;
正常同步;

移除節(jié)點(diǎn)可以:stop group_replication
七.主節(jié)點(diǎn)宕機(jī)測試
宕機(jī)前
select * from performance_schema.replication_group_members;

show status like‘group_replication_primary_member’;
查看當(dāng)前誰是master

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

再查看復(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;

重新加入組成功,之后檢查主節(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配置
隨便在一個(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)證集群是否正常同步;

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

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的讀取組

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


區(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

再試一下另一個(gè)proxysql節(jié)點(diǎn):
mysql -uproxysql -p -h10.10.1.213 -P6033 -e 'select @@hostname;'

注:后續(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;

十二.ProxySQL測試
1.讀寫分離測試
首先用mysql工具連入,測試正常讀寫:

測試插入:

然后清空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;

發(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é)果中不包含列名


可以看到符合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)顯示不同,見截圖
主:

從:

配置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;

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;
主從顯示信息不同
主:

從:

模擬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;

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

proxysql> select hostgroup_id,hostname,port,status,weight,comment from mysql_servers;

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

發(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;

查看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

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

后續(xù)補(bǔ)充,經(jīng)過大量的查詢后,才逐漸穩(wěn)定:

十四.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

用MySQL連接工具連接vip驗(yàn)證正常。
十五.ProxySQL宕機(jī)測試
systemctl stop proxysql.service

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í)故障