一、简介

这次给大家介绍下MySQL官方最新版本5.7.17中GA的新功能 Group Replication 。

Group Replication是一种可用于实现容错系统的技术。复制组是一组通过消息传递相互交互的服务器。通信层提供一组保证,例如原子消息和总订单消息传递。这些是非常强大的属性,可以转化为非常有用的抽象,人们可以诉诸构建更高级的数据库复制解决方案。MySQL组复制构建在这些属性和抽象之上,并实现多主复制协议的更新。实质上,复制组由多个服务器形成,并且组中的每个服务器可以独立地执行事务。但是所有读写(RW)事务只有在组被批准后才会提交。只读(RO)事务不需要在组内协调,因此立即提交。换句话说,对于任何RW事务,组需要决定是否提交,因此提交操作不是来自始发服务器的单向决定。准确地说,当事务准备好在始发服务器上提交时,服务器原子地广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后为该交易建立全局总订单。最终,这意味着所有服务器以相同的顺序接收同一组事务。因此,所有服务器以相同的顺序应用相同的一组更改,因此它们在组内保持一致。
但是,在不同服务器上并发执行的事务之间可能存在冲突。通过在称为认证的过程中检查两个不同的并发事务的写集合来检测这样的冲突。如果在不同的服务器上执行的两个并发事务更新同一行,则会出现冲突。解析过程指出,首先订购的事务在所有服务器上提交,而顺序第二次中止的事务将在源服务器上回滚,并由组中的其他服务器删除。这实际上是一个分布式的第一个提交赢的规则。

MySQL组复制协议

最后,组复制是一种无共享复制方案,其中每个服务器都有自己的整个数据副本。
上图描述了MySQL组复制协议,并通过将其与MySQL复制(或甚至MySQL半同步复制)进行比较,您可以看到一些差异。注意,为了清楚起见,这个图片中缺少一些基本的共识和Paxos相关消息。

介绍就到这,本文中我将一步一步的安装部署group_replication的三个节点,并让你看到它的功能和特性,如果看完全文,你十分的感兴趣的话,可以去mysqlGroup Replication主页去查看更详细的信息。

二、正式部署

1. 环境介绍

basedir = /usr/local/mysql
(PS: 这点还是要吐槽一下的,mysql官方basedir如果不在这个目录的话,mysql.server也不好使,这个实验也不成功,我们还是勉强先放在这)

端口号 数据及日志目录  Group_Replication通讯端口
3306 /data/mysql/mysql_3306/{data,logs,tmp} 33061
3307 /data/mysql/mysql_3307/{data,logs,tmp} 33062
3308 /data/mysql/mysql_3308/{data,logs,tmp} 33063

2. 初始化

①、下载and解压缩,并把mysql放到指定地方(标准目录: /usr/local/mysql)

cd /opt/
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.-linux-glibc2.-x86_64 /usr/local/mysql

②、 创建数据库需要的数据、日志和临时目录并赋权:

mkdir -p /data/mysql/{mysql_3306,mysql_3307,mysql_3308}/{data,logs,tmp}
chown -R mysql.mysql /data/mysql/

3. 初始化

安装机器: 192.168.0.162 (单机多实例安装)
配置文件说明:

端口号 配置文件
3306 /data/mysql/mysql_3306/my3306.cnf
3307 /data/mysql/mysql_3306/my3307.cnf
3308 /data/mysql/mysql_3306/my3308.cnf
 
 
3306端口配置文件详情:
 
my3306.cnf
 
[client]
port =
socket = /tmp/mysql3306.sock
[mysql]
prompt = mysql [\d]>
default_character_set = utf8
no-auto-rehash
[mysqld]
#misc
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql_3306/data
port =
socket = /tmp/mysql3306.sock
event_scheduler =
tmpdir=/data/mysql/mysql_3306/tmp
#timeout
interactive_timeout =
wait_timeout =
#character set
character-set-server = utf8
open_files_limit =
max_connections =
max_connect_errors =
#
explicit_defaults_for_timestamp
#logs
log-output=file
slow_query_log =
slow_query_log_file = slow.log
log-error = error.log
log_error_verbosity=
pid-file = mysql.pid
long_query_time =
#log-slow-admin-statements =
#log-queries-not-using-indexes =
log-slow-slave-statements =
#binlog
binlog_format = row
server-id =
log-bin = /data/mysql/mysql_3306/logs/mysql-bin
binlog_cache_size = 1M
max_binlog_size = 200M
max_binlog_cache_size = 2G
sync_binlog =
expire_logs_days = #group replication
server_id=
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="13855fca-d2ab-11e6-8f37-005056b8286c"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.0.162:33061"
loose-group_replication_group_seeds= "192.168.0.162:33061,192.168.0.162:33071,192.168.0.162:33081"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
#relay log
skip_slave_start =
max_relay_log_size = 500M
relay_log_purge =
relay_log_recovery =
#slave-skip-errors=,,
#buffers & cache
table_open_cache =
table_definition_cache =
table_open_cache =
max_heap_table_size = 96M
sort_buffer_size = 2M
join_buffer_size = 2M
thread_cache_size =
query_cache_size =
query_cache_type =
query_cache_limit = 256K
query_cache_min_res_unit =
thread_stack = 192K
tmp_table_size = 96M
key_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 32M
#myisam
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads =
#innodb
innodb_buffer_pool_size = 500M
innodb_buffer_pool_instances =
innodb_data_file_path = ibdata1:100M:autoextend
innodb_flush_log_at_trx_commit =
innodb_log_buffer_size = 64M
innodb_log_file_size = 256M
innodb_log_files_in_group =
innodb_max_dirty_pages_pct =
innodb_file_per_table =
innodb_rollback_on_timeout
innodb_status_file =
innodb_io_capacity =
transaction_isolation = READ-COMMITTED
innodb_flush_method = O_DIRECT
3307和3308端口的配置文件我不贴的,替换下端口即可。
其中比较重要的地方,也是安装Group_replication必须要有的配置项,需要注意一下:
 
#group replication
server_id=
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="13855fca-d2ab-11e6-8f37-005056b8286c"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.0.162:33061"
loose-group_replication_group_seeds= "192.168.0.162:33061,192.168.0.162:33071,192.168.0.162:33081"
loose-group_replication_bootstrap_group= off loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on

在这里有一些技术细节要说明一下:

上面的三个配置文件省略了所有不必要的配置项、但是看起来还是有点多、这些都是mgr环境要求的。

server_id 每个实例都要不要样

loose-group_replication_group_name:为mgr高可用组起一个名字,必须是有效的UUID。在二进制日志中为组复制事件设置GTID时,将在内部使用此UUID。使用SELECT UUID()生成一个UUID。

loose-group_replication_local_address:mgr各实例之前都是要进行通信的、这个配置项设置的就是本实例所监听的ip:端口

loose-group_replication_group_seeds:各mgr实例所监听的ip:端口信息

其他配置参数,请参考官方文档:

https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html

4. 启动Group_replication第一个节点

初始化3306实例:

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/my3306.cnf --initialize-insecure

启动3306实例:

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/my3306.cnf &

进入mysql进行change操作:

/usr/local/mysql/bin/mysql -u root -S /tmp/mysql3306.sock
mysql> SET SQL_LOG_BIN=;
mysql> CREATE USER rpl_user@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
mysql> SET SQL_LOG_BIN=;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery';
加载 group_replication的plugin:
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
|... ... ... |
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
启动第一个节点的Group_replication:
mysql> SET GLOBAL group_replication_bootstrap_group=ON;     #只在第一个节点使用
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 | 68ce93ca-d292-11e6-bdf9-005056b8286c | localhost.localdomain | | ONLINE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
rows in set (0.00 sec)
创建测试数据:
mysql> create database boom;
mysql> use boom;
mysql> create table boomballa(id int not null,name varchar(),primary key(id));
mysql> insert into boomballa(id,name) values(,'boomballa.top');
mysql> insert into boomballa(id,name) values(,'myblog');

查看端口是否启动

root@ubuntu:/data/mysql/mysql_3306# netstat -anpt | grep 33061
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld

5. 启动Group_replication第二个节点

复制配置文件:

# 复制配置文件
cd /data/mysql/mysql_3307/
cp ../mysql_3306/my3306.cnf my3307.cnf # 编辑配置文件
vim my3307.cnf #将替换3306为3307
 
特别注意以下2行:
loose-group_replication_local_address= "192.168.0.162:33071"
loose-group_replication_group_seeds= "192.168.0.162:33061,192.168.0.162:33071,192.168.0.162:33081"

注意:loose-group_replication_local_address配置参数,必须要在loose-group_replication_group_seeds里面!

否则会出现3092错误

初始化并启动实例:

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3307/my3307.cnf --initialize-insecure
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3307/my3307.cnf &
安装插件并启动Group_replication:
mysql> SET SQL_LOG_BIN=;
mysql> CREATE USER rpl_user@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';
mysql> SET SQL_LOG_BIN=;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
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 | 5aaa8529-d296-11e6-a7be-005056b8286c | localhost.localdomain | | ONLINE |
| group_replication_applier | 68ce93ca-d292-11e6-bdf9-005056b8286c | localhost.localdomain | | ONLINE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
rows in set (0.00 sec)
查看端口是否启动
root@ubuntu:/data/mysql/mysql_3306# netstat -anpt | grep 33061
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld

6. 第三节点安装配置

这里省略了,参考第二个节点。注意:替换端口为3308

安装好了以后的状态应该是(三节点上查询结果都是如此):

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
| group_replication_applier | 5aaa8529-d296-11e6-a7be-005056b8286c | localhost.localdomain | | ONLINE |
| group_replication_applier | 68ce93ca-d292-11e6-bdf9-005056b8286c | localhost.localdomain | | ONLINE |
| group_replication_applier | af93afd1-d297-11e6-b8e9-005056b8286c | localhost.localdomain | | ONLINE |
+---------------------------+--------------------------------------+-----------------------+-------------+--------------+
rows in set (0.00 sec) mysql> use boom
Database changed
mysql> select * from boomballa;
+----+---------------+
| id | name |
+----+---------------+
| | boomballa.top |
| | myblog |
+----+---------------+
rows in set (0.00 sec)

确认一下:

[root@localhost ~]# echo "select * from boom.boomballa;"|/usr/local/mysql/bin/mysql -S /tmp/mysql3306.sock
id name
boomballa.top
myblog
[root@localhost ~]# echo "select * from boom.boomballa;"|/usr/local/mysql/bin/mysql -S /tmp/mysql3307.sock
id name
boomballa.top
myblog
[root@localhost ~]# echo "select * from boom.boomballa;"|/usr/local/mysql/bin/mysql -S /tmp/mysql3308.sock
id name
boomballa.top
myblog

三、测试

查看mysql进程

root@ubuntu:/data/mysql/mysql_3306# ps -aux | grep mysql
mysql 0.1 6.3 pts/ Sl : : /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/my3306.cnf
mysql 0.1 6.2 pts/ Sl : : /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3307/my3307.cnf
mysql 0.2 6.2 pts/ Sl : : /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3308/my3308.cnf
root 0.0 0.0 pts/ S+ : : grep --color=auto mysql

设置第一个mysql实例密码,设置密码为root

/usr/local/mysql/bin/mysqladmin -u root -S /tmp/mysql3306.sock -p password root

授权root用户远程连接

/usr/local/mysql/bin/mysql -u root -S /tmp/mysql3306.sock -proot
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;
使用Navicat 客户端查看数据

测试其他端口,比如:3307和3308,也应该是可以查看表数据!

在3306修改表数据,在3307查看数据,会立即同步的

关闭其中一个节点

关闭3308的进程

kill 

再次查看3306和3307表数据,是ok的。

在3306修改表数据,3307也是会同步的

启动3308实例

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3308/my3308.cnf &

查看3308数据,发现数据没有更新过来

 

进入到3308,开启GROUP_REPLICATION

/usr/local/mysql/bin/mysql -u root -S /tmp/mysql3308.sock -proot
mysql> START GROUP_REPLICATION;
再次刷新数据,发现数据同步过来了

大功告成!

本文参考链接:

https://www.jianshu.com/p/dc64fee1c792

 
 
 
 

MySQL Group Replication的安装部署的更多相关文章

  1. mysql group replication 安装&配置详解

    一.原起: 之前也有写过mysql-group-replication (mgr) 相关的文章.那时也没有什么特别的动力要写好它.主要是因为在 mysql-5.7.20 之前的版本的mgr都有着各种各 ...

  2. MySQL Group Replication 动态添加成员节点

    前提: MySQL GR 3节点(node1.node2.node3)部署成功,模式定为多主模式,单主模式也是一样的处理. 在线修改已有GR节点配置 分别登陆node1.node2.node3,执行以 ...

  3. MySQL双主+keeplived安装部署说明

    MySQL双主+keeplived安装部署说明 一.环境介绍 1.1.规划 序号 类别 版本 主机名 IP 端口 备注 1 OS CentOS release 6.9 (Final) (minimal ...

  4. Mysql 5.7 基于组复制(MySQL Group Replication) - 运维小结

    之前介绍了Mysq主从同步的异步复制(默认模式).半同步复制.基于GTID复制.基于组提交和并行复制 (解决同步延迟),下面简单说下Mysql基于组复制(MySQL Group Replication ...

  5. Mysql Group Replication 简介及单主模式组复制配置【转】

    一 Mysql Group Replication简介    Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务.    高一致性,基于原生复制及p ...

  6. MySQL Group Replication 技术点

    mysql group replication,组复制,提供了多写(multi-master update)的特性,增强了原有的mysql的高可用架构.mysql group replication基 ...

  7. mysql group replication 主节点宕机恢复

    一.mysql group replication 生来就要面对两个问题: 一.主节点宕机如何恢复. 二.多数节点离线的情况下.余下节点如何继续承载业务. 在这里我们只讨论第一个问题.也就是说当主结点 ...

  8. mysql group replication观点及实践

    一:个人看法 Mysql  Group Replication  随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...

  9. MySQL Group Replication配置

    MySQL Group Replication简述 MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事 ...

随机推荐

  1. CF1098E Fedya the Potter

    CF1098E Fedya the Potter 题意:有一个序列\(A\). 对所有\(1\leq l\leq r\leq |A|\),将\(\gcd_{i=l}^{r}A_i\)加入\(B\)中. ...

  2. static final与final修饰的常量有什么不同

    最近重头开始看基础的书,对一些基础的概念又有了一些新的理解,特此记录一下 static final修饰的常量: 静态常量(static修饰的全部为静态的),编译器常量,编译时就确定其值(java代码经 ...

  3. mysql 表联结,内部联结

    mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...

  4. mysql abs() 获取绝对值

    mysql> -); +----------+ | abs(-) | +----------+ | | +----------+ row in set (0.00 sec)

  5. 解决PHP7无法监听9000端口问题/502错误解决办法

    问题背景 昨晚帮配置nginx+php服务的时候,发生了一个奇怪的事情netstat -anp|grep 9000查看9000端口,一直没有监听,于是nginx无法通过fastcgi来代理php请求. ...

  6. 【软工实践】Beta冲刺(4/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增数据分析展示等功能API 服务器后端部署,API接口的beta版实现 展示 ...

  7. RUN vs CMD vs ENTRYPOINT

    参考:https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/RUN ...

  8. Java-Maven(十一):Maven 项目出现pom.xml错误:Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin

    Maven项目出现ERROR: eclipse更新了Maven插件后,让后就出现了以下错误: Description Resource Path Location Type Conflicting l ...

  9. Xamarin图表开发基础教程(8)OxyPlot框架

    Xamarin图表开发基础教程(8)OxyPlot框架 [示例OxyPlotFormsDemo]在Xamarin.Forms中实现线图的显示. (1)打开Xamarin.Forms项目. (2)将Ox ...

  10. Java程序执行cmd命令

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...