乐趣区

CentOS7-快速搭建基于Rancher-16-的容器自动化资源调度平台二-MySQL主从复制

概要

主要是基于 Rancher 搭建 MySQL5.7 的主从复制的双机模式

添加服务 -MySQL57-master

应用 -> 用户 -> 选择对应的应用 -> 添加服务

图中镜像名称:mysql:5.7.23

对该服务添加一些信息

这个就同 Docker 启动 一个容器一样,有些需要指定 端口、卷、或者变量

配置环境变量

图中变量
MYSQL_ROOT_PASSWORD=123456
TZ=Asia/Shanghai

映射卷

路劲映射为:
/d01/test/mysql/db:/var/lib/mysql
/d01/test/mysql/conf:/etc/mysql/conf.d
/d01/test/mysql/backup:/backup

配置调度规则

所谓调度规则就是 Rancher 会根据该配置的规则,觉得该容器启动的时候会在哪个主机上面运行。
这个标签就是在添加主机的时候配置,添加主机完成之后也可以添加标签

调度规则:
如果配置的标签,也就是键值对只在一台主机上出现,那么该容器就是只在该主机上运行,但是如果这个标签在多台主机上出现,那么该容器就会随机选一台主机运行。

启动成功

添加 Salve 节点 – MySQL57-salve

在添加 MySQL 的从节点的时候,有两个地方需要修改

  • 服务名称
  • 调度规则: 不能让所有的 mysql 都是同一台主机上面运行

配置图例如下:

配置负载均衡规则

该配置主要是将内部端口进行转换,掩护真正开发的接口

添加负载均衡

开始配置负载均衡的内容

defaults
    mode tcp
    retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置
    option redispatch       #当 serverId 对应的服务器挂掉后,强制定向到其他健康的服务器
    option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
    maxconn 4096            #默认的最大连接数
    timeout client          0
    timeout server          0
将调度规则配置到安装 rancher 的主机上

ok! 等待 该负载均衡启动成功!

使用 Navicat 测试数据库连接

配置 MySQL 主从复制

MySQL 主从复制和读写分离的区别

一直依赖都有人将主从复制和读写分离是混淆的。但是在我看来 MySQL 读写分离跟主从复制根本就是两回事。

主从复制

首先主从复制一种数据冗余的技术,简单来说是用数据备份的。体现为一个数据库节点将数据以异步同步的形式同步到另外数据库节点的技术。首先这是一种异步的方式进行同步的,这种异步同步数据也不是每时每刻进行的,所以这种方式的数据同步是保证了数据实时一致性。

读写分离

而读写分离,简单来理解就是将针对一个数据库的读写操作分离出来,某个数据库只进行读操作、某个数据库进行写操作,而在主从复制是可以应用到读写分离中来的。
因为为了保证数据库的数据的完整性,写操作时只能在主库进行的,而读操作时可以在主库和从库进行的。但是很多人更多是主库读、从库写这样子进行操作的。

大概过程如下图所示:

上面我瞎说一堆理论,哪如何配置这样的主从复制的环境呢?

搭建 MySQL 主从复制

MySQL 的主从复制是通过配置文件来配置实现,是 MySQL 官方支持,不需要什么中间插件。所以得找到 MySQL 的配置文件的位置。这个位置得从启动 MySQL 服务的配置的 卷 中查看, 如果没有配置的话,得进去容器内部进行配置。

所以得进入容器内部进行操作,但是这个就比较麻烦,先进入容器内部看看再说
怎么进入容器内部呢?

二话不说,先来个 docker –help

这个命令的意思应该就是针对一个运行的容器执行命令, 具体如何操作?
docker exec –help

具体操作如下

但是我们在查看 mysql 这个 my.cnf 这个配置配置文件的时候,是包含了 /etc/mysql/conf.d/ 这个目录中的配置文件的,然后在路径映射中,我们配置了这个路径映射的,所以我们直接在本地配置就好啦。

开始配置

在本地主机找到上面的映射路径,创建一个配置文件 vi /d01/test/mysql/conf/mysql-local.cnf
配置以下内容

# 注意 /d01/test/mysql/conf/mysql-local.cnf 这个路劲按自己映射的路径配置即可
# 这个路径映射的是 容器的 /etc/mysql/conf.d/ 这路径

# 这个是主数据库的配置
server_id = 101
log-bin=mysql-bin

# 这个是从服务器的配置
server_id=104  ### 从服务器 server_id
log-bin=mysql-slave-bin
## relay_log 配置中继日志
relay_log=edu-mysql-relay-bin

注意

如果你在本地配置的 mysql 配置没有生效,记得将配置文件后缀改为 *.cnf

查看该帮助 MySQL !includedir not working

但是如果您添加上了上面的配置仍然没有生效的话,怎么办?

查看容器启动时候的日志

# 命令如下:
docker logs <container id>

然后你可能看到的日志如下:

大概意思就是说: 在配置文件 xx 的第几行中发现有配置项的前面没有分组
那直接添加分组就好啦,具体是哪个分组呢?百度一个标准 my.cnf 配置文件结构即可。在这里我直接告诉说啦
这个分组数 mysqld

也就是直接在配置文件前面添加 [mysqld] 即可

最终配置文件示意图如下:

ok! 重启容器!查看是否配置成功:

以上是配置文件方面的配置工作,如果这个配置好,算是成功了一大半啦!


配置从服务器同步主服务器

这一步的工作是在连接好 mysql 执行的命令
可以在 Navicat 中执行。

以下操作分为以下几个步骤:

第一步:查看主服务器状态

-- 在主服务器中执行以下命令
show master status;

结果:

记住 FilePosition 这个两个值

第二步:给从服务器分配数据同步的账号并授权

-- 分配账号密码为 slave/123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

第三步:在从服务器中创建同步的连接

change master to master_host='192.168.182.103', master_port=18083, master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=968;

-- 注意上面几个参数:master_host : 主服务器的 ip
master_port : 主数据库对外开放的端口 也就是在上面负载均衡中配置
master_user : 主服务器配置的账号
master_password : 密码
master_log_file: 这个就是上面要记录的那个 File 的值
master_log_pos: 这个是 Position 的值

第四步:开始同步

start slave;

第五步:查看同步状态

SHOW SLAVE STATUS;

只有这两个都是 Yes 才算是成功的!

其他错误情况解决

  • Slave IO Running 的值一直是 Connecting 状态

SHOW SLAVE STATUS 的结果 Last_IO_Error 查看原因
一般都是以下几个原因:
1、IP 或者端口写错,导致网络不通
2、账号密码写错啦
3、File、Position 写错

解决:
1、先 stop slave;
2、修改 change master to …
3、start slave;

  • 报错:Slave failed to initialize relay log info structure from the repository

如果出现这个问题,先 stop slave
在然后查看一下 mysql 后台日志,方法:docker logs <container id>
在日志中找到 上面那个错误信息:

解决方法就是:在 从库中找到 mysql.slave_master_info 这张表,清空该表
然后执行 reset slave; 就可以啦。

然后重新开始 change master …
但是记得重新查看一些 master 的 File、Position

MYSQL 主从复制验证

  • 在主库中创建一张 t_user

  • 添加一条记录

  • 在从库中查询

在从库中开启 只读模式

注意:这个只读模式针对的是 root 之外的用户

  • 查看从库的只读状态
show variables like 'read_only';

  • 配置只读

  • 创建非 root 账号

参考链接 – mysql 新建用户,修改权限

-- 在 root 账号下创建
-- 格式:create user "username"@"host" identified by "password";
-- 授权:grant select on test.* to 'user1'@'localhost';  /* 给予查询权限 */
-- 刷新权限:flush privileges;

-- 创建一个 hunter/123456 的账户
create user "hunter"@"localhost" identified by "123456";

-- 给 hunter 分配 test 数据库下 select,delete,update,insert,create 的权限
grant select,delete,update,insert,create on test.* to 'hunter'@'localhost';

-- 刷新权限
flush privileges;

如果是 @localhost 的话,在外面使用 Navicat 链接可能会出现 权限不够

解决方法: 删除该用户,重新创建一个外网支持的账号

-- 删除 hunter
drop user 'hunter'@'localhost';

create user "hunter"@"%" identified by "123456";

grant select,delete,update,insert,create on test.* to 'hunter'@'%';

flush privileges;

使用 Navicat 链接成功,尝试在从库中添加数据,报以下错误!


OK! 大功告成!

退出移动版