自学内容网 自学内容网

Day11-数据库服务主从扩展

1、数据库过滤复制实践
2、数据库半同步复制实践 (数据库同步一致性)
3、数据库GTID复制实践 (GTID方式实现主从)
4、数据库克隆复制实践
5、数据库多源复制实践 (将多个主库的数据 汇总同步到一个从库上) – 数据中台 – 大数据
6、数据库MGR组复制实践(强一致性主从同步)

1、数据库过滤复制实践

步骤一:进行过滤配置
需求:可以同步ppt word 数据库信息,其他数据库变化不关注
永久配置:

# vim /data/3309/data/my.cnf
replicate_do_db=ppt
replicate_do_db=word

临时配置:

# 在线调整参数实现过滤
help change replication filter
stop slave sql_thread;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (word, ppt);
start slave sql_thread;
# PS:一般企业中,数据库配置信息可以在临时和永久上都进行配置
-- 一般编写配置文件和在线配置都会进行,可以不重启数据库服务生效过滤机制,日后重启数据库后过滤机制依然生效;

# 查看获取从库过滤配置
mysql> show slave status\G
Replicate_Do_DB: word,ppt
Replicate_Ignore_DB:

2、数据库半同步复制实践 (数据库同步一致性)

第一步:主从数据库安装半同步功能插件

# 主库安装半同步插件(3307)
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 主库利用插件控制ack_receiver线程接收ack确认信息,并且会控制commit阻塞,实现半同步复制功能
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------------+----------+
| Name                            | Status   | Type               | Library                  | License |
+---------------------------------+----------+--------------------+--------------------------+----------+
| rpl_semi_sync_master            | ACTIVE   | REPLICATION        | semisync_master.so       | GPL     |
+---------------------------------+----------+--------------------+--------------------------+----------+
-- 查看插件是否进行加载

# 从库安装半同步插件(3309)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 从库利用插件控制IO线程发送ack确认信息;
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------------+----------+
| Name                 | Status   | Type                   | Library                       | License |
+---------------------------------+----------+--------------------+--------------------------+----------+
| rpl_semi_sync_slave             | ACTIVE  | REPLICATION    | semisync_slave.so    | GPL       |
+---------------------------------+----------+--------------------+--------------------------+----------+
-- 查看插件是否进行加载

第二步:主从数据库启动半同步插件功能:

# 主库启动半同步功能
mysql> set global rpl_semi_sync_master_enabled =1;

# 从库启动半同步功能
mysql> set global rpl_semi_sync_slave_enabled =1;

# 重启从库上的IO线程
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

mysql> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)
-- 查看主库状态

mysql> show status like 'rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.06 sec)
-- 查看从库状态

永久配置:

# 在数据库配置文件中编写以下参数
rpl_semi_sync_master_enabled=on
-- 主库半同步功能启停设置,on为激活设置
rpl_semi_sync_master_timeout=1000
-- 主库接收从库确认信息的超时时间设置(单位毫秒)
rpl_semi_sync_master_trace_level=32
rpl_semi_sync_master_wait_for_slave_count=1
rpl_semi_sync_master_wait_no_slave=on
rpl_semi_sync_master_wait_point=after_sync
binlog_group_commit_sync_delay=1
binlog_group_commit_sync_no_delay_count=1000
-- 实现事务组提交方式,将多个事务合并成组推送到从库上,避免dump线程采用串型方式提交事务,造成主从同步延时;

rpl_semi_sync_slave_enabled=on
-- 从库半同步功能启停设置,on为激活设置
rpl_semi_sync_slave_trace_level=32

stop slave io_thread;

3、数据库GTID复制实践

优势:可以自动识别位置点 便于异常情况自动修复主从关系

第一步:准备主从主机信息
省略

第二步:进行gtid主从配置
主库配置:

# 配置参数信息
gtid-mode=on
-- 启用gtid复制方式,默认采用传统的复制方式
enforce-gtid-consistency=true
-- 开启gtid所有节点的强制一致性
log-slave-updates=1
-- 定义slave更新是否记入二进制日志,从而增强数据一致性,是在高可用架构中重要配置环节

# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/3306/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF

从库配置:

# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
#autocommit=0
log_bin=/data/3306/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF

第三步:进行主从关系构建
主库:

-- 进行数据信息全备/恢复
[root@db01 ~]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction >/tmp/full.sql
create user repl@'10.0.0.%' identified with mysql_native_password by '123456';
grant replication slave on *.* to repl@'10.0.0.%';

[root@db01 ~]# scp -rp /tmp/full.sql 10.0.0.52:/tmp/

从库:



[root@db02 data]# vim /tmp/full.sql 
-- master-data is deprecated and will be removed in a future version. Use --source-data instead
-- master-data is deprecated and will be removed in a future version. Use --source-data instead.
-- MySQL dump 10.13  Distrib 8.0.26, for Linux (x86_64)

[root@db02 data]# mysql -uroot -p123456 </tmp/full.sql

change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123456',
master_auto_position=1;
-- 表示让从库自己找寻复制同步数据的起点;
-- 在第一次启动gtid功能时,会读取从库中的binlog日志信息,根据主库uuid信息,获取从库中执行过的主库gtid信息
-- 从从库中没有执行过的主库gtid信息之后进行进行数据同步操作
db02 [(none)]> start slave;
-- 其他从库一并操作

知识扩展:实现自动获取同步位置点
主从同步获取主库的gtid信息,获取同步位置点,并且不断更新位置点:

db01 [(none)]>show master status;
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                            |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| mysql-bin.000002 |         681 |                           |                                 | 3cfa5898-771a-11ed-b8d7-000c2996c4f5:1-2 |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
1 row in set (0.00 sec)
-- 主库查看状态信息,获取gtid同步信息,gtid信息将会存储的位置:binlog、relaylog、master-info(uuid)

db02 [(none)]>show master status;
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                            |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| mysql-bin.000002 |         695 |                           |                                 | 3cfa5898-771a-11ed-b8d7-000c2996c4f5:1-2 |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
1 row in set (0.00 sec)
db03 [(none)]>show master status;
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                            |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
| mysql-bin.000002 |         695 |                           |                                 | 3cfa5898-771a-11ed-b8d7-000c2996c4f5:1-2 |
+-----------------------+-----------+-------------------+-----------------------+-------------------------------------------------------+
1 row in set (0.00 sec)
-- 从库查看状态信息,获取gtid同步信息;gtid信息将会存储的位置:binlog、relaylog、master-info(uuid)
-- show binlog events in 'mysql-bin.000002' 获取从库自己的binlog信息,得到gitd同步的位置点;

知识扩展:进行全备恢复数据时不要加 set-gtid-purged参数
如果是已经运行很久的数据库,需要构建主从,都是需要备份恢复主库数据后,再开启实现主从功能的;
在mysqldump进行备份数据时,不要加set-gtid-purged参数,否则会造成从库依旧从第一个gtid信息开始同步数据;
造成主从同步数据信息冲突,影响主从构建过程,导致主从同步过程失败;

# 未加set-gtid-purged参数实现的数据备份效果
[root@xiaoQ-01 ~]# mysqldump -A --master-data=2 --single-transaction >/tmp/full.sql
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 
[root@xiaoQ-01 ~]# vim /tmp/full.sql
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '3cfa5898-771a-11ed-b8d7-000c2996c4f5:1-2';
-- 表示让从库删除1-2的集合信息,即通过备份文件已经恢复了1-2的数据,可以从1-2之后进行数据信息同步;

# 已加set-gtid-purged参数实现的数据备份效果
[root@xiaoQ-01 ~]# mysqldump -A --master-data=2 --single-transaction --set-gtid-purged=OFF >/tmp/full02.sql
[root@xiaoQ-01 ~]# vim /tmp/full.sql
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '3cfa5898-771a-11ed-b8d7-000c2996c4f5:1-2';
SET SQL_LOG_BIN=0;
-- 以上信息不会出现在备份文件中
-- 表示会让从库把备份文件中的操作语句,再次根据gtid请求执行一遍,容易产生异常冲突问题;

–set-gtid-purged=on/auto 此为默认参数,即使在备份命令中不写,依旧生效;
它的效果是在mysgldump输出的备份文件中生成 SET@@GLOBAL.GTID_PURGED语句;备份文件中的这条语句记录了GTID号。

  • 参数应用场景-主从复制:

image-20240913140214767

当需要构建主从的时候,主库上有许多数据需要先备份出来并恢复到从库上,以此来保持两个库没有差异,然后再去配置主从。
这种场景下一定要用on;想要基于GTID实现主从复制,从库是基于MASTER_AUTO_POSITION=1自动获取并应用GTID的。

  • 参数应用场景-普通备份:

在GTID开启的情况下,MYSQL通过binlog恢复时,若有匹配到重复,相同的GTID日志记录,则会直接跳过;所以,在截取binlog时,需要忽略原日志中的GTID,如果不忽略,则在恢复时就会因为GTID相同而跳过,导致恢复失败;在执行恢复前,同样需要执行sql_log_bin=0,因为原binlog文件中已有记录,无需再次记录。

4、数据库克隆复制实践

# 清理原有从库配置应用(db03)
db03 [(none)]>stop slave;
db03 [(none)]>reset slave all;

# 准备数据库空白的节点
[root@xiaoQ-03 ~]# pkill mysqld
[root@xiaoQ-03 ~]# rm -rf /data/3306/*
[root@xiaoQ-03 ~]# rm -rf /data/binlog/*
[root@xiaoQ-03 ~]# mv /etc/my.cnf /tmp
[root@xiaoQ-03 ~]# mkdir -p /data/3306/data /data/binlog
[root@xiaoQ-03 ~]# chown -R mysql.mysql /data/*
-- 在新的数据库节点进行以上清理操作;

cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF
-- 从库db03配置文件编写

[root@xiaoQ-03 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
-- 进行数据库所有节点初始化操作

[root@xiaoQ-03 ~]# /etc/init.d/mysqld start
-- 启动数据库相应节点服务

免交互操作:

# 实现免交互方式安装插件和创建用户(主库操作)
[root@db01 ~]# mysql -uroot -p123456 -e "INSTALL PLUGIN clone SONAME 'mysql_clone.so';create user test@'%' identified by '123456';grant backup_admin on *.* to 'test'@'%';"

# 实现免交互方式安装插件和创建用户(从库操作)
[root@db02 ~]# mysql -uroot -p123456 -e "INSTALL PLUGIN clone SONAME 'mysql_clone.so';create user test@'%' identified by '123456';grant clone_admin on *.* to 'test'@'%';set global clone_valid_donor_list='10.0.0.51:3306';"
# 从库上启用克隆功能

[root@db02 ~]# mysql -utest -p123456 -h10.0.0.52 -P3306 -e "clone instance from test@'10.0.0.51':3306 identified by '123456';"
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3707 (HY000) at line 1: Restart server failed (mysqld is not managed by supervisor process).
[root@db02 ~]# systemctl start mysqld.service 
[root@db02 ~]# mysql -uroot -p123456 -e "select stage,state,end_time from performance_schema.clone_progress;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+-----------+----------------------------+
| stage     | state     | end_time                   |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2024-09-13 14:17:30.710581 |
| FILE COPY | Completed | 2024-09-13 14:17:31.131944 |
| PAGE COPY | Completed | 2024-09-13 14:17:31.147801 |
| REDO COPY | Completed | 2024-09-13 14:17:31.153531 |
| FILE SYNC | Completed | 2024-09-13 14:17:31.572323 |
| RESTART   | Completed | 2024-09-13 14:22:18.111384 |
| RECOVERY  | Completed | 2024-09-13 14:22:18.967095 |
+-----------+-----------+----------------------------+


[root@xiaoQ-03 ~]# mysql -uroot -p123456 -e "change master to master_host='10.0.0.51',master_user='repl',master_password='123456',master_auto_position=1;start slave"

[root@db02 ~]# mysql -uroot -p123456 -e "show slave status\G"|grep -i "yes"
mysql: [Warning] Using a password on the command line interface can be insecure.
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


# 卸载插件并查看
db01 [(none)]>UNINSTALL PLUGIN clone;
db01 [(none)]>show plugins;

5、数据库多源复制实践

第一步:构建多源复制架构
两台主服务器(51、52)一台从服务器(53)

第二步:所有实例重新初始化

[root@db01 ~]# systemctl stop mysqld.service 
[root@db01 ~]# ps -ef|grep mysql
root       2459   1214  0 15:27 pts/0    00:00:00 grep --color=auto mysql
[root@db01 ~]# rm -rf /data/3306/data/*
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

编写配置文件:

# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=51
socket=/tmp/mysql.sock
log_bin=/data/3306/data/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
-- 这个参数控制着innodb数据文件及redo log的打开、刷写模式
-- 参考资料:https://blog.csdn.net/h106140873/article/details/125701485
slow_query_log=ON
slow_query_log_file=/data/3306/data/db01-slow.log
long_query_time=0.1
log_queries_not_using_indexes
-- 生成慢日志信息功能配置参数
master_info_repository=TABLE
-- 将master_info信息以表方式记录
relay_log_info_repository=TABLE
-- 将relay_log_info信息以表方式记录
[client]
socket=/tmp/mysql.sock
[mysql]
prompt=db01 [\\d]>
-- 数据库命令提示符设置,可以参考官方设置:https://dev.mysql.com/doc/refman/8.0/en/mysql-commands.html
socket=/tmp/mysql.sock
EOF



cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=51
socket=/tmp/mysql.sock
log_bin=/data/3306/data/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
slow_query_log=ON
slow_query_log_file=/data/3306/data/db01-slow.log
long_query_time=0.1
log_queries_not_using_indexes

[mysql]
prompt=db01 [\\d]>
socket=/tmp/mysql.sock
EOF

# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=52
socket=/tmp/mysql.sock
log_bin=/data/3306/data/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
slow_query_log=ON
slow_query_log_file=/data/3306/data/db02-slow.log
long_query_time=0.1
log_queries_not_using_indexes

[mysql]
prompt=db02 [\\d]>
socket=/tmp/mysql.sock
EOF


# 主库db03配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=53
socket=/tmp/mysql.sock
log_bin=/data/3306/data/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
slow_query_log=ON
slow_query_log_file=/data/3306/data/db03-slow.log
long_query_time=0.1
log_queries_not_using_indexes

[mysql]
prompt=db03 [\\d]>
socket=/tmp/mysql.sock
EOF

# systemctl start mysqld.service
# ps -ef|grep mysql

第三步:主从构建过程
主库配置信息:

set sql_log_bin=0;
create user repl@'10.0.0.%' identified with mysql_native_password by '123456';
grant replication slave on *.* to repl@'10.0.0.%';
set sql_log_bin=1;
-- 两个主库上创建主从复制用户信息,并且不要产生创建用户日志信息,因为多个主节点可能用户信息不一致,会导致同步异常

从库配置信息:

db03 [(none)]>change master to
master_host='10.0.0.51',
master_user='repl',
master_password='123456',
master_auto_position=1 for channel 'Master_1';

db03 [(none)]>change master to
master_host='10.0.0.52',
master_user='repl',
master_password='123456',
master_auto_position=1 for channel 'Master_2';

db03 [(none)]> start slave for channel 'Master_1';
db03 [(none)]> start slave for channel 'Master_2';

查看:

db03 [(none)]> show slave status for channel 'Master_1'\G
db03 [(none)]> show slave status for channel 'Master_2'\G
-- 多源主从状态监控信息分别查看,重点关注Channel_Name信息和IO SQL线程状态
db03 [(none)]> use performance_schema;
db03 [(none)]> select * from replication_connection_configuration\G
db03 [(none)]> select * from replication_connection_status where channel_name='master_1'\G
db03 [(none)]> select * from replication_connection_status where channel_name='master_2'\G
-- 多源主从状态监控信息汇总查看,或进行单独查看
db03 [(none)]> select * from performance_schema.replication_applier_status_by_worker\G;
-- 多源主从复制线程工作情况查看,了解即可

主从多源复制数据信息过滤
如果多个主库之间存在相同的数据表信息,在进行多源复制时,需要进行过滤处理,避免汇总在从库中产生数据不一致的情况;

db03 [(none)]> change replication filter replicate_wild_do_table=('db1.%') channel "Master_1";
db03 [(none)]> change replication filter replicate_wild_do_table=('db2.%') channel "Master_2";

6、数据库MGR组复制实践

单主模式构建MGR

第一步:构建多源复制架构
一台主服务器(51)两台从服务器(52、53)

第二步:所有实例重新初始化

[root@db01 ~]# systemctl stop mysqld.service 
[root@db01 ~]# ps -ef|grep mysql
root       2459   1214  0 15:27 pts/0    00:00:00 grep --color=auto mysql
[root@db01 ~]# rm -rf /data/3306/data/*
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

第三步:编写配置文件信息:

# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
report_host=10.0.0.51
report_port=3306
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.51:33061"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=OFF

[mysql]
prompt=db01 [\\d]>
EOF

binlog_transaction_dependency_tracking=WRITESET
-- 在数据库8.0之后具有的配置,表示写集合配置信息,可以进一步提升SQL线程回放的并发度;(需要表有主键)
-- 是可以实现跨事务并发执行
transaction_write_set_extraction=XXHASH64
-- 定义写集合的hash算法信息,也属于数据库8.0之后具有的特性配置
-- 以上两行参数信息不加上,就表示与5.7版本数据库可以进行兼容,可以理解为是优化参数
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
-- 设置组复制各个节点的统一唯一uuid标识信息,即同一组复制内部的唯一标识;
-- 一样就表示可以加入同一组复制中,不同就表示不加入到相同的组复制中
loose-group_replication_start_on_boot=OFF
-- 在组复制过程中也是需要启动相应线程,完成组复制任务的;
-- 此参数配置表示在服务启动时,不自动运行启动组复制功能,一般都是进行手工启动
-- 主要是防止数据库意外重启后,对组复制之间关系的影响,不能让重启后数据库自动加入到组复制中
loose-group_replication_local_address="110.0.0.51:33061"
-- 表示定义本地主机数据库服务的内部通讯地址和端口
loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063"
-- 表示定义所有集群主机的内部通讯地址和端口
-- 以上地址和端口信息,表示组复制集群内部通讯时,应用的地址和端口信息;
-- 内部通讯需求:心跳检测、复制关系、日志同步、投票、选举...,都是通过内部地址和端口进行的;
loose-group_replication_bootstrap_group=OFF
-- 表示是否将此节点作为引导节点
-- 组复制在第一次进行配置时,需要先有引导节点,其他节点做为加入节点(joiner),不能都是ON,否则会产生争抢问题
-- 以上参数信息中loose,表示在没有组复制插件时,进行初始化操作只会报警告信息,而不会报错误提示


# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
report_host=10.0.0.52
report_port=3306
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.52:33062"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=OFF

[mysql]
prompt=db02 [\\d]>
EOF

# 主库db03配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/data/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
report_host=10.0.0.53
report_port=3306
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.53:33063"
loose-group_replication_group_seeds="10.0.0.51:33061,10.0.0.52:33062,10.0.0.53:33063"
loose-group_replication_bootstrap_group=OFF

[mysql]
prompt=db03 [\\d]>
EOF


root@db01 ~]# systemctl restart mysqld.service
[root@db01 ~]# systemctl status mysqld.service

第三步:MGR单主模式配置过程:

# 设置本地root用户密码和密码插件(所有节点)
mysql -S /tmp/mysql.sock -e "alter user 'root'@'localhost' identified with mysql_native_password by '123';"

# 安装部署MGR组复制功能插件(所有节点)
mysql -uroot -p123 -S /tmp/mysql.sock -e "install plugin group_replication SONAME 'group_replication.so';"
[root@db03 ~]# mysql -uroot -p123 -S /tmp/mysql.sock -e "show plugins;"

# 设置创建MGR组复制功能账号(所有节点)
mysql -uroot -p123 -S /tmp/mysql.sock
set sql_log_bin=0;
create user repl@'%' identified by '123';
grant replication slave,replication client on *.* to repl@'%';
flush privileges;
set sql_log_bin=1;
-- 设置主库上同步用户信息

# 启动MGR单主模式:启动MGR引导节点(在db01主库上执行)
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
-- 主库创建
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
-- 相当于创建一个组复制集群,并指定集群中的引导节点
select * from performance_schema.replication_group_members;
-- 查看集群节点状态信息,以及集群成员信息
db01 [(none)]>select * from performance_schema.replication_group_members;


# 其他几点加入MGR(在所有db02 db03从库上执行)
reset master;
-- 表示清除从库上所有日志信息,重新做日志信息的复制或生成;
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
-- 设置想要加入组信息
start group_replication;
-- 将指定从库节点加入到组复制集群中(企业中最好先备份恢复一定的数据,在进行组复制应用)
select * from performance_schema.replication_group_members;

db01 [(none)]>select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | ME
+---------------------------+--------------------------------------+-------------+-------------+---
| group_replication_applier | cb5ceaa4-7243-11ef-b4bd-000c29978564 | 10.0.0.51   |        3306 | ON
| group_replication_applier | cbbe48ad-7243-11ef-b219-000c293e27f0 | 10.0.0.53   |        3306 | ON
| group_replication_applier | cbe48e48-7243-11ef-b388-000c291290fe | 10.0.0.52   |        3306 | ON
+---------------------------+--------------------------------------+-------------+-------------+---
3 rows in set (0.00 sec)

show variables like '%only%';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| read_only                              | ON    |
| super_read_only                        | ON    |
+----------------------------------------+-------+
-- 此时所有从库节点只能实现只读操作,只有主库可以进行写操作

# 遇到集群构建异常,可以进行重置操作
stop group_replication;
reset master;
set sql_log_bin=0;
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
start group_replication;

多主模式构建MGR


原文地址:https://blog.csdn.net/dws123654/article/details/142982252

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!