一、组复制
单主模式:
1. server1配置:
恢复环境,确保没有mysql相关进程
随机生成一个uuid(组复制需要使用所有组成员保证一致)
uuidgen
更改配置文件,添加组复制
启动数据库,获取临时密码
systemctl start mysqld
cat /var/log/mysqld.log | grep password
更改密码(登陆需要输入日志中查到的临时密码)
关闭二进制文件,避免接下来的操作被其他组成员复制,再创建复制用户并授权,刷新授权表,最后打开二进制文件
配置组用户
CHANGE MASTER TO MASTER_USER='group_rpl', MASTER_PASSWORD='Huayu+123' FOR CHANNEL 'group_replication_recovery';
安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
我这里提示已经安装过了,因为我在配置文件中设置过加载这个插件
开启组引导 注:只在第一次执行这个操作,后面其他组成员配置时不需要
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
查看组成员
SELECT * FROM performance_schema.replication_group_members;
ONLINE代表配置成功
2. server2配置:
恢复环境
修改配置文件,和server1一致,只需要改变server-id 以及 绑定的本地ip
启动服务,获取临时密码
systemctl start mysqld
cat /var/log/mysqld.log | grep password
登陆,更改密码
关闭二进制文件,创建复制用户并授权
打开二进制文件
添加组复制
如果没有加载组复制插件则需要安装
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
我在配置文件中设置加载组复制插件,所以不需要这一步骤
开启组复制报错
停止组复制,reset master后再打开
问题分析:在配置组复制之前,启动mysql时,配置文件中已经设置了binlog_format=on,初始化mysql更改密码时,有事物已经被记录,所以或报错,将master reset后,删除之前的事物,再启动组复制则没有问题,其实这就类似于主从复制中的数据不同步。
测试:
在server1创建数据库
server2可以看到
在server2中新建表
提示为只读模式,因为是单主复制,所以只有一个可读,其他为只读
多主模式:
在刚才单主模式基础上,所有组复制节点执行以下命令:
停止组复制,单主模式关闭,检查更新开启
选择一个节点(我是在server1)开启组引导,开启组复制,关闭引导
其他节点直接打开组复制
查看组复制状态
在server2创建表
server1查看:
在server1插入数据
报错,因为刚创建的表没有主键,所以无法插入数据
组复制只支持innodb存储引擎,能够创建非innodb引擎的表,但是无法写入数据,向非innodb表写数据直接报错。
在server1重新创建表,插入数据
在server2查看
可以看到server1插入的数据
二、读写分离 -- mysql-proxy
1. Mysql-proxy简介:
- mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等
- MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。
搭建mysql主从复制,通过mysql-proxy将写请求转发给主库,读请求转发给从库,从而实现读写分离,负载均衡,减轻主库压力
2. 安装mysql-proxy
配置好server1和server而主从复制可参考上一篇文章
https://blog.youkuaiyun.com/qq_36023219/article/details/106087210
server3作为代理端:
没有el7的安装包,这里使用的el6的
创建conf目录
编辑配置文件
vim mysql-proxy.conf
创建日志目录(刚在配置文件中指定的)
修改下我们刚指定的读写分离脚本
主要修改最大连接数,即超过两个时启用读写分离(一般读写分离启用都是又限制的,不会一个连接就读写分离)
更改配置文件权限0660 ,对配置文件权限又要求,否则会报错
chmod 0660 /usr/local/mysql-proxy/conf/mysql-proxy.conf
报错原因是因为配置文件中有字符不识别,删除注释,将true改为1
启动成功
真是主机安装mariadb测试
yum install -y mariadb-server.x86_64
发现失败
查找原因,发现虽然mysql-proxy没报错,但启动失败,原因是3306端口被占用,因为我server3安装了mysql且运行中
停止server3的mysqld服务后再启动mysql-proxy
server1授权,方便测试
访问
代理端安装lsof工具,查看3306端口进程
可以看到转发到server1
再开一个连接
第三个连接显然不再交给server1而交给server2
三个连接分别写入