mysql5.7实现组复制(MGR)

实验主机server1,7,8:

组复制原理:

组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制
实现了基于复制协议的多主更新
复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。

mysql组复制协议:
这里写图片描述
组复制是一种 share-nothing 复制方案,其中每个 server 成员都有自己的完整数据副本。

故障检测:

故障检测是提供关于哪些 server 可能已死的信息(猜测)的分布式服务。
某个 server 无响应时触发猜测,组中其余成员进行协调决定以排除给定成员。如果某个 server 与组的其余成员隔离,则它会怀疑所有其他 server 都失败了。由于无法与组达成协议(因为它无法确保仲裁成员数),其怀疑不会产生后果。 当服务器以此方式与组隔离时,它无法执行任何本地事务。
在线 server 列表通常称为视图,新成员server的加入离开,无论是自愿还是被迫的离开,该组都会动态地重新规划其配置,并触发视图更新

MGR的限制:
仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;
必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set
COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景
目前一个MGR集群最多支持9个节点
不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
二进制日志不支持binlog event checksum

三台主机安装mysql5.7并初始化密码。
编写配置文件:

vim /etc/my.cnf

添加:
server_id=1    #三台主机的id号不同
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="8053c671-0622-11e8-a300-525400b9c5e8"        #表示将加入或者创建的复制组命名为8053c671-0622-11e8-a300-525400b9c5e8,可以自己指定
loose-group_replication_start_on_boot=off  #设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "172.25.92.1:24901"                #绑定本地的172.25.92.1以及25901端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="172.25.92.2:24901,172.25.92.7:24901,172.25.92.8:24901"          #本行为告诉服务器当服务器加入组时,应当连接到172.25.92.2:24901,172.25.92.7:24901,172.25.92.8:24901这些种子服务器进行配置。本设置可以不是全部的组成员服务地址
loose-group_replication_bootstrap_group= off   #配置是否自动引导组
loose-group_replication_single_primary_mode=FALSE  #设置组自动选择一个 server 来处理读/写工作。 这个 server 是主(PRIMARY),所有其他的都是从
loose-group_replication_enforce_update_everywhere_checks=FALSE  #多主模式下为多主更新启用或禁用严格一致性检查。
loose-group_replication_ip_whitelist="172.25.92.0/24"   #开启白名单,认情况下只允许白名单连接到复制组,如果是其他IP则需要配置。

#使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动

server1:


mysql -uroot -p
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Workhard@345';      #创建复制用户及密码

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery';   #这个复制跟普通的change master命令有区别,并不需要指定master是谁,但需要指定通道为’group_replication_recovery’。 

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装一个group_replicaiton 的plugin
Query OK, 0 rows affected (0.16 sec) 

mysql> SHOW PLUGINS;

mysql> SET GLOBAL group_replication_bootstrap_group=ON;  #此引导应仅由单个 sever 独立完成,该 server 启动组并且只启动一次。 这就是为什么引导配置选项的值不保存在配置文件中的原因。 如果将其保存在配置文件中,则在重新启动时,server 会自动引导具有相同名称的第二
个组。 这将导致两个不同的组具有相同的名称
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.78 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;  #查看组成员状态
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 82aae2a9-05d5-11e8-9a44-525400b9c5e8 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

server7和server8:

先修改配置文件。
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'Workhard@345';

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Workhard@345' FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.16 se
mysql> select * from plugin;
+-------------------+----------------------+
| name              | dl                   |
+-------------------+----------------------+
| group_replication | group_replication.so |
| validate_password | validate_password.so |
+-------------------+----------------------+
2 rows in set (0.03 sec)

mysql> delete from plugin where name='validate_password';
Query OK, 1 row affected (0.17 sec)

mysql> select * from plugin;
+-------------------+----------------------+
| name              | dl                   |
+-------------------+----------------------+
| group_replication | group_replication.so |
+-------------------+----------------------+
1 row in set (0.00 sec)

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
Query OK, 0 rows affected (0.00 sec)


mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (44,88 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 379fe31a-0624-11e8-8636-525400f194e5 | server8     |        3306 | ONLINE       |
| group_replication_applier | 82aae2a9-05d5-11e8-9a44-525400b9c5e8 | server1     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+------------

配置过程常见的错误:
1,来源IP没有在白名单列表中,所以连接拒绝
2,没有配置同步账号跟密码,使用的是空密码进行同步。 需要为复制通道group_replication_recovery设置同步信息:CHANGE MASTER TO MASTER_USER=’mysqlsync’, MASTER_PASSWORD=’mysqlsync_password’ FOR CHANNEL ‘group_replication_recovery’;
3,删除validate_password密码验证插件。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 5.7 支持递归查询功能,可以使用 WITH RECURSIVE 关键字来实现。 下面是一个示例,假设有一个表格存储了员工的信息,其中包括员工编号和直接上级编号: ``` CREATE TABLE employees ( emp_id INT PRIMARY KEY, name VARCHAR(50), mgr_id INT ); INSERT INTO employees VALUES (1, 'Alice', NULL); INSERT INTO employees VALUES (2, 'Bob', 1); INSERT INTO employees VALUES (3, 'Charlie', 2); INSERT INTO employees VALUES (4, 'David', 3); INSERT INTO employees VALUES (5, 'Eve', 4); ``` 现在需要查询某个员工的所有直接或间接下属员工的信息,可以使用递归查询实现: ``` WITH RECURSIVE subordinates AS ( SELECT emp_id, name, mgr_id, 0 AS level FROM employees WHERE emp_id = 1 -- 查询员工编号为1的员工及其下属员工 UNION ALL SELECT e.emp_id, e.name, e.mgr_id, s.level + 1 FROM employees e JOIN subordinates s ON e.mgr_id = s.emp_id ) SELECT emp_id, name, mgr_id, level FROM subordinates; ``` 在上面的查询语句中,使用了一个名为 subordinates 的递归公共表表达式(CTE),它包含了两个部分: - 初始查询:SELECT emp_id, name, mgr_id, 0 AS level FROM employees WHERE emp_id = 1,返回员工编号为1的员工的信息,并设置 level 属性为0。 - 递归查询:SELECT e.emp_id, e.name, e.mgr_id, s.level + 1 FROM employees e JOIN subordinates s ON e.mgr_id = s.emp_id,返回直接下属员工的信息,并设置 level 属性为父节点的 level 属性加1,使用 JOIN 子句与递归公共表 subordinates 连接。 最终通过 SELECT 查询从递归公共表 subordinates 中返回所有下属员工的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值