一、简介

这次给大家介绍下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. vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片

    H5 页面在做某个活动的时候,有两种分享方式,一种是链接分享,一种是图片分享. 链接分享的话,如果是在微信里,就可引导用户利用微信浏览器自带的分享,根据sdk设置分享标题简介链接缩略图即可. 图片分享 ...

  2. 洛谷P3205 合唱队

    题目 区间dp.但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路. 这个题我们首先发现每个人在插入的时候一定插入到队伍 ...

  3. Linux最大线程数限制

    开始以为是内存不足导致无法创建线程,把jvm的-Xms,-Xmx的2个参数都加大一倍:-Xms2048m -Xmx2048m.把-Xss参数调小,还是启动失败.应该是系统方面的限制了,这台机器上搞了1 ...

  4. 文档流&浮动&定位

    文档流指元素在文档中的位置由元素在html里的位置决定,块级元素独占一行,自上而下排列:内联元素从左到右排列脱离文档流的方式: 浮动,通过设置float属性 绝对定位,通过设置position:abs ...

  5. Kubeadm证书过期时间调整

    kubeadm 默认证书为一年,一年过期后,会导致api service不可用,使用过程中会出现:x509: certificate has expired or is not yet valid. ...

  6. TCP选项之SO_LINGER

    SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug. SO_LINGER作用设置函数close()关闭TCP连接时的行为.缺省close() ...

  7. 007 webpack基本的用法

    1.安装node.js 因为webpack是基于node.js的 2.新建目录 3.需求 列表的隔行变色 4.初始化 在终端中使用npm init命令可以自动创建这个package.json文件  n ...

  8. web服务器请求代理方式

    1 通信数据转发程序:代理.网关.隧道 代理:是一种有转发功能的应用程序,他扮演了位于服务器和客户端“中间人”的角色,接收客户端发送的请求并转发给服务器:同时也接收服务器返回的响应并转发给客户端. 使 ...

  9. odoo开发笔记 -- 跨域Refused to display in a frame because it set 'X-Frame-Options' to 'DENY'

    场景描述: odoo界面嵌入iframe,Refused to display in a frame because it set 'X-Frame-Options' to 'DENY' 跨域请求失败 ...

  10. 微信小程序开发——微信小程序下拉刷新真机无法弹回

    开发工具中下拉之后页面回弹有一定的延迟,这个时间也有点久.真机测试,下拉后连回弹都没有,这个问题要解决,就得在下拉函数里加上停止下拉刷新的API,如下: /** * 下拉刷新 */ onPullDow ...