---恢復內容開始---
實驗目的是MySQL高可用且根據規則實現讀寫分離
首先准備三台MySQL服務器,版本是二進制的mysql-5.7.27
第一台:192.168.110.113
第二台:192.168.110.112
第三台:192.168.110.110
三台機器配置/etc/hosts,三台機器的目錄都是/data,第一,二台機器設置為種子節點
如果三台機器是新裝的數據庫,不用先進行mysqldump更新至一致,如果有數據且不小的話建議先mysqldump更新至一致
在第一台上面,設置/etc/my.cnf
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# changes to the binary log between backups.
# log_bin
basedir = /usr/local/mysql
datadir = /data
# port = .....
# server_id = .....
# socket = .....
pid-file = /data/rabbitmq4.pid
# 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
socket=/tmp/mysql.sock
gtid_mode=on # 必須
enforce_gtid_consistency=on # 必須
log-bin=/data/master-bin # 必須
binlog_format=row # 必須
binlog_checksum=none # 必須
master_info_repository=TABLE # 必須
relay_log_info_repository=TABLE # 必須
relay_log=/data/relay-log # 必須,如果不給,將采用默認值
log_slave_updates=ON # 必須
sync-binlog=1 # 建議
log-error=/data/error.log
#pid-file=/data/mysqld.pid
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 必須
loose-group_replication_start_on_boot=off # 建議設置為OFF
loose-group_replication_member_weigth = 40 # 非必需,mysql 5.7.20才開始支持該選項
loose-group_replication_local_address="192.168.110.113:20001" # 必須,下一行也必須
loose-group_replication_group_seeds="192.168.110.113:20001,192.168.110.112:20002"
master_user='repl',
master_password='P@ssword1!'
for channel 'group_replication_recovery';
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=off;
datadir=/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock
gtid_mode=on # 必須
enforce_gtid_consistency=on # 必須
log-bin=/data/master-bin # 必須
binlog_format=row # 必須
binlog_checksum=none # 必須
master_info_repository=TABLE # 必須
relay_log_info_repository=TABLE # 必須
relay_log=/data/relay-log # 必須,如果不給,將采用默認值
log_slave_updates=ON # 必須
sync-binlog=1 # 建議
log-error=/data/error.log
pid-file=/data/mysqld.pid
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 必須
loose-group_replication_start_on_boot=off # 建議設置為OFF
loose-group_replication_member_weigth = 20 # 非必需,mysql 5.7.20才開始支持該選項
loose-group_replication_local_address="192.168.110.112:20002" # 必須,下一行也必須
loose-group_replication_group_seeds="192.168.110.113:20001,192.168.110.112:20002"
master_user='repl',
master_password='P@ssword1!'
for channel 'group_replication_recovery';
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# changes to the binary log between backups.
#log_bin= mysql-bin
#server_id= 1
# These are commonly set, remove the # and set as required.
basedir = /usr/local/mysql
datadir = /data
#character_set_database = utf8
#character_set_server = utf8
# port = .....
# server_id = .....
socket = /tmp/mysql.sock
#pid = /data-mysql/docker.pid
# 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
server-id=120 # 必須
gtid_mode=on
enforce_gtid_consistency=on
log-bin=/data/master-bin
binlog_format=row
binlog_checksum=none
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=/data/relay-log
log_slave_updates=ON
sync-binlog=1
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_member_weigth = 30
loose-group_replication_local_address="192.168.110.110:20003"
loose-group_replication_group_seeds="192.168.110.113:20001,192.168.110.112:20002"
log-error=/data/error.log
pid-file=/data/docker.pid
master_user='repl',
master_password='P@ssword1!'
for channel 'group_replication_recovery';
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=off;
[proxysql_repo]
name= ProxySQL
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
runtime_
表,修改后必須執行
LOAD ... TO RUNTIME
才能加載到RUNTIME生效,執行
save ... to disk
才能將配置持久化保存到磁盤
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.110.112',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.110.110',3306);
save mysql servers to disk;
mysql> create user monitor@'192.168.110.%' identified by 'P@ssword1!';
mysql> grant replication client on *.* to monitor@'192.168.110.%';
set mysql-monitor_password='P@ssword1!';
save mysql variables to disk;
save mysql servers to disk;
在master節點上執行:(只需master執行即可,會復制給兩個slave)
grant all on *.* to root@'192.168.110.%' identified by 'P@ssword1!';
grant all on *.* to sqlsender@'192.168.110.%' identified by 'P@ssword1!';
回到proxysql上
insert into mysql_users(username,password,default_hostgroup) values('root','P@ssword1!',10);
insert into mysql_users(username,password,default_hostgroup) values('sqlsender','P@ssword1!',10);
load mysql users to runtime;
save mysql users to disk;
插入兩個規則,目的是將select語句分離到hostgroup_id=20
的讀組,但由於select語句中有一個特殊語句SELECT...FOR UPDATE
它會申請寫鎖,所以應該路由到hostgroup_id=10
的寫組。
insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),
(2,1,'^SELECT',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
至此讀寫分離規則生效
以上,組復制是2016年官方推出的高可用功能,並且5.7.20后才支持這個功能,所以舊版本的MySQL不能用,舊版本的要用這個功能只能更新到新版,但是要結合應用程序代碼是否能被新版本的數據庫兼容