一、背景

最近在做内部平台架构上的部署调整,顺便玩了一下数据库的主从同步,特此记录一下操作~

二、具体操作

1、先建立数据存放目录(~/test/mysql_test/)

--mysql
--master
--data
--conf
--my.cnf
--slave
--data
--conf
--my.cnf

2、Master my.cnf配置文件

[mysqld]
server_id = 1 log-bin= mysql-bin read-only=0 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/

3、Slave my.cnf配置文件

[mysqld]
server_id = 2 log-bin= mysql-bin read-only=1 replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/

4、创建master主容器

docker run --name mastermysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/master/data:/var/lib/mysql -v ~/test/mysql_test/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7

5、创建slave从容器

docker run --name slavemysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/slave/data:/var/lib/mysql -v ~/test/mysql_test/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7

6、master容器设置

//进入master容器

docker exec -it mastermysql bash

//启动mysql命令,刚在创建窗口时我们把密码设置为:root

mysql -u root -p

//创建一个用户来同步数据,每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE 权限。

CREATE USER 'slave'@ '%' IDENTIFIED BY '123456';  (其实可省略)
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456'; //这里表示创建一个slaver同步账号slave,允许访问的IP地址为%,%表示通配符 //查看状态,记住File、Position的值,在Slave中将用到
show master status/G;

7、slave容器设置

//进入slaver容器
docker exec -it slavemysql bash //启动mysql命令,刚在创建窗口时我们把密码设置为:root
mysql -u root -p //设置主库链接
change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306; //启动从库同步
start slave; //查看状态
show slave status\G;

如果 show slave status\G命令结果中出现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上两项都为Yes,那说明没问题了。

三、注意事宜

1,首先在主从没有生效的时候,要保持两台服务器数据库、表相同,数据相同
 
master容器上执行:
mysqldump -uroot -p --all-databases >/root/all_database.sql
拷贝到slave容器中,在slave从库上执行:
mysql -uroot -p <all_database.sql
 
如此两步骤,主库和从库数据会追加相平,保持同步!
 
再此过程中,若主库存在业务,在同步的时候要先锁表,让其不要有修改!
 
#如需要,可以master容器中,执行以下命令锁定数据库以防止写入数据。

mysql>FLUSH TABLES WITH READ LOCK;

等待主从数据追平,主从同步后在打开锁!

#解锁数据表。

mysql>UNLOCK TABLES;

主从数据追平后,定位好从库到主库日志的文件名字,和相应的位置

master主库运行:
mysql> show master status\G;

看到相应文件名字和位置!

slave从库运行:

#设置主库链接
change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306; #执行从库同步
start slave; #查看从库同步状态
show slave status\G;

在结果中看到:

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
即可成功同步!

四、主从同步验证

注:在本次实验中,由上述my.cnf配置文件可得知,主从同步针对的数据库(除了mysql,sys,information_schema,performance_schema这些以外)的其它所有数据库都会进行同步(含数据库、表、数据等)

1、如当前数据库情况如下:

2、在master主库容器中,创建数据库master_demo,并在此库下创建表userinfo,并插入一条记录

create database master_demo;
use master_demo;
create table userinfo(username varchar(50),age int);
insert into userinfo values('Tom',18);

3、此时,进入从库容器中,查看:

确实已经将在master主库新建的数据库和表记录都同步过来了。

既然是主从同步,那反过来验证一下,在从库下插入记录后,会不会同步到主库中来呢?

在从库上操作插入记录:

insert into userinfo values('slave',20);

查看:

切到master主库中,查看:

发现在master主库中,还是只有一条记录,说明与预期设想的一样,在从库中插入记录,是不会同步到master主库中来的

再来一波,在主库master上,插入新记录:

insert into userinfo values('master',25);

在从库中,查看

发现在master主库中新加入的master记录,在从库中同步过来了。

到此,基于docker mysql数据库的主从同步配置,验证到此结束,命令、配图给的如此详细,来点个赞吧~

Docker Mysql数据库主从同步配置方法的更多相关文章

  1. Docker Mongo数据库主从同步配置方法

    一.具体操作方法 1.启两个Mongo容器 docker run --name mongo1 -p 21117:27017 -d mongo --noprealloc --smallfiles --r ...

  2. Linux下MySQL数据库主从同步配置

    说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...

  3. MySQL数据库主从同步配置

    主服务器必须打开开二进制日志. 主要是修改配置文件 , 一般在 linux 下安装的 mysql 配置文件是 my.cnf, 在 windwos 下是 my.ini, 修改主服务器配置文件 serve ...

  4. 简单的MySQL数据库主从同步配置

    Master配置: 代码如下 复制代码 log-bin = mysql-binserver-id = 1binlog-do-db = powerdns #要同步的数据库 Master新增slave账号 ...

  5. MySQL数据库主从同步延迟分析及解决方案

    一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...

  6. MySQL数据库主从同步实战过程

       Linux系统MySQL数据库主从同步实战过程 安装环境说明 系统环境: [root@~]# cat /etc/redhat-release CentOS release 6.5 (Final) ...

  7. MySql数据主从同步配置

    由于需要配置MySQL的主从同步配置,现将配置过程记录下,已被以后不时之需 MySql数据主从同步   1.1. 同步介绍 Mysql的 主从同步 是一个异步的复制过程,从一个 Master复制到另一 ...

  8. mysql数据库主从同步

    环境: Mater:   CentOS7.1  5.5.52-MariaDB  192.168.108.133 Slave:   CentOS7.1  5.5.52-MariaDB  192.168. ...

  9. mysql数据库主从同步读写分离(一)主从同步

    1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做?  不往从服务器去写了 ...

随机推荐

  1. POJ 2488 A Knight's Journey-dfs

    题目链接:http://poj.org/problem?id=2488 题目解读:首先得弄清楚国际象棋中关于“马走日”的规则,如上图中的马,它的下一步的走法有8中,所以对每一个位置的马,它所能走的8个 ...

  2. 深入理解JS防抖与节流

    参考博客:JS防抖和节流,感谢作者的用心分享 日常开发过程中,滚动事件做复杂计算频繁调用回调函数很可能会造成页面的卡顿,这时候我们更希望把多次计算合并成一次,只操作一个精确点,JS把这种方式称为deb ...

  3. 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)

    项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...

  4. 潭州课堂25班:Ph201805201 django 项目 第四十三课 后台 用户管理前后功能实现 (课堂笔记)

    用户的展示,编辑,删除, 把用户显示出来,用户名,员工(是,否), 超级用户(是, 否) 活跃状态,(非活跃示为删除) 在前台要显示该用户所属的用户组,在前台代码中是调用类的属性,所以在 user 的 ...

  5. [P1020]导弹拦截 (贪心/DP/二分/单调队列)

    一道很经典的题 这道题就是要求一个最长单调不升子序列和一个最长单调上升子序列. 先打了一个n2复杂度的 用DP #include<bits/stdc++.h> using namespac ...

  6. java第一次课

    package java第一周学习2; 达达20173435 信1705-2 import java.text.SimpleDateFormat; import java.util.Date; pub ...

  7. Ruby语法基础(一)

    Ruby语法基础(一) Ruby是一种开源的面向对象程序设计的服务器端脚本语言,最初由松本行弘(Matz)设计开发,追求『快乐和生产力』,程序员友好型,被称为『human-oriented langu ...

  8. Jmeter接口测试实例2-获取所有学生信息

    Jmeter实例2:获取所有学生信息 添加http协议—添加IP.路径.方法,添加信息头管理器,察看结果树,运行 如下图所示,响应结果中获取到所有学生信息

  9. ios程序中存储的回忆

    可编程序中的存储区域基本上分为:静态存储区,栈区,堆区,代码区. 1.静态存储区(全局存储区):该块内存在程序编译期间就已经分配好,并且在程序运行期间都一直存在,主要用于存储静态数据,全局数据和常量. ...

  10. JAVA自学笔记17

    JAVA自学笔记17 1.Map接口 1)概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值.可以存储键值对的元素 2)与Collection接口的不同: ①Map是双列的 ...