Docker方式创建MySQL8的MGR集群
目录
- 一、MGR简述
- 二、安装环境及要求
- 2.1 系统版本
- 2.2 网络要求
- 三、安装步骤
- 3.1 创建容器
- 3.2 创建用户
- 3.3 安装插件
- 3. 4 启动集群
- 3.5 加入集群
- 四、查看集群
- 查看 MGR 组成员列表
- 查看 MGR 组成员拓扑信息
- 五、其他说明
- 集群配置要求
- 集群配置限制
- 集群相关变量和状态
一、MGR简述
MySQL Group Replication(MGR)它是一个MySQL插件,它建立在现有的MySQL复制基础设施上,利用二进制日志、基于行的日志和全局事务标识符等功能。MGR出来之后基本上可以替换之前的MHA之类的集群技术了。
这里简单整理一下MGR和传统的主从模式有什么区别:
对 比 特 性 | MySQL Group Replication(MGR) | 传统的主从复制 |
---|---|---|
数据同步方式 | 基于消息传递的复制机制 | 通过读取主节点的binlog进行数据复制 |
复制拓扑结构 | 对等结构,所有节点都可以接收写入操作并复制到其他节点 | 一个主节点和多个从节点 |
数据一致性 | 所有写入操作在集群中的所有节点上执行,事务在所有节点上成功应用后才提交 | 从主节点的binlog读取数据进行复制 |
自动故障转移 | 自动选择新的主节点 | 需要手动将一个从节点提升为新的主节点 |
复制延迟监控 | 提供了方便的方式来监控复制延迟 | 需要手动监控复制延迟 |
动态成员管理 | 动态添加和删除节点 | 需要在配置文件中手动添加和删除节点 |
搭建简易程度 | 中,需充分了解MGR知识点 | 简单 |
学习成本 | 中,仔细查看官方文档 | 低 |
重点说下 数据同步方式 和 复制拓扑结构:
- 数据同步方式:在传统的主从复制中,主节点将写入操作记录到二进制日志(binlog),从节点通过读取主节点的binlog并应用到自己的数据库中来实现数据复制。而MGR使用基于消息传递的复制机制,节点之间通过TCP/IP协议进行数据传输。每个节点都可以接收写入操作,并将其传播到其他节点,从而实现数据的同步。
- 复制拓扑结构:在传统的主从复制中,有一个主节点和多个从节点,主节点负责写入操作并将更新的数据写入binlog,从节点通过读取主节点的binlog来进行数据复制。而MGR中,所有的节点都是对等的,每个节点都可以接收写入操作并将其复制到其他节点。这种对等的结构使得MGR更加灵活和可扩展
接下来 采用3台物理主机安装具有3个节点的MGR集群,MGR集群架构为1主2从方式 ( MySQL8.0.27默认模式)
二、安装环境及要求
3台物理主机,按照docker环境,mysql镜像版本为 8.0.27,3台主机可相互访问且具有不同的主机名称
为了最佳的兼容性和性能,组中的所有成员应该运行相同版本的MySQL Server,
2.1 系统版本
主机名称 | IP地址 | 操作系统 | Docker版本 | Mysql镜像版本 | 备注 |
---|---|---|---|---|---|
mgr-master | 172.20.167.255 | Ubuntu 22.04.2 LTS | 24.0.5 | 8.0.27 | 主节点 |
mgr-node1 | 172.20.167.253 | Ubuntu 22.04.2 LTS | 24.0.5 | 8.0.27 | 从节点 |
mgr-node2 | 172.20.167.254 | Ubuntu 22.04.2 LTS | 24.0.5 | 8.0.27 | 从节点 |
2.2 网络要求
-
关闭SELinux
-
建议先关闭防火墙
-
【重要】各主机名称唯一
MGR各个节点之间默认采用主机名进行管理通讯。
-
【重要】各主机上的hosts文件中配置所有主机的名称和对应的IP地址
vim /etc/hosts
hosts文件后面追加信息:
172.20.167.253 mgr-node1 mgr-node1 172.20.167.255 mgr-master mgr-master 172.20.167.254 mgr-node2 mgr-node2
-
【重要】 创建Mysql Docker 容器的网络模式全部采用 host模式
为什么要用host模式?
因为MGR启动时需要验证主机IP地址和配置文件中MGR相关的IP是否一致,
如果不采用则报错无法启动MGR,否则你会看到如下错误:
... There is no local IP address matching the one configured for...
三、安装步骤
安装之前请务必参考上面的 安装环境及要求
安装之前请务必参考上面的 安装环境及要求
安装之前请务必参考上面的 安装环境及要求
3.1 创建容器
三台主机上创建MySQL容器映射目录:
mkdir -p /apps/mysql/data /apps/mysql/conf /apps/mysql/files
三台主机上配置各自的 my.cnf,这里只列出和MGR配置要求相关的参数信息:文件位置: /apps/mysql/conf/my.cnf
[mysqld]
port = 3309disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"default_time_zone = "+8:00"
transaction_isolation = READ-COMMITTED# 请确保每一台主机上是唯一值
server-id = 1log-bin=mysql-binbinlog_format = ROW
binlog_row_image = FULL
binlog_expire_logs_seconds = 1209600
master_info_repository = TABLErelay_log_info_repository = TABLE
log_replica_updates = ON
relay_log_recovery = 1replica_skip_errors = ddl_exist_errors
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
transaction_write_set_extraction = XXHASH64
gtid_mode = on
enforce_gtid_consistency=ON# MySQL 8.0.21可以不设置
#binlog_checksum=NONE
上面文件中的参数 确保每个主机上的 server-id 不一样
三台主机上执行docker命令创建容器
docker run \-u root \--network=host \--restart=always \--name mysql8 \-v /apps/mysql/conf/my.cnf:/etc/mysql/my.cnf \-v /apps/mysql/files:/var/lib/mysql-files \-v /apps/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=PassWord123_ \-d mysql:8.0.27
3.2 创建用户
登录mysql:
docker exec -it mysql8 /bin/bash
mysql> mysql -uroot -p -P3309
Enter password: 请输入mysql登录密码
然后执行下面的 1/2/3/4 步骤:
-
设置binlog 下面操作不用进入binlog
mysql> SET SQL_LOG_BIN=0;
-
创建用户赋予必要权限
mysql> CREATE USER rpl_user@'%' IDENTIFIED WITH mysql_native_password BY 'PassWord123_'; mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; mysql> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%'; mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%'; mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%'; mysql> FLUSH PRIVILEGES;
注意:
官方文档上有个Bug,这里创建用户密码需要采用 mysql_native_password,否则启动或加入集群会报用户名密码连接失败
-
恢复binglog
mysql> SET SQL_LOG_BIN=1;
-
将用户凭据提供给服务器以用于分布式恢复
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='PassWord123_' FOR CHANNEL 'group_replication_recovery';
注意:
MySQL 8.0.24版本之前使用下面的SQL
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='PassWord123_' FOR CHANNEL 'group_replication_recovery';
说明:
group_replication_recovery是MySQL Group Replication中的一个通道(channel),
用于执行分布式恢复操作。
在Group Replication中,每个成员(member)都可以充当复制源(replication source)
和复制目标(replication target)。当一个成员从其他成员复制数据时,
它可以使用group_replication_recovery通道来连接到复制源,并从中检索丢失的数据。
3.3 安装插件
必须安装 group_replication插件之后才能启动MGR集群,安装之后 my.cnf里面才能配置 MGR相关的参数。
- 三台主机上安装插件:
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
- 三台主机上查看插件:
mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+-------------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+-------------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | PROPRIETARY |(...)| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | PROPRIETARY |
+----------------------------+----------+--------------------+----------------------+-------------+
- 三台主机上添加参数:
172.20.167.255 修改 my.cnf 增加如下MGR参数配置
group_replication_group_name = "7cf70110-59f9-11ee-a293-246e967fa518"
group_replication_start_on_boot = off
group_replication_local_address = "172.20.167.255:33061"
group_replication_group_seeds = "172.20.167.255:33061,172.20.167.254:33061,172.20.167.253:33061"
group_replication_bootstrap_group = off
172.20.167.254 修改 my.cnf 增加如下MGR参数配置
group_replication_group_name = "7cf70110-59f9-11ee-a293-246e967fa518"
group_replication_start_on_boot = off
group_replication_local_address = "172.20.167.254:33061"
group_replication_group_seeds = "172.20.167.255:33061,172.20.167.254:33061,172.20.167.253:33061"
group_replication_bootstrap_group = off
172.20.167.253 修改 my.cnf 增加如下MGR参数配置
group_replication_group_name = "7cf70110-59f9-11ee-a293-246e967fa518"
group_replication_start_on_boot = off
group_replication_local_address = "172.20.167.253:33061"
group_replication_group_seeds = "172.20.167.255:33061,172.20.167.254:33061,172.20.167.253:33061"
group_replication_bootstrap_group = off
- 三台主机上重启容器:
docker restart mysql8
- 三台主机上查看参数:
登录mysql之后执行查看语句
mysql> SHOW VARIABLES LIKE 'group_replication%';
注意:
千万不要在创建mysql容器时添加这些参数,这样mysql启动不了,因为还没安装这个插件,这些参数Mysql启动时候不认识
相关参数说明:
- 配置group_replication_group_name告诉插件它所加入或创建的组的名称为"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
- group_replication_group_name的值必须是有效的UUID。您可以使用SELECT UUID()来生成一个
- 将group_replication_start_on_boot变量配置为off指示插件在服务器启动时不自动启动操作,这在设置Group Replication时很重要,因为它确保您可以在手动启动插件之前配置服务器。一旦成员配置完成,您可以将group_replication_start_on_boot设置为on,以便在服务器启动时自动启动Group Replication
- 配置group_replication_local_address设置成员在组内部与其他成员进行通信时使用的网络地址和端口。组复制使用此地址进行涉及组通信引擎的远程实例(XCom,一种Paxos变体)的内部成员之间的连接。
- 组复制的端口不能和Mysql的服务端口相同,组成员之间复制使用的端口必须是其他端口 例如上面的 33061
- group_replication_local_address配置的网络地址必须由所有组成员解析,推荐端口是33061
- group_replication_group_seeds列表包含每个组成员的group_replication_local_address的主机名和端口,但这并非强制要求,可以选择组成员的子集作为种子成员,这些成员被称为种子成员。一旦建立连接,组成员信息将在Performance Schema表replication_group_members中列出
- 最佳实践是先启动引导成员,并让它创建组。然后将其设置为其他正在加入的成员的种子成员。这样可以确保在加入其他成员时已经形成了一个组,启动组的服务器不使用group_replication_group_seeds选项,因为它是初始服务器,负责引导组
- group_replication_bootstrap_group参数用于指示插件是否引导组。当设置为ON时,它表示当前成员将引导组。当设置为OFF时,它表示当前成员将加入现有组。在配置组复制时,通常只有一个成员需要引导组。这个成员将负责创建组,并成为种子成员,其他成员将加入这个已经引导的组。因此,在引导成员时,需要将group_replication_bootstrap_group设置为ON,而在其他成员时,需要将其设置为OFF
- 引导组的成员将创建并初始化组的相关数据结构,包括组的通信通道和日志。这是组复制的起点。因此,确保只有一个成员引导组非常重要,否则可能会导致数据一致性和冲突问题
3. 4 启动集群
-
启动一个引导实例
引导应该只由一个服务器完成,即启动群组的服务器,并且只能执行一次
这次我们选择在 172.20.167.255 这台主机上执行启动集群操作:
mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='PassWord123_'; mysql> 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 | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+-------------+-------------+---------------+-------------+----------------+----------------------------+ | group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 | s1 | 3306 | ONLINE | | | XCom | +---------------------------+--------------------------------------+-------------+-------------+---------------+-------------+----------------+----------------------------+ 1 row in set (0.0108 sec)
-
创建DDL事务后查看binlog 事件
mysql> SHOW BINLOG EVENTS;
3.5 加入集群
另外两台服务器上,登录MySQL后执行如下操作:
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED WITH mysql_native_password BY 'PassWord123_';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='PassWord123_' FOR CHANNEL 'group_replication_recovery';Or from MySQL 8.0.23:CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='PassWord123_' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='PassWord123_';
mysql> SELECT * FROM performance_schema.replication_group_members;
mysql> SHOW BINLOG EVENTS;
如果 START GROUP_REPLICATION 时出现以下错误:
....
[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: ae6b26d7-5dc0-11ea-9d16-000c29b33fcb:1 > Group transactions: 043887ba-5ce8-11ea-8f3a-000c29d3fc7e:1,043887ba-5ce8-11ea-8f3a-000c29d3fc7e'
....
这个错误的原因是MGR中的成员拥有比组中存在的事务更多的已执行事务。
这种情况通常发生在MGR集群中的成员之间的数据同步出现问题时。可能的原因包括网络故障、成员崩溃或其他同步问题。
当一个成员拥有比组中其他成员更多的已执行事务时,可能会导致数据不一致的情况。这是因为在MGR中,所有成员都应该具有相同的已执行事务,以保持数据的一致性。
执行下面SQL清空Executed_Gtid_Set解决问题:
mysql> reset master
四、查看集群
查看 MGR 组成员列表
SELECT * FROM performance_schema.replication_group_members;
以下是 replication_group_members
表格中每个字段的含义:
字段名 | 描述 |
---|---|
MEMBER_ID | 成员的唯一标识符 |
MEMBER_HOST | 成员的主机名或 IP 地址 |
MEMBER_PORT | 成员的端口号 |
MEMBER_STATE | 成员的状态 |
MEMBER_ROLE | 成员的角色 |
MEMBER_VERSION | 成员的版本号 |
MEMBER_SSL | 成员是否使用 SSL 连接 |
MEMBER_SSL_VERSION | 成员使用的 SSL 版本 |
MEMBER_SSL_CIPHER | 成员使用的 SSL 加密算法 |
MEMBER_SSL_STATE | 成员 SSL 连接的状态 |
MEMBER_CONNECTIONS | 成员当前连接的数量 |
MEMBER_UUID | 成员的 UUID |
MEMBER_PRIMARY | 成员是否为主节点 |
MEMBER_AUTOPROTECT | 成员是否启用自动保护模式 |
MEMBER_PRIMARY_UUID | 成员所属的主节点的 UUID,如果成员本身是主节点,则该字段为 NULL |
MEMBER_PRIMARY_HOST | 成员所属的主节点的主机名或 IP 地址,如果成员本身是主节点,则该字段为 NULL |
MEMBER_PRIMARY_PORT | 成员所属的主节点的端口号,如果成员本身是主节点,则该字段为 NULL |
注意:该表格中的字段可能会因为 MySQL 版本的不同而略有差异。
查看 MGR 组成员拓扑信息
SELECT * FROM performance_schema.replication_group_member_stats
字段名 | 描述 |
---|---|
VIEW_ID | 视图的唯一标识符 |
MEMBER_ID | 成员的唯一标识符 |
MEMBER_HOST | 成员的主机名或 IP 地址 |
MEMBER_PORT | 成员的端口号 |
MEMBER_STATE | 成员的状态 |
MEMBER_ROLE | 成员的角色 |
MEMBER_VERSION | 成员的版本号 |
COUNT_TRANSACTIONS_IN_QUEUE | 当前队列中的事务数 |
COUNT_TRANSACTIONS_CHECKED | 已经检查的事务数 |
COUNT_TRANSACTIONS_QUEUED | 已经排队的事务数 |
COUNT_TRANSACTIONS_COMMITTED | 已经提交的事务数 |
COUNT_TRANSACTIONS_ROLLED_BACK | 已经回滚的事务数 |
COUNT_TRANSACTIONS_UNKNOWN | 未知状态的事务数 |
COUNT_RECEIVED_HEARTBEATS | 接收到的心跳数 |
COUNT_RECEIVED_TRANSACTION_SETS | 接收到的事务集数 |
COUNT_APPLIED_TRANSACTION_SETS | 应用的事务集数 |
COUNT_COMMITTED_TRANSACTIONS | 提交的事务数 |
COUNT_ROLLEDBACK_TRANSACTIONS | 回滚的事务数 |
COUNT_RECEIVED_TRANSACTION_SETS_TO_COMMIT | 待提交的事务集数 |
COUNT_RECEIVED_TRANSACTION_SETS_TO_ROLLBACK | 待回滚的事务集数 |
COUNT_TRANSACTIONS_GTID_EXECUTED | 已经执行的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_EXECUTED_ALL_MEMBERS | 所有成员已经执行的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_EXECUTED_LOCAL | 本地成员已经执行的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_IN_QUEUE | 当前队列中的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_IN_QUEUE_ALL_MEMBERS | 所有成员当前队列中的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_IN_QUEUE_LOCAL | 本地成员当前队列中的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_PURGED | 已经清除的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_PURGED_ALL_MEMBERS | 所有成员已经清除的 GTID 事务数 |
COUNT_TRANSACTIONS_GTID_PURGED_LOCAL | 本地成员已经清除的 GTID 事务数 |
COUNT_TRANSACTIONS_WITHOUT_CONFLICTS | 不冲突的事务数 |
COUNT_TRANSACTIONS_WITH_CONFLICTS | 冲突的事务数 |
COUNT_TRANSACTIONS_WITHOUT_CONFLICTS_ALL_MEMBERS | 所有成员不冲突的事务数 |
COUNT_TRANSACTIONS_WITH_CONFLICTS_ALL_MEMBERS | 所有成员冲突的事务数 |
COUNT_TRANSACTIONS_WITHOUT_CONFLICTS_LOCAL | 本地成员不冲突的事务数 |
COUNT_TRANSACTIONS_WITH_CONFLICTS_LOCAL | 本地成员冲突的事务数 |
LAST_CONFLICT_FREE_TRANSACTION | 最后一个不冲突的事务 |
LAST_CONFLICT_TRANSACTION | 最后一个冲突的事务 |
LAST_ERROR_TRANSACTION | 最后一个出错的事务 |
LAST_ERROR_NUMBER | 最后一个错误的编号 |
LAST_ERROR_MESSAGE | 最后一个错误的消息 |
五、其他说明
集群配置要求
-
在MGR中使用除了
InnoDB
之外的存储引擎会导致集群错误,最好版本是禁用其他disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
-
所有表必须有主键或者非空唯一索引
-
保证集群中的mysql相互之间可以通讯
-
保证 server-id值唯一
-
保证binlog打开,默认情况是打开的
-
设置log_replica_updates=ON(从MySQL 8.0.26开始)或log_slave_updates=ON(在MySQL 8.0.26之前)默认情况是打开
-
设置
binlog_format=row
-
set
binlog_checksum=NONE
在MySQL 8.0.20及之前的版本中,设置binlog_checksum=NONE,不过从MySQL 8.0.21开始,Group Replication支持校验和,因此群组成员可以使用默认设置binlog_checksum=CRC32 -
全局事务标识启用。设置gtid_mode=ON和enforce_gtid_consistency=ON。这些设置不是默认值
-
针对大小写是否敏感设置请保持所有实例配置一样
-
多线程设置
Group Replication成员可以配置为多线程副本,从而实现并行应用事务。从MySQL 8.0.27开始,默认情况下所有副本都配置为多线程。对于系统变量replica_parallel_workers(从MySQL 8.0.26开始)或slave_parallel_workers(在MySQL 8.0.26之前),非零值启用了成员上的多线程应用程序。从MySQL 8.0.27开始,默认值为4个并行应用程序线程,最多可以指定1024个并行应用程序线程。对于多线程副本,还需要以下设置,这些设置是从MySQL 8.0.27开始的默认设置:
replica_preserve_commit_order=ON(从MySQL 8.0.26开始)或slave_preserve_commit_order=ON(在MySQL 8.0.26之前) 此设置要求确保并行事务的最终提交与原始事务的顺序相同。Group Replication依赖于围绕所有参与成员按相同顺序接收和应用已提交事务的一致性机制。
replica_parallel_type=LOGICAL_CLOCK(从MySQL 8.0.26开始)或slave_parallel_type=LOGICAL_CLOCK(在MySQL 8.0.26之前) 此设置要求使用replica_preserve_commit_order=ON或slave_preserve_commit_order=ON。它指定了在副本上允许并行执行哪些事务的策略
-
设置replica_parallel_workers=0或slave_parallel_workers=0将禁用并行执行,并为副本提供单个应用程序线程和无协调器线程
集群配置限制
-
为了降低间隙锁的概率,强烈建议配置事务级别为
READ COMMITTED
-
集群不支持 事务级别为最高级别:序列化
-
在多主模式下,不支持在不同服务器上同时执行针对相同对象的并发数据定义DDL语句和数据操作DML语句
-
不建议使用外键功能
-
多主模式死锁。当一个组以多主模式运行时,SELECT … FOR UPDATE语句可能会导致死锁。这是因为锁不在组的成员之间共享,因此可能无法达到对这样的语句的期望。
-
在配置为群组复制的MySQL服务器实例上无法使用全局复制过滤器,因为在某些服务器上过滤事务会导致群组无法达成一致状态协议
-
一个复制组中的MySQL服务器成员的最大数量为9。如果有更多成员尝试加入该组,它们的请求将被拒绝。这个限制是通过测试和基准测试确定的,被认为是一个安全的边界,在稳定的局域网上该组能够可靠地运行。
-
事务太大以至于在5秒的时间窗口内无法在群组成员之间通过网络进行复制,那么成员可能会被怀疑已经失败,并因此被驱逐。
如果由于大型消息而发生不必要的驱逐,请使用系统变量group_replication_member_expel_timeout,在怀疑已经失败的成员被驱逐之前,允许额外的时间。
-
使用系统变量group_replication_transaction_size_limit来指定群组接受的最大事务大小。在MySQL 8.0中,该系统变量的默认值为150000000字节(约143 MB)的最大事务大小。超过此大小的事务将被回滚,并且不会发送到Group Replication的Group Communication System(GCS)以分发给群组.
-
使用系统变量group_replication_compression_threshold来指定应用压缩的消息大小上限。该系统变量的默认值为1000000字节(1 MB),因此会自动压缩大型消息。当Group Replication的Group Communication System(GCS)接收到一个由group_replication_transaction_size_limit设置允许但超过group_replication_compression_threshold设置的消息时,将执行压缩
-
使用系统变量group_replication_communication_max_message_size来指定消息大小,超过此大小的消息将被分段。该系统变量的默认值为10485760字节(10 MiB),因此大型消息将自动被分段。如果压缩后的消息仍然超过group_replication_communication_max_message_size限制,则GCS将在压缩后执行分段。为了让复制群组使用分段,所有群组成员必须使用MySQL 8.0.16或更高版本,并且群组使用的Group Replication通信协议版本必须允许分段
-
总之记住:你的应用程序中的事务尽可能的小
集群相关变量和状态
变量: MySQL :: MySQL 8.0 Reference Manual :: 18.9.1 Group Replication System Variables
状态:MySQL :: MySQL 8.0 Reference Manual :: 18.9.2 Group Replication Status Variables
相关文章:
Docker方式创建MySQL8的MGR集群
目录 一、MGR简述二、安装环境及要求2.1 系统版本2.2 网络要求 三、安装步骤3.1 创建容器3.2 创建用户3.3 安装插件3. 4 启动集群3.5 加入集群 四、查看集群查看 MGR 组成员列表查看 MGR 组成员拓扑信息 五、其他说明集群配置要求集群配置限制集群相关变量和状态 一、MGR简述 …...
问 ChatGPT 关于GPT的事情:扩展篇
一、GPT预训练有什么节省显存和算力的技巧吗?我如何拿四块A100完成175B模型的预训练? 对于GPT预训练,有一些技巧可以帮助节省显存和算力。以下是一些常用的技巧: 按批次截断:在较长的文本序列中,将其切割…...

Spring Boot 集成 MinIO 实现文件上传、下载和删除
MinIO 是一种开源的对象存储服务,它基于云原生架构构建,并提供了高性能、易于扩展和安全的存储解决方案。 一.安装和配置 MinIO 服务器 为了演示方便,本文采用Windows安装 1.在官方网站下载MinIO 安装文件,地址:ht…...

Polygon Miden交易模型:Actor模式 + ZKP => 并行 + 隐私
1. 引言 前序博客: Polygon Miden:扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型 Polygon Miden为: ZK-optimized rollup由客户端生成证明完善Polygon ZK系列解决方案,致力于成为网络…...
Java流的体系结构(二)
文章目录 一、对象流的使用1.概念2.序列化机制3.代码案例:序列化过程:将内存中的java对象保存到磁盘中或通过通络传输出去4.反序列化,将磁盘文件中的对象还原为内存中的一个java对象 二、RandomAccessFile的使用1.说明2.代码案例 提示&#x…...
python计算阶层
阶层(Factorial)是指从1到一个正整数n的所有整数相乘,即n! 1 2 3 … n。下面是Python代码计算阶层: def factorial(n):"""计算阶层:param n: 正整数:return: n的阶层"""if n 1 or n 0:retu…...
前端架构师之01_ES6_基础
1 初识ES6 简单来说,ECMAScript是JavaScript语言的国际标准,JavaScript是实现ECMAScript标准的脚本语言。 2011年,ECMA国际标准化组织在发布ECMAScript 5.1版本之后,就开始着手制定第6版规范。 存在的问题:这个版本…...
银行卡号识别
# 导入工具包 from imutils import contours import numpy as np import argparse import cv2 import myutils# 设置参数 # ap = argparse.ArgumentParser() # ap.add_argument("-i", "--image", required=True, # help="path to input image")…...

【Idea】idea、datagrip设置输入法
https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5https://github.com/RikudouPatrickstar/JetBrainsRuntime-for-Linux-x64/releases/tag/jbr-release-17.0.6b829.5 下载后解压并重命名为 jbr, 然后替换对应 ide…...

回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测
回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合…...

最小生成树 | 市政道路拓宽预算的优化 (Minimum Spanning Tree)
任务描述: 市政投资拓宽市区道路,本着执政为民,节省纳税人钱的目的,论证是否有必要对每一条路都施工拓宽? 这是一个连问带答的好问题。项目制学习可以上下半场,上半场头脑风暴节省投资的所有可行的思路&a…...

Java实现使用多线程,实现复制文件到另一个目录,起不一样的名字,创建100万个数据
目录 1 需求2 实现 1 需求 我现在有一个300MB 的文件,想要根据这个文件,创建100万个大小一样的,名称不一样,如何实现,如何比较快点实现 2 实现 1 先准备好这个文件 2 准备好目录 3 写代码 private static void crea…...

uni-app:canvas-图形实现1
效果 代码 <template><view><!-- 创建了一个宽度为300像素,高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas",可以用来在JavaScript中获取该canvas元素的上下文对象。 --><canvas style"width:200p…...

【算法分析与设计】动态规划(下)
目录 一、最长公共子序列1.1 最长公共子序列的结构1.2 子问题的递归结构1.3 计算最优值1.4 举例说明1.5 算法的改进 二、最大子段和2.1 代码2.2 最大子段和问题的分治算法2.3 代码2.4 分治算法的时间复杂度2.5 最大子段和问题的动态规划算法 三、凸多边形最优三角剖分3.1 三角剖…...

计算机图像处理-均值滤波
均值滤波 线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定…...

FreeRTOS入门教程(空闲任务和钩子函数及任务调度算法)
文章目录 前言一、空闲任务概念二、钩子函数概念三、任务调度算法四、任务调度算法实验1.实验代码2.是否抢占3.时间片是否轮转4.空闲任务让步 总结 前言 本篇文章将带大家学习一下什么是空闲任务以及钩子函数,以及学习FreeRTOS中的任务调度算法,了解在F…...
Javascript真的是10天内做出来的吗?
我曾听说,Javascript 之所以有这么多缺点,是因为它的第一个版本是在短短十天内完成的。我很好奇:1)这是否属实;2)这是否能解释这种语言的缺陷。 经过一番研究,我可以不自信地说:是的…...

picoctf_2018_got_shell
picoctf_2018_got_shell Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位,只开了NX int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {_DWOR…...

作用域 CSS 回来了
几年前,消失的作用域 CSS,如今它回来了,而且比以前的版本要好得多。 更好的是,W3C规范基本稳定,现在Chrome中已经有一个工作原型。我们只需要社区稍微关注一下,引诱其他浏览器构建它们的实现,并…...

简述ceph文件储存系统
Ceph 是一个统一的分布式存储系统和共享机制,它定义了数据如何存储在一个或多个节点上并呈现给其他机器以供文件访问。 Ceph特点 高性能 a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。 b.考…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...