mysql组复制配置
时间:2017-10-26 13:17 来源:潇湘夜雨 作者:华嵩阳 点击:次
一、环境介绍
1、软件版本
mysql5.7.19
centos6.8
2、服务器架构
mq129:192.168.198.129
mq130:192.168.198.130
3、组复制的要求
InnoDB存储引擎。数据必须存储在InnoDB的事务性存储引擎
主键。组要复制的每一个表必须有一个定义的主键或主键等价,其中等效为一个非空唯一键。这样的键是表中每行的惟一标识符,它使系统能够确定每个事务修改过的行,从而确定哪些事务冲突。
IPv4网络。MySQL组复制所使用的组通信引擎只支持IPv4。因此,组复制需要IPv4网络基础设施。
网络性能。组复制被设计为在集群环境中部署,服务器实例彼此非常接近,同时受到网络延迟和网络带宽的影响。
二、mysql安装与组复制
1.下载解压mysql安装文件
# tar -zxf mysql-5.7.19-linux-glibc2.5-x86_64.tar.gz
# ls
mysql-5.7.19-linux-glibc2.5-x86_64 mysql-5.7.19-linux-glibc2.5-x86_64.tar.gz wget-log
#scp -r mysql-5.7.19-linux-glibc2.5-x86_64/ /usr/local/mysql
# mkdir -p /data/mysql
useradd mysql -s /sbin/nologin
# chown -R root.mysql /data/mysql
2.数据库初始化
# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2017-08-13T09:42:16.883129Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-08-13T09:42:19.408722Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-08-13T09:42:19.795060Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-08-13T09:42:19.910316Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: b34ab5d1-800b-11e7-bbd7-000c2903e1e6.
2017-08-13T09:42:19.928496Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-08-13T09:42:19.957702Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
注:
之前版本mysql_install_db是在mysql_basedir/script下,5.7放在了mysql_install_db/bin目录下,且已被废弃
“–initialize”会生成一个随机密码(~/.mysql_secret),而”–initialize-insecure”不会生成密码
–datadir目标目录下不能有数据文件
3、配置文件中添加组复制参数
注意下面参数一定要配置正确,否则不能安装group_replication.so
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64 #server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="e360ffd4-99ec-11e7-b44b-000c29305a67" #告知插件加入或创建组命名UUID,十六进制格式。
loose-group_replication_start_on_boot=off #server启动时不自启组复制,第一次启动时配置,集群配置成功后在更改。
loose-group_replication_local_address= "192.168.198.129:24901" #告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_group_seeds= "192.168.198.129:24901,192.168.198.130:24901" #启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_bootstrap_group= off #节点初始化关闭
loose-group_replication_single_primary_mode=FALSE #关闭单主模式,这样才能多写,否则只有一个节点能写,其它节点为只读。
loose-group_replication_enforce_update_everywhere_checks= TRUE
组复制的主要参数:
group_replication_group_name:此服务器实例属于的组的名称。必须是一个有效的UUID。
group_replication_start_on_boot:服务器启动期间服务器是否应该启动组复制。
group_replication_local_address:组服务的本地地址、端口
group_replication_member_weight:分配给成员以影响在故障转移事件中当选成员的机会的百分比权重
group_replication_group_seeds:在开始组复制时,每个地址都被验证,列表必须至少包含一个有效地址。任何无效的主机名group_replication可能导致启动失败。
group_replication_force_members:假设你回到组s1和s2是组中唯一剩下的服务器的情况。服务器s3,s4和s5意外离开了组。要使服务器s1和s2继续,您希望强制仅包含s1和s2的成员资格配置。
group_replication_bootstrap_group:此选项必须只设置在一个服务器上,只有在第一次启动组或重新启动整个组时才设置。它应该在动态和配置文件中设置为关闭。从两个服务器或设置此选项而组运行可能导致人工脑裂情况的一个服务器重新启动,在独立的两组具有相同名称的自举。
group_replication_poll_spin_loops:在线程等待更多传入的网络消息之前,组通信线程等待通信引擎互斥体释放的次数。
group_replication_recovery_retry_coun:放弃连接失败节点的最大重试次数。
group_replication_recovery_reconnect_interval:重试的时间间隔
group_replication_auto_increment_increment:确定在这个服务器实例上执行的事务的连续列值之间的间隔
group_replication_compression_threshold:大于多少字节时使用压缩功能,0表示不压缩。
group_replication_gtid_assignment_block_size:连续gtids,留给各成员的数量。每个成员在需要时消耗块并储备更多。
group_replication_enforce_update_everywhere_checks:启用或禁用对多主更新的严格一致性检查。
group_replication_flow_control_applier_threshold:指定数量的等待交易在施放队列触发流量控制
配置文件示例
[root@mq129 mha]# cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
gtid-mode = on
enforce-gtid-consistency = 1
skip_slave_start = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
slave-preserve-commit-order=1
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="ce9be252-2b71-11e6-b8f4-00212844f856"
loose-group_replication_start_on_boot=on
loose-group_replication_local_address= "192.168.198.129:24901"
loose-group_replication_group_seeds= "192.168.198.129:24901,192.168.198.130:24901"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE
group_replication_auto_increment_increment=2 #自增长字段的值,如果节点较多,可以设大点,大于等于节点数,并且两边的增长值相同,降低事务冲突的概率。
default_password_lifetime=0
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
init-connect = 'SET NAMES utf8'
character-set-server = utf8
skip-name-resolve
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 0
query_cache_size = 0
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 30
log_timestamps = SYSTEM
log_error = /data/mysql/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp
skip-external-locking
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
innodb_locks_unsafe_for_binlog = 1
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
[root@mq130 ~]# cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
gtid-mode = on
enforce-gtid-consistency = 1
skip_slave_start = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
slave-preserve-commit-order=1
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="ce9be252-2b71-11e6-b8f4-00212844f856"
loose-group_replication_start_on_boot=on
loose-group_replication_local_address= "192.168.198.130:24901"
loose-group_replication_group_seeds= "192.168.198.129:24901,192.168.198.130:24901"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks=TRUE
group_replication_auto_increment_increment=2 #自增长字段的值,如果节点较多,可以设大点,大于等于节点数,并且两边的增长值相同,降低事务冲突的概率。
default_password_lifetime=0
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 2
init-connect = 'SET NAMES utf8'
character-set-server = utf8
skip-name-resolve
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 0
query_cache_size = 0
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 30
log_timestamps = SYSTEM
log_error = /data/mysql/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp
skip-external-locking
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
innodb_locks_unsafe_for_binlog = 1
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
配置好后启动mysql
4、创建账号
#下面操纵不写入二进制日志,避免修改传递给其他实例,先关闭
set sql_log_bin=0;
#创建拥有replication slave权限mysql用户
create user rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'%' identified by '123456';
flush privileges;
#开启二进制写入
set sql_log_bin=1;
#分布式恢复加入组的server执行第一步
#change master to语言将server配置为,在下次需要从其他成员恢复状态时,使用group_replication_recovery复制通道的给定凭证。
CHANGE MASTER TO MASTER_USER='tongbu', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
5、启动组复制
#安装组复制插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.00 sec)
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
启动组复制程序(复制组只启动一次就行)
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | e360ffd4-99ec-11e7-b44b-000c29305a67 | mq129 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
新增节点
#下面操纵不写入二进制日志,避免修改传递给其他实例,先关闭
set sql_log_bin=0;
#创建拥有replication slave权限mysql用户
create user rpl_user@'%';
GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'%' identified by '123456';
flush privileges;
#开启二进制写入
set sql_log_bin=1;
#分布式恢复加入组的server执行第一步
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.00 sec)
#change master to语言将server配置为,在下次需要从其他成员恢复状态时,使用group_replication_recovery复制通道的给定凭证。
CHANGE MASTER TO MASTER_USER='tongbu', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
mysql>start group_replication;
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | ca1c7a1f-9dc4-11e7-a002-000c2903e1e6 | mq130 | 3306 | ONLINE |
| group_replication_applier | e360ffd4-99ec-11e7-b44b-000c29305a67 | mq129 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
【注意】 前面的用户密码修改和创建用户操作必须设置binlog不记录,执行后再打开,否则会引起START GROUP_REPLICATION执行报错:
[ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group
解决方案是:根据提示打开group_replication_allow_local_disjoint_gtids_join选项,mysql命令行执行:
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> set global super_read_only='OFF';
Query OK, 0 rows affected (0.00 sec)
三、测试
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> CREATE TABLE t2 (c1 INT, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (3, 'his');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1; #查看另一节点的数据。
+----+------+
| c1 | c2 |
+----+------+
| 1 | Luis |
| 2 | guis |
| 3 | his |
+----+------+
[root@mq129 ~]# mysqldbcompare --server1=/etc/myclient.cnf[client] --server2=/etc/myclient.cnf[client2] -t test:test
# server1 on mq129: ... connected.
# server2 on mq130: ... connected.
# Checking databases test on server1 and test on server2
#
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE t1 FAIL pass -
# - Compare table checksum pass
#
# Object definitions differ. (--changes-for=server1)
#
--- `test`.`t1`
+++ `test`.`t1`
@@ -2,4 +2,4 @@
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` text NOT NULL,
PRIMARY KEY (`c1`)
-) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8
+) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8
#注意:组复制中自增长的值可能是不一致的,这是为了减少事务冲突。
四、状态监控
mysql> SELECT * FROM performance_schema.replication_group_member_stats; #查看事务执行状态
+---------------------------+---------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+
| CHANNEL_NAME | VIEW_ID | MEMBER_ID | COUNT_TRANSACTIONS_IN_QUEUE | COUNT_TRANSACTIONS_CHECKED | COUNT_CONFLICTS_DETECTED | COUNT_TRANSACTIONS_ROWS_VALIDATING | TRANSACTIONS_COMMITTED_ALL_MEMBERS | LAST_CONFLICT_FREE_TRANSACTION |
+---------------------------+---------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+
| group_replication_applier | 15059656909406590:2 | e360ffd4-99ec-11e7-b44b-000c29305a67 | 0 | 7 | 0 | 0 | ca1c7a1f-9dc4-11e7-a002-000c2903e1e6:1,
ce9be252-2b71-11e6-b8f4-00212844f856:1-6:1000002-1000004,
e360ffd4-99ec-11e7-b44b-000c29305a67:1-10631:1000010-1010370,
fbc3482e-99ed-11e7-b970-000c2903e1e6:1-2 | ce9be252-2b71-11e6-b8f4-00212844f856:6 |
+---------------------------+---------------------+--------------------------------------+-----------------------------+----------------------------+--------------------------+------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------+
mysql> SELECT * FROM performance_schema.replication_applier_status;
+----------------------------+---------------+-----------------+----------------------------+
| CHANNEL_NAME | SERVICE_STATE | REMAINING_DELAY | COUNT_TRANSACTIONS_RETRIES |
+----------------------------+---------------+-----------------+----------------------------+
| group_replication_applier | ON | NULL | 0 |
| group_replication_recovery | OFF | NULL | 0 |
+----------------------------+---------------+-----------------+----------------------------+
mysql> SELECT * FROM performance_schema.replication_applier_status_by_worker;
+----------------------------+-----------+-----------+---------------+---------------------------------------------+-------------------+--------------------+----------------------+
| CHANNEL_NAME | WORKER_ID | THREAD_ID | SERVICE_STATE | LAST_SEEN_TRANSACTION | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | LAST_ERROR_TIMESTAMP |
+----------------------------+-----------+-----------+---------------+---------------------------------------------+-------------------+--------------------+----------------------+
| group_replication_applier | 0 | 39 | ON | ce9be252-2b71-11e6-b8f4-00212844f856:149592 | 0 | | 0000-00-00 00:00:00 |
| group_replication_recovery | 0 | NULL | OFF | ce9be252-2b71-11e6-b8f4-00212844f856:57937 | 0 | | 0000-00-00 00:00:00 |
+----------------------------+-----------+-----------+---------------+---------------------------------------------+-------------------+--------------------+----------------------+
mysql> SELECT * FROM performance_schema.replication_connection_configuration;
+----------------------------+--------+------+--------+-------------------+---------------+-------------+-------------+-------------+-----------------+------------+---------+-------------------------------+--------------+--------------+---------------------------+------------------------+--------------------+-------------+
| CHANNEL_NAME | HOST | PORT | USER | NETWORK_INTERFACE | AUTO_POSITION | SSL_ALLOWED | SSL_CA_FILE | SSL_CA_PATH | SSL_CERTIFICATE | SSL_CIPHER | SSL_KEY | SSL_VERIFY_SERVER_CERTIFICATE | SSL_CRL_FILE | SSL_CRL_PATH | CONNECTION_RETRY_INTERVAL | CONNECTION_RETRY_COUNT | HEARTBEAT_INTERVAL | TLS_VERSION |
+----------------------------+--------+------+--------+-------------------+---------------+-------------+-------------+-------------+-----------------+------------+---------+-------------------------------+--------------+--------------+---------------------------+------------------------+--------------------+-------------+
| group_replication_applier | <NULL> | 0 | test | | 1 | NO | | | | | | NO | | | 60 | 86400 | 30.000 | |
| group_replication_recovery | <NULL> | 0 | tongbu | | 1 | NO | | | | | | NO | | | 60 | 1 | 30.000 | |
+----------------------------+--------+------+--------+-------------------+---------------+-------------+-------------+-------------+-----------------+------------+---------+-------------------------------+--------------+--------------+---------------------------+------------------------+--------------------+-------------+
mysql> SELECT * FROM performance_schema.replication_connection_status;
+----------------------------+--------------------------------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+--------------------+----------------------+
| CHANNEL_NAME | GROUP_NAME | SOURCE_UUID | THREAD_ID | SERVICE_STATE | COUNT_RECEIVED_HEARTBEATS | LAST_HEARTBEAT_TIMESTAMP | RECEIVED_TRANSACTION_SET | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE | LAST_ERROR_TIMESTAMP |
+----------------------------+--------------------------------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+--------------------+----------------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 | ce9be252-2b71-11e6-b8f4-00212844f856 | NULL | ON | 0 | 0000-00-00 00:00:00 | ca1c7a1f-9dc4-11e7-a002-000c2903e1e6:1,
ce9be252-2b71-11e6-b8f4-00212844f856:1-193288:1000002-1035381,
e360ffd4-99ec-11e7-b44b-000c29305a67:1-10631:1000010-1010370,
fbc3482e-99ed-11e7-b970-000c2903e1e6:1-2 | 0 | | 0000-00-00 00:00:00 |
| group_replication_recovery | | | NULL | OFF | 0 | 0000-00-00 00:00:00 | | 0 | | 0000-00-00 00:00:00 |
+----------------------------+--------------------------------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+--------------------+----------------------+
五、组复制的相关问题
注意,组复制不是同步的,但最终是同步的。更确切地说,事务以相同的顺序传递给所有组成员,但它们的执行不同步,这意味着在接受了一个事务之后,每个成员都按自己的步调提交。
当提交的事务过大时,各节点的数据可能不是实时一致的。
设置全局group_replication_recovery_retry_count = 10;
注意,集群恢复的最大重连次数。
的group_replication_recovery_reconnect_interval插件变量定义了恢复过程应该睡多少时间供连接尝试之间。此变量的默认设置为60秒,您可以动态地更改此值。下面的命令将恢复供体连接重试间隔设置为120秒。
设置全局group_replication_recovery_reconnect_interval = 120;
但是请注意,每次连接尝试之后,恢复不会休眠。
一组中MySQL服务器的最大数量是多少?
一个组最多可以包含9个服务器。试图向具有9个成员的组添加另一个服务器时,将导致拒绝加入请求。
一组中的服务器是如何连接的?
组中的服务器通过打开点对点TCP连接连接到组中的其他服务器。这些连接仅用于组中服务器之间的内部通信和消息传递。
用于group_replication_bootstrap_group选项是什么?
引导标志指示一个成员创建一个组并充当初始种子服务器。第二成员加入集团需要向成员,引导组动态改变配置,以便它可以添加到组。
成员需要在两种场景中引导该组。当最初创建组时,或者关闭和重新启动整个组时。
我如何恢复过程设置凭据?
使用变更主机到语句预配置组复制恢复通道凭据。
我可以扩展我写负载使用组复制?
不是直接的,但是MySQL组复制是一个没有共享的完全复制解决方案,其中组中的所有服务器都复制相同数量的数据。因此,如果该组中的一个成员以事务提交操作的结果将n字节存储到存储中,那么大约n个字节被写入到其他成员的存储中,因为事务被到处复制。
然而,考虑到其他成员不需要在最初执行事务时对原始成员进行相同的处理,所以它们更快地应用更改。事务被复制为只应用行转换的格式,而无需再次执行事务(基于行的格式)。
此外,鉴于更改是以行为基础的格式传播和应用的,这意味着它们以优化和紧凑的格式接收,并可能减少与发起成员相比所需的IO操作数量。
总之,可以通过在组中不同的成员之间传播无冲突事务来扩展处理过程。您可能会缩小IO操作的一小部分,因为远程服务器只接收必要的更改,以便读取、修改、写入、更改到稳定存储。
与简单复制相比,在相同的工作负载下,组复制需要更多的网络带宽和CPU吗?
需要一些额外的负载,因为为了同步目的,服务器需要不断地交互。这是很难量化的多少数据。它还取决于组的大小(三个服务器对带宽需求的压力小于组中的九个服务器)。
内存和CPU占用量也较大,因为服务器同步部分和组消息传递要做更复杂的工作。
我能在广域网中部署组复制吗?
是的,但每个成员之间的网络连接必须是可靠的,具有合适的性能。低延迟、高带宽网络连接是优化性能的要求。
如果网络带宽是一个问题,然后17.9.7.2节,“信息压缩”可以用较低的带宽要求。然而,如果网络丢弃数据包,导致重新传输和更高的端到端延迟,吞吐量和延迟都会受到负面影响。
警告
当网络往返时间(RTT)任何集团成员之间是2秒或更多的你可能会遇到的问题为内置故障检测机制可以正确触发。
如果临时连接问题,成员是否自动重新加入一个组?
这取决于连接问题的原因。如果连接问题是暂时的,重新连接足够快,故障检测器不知道它,那么服务器就不能从组中删除。如果它是一个“长”的连接问题,那么故障检测器最终会怀疑问题,服务器从组中移除。
一旦服务器从组中移除,您需要再次加入它。换句话说,在从组中显式删除服务器之后,需要手动重新添加服务器(或者脚本自动执行)。
什么时候一个成员被排除在一个组之外?
如果成员变为静音,则其他成员将其从组配置中删除。实际上,当成员崩溃或网络断开时,这种情况可能发生。
检测到故障后,一个给定的超时逝去对于一个给定的成员和一个新的配置没有沉默的成员在它被创建。
当一个节点明显落后时会发生什么?
没有定义何时自动从组中开除成员的策略。你需要找出为什么一个成员落后或修复或从组中删除成员。否则,如果服务器速度太慢,触发了流量控制,那么整个组也会慢下来。流程控制可以根据您的需要进行配置。
如果在小组中怀疑有问题,是否有一个特殊的成员负责触发重新配置?
没有,小组中没有专门负责触发重新配置的成员。
任何成员可怀疑有问题。所有成员都必须(自动)同意某一成员已失败。其中一个成员负责将其逐出组,触发一个重新配置。哪个成员负责驱逐成员不是你可以控制或设置的。
我可以用组复制的碎片?
组复制旨在提供高度可用的副本集;数据和写入在组中的每个成员上重复。缩放超出单个系统所能提供的,你需要一个业务流程和分片框架围绕一组复制集,其中每个副本集维护和管理一个给定的总数据碎片或分区。这种类型的安装,通常称为“分片集群规模,允许你读取和写入线性无限制。
我如何使用组复制SELinux吗?
如果SELinux被启用,您可以验证使用sestatus V,那么你需要使该组复制通信端口的使用,配置的group_replication_local_address为mysqld,以便它可以绑定到它,听我说。看看哪个端口MySQL是目前允许使用,问题semanage港-我| grep mysqld。假设端口配置为6606,添加必要的端口允许SELinux通过发行semanage港- T mysqld_port_t -p tcp 6606。
我如何使用组复制iptables?
如果防火墙被启用,那么你需要开放的端口组复制机器间通信。看目前的规则在每一台机器上,问题iptables - L.假设端口配置为6606,使发行iptables -输入-p tcp -运动6606 J接受超过必要的端口通信。
如何恢复组成员使用的复制通道的中继日志?
组复制使用的复制通道与主复制到从复制中使用的复制通道的行为相同,因此依赖于中继日志。在一个变化的relay_log变量时,或当选项不设置和主机名的变化,可能有错误。
见第16.2.4.1,“在这种情况下,恢复过程从中继日志”。或者,另一种固定的问题特别是在组复制是发出停止group_replication语句然后开始group_replication语句启动实例。
集团创建group_replication_applier通道再次复制插件。
组复制使您能够通过强制执行特定配置来重置组成员资格列表。例如,在上面的情况中,其中s1和s2是唯一的在线服务器,您可以选择强制包括仅s1和s2的成员资格配置。这需要检查有关s1和s2的一些信息,然后使用group_replication_force_members变量。
假设你回到组s1和s2是组中唯一剩下的服务器的情况。服务器s3,s4和s5意外离开了组。要使服务器s1和s2继续,您希望强制仅包含s1和s2的成员资格配置。
此过程使用group_replication_force_members并应被视为最后手段补救措施。它必须非常小心地使用,并且仅用于覆盖法定数量的损失。如果被滥用,它可能创建一个人为裂脑情景或完全阻止整个系统。
组复制插件具有一个配置选项,用于确定从哪些主机可以接受传入的组通信连接。此选项称为group_replication_ip_whitelist。如果在服务器s1上设置此选项,则当服务器s2正在建立与s1的连接以便进行组通信时,s1在接受s2传过来的连接之前,首先会检查白名单。如果s2在白名单中,则s1接受连接,否则s1拒绝s2的连接尝试。
如果未配置任何白名单,则服务器会自动将白名单设置为服务器当前IP地址的默认网段
每当IP白名单设置为AUTOMATIC时,在这种情况下可以发出错误日志中的条目,类似于:
[GCS] Added automatically IP ranges 127.0.0.1/8,192.168.198.130/24 to the whitelist
您可以通过手动设置允许进行组通信连接的IP地址列表来进一步提高组的安全性。可以使用CIDR表示法或简单的IP地址来指定列表。逗号必须分隔每个条目。例如:
mysql> STOP GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_ip_whitelist="10.120.40.237/18,10.178.59.44/22,127.0.0.1/8";
mysql> START GROUP_REPLICATION;
开启多线程复制
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 #线程数量
slave-preserve-commit-order=1
组复制存在以下已知的限制。
复制事件的校验。由于一个复制事件的校验和设计上的局限,组复制目前无法利用他们。因此,binlog校验=没有。
间隙锁。认证过程中不考虑间隙锁,对间隙锁的信息不可用在InnoDB。有关更多信息,请参见间隙锁。
注:除非您在应用程序中依赖可重复读取语义,否则我们建议使用组复制来使用读提交隔离级别。InnoDB不在读取使用间隙锁,使得当地的冲突检测的分布式冲突检测组复制执行InnoDB。
表锁和命名锁。认证过程中不考虑表锁(见第13.3.5,“锁表和解锁表语法”)或“锁(见get_lock())。
SERIALIZABLE隔离级别。SERIALIZABLE隔离级别不在多组默认支持。事务隔离级别设置为可序列化配置复制拒绝提交事务。
并发的DDL和DML操作。在使用多主模式时,不支持对同一对象执行不同的服务器的并发数据定义语句和数据操作语句。
数据定义语言(DDL)在执行一个对象的语句,执行并发的数据操作语言(DML)对同一对象在不同的服务器实例具有风险不冲突的DDL执行不同情况下的检测。
具有级联约束的外键。多主模式组(所有配置group_replication_single_primary_mode =关闭成员)不支持表的外键依赖多层次,具体表定义了级联外键约束。
这是因为导致一个多主模式组执行级联操作的外键约束可能导致未被发现的冲突,并导致该组成员之间不一致的数据。
因此,我们建议设置group_replication_enforce_update_everywhere_checks =on对服务器实例使用多主模式组避免漏检的冲突。
在单一主模式中,这不是问题,因为它不允许并发地写入组中的多个成员,因此没有未被发现的冲突的风险。
非常大的交易。这是足够大的,它不能被复制,集团成员之间在网络上一个5秒的窗口内可以导致在组通信故障gtid内容结果个人交易。
为了避免这个问题,尽可能地尽可能地限制事务的大小。例如,使用LOAD DATA INFILE分裂成较小的块文件。
|