mysql 基于docker-compose配置主从复制(一主一从)

MySQL主从复制有那些好处

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发。

MySQL复制过程

  • master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;

  • slave将master的binary log events拷贝到它的中继日志(relay log);

  • slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的

操作之前需要注意的地方

  • master和slave都在一台linux上,IP是192.168.10.11
  • master 端口为33065;slave端口为33066
  • 工程目录是 /data/docker/mysql
  • 默认创建了test库
  • 两个mysql的账号密码均为 root
  • 我这里使用的mysql版本是mysql5.7

搭建过程

1、目录结构


image.png
image.png

2、编辑 docker-compose.yml

version: '2'
services:
 mysql-master:
   image: "docker.io/mysql:5.7"
   environment:
    - "MYSQL_ROOT_PASSWORD=root"
    - "MYSQL_DATABASE=test"
   volumes:
    - "./master/data:/var/lib/mysql"
    - "./master/my.cnf:/etc/mysql/my.cnf"
   links:
    - mysql-slave
   ports:
    - "33065:3306"
   restart: always
   hostname: mysql-master
 mysql-slave:
   image: "docker.io/mysql:5.7"
   environment:
    - "MYSQL_ROOT_PASSWORD=root"
    - "MYSQL_DATABASE=test"
   volumes:
    - "./slave/data:/var/lib/mysql"
    - "./slave/my.cnf:/etc/mysql/my.cnf"
   ports:
    - "33066:3306"
   restart: always
   hostname: mysql-slave

3、编辑master的配置文件
vi /data/docker/mysql/master/my.cnf

binlog-do-db=test 指定需要主从备份的数据库为test库

[mysqld]
## server_id,一般设置为IP,注意要唯一
server_id=1
log_bin=mysql-bin
## 需要主从复制的数据库
binlog-do-db=test
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

4、编辑slave的配置文件
vi /data/docker/mysql/slave/my.cnf

binlog-do-db=test 指定需要主从备份的数据库为test库

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=2
## 需要主从复制的数据库
replicate-do-db=test
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log_bin = mysql-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=row
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1

5、设置目录文件权限
在/data/docker/mysql下执行授权

chmod 644 -R *

6、启动mysql服务

docker-compose up
image.png

启动成功!

7、在master里准备数据,创建test表;并插入三条数据



SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NOT NULL COMMENT 'id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1);
INSERT INTO `test` VALUES (2);
INSERT INTO `test` VALUES (3);

SET FOREIGN_KEY_CHECKS = 1;

8、在master中查看binlog的版本参数

show master status;
image.png

File 和 Position两个参数会在下面用到

9、在slave中执行命令

change master to master_host='192.168.10.11',master_port=33065,master_user='root',master_password='root',master_log_file='mysql-bin.000003',master_log_pos=1259;
  • master_host master的ip
  • master_port master的端口
  • master_user master 用户名
  • master_password master 密码
  • master_log_file master中此时的File 参数
  • master_log_pos master中此时的Position 参数

salve中启动主从复制

start slave;

查看从机的复制状态

show slave status;
image.png

Waiting for master to send event 即等待主服务器发送事件;现在到master里新增一条记录
下面两个参数都是YES,则说明主从配置成功!Slave_IO_Running:Yes和Slave_SQL_Running:Yes


image.png
INSERT INTO `test`.`test`(`id`) VALUES (4);

slave再次执行

show slave status;
image.png

提示slave中test表不存在,难道mysql在主从复制过程中只是同步变更,而之前master中已经存在的表结构和表数据不会被同步?那么就先将master中的表结构和数据一起复制到slave中,然后进行insert:


image.png

同步成功!!

10、同步停止方式
slave 中执行

stop slave;

注意事项

1、在停止一次主从复制后如果需要再次启用,需要再次到master中执行show master status; 生成最新的File 和 Position
2、开启同步后,master中已经存在的表结构和表数据不会被同步到slave中;将master中的数据迁移至slave,之后就可以实现同步了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容