系统环境 * 3

Ubuntu 16.04

mysql 8.0.12

docker 18.06.1-ce

docker-compose 1.23.0-rc3

*3 ==> PS  ###我用的是虚拟机, 所以起了3个虚拟机,分配 IP如下###

主IP :192.168.100.100

从IP :192.168.100.101、192.168.100.102

#开始

##安装Docker、docker-compose环境

参考这篇博文  https://blog.csdn.net/diligent_lee/article/details/79098302

#操作注意事项:

1、如果你是windows上面用虚拟机去模拟的话,通过操作编写文件的时候,要保存为liunx格式的文本。

2、一些目录可能需要执行的权限,建议chmod +x 你的目录及其文件。我操作的时候,3个虚拟机上面的文件目录都是一样的,为了方便。

操作的目录文件结构如下

----------------------------------------------------------------

(1)conf里面放mysql的配置文件

----------------------------------------------------------------

(2)data用于挂载mysql的数据目录

----------------------------------------------------------------

(3)docker里面我要接下来要创建的Dockerfile文件

##制作Dockerfile文件

主从的配置文件一样

FROM mysql
MAINTAINER <caicai xx@qq.com>
EXPOSE 3306
CMD ["mysqld"]

保存文件名为Dockerfile。接着在同级目录下执行脚本如下:

docker build -t test/mysql:1.0 .

注意后面有个空格和.符号。

test/mysql:1.0 表示保存为的docker镜像名称

执行完之后,查看本地的镜像文件。

##编写mysql的配置文件my.cnf

主 192.168.100.100 配置文件如下

[mysqld]

# By default we only accept connections from localhost
bind-address="192.168.100.100"
report_host="192.168.100.100" #Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1 #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4 #数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci #设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘ #是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1 ##################主从复制设置##################
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
log-bin=mysql-bin
log-bin-index=mysql-bin.index #设置加密方式
default_authentication_plugin=mysql_native_password #group replication
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address ="192.168.100.100:33061"
loose-group_replication_group_seeds= "192.168.100.100:33061,192.168.100.101:33061,192.168.100.102:33061"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

因为我们等下做的是1主2从,所以这里还需要从的2个配置文件,共3个。不同的地方就是红色的地方。

192.168.100.100为2个从的IP,替换下,还有就是
主的server-id=1,从的设置为2、3就好了。

##编写docker-compose文件

version: '2'
services:
mysql:
container_name: mysql
network_mode: "host"
environment:
MYSQL_ROOT_PASSWORD: "123456"
image: test/mysql:1.0
restart: unless-stopped
volumes:
- "/usr/test/mysql/data:/var/lib/mysql"
- "/usr/test/mysql/conf:/etc/mysql/conf.d"

上面脚本其实很简单,就是设置mysql密码为123456,然后挂载了2个目录,data是mysql的数据文件目录,conf是mysql的配置文件目录,为了mysql启动的时候加载my.cnf

3台主机,依次启动容器

进入我的/usr/test/mysql根目录,执行docker-compose up -d

可以看到我们的mysql容器已经起来了。然后看下刚才挂载的data目录,是不是有东西。

不放心,再检查下容器服务

说明,mysql服务已经起来了。ps:这里我就不查看日志什么的,即便出错了。篇幅有限。偷懒:)

说了一大堆,下面才是重点 [由于我本地验证成功过了,所以下面就没有截图了,直接贴脚本]

1、设置mysql主从复制

(1) 配置master

进入msater的mysql容器,输入命令

docker exec -it mysql /bin/bash  #mysql表示我刚才docker-compose里面设置的容器名称

登录mysql 控制台,帐号root 密码123456

mysql -uroot -p123456

创建用于主从复制的用户,并授权所有。(网上教程说,只需要同步的权限就可以,但是我操作的时候会发现一大堆同步日志错误,各种没权限等,有没有大侠指明原因出在哪里)

SET SQL_LOG_BIN =0;
CREATE USER 'rpl_user'@'%' IDENTIFIED BY '123456';
grant all privileges on *.* to 'rpl_user'@'%';
#GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%' ;
SET SQL_LOG_BIN =1;
CHANGE MASTER TO MASTER_USER ='rpl_user', MASTER_PASSWORD ='123456' FOR CHANNEL 'group_replication_recovery';
FLUSH PRIVILEGES; INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装Group Replication plugin
SHOW PLUGINS; SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

锁库,不让数据再进行写入动作,这个命令在结束终端会话的时候会自动解锁

FLUSH TABLES WITH READ LOCK;

重置下master状态,这点有争议,其他教程是先查询master状态,show master status; 然后在通过制定日志位置去同步。

reset master;

(2)配置slave

同样进入mysql控制台,然后

#从节点
reset master;
SET SQL_LOG_BIN =0;
CREATE USER 'rpl_user'@'%' IDENTIFIED BY '123456';
grant all privileges on *.* to 'rpl_user'@'%';
#GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%' ;
SET SQL_LOG_BIN =1;
CHANGE MASTER TO MASTER_USER ='rpl_user', MASTER_PASSWORD ='123456' FOR CHANNEL 'group_replication_recovery';
FLUSH PRIVILEGES; INSTALL PLUGIN group_replication SONAME 'group_replication.so'; #安装Group Replication plugin
#SHOW PLUGINS; CHANGE MASTER TO
MASTER_HOST='192.168.100.100',
MASTER_USER='rpl_user',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0; START GROUP_REPLICATION;
start slave;

 于是乎,差不多整个过程就是这样了。可能会遇到一些异常,只能一个一个踩坑解决了,主要是开头注意事项的那些吧。比如server_id一样、同步用户的权限不足、slave上同步的日志异常。

参考文章:https://blog.csdn.net/wang_jingj/article/details/53931237

http://www.cnblogs.com/xinysu/p/6674832.html

https://www.jianshu.com/p/fed36ba15b01

https://blog.csdn.net/boling_cavalry/article/details/79747488

https://blog.csdn.net/wang_jingj/article/details/53931237

基于Docker Compose搭建mysql主从复制(1主2从)的更多相关文章

  1. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  2. 基于 Docker 搭建 MySQL 主从复制

    本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 根据网上教程走还是踩了一些坑,不过所幸最终 ...

  3. Docker搭建MySQL主从复制

    Docker搭建MySQL主从复制 主从服务器上分别安装Docker 1.1 Docker 要求 CentOS 系统的内核版本高于 3.10 [root@localhost ~]# uname -r ...

  4. MySQL(14)---Docker搭建MySQL主从复制(一主一从)

    Docker搭建MySQL主从复制(一主一从) 上一篇博客写了MYSQL主从复制原理 : MySQL(13)---MYSQL主从复制原理 这篇我们来写 Docker搭建MYSQL主从复制(一主一从) ...

  5. 1.Mysql集群------Docker下的Mysql主从复制

    前言: 实话说,我想做的是Mysql集群架构. 我的计划是: 1.实现Docker下的Mysql主从复制 2.实现MyCat基于Mysql的读写分离 3.实现MyCat的分库分表 4.实现pxc集群 ...

  6. 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)

    0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...

  7. 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……

    两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...

  8. [置顶] 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……

    两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...

  9. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

随机推荐

  1. (转)Repeater中增加序号自增列

    <%# Convert.ToString(Container.ItemIndex+)%> 当Repeater空为时,提示没有数据... <FooterTemplate> < ...

  2. bzoj 1355: [Baltic2009]Radio Transmission【kmp】

    kmp复健,答案是n-next[n] #include<iostream> #include<cstdio> using namespace std; const int N= ...

  3. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】

    参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...

  4. Vue的响应式原理

    Vue的响应式原理 一.响应式的底层实现 1.Vue与MVVM Vue是一个 MVVM框架,其各层的对应关系如下 View层:在Vue中是绑定dom对象的HTML ViewModel层:在Vue中是实 ...

  5. 【原创】《从0开始学RocketMQ》—集群搭建

    用两台服务器,搭建出一个双master双slave.无单点故障的高可用 RocketMQ 集群.此处假设两台服务器的物理 IP 分别为:192.168.50.1.192.168.50.2. 内容目录 ...

  6. c语言程序设计案例教程(第2版)笔记(二)—函数、递归

    零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...

  7. A - I'm bored with life

    Holidays have finished. Thanks to the help of the hacker Leha, Noora managed to enter the university ...

  8. 暑期训练狂刷系列——Lightoj 1084 - Winter bfs

    题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1084 题目大意: 有n个点在一条以零为起点的坐标轴上,每个点最多可以移动k, ...

  9. [USACO 2011 Dec Gold] Threatening Letter【后缀】

    Problem 3: Threatening Letter [J. Kuipers, 2002] FJ has had a terrible fight with his neighbor and w ...

  10. 洛谷 P2061 [USACO07OPEN]城市的地平线City Horizon

    简化版的矩形面积并,不用线段树,不用离散化,代码意外的简单 扫描线,这里的基本思路就是把要求的图形竖着切几刀分成许多矩形,求面积并.(切法就是每出现一条与y轴平行的线段都切一刀) 对于每一个切出来的矩 ...