LNMP架构(12)-mysql组复制集群的配置(分布式存储的数据库)

一.mysql组复制(同步复制)

组复制是一种可用于实现容错系统的技术。 复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息(atomic message)和完全有序信息交互等保障机制。 这些是非常强大的功能,我们可以据此架构设计更高级的数据库复制解决方案。

复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的部术更改,以确保组内一致。

        在不同 server 上并发执行的事务可能存在冲突。 根据组复制的冲突检测机制,对两个不同的并发事务的写集合进行检测。如在不同的 server 成员执行两个更新同一行的并发事务,则会出现技库冲突。排在最前面的事务可以在所有 server 成员上提交,第二个事务在源 server 上回滚,并在组中的其他 server 上删除。 这就是分布式的先提交当选规则。

最后,组复制是一种 share-nothing 复制方案,其中每个 server 成员都有自己的完整数据副本。上图描述了 MySQL 组复制协议,并通过将其与 MySQL 复制(MySQL 半同步复制)进行比较,可以看到一些差异。 需要注意的是,这个图片中不包含一些基本共识和 Paxos 相关的信息。

2.优点

  • 弹性复制 - 需要非常流畅的复制基础架构环境,其中 server 的数量必须动态增长或收缩,并尽可能减少副作用。 例如,云数据库服务 。
  • 高可用分片( Shards ) - 分片是实现写扩展的常用方法。 使用 MySQL 组复制实现高可用性分片,其中每个分片映射到一个复制组。
  • 替代主从复制 - 在某些情况下,使用单个主服务器会造成单点争用,写入整个组可能更具可扩展性。
  • 自动系统 - 此外,您可以将 MySQL 组复制直接部署到已有复制协议的自动化系统中(在本章和前面的章节中已经描述过) 。

二.组复制的部署

1.实验环境

三台服务器(server1,server2,server3)为保持实验顺利进行,需要清理之前的数据库,重新初始化  三台服务器作相同的操作。

rm -rf /data/mysql/*
mysqld --initialize --user=mysql
vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON

default_authentication_plugin=mysql_native_password
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.2.2:33061"    该处为当前主机的ip地址
group_replication_group_seeds="172.25.2.2:33061,172.25.2.3:33061,172.25.2.4:33061"  组                   中所有服务器的ip地址
group_replication_bootstrap_group=off
group_replication_ip_whitelist="172.25.2.0/24,127.0.0.1/8"
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON

##
## include all files from the config directory
##
#!includedir /etc/my.cnf.d

2.server1的部署(作为集群中的第一台服务器)

初始化mysql之后 重启mysql 进入配置。
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec
mysql> alter  user root@localhost identified by 'westos';
Query OK, 0 rows affected (0.01 sec)
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

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='password' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> SHOW PLUGINS;
 group_replication  | ACTIVE   | GROUP REPLICATION  |group_replication.so | GPL
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.16 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 | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | f657672b-e1c6-11ea-88af-525400910b20 | server2     |        3306 | ONLINE       | PRIMARY     | 8.0.21         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1 row in set (0.00 sec)

3.server2和server3的配置

和server1一样配置
下面两条不用设置 其他一样
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

4.测试

在server1上

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)

mysql> USE test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)

server2 3上都会出现server1上的数据库  组内达到同步的复制的效果。在组内任何一个数据库中操作 都会同步。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值