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

概要

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

添加服务 -MySQL57-master

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

图中镜像名称:mysql:5.7.23html

clipboard.png

对该服务添加一些信息

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

clipboard.png

图中变量
MYSQL_ROOT_PASSWORD=123456
TZ=Asia/Shanghai
映射卷

clipboard.png

路劲映射为:
/d01/test/mysql/db:/var/lib/mysql
/d01/test/mysql/conf:/etc/mysql/conf.d
/d01/test/mysql/backup:/backup
配置调度规则
所谓调度规则就是Rancher会根据该配置的规则,以为该容器启动的时候会在哪一个主机上面运行。
这个标签就是在添加主机的时候配置,添加主机完成以后也能够添加标签

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

clipboard.png

启动成功

clipboard.png

添加Salve节点 - MySQL57-salve

在添加 MySQL的从节点的时候,有两个地方须要修改
  • 服务名称
  • 调度规则: 不能让全部的mysql都是同一台主机上面运行

配置图例以下:

clipboard.png

clipboard.png

配置负载均衡规则

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

添加负载均衡

clipboard.png

开始配置负载均衡的内容

clipboard.png

clipboard.png

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

clipboard.png

ok! 等待 该负载均衡启动成功!
使用Navicat 测试数据库链接

clipboard.png

配置MySQL主从复制

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

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

主从复制 redis

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

读写分离 docker

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

大概过程以下图所示:数据库

clipboard.png

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

搭建MySQL主从复制

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

clipboard.png

因此得进入容器内部进行操做,可是这个就比较麻烦,先进入容器内部看看再说
怎么进入容器内部呢?

二话不说,先来个docker --help服务器

clipboard.png

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

clipboard.png

具体操做以下
clipboard.png

可是咱们在查看mysql 这个my.cnf 这个配置配置文件的时候,是包含了/etc/mysql/conf.d/ 这个目录中的配置文件的,而后在路径映射中,咱们配置了这个路径映射的,因此咱们直接在本地配置就好啦。
clipboard.png网络

开始配置

在本地主机找到上面的映射路径,建立一个配置文件 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

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

clipboard.png

查看容器启动时候的日志

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

而后你可能看到的日志以下:

clipboard.png

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

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

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

clipboard.png

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

clipboard.png

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

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

这一步的工做是在链接好 mysql 执行的命令
能够在Navicat中执行。

如下操做分为如下几个步骤:

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

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

结果:
clipboard.png

记住 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的值

clipboard.png

第四步:开始同步

start slave;

第五步:查看同步状态

SHOW SLAVE STATUS;

clipboard.png

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

其余错误状况解决

  • Slave IO Running 的值一直是 Connecting 状态
SHOW SLAVE STATUS 的结果 Last_IO_Error 查看缘由
通常都是如下几个缘由:
一、IP或者端口写错,致使网络不通
二、帐号密码写错啦
三、File、Position写错

解决:
一、先 stop slave;
二、修改 change master to ...
三、start slave;

  • 报错: Slave failed to initialize relay log info structure from the repository
若是出现这个问题,先stop slave
在而后查看一下 mysql 后台日志,方法:docker logs <container id>
在日志中找到 上面那个错误信息:

clipboard.png

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

而后从新开始 change master ...
可是记得从新查看一些 master 的File、Position

MYSQL 主从复制验证

  • 在主库中建立一张 t_user

clipboard.png

  • 添加一条记录

clipboard.png

  • 在从库中查询

clipboard.png

在从库中开启 只读模式

注意:这个只读模式针对的是 root 以外的用户
  • 查看从库的只读状态
show variables like 'read_only';

clipboard.png

  • 配置只读

clipboard.png

  • 建立非 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连接可能会出现 权限不够
clipboard.png

解决方法: 删除该用户,从新建立一个外网支持的帐号

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

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

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

flush privileges;
使用 Navicat 连接成功, 尝试在从库中添加数据,报如下错误!
clipboard.png

OK! 大功告成!
相关文章
相关标签/搜索