主要是基于Rancher搭建MySQL5.7 的主从复制的双机模式
应用-> 用户 -> 选择对应的应用 ->添加服务图中镜像名称:mysql:5.7.23html
这个就同 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会根据该配置的规则,以为该容器启动的时候会在哪一个主机上面运行。
这个标签就是在添加主机的时候配置,添加主机完成以后也能够添加标签调度规则:
若是配置的标签,也就是键值对只在一台主机上出现,那么该容器就是只在该主机上运行,可是若是这个标签在多台主机上出现,那么该容器就会随机选一台主机运行。mysql
在添加 MySQL的从节点的时候,有两个地方须要修改
该配置主要是将内部端口进行转换,掩护真正开发的接口
defaults mode tcp retries 2 #两次链接失败就认为是服务器不可用,也能够经过后面设置 option redispatch #当serverId对应的服务器挂掉后,强制定向到其余健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 maxconn 4096 #默认的最大链接数 timeout client 0 timeout server 0
ok! 等待 该负载均衡启动成功!
一直依赖都有人将主从复制和读写分离是混淆的。可是在我看来MySQL读写分离跟主从复制根本就是两回事。
主从复制 redis
首先主从复制一种数据冗余的技术,简单来讲是用数据备份的。体现为一个数据库节点将数据以异步同步的形式同步到另外数据库节点的技术。首先这是一种异步的方式进行同步的,这种异步同步数据也不是每时每刻进行的,因此这种方式的数据同步是保证了数据实时一致性。sql
读写分离 docker
而读写分离,简单来理解就是将针对一个数据库的读写操做分离出来,某个数据库只进行读操做、某个数据库进行写操做,而在主从复制是能够应用到读写分离中来的。
由于为了保证数据库的数据的完整性,写操做时只能在主库进行的,而读操做时能够在主库和从库进行的。可是不少人更可能是主库读、从库写这样子进行操做的。shell
大概过程以下图所示:数据库
上面我瞎说一堆理论,哪如何配置这样的主从复制的环境呢?
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;
结果:
记住File
、Position
这个两个值
第二步:给从服务器分配数据同步的帐号并受权
-- 分配帐号密码为 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才算是成功的!
其余错误状况解决
从SHOW SLAVE STATUS
的结果Last_IO_Error
查看缘由
通常都是如下几个缘由:
一、IP或者端口写错,致使网络不通
二、帐号密码写错啦
三、File、Position写错解决:
一、先 stop slave;
二、修改 change master to ...
三、start slave;
若是出现这个问题,先stop slave
在而后查看一下 mysql 后台日志,方法:docker logs <container id>
在日志中找到 上面那个错误信息:
解决方法就是:在 从库中找到 mysql.slave_master_info 这张表,清空该表
而后执行 reset slave; 就能够啦。而后从新开始 change master ...
可是记得从新查看一些 master 的File、Position
t_user
表
注意:这个只读模式针对的是
root
以外的用户
show variables like 'read_only';
root
帐号-- 在 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 连接成功, 尝试在从库中添加数据,报如下错误!
![]()