1. 安装mysql
这里为了快速搭建,直接使用rpm安装包安装(编译安装太费时)
获取安装包
server1安装:
server2:
server3:
2. 基于二进制位置的主从复制
- 主节点:server1:192.168.1.11
- 从节点:server2:192.168.1.12
主节点:
vim /etc/my.cnf
启动mysql服务,并查看临时密码
cat /var/log/mysqld.log | grep password
安全初始化mysql数据库
更改密码,默认密码是刚才在日志中查到的临时密码。
注:这里的新密码有健壮性要求,用大小写字母、数字、符号混合
移除匿名用户登陆权限
禁止超户远程登陆
移除测试数据库
刷新权限表
登陆数据库
创建复制用户并授权(192.168.1网段huayu用户授权所有权限)
grant replication slave on *.* to huayu@'192.168.1.%' identified by 'Huayu+123';
查看master状态(这里的二进制文件和位置需要在从节点使用)
show master status;
从节点:
先测试是否可以远程登录主节点mysql
mysql -h 远程主机ip -u登陆用户身份 -p
退出(quit)
更改mysql配置文件
vim /etc/my.cnf
启动服务
查看server2中mysql的临时密码,并安全初始化
初始化过程和主节点一样
登陆mysql
从库和主库建立连接,必须和主服务器里查看到的数据保持一致
查看从节点状态
主要是IO和SQL的状态是yes即可
测试:
在主节点创建数据库
创建表,插入数据
在从节点查看
可以看到,在主节点插入的数据,在从节点也可以看到,证明复制成功
3. 基于gtid的主从复制
优点:不需要知道复制哪个文件,也不需要知道从哪个号开始复制
因为之前的实验已经配置主从复制,在这里先停止slave
更改主节点配置文件,启用gtid
vim /etc/my.cnf
重启服务,并授权
从节点更改配置文件,添加gtid
重启mysql,添加主节点配置
change master to master_host='192.168.1.11', master_user='huayu', master_password='Huayu+123', MASTER_AUTO_POSITION=1;
查看从节点状态
测试
主节点插入一条数据(注:可以看到二进制文件和位置都改变了)
在从节点查看
也可以查看gtid记录
3. 半同步复制
主库在执行完客户端提交的事务后不会立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟。
主库:
在主库安装半同步插件,查看插件是否加载
install plugin rpl_semi_sync_master soname 'semisync_master.so';
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
查看是否启用
show global variables like '%semi%';
显然没有启用
临时设置启用
set global rpl_semi_sync_master_enabled=1;
永久设置:编辑文件/etc/my.cnf写入rpl_semi_sync_master_enabled=1
设置超时时间(单位ms)
set global rpl_semi_sync_master_timeout=5000;
再次查看
查看半同步是否运行
show status like 'Rpl_semi_sync_master_status';
从库:
安装半同步从库插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
启用插件
set global rpl_semi_sync_slave_enabled=1;
这里需要重启slave IO 否则半同步不生效
stop slave IO_THREAD;
start slave IO_THREAD;
查看半同步插件启用
show global variables like '%semi%';
查看半同步是否在运行(状态)
show status like 'Rpl_semi_sync_slave_status';
测试:
正常情况下
主库插入一条数据
从库读取
可以看到成功复制
在主库查看半同步状态,可以看到成功复制一次,失败0次
停止从库slave
主节点再次插入
可以看到,耗时5s多,因为我们之前设置超时时间是5s
主库查看
主库成功插入
从库查看
从库没有数据
主库查看半同步状态
同步失败一次
从库启动slave,再查看
可以看到,数据又同步了
注:当半同步复制发生超时时(rpl_semi_sync_master_timeout参数,单位是毫秒,默认为10000,即10s,我之前设定为5s),会暂时关闭半同步复制,使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在超时时间内,收到了从库的响应,则主从又重新恢复为半同步复制。