转载自https://zhuanlan.zhihu.com/p/45193580

前言

随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作。此时,我们可以将数据库扩展成 主从复制模式,将 读操作写操作 分离开来,多台数据库 分摊请求,从而 减少单库访问压力,进而应用得到优化。

正文

主从复制的方式

MySQL 5.6 开始主从复制有两种方式:基于日志(binlog)和 基于 GTID(全局事务标示符)。

本文只涉及基于日志 binlog 的 主从配置

主从复制的流程

MySQL 同步操作通过 3 个线程实现,其基本步骤如下:

  1. 主服务器 将数据的更新记录到 二进制日志(Binary log)中,用于记录二进制日志事件,这一步由 主库线程 完成;
  2. 从库主库二进制日志 复制到本地的 中继日志(Relay log),这一步由 从库I/O线程 完成;
  3. 从库 读取 中继日志 中的 事件,将其重放到数据中,这一步由 从库SQL线程 完成。

主从模式的优点

1. 负载均衡

通常情况下,会使用 主服务器 对数据进行 更新删除新建 等操作,而将 查询 工作落到 从库 头上。

2. 异地容灾备份

可以将主服务器上的数据同步到 异地从服务器 上,极大地提高了 数据安全性

3. 高可用

数据库的复制功能实现了 主服务器从服务器间 的数据同步,一旦主服务器出了 故障,从服务器立即担当起主服务器的角色,保障系统持续稳定运作。

4. 高扩展性

主从复制 模式支持 2 种扩展方式:

  • scale-up

向上扩展或者 纵向扩展,主要是提供比现在服务器 性能更好 的服务器,比如 增加 CPU 和 内存 以及 磁盘阵列等,因为有多台服务器,所以可扩展性比单台更大。

  • scale-out

向外扩展或者 横向扩展,是指增加 服务器数量 的扩展,这样主要能分散各个服务器的压力。

主从模式的缺点

1. 成本增加

搭建主从肯定会增加成本,毕竟一台服务器和两台服务器的成本完全不同,另外由于主从必须要开启 二进制日志,所以也会造成额外的 性能消耗

2. 数据延迟

从库主库 复制数据肯定是会有一定的 数据延迟 的。所以当刚插入就出现查询的情况,可能查询不出来。当然如果是插入者自己查询,那么可以直接从 主库 中查询出来,当然这个也是需要用代码来控制的。

3. 写入更慢

主从复制 主要是针对 读远大于写 或者对 数据备份实时性 要求较高的系统中。因为 主服务器 在写中需要更多操作,而且 只有一台 可以写入的 主库,所以写入的压力并不能被分散。

主从复制的前提条件

  1. 主从服务器 操作系统版本位数 一致。
  2. 主数据库和从数据库的 版本 要一致。
  3. 主数据库和从数据库中的 数据 要一致。
  4. 主数据库 开启 二进制日志,主数据库和从数据库的 server_id 在局域网内必须 唯一

具体配置

1. 环境准备

创建网络

docker network create docker_bridge

2. 配置docker-compose.yml

docker-compose.yml

version: '2'services:  mysql-master:    build:      context: ./      dockerfile: master/Dockerfile    environment:      - "MYSQL_ROOT_PASSWORD=root"      - "MYSQL_DATABASE=replicas_db"    ports:      - "33065:3306"    restart: always    hostname: mysql-master    #使用桥接,保证docker容器之间通信正常    networks:          - docker_bridge  mysql-slave:    build:      context: ./      dockerfile: slave/Dockerfile    environment:      - "MYSQL_ROOT_PASSWORD=root"      - "MYSQL_DATABASE=replicas_db"    ports:      - "33066:3306"    restart: always    hostname: mysql-slave    #使用桥接,保证docker容器之间通信正常    networks:      - docker_bridge#使用桥接,保证docker容器之间通信正常networks:  docker_bridge:    external: true

3. 主数据库配置

3.1. 配置Dockerfile

Dockerfile

FROM mariadb:latestMAINTAINER harrisonADD ./master/my.cnf /etc/mysql/my.cnf

3.2. 配置my.cnf文件

my.cnf

[mysqld]## 设置server_id,一般设置为IP,注意要唯一server_id=100  ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)binlog-ignore-db=mysql  ## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)log-bin=replicas-mysql-bin  ## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存binlog_cache_size=1M  ## 主从复制的格式(mixed,statement,row,默认格式是statement)binlog_format=mixed  ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。expire_logs_days=7  ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave_skip_errors=1062

4. 从数据库配置

4.1. 配置Dockerfile

Dockerfile

FROM mariadb:latestMAINTAINER harrisonADD ./slave/my.cnf /etc/mysql/my.cnf

4.2. 配置my.cnf文件

[mysqld]## 设置server_id,一般设置为IP,注意要唯一server_id=101  ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)binlog-ignore-db=mysql  ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=replicas-mysql-slave1-bin  ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存binlog_cache_size=1M  ## 主从复制的格式(mixed,statement,row,默认格式是statement)binlog_format=mixed  ## 二进制日志自动删除/过期的天数。默认值为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. 创建容器

进入 docker 目录,运行 docker-compose 启动命令。

$ docker-compose up -d

如图所示,MySQL 主数据库从数据库 的容器创建成功。

分别配置 主数据库从数据库 的连接信息如下:

  • 主数据库
  • 从数据库

6. 配置从数据库

检查从库的起始状态

$ show master status;

如图所示,从数据库处于 未同步复制状态

检查主库的状态

$ show master status;

记录 主数据库 binary-log 的 文件名称数据同步起始位置

  • File: replicas-mysql-bin.000003
  • Position: 154

从库配置主库信息

从数据库 上运行 主数据库 的相关配置 sql 进行主从关联

CHANGE MASTER TO    MASTER_HOST='mysql-master',    MASTER_USER='root',    MASTER_PASSWORD='root',    MASTER_LOG_FILE='replicas-mysql-bin.000003',    MASTER_LOG_POS=154;

重新启动 slave 服务

$ stop slave$ start slave

进一步检查 从数据库 的状态信息,两者已经进行 数据同步 关联。

7. 创建目标表

主数据库 中创建一张测试数据表 course

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for ivy_user-- ----------------------------DROP TABLE IF EXISTS `ivy_user`;CREATE TABLE `ivy_user` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',  `name` varchar(100) NOT NULL COMMENT '用户名字',  `phone` varchar(20) NOT NULL COMMENT '用户手机号码',  `create_time` bigint(13) unsigned NOT NULL COMMENT '创建时间',  `update_time` bigint(13) unsigned NOT NULL COMMENT '更新时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

主数据库从数据库 的 数据处于 同步状态,主从复制集群搭建完成。

转载自https://zhuanlan.zhihu.com/p/45193580

docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群相关推荐

  1. centos7 docker-compose安装_Docker Compose 搭建 Redis Cluster 集群环境

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

  2. 本地连接服务器搭建的 Redis 集群

    本地连接服务器搭建的 Redis 集群 在实际运行测试中,存在两个问题 安全组或防火墙开放端口 主要开放+10000端口. 如果要连接 Redis集群的应用服务不和 Redis集群在一个局域网下,会出 ...

  3. 单机 搭建kafka集群 本地_10分钟搭建单机Kafka集群

    单机版kafka集群有什么作用 练习上手用. 搭建zookeeper集群首先下载zookeeper解压 apache zookeeper tar -zxvf apache-zookeeper-3.5. ...

  4. 利用Docker搭建Redis主从复制集群

    查看容器IP地址 docker inspect cd27261ad940(容器id) 追随主节点 slaveof 主节点IP 端口号 查看主节点的从节点信息 info replication 测试 从 ...

  5. CentOS 7 上搭建 Nacos Cluster 集群

    全部在WMWare虚拟机上实现,一共准备4个节点,IP 分别为 192.168.216.128/138/148/198. 整体架构: 1)Nginx,部署在1个节点198,负责负载均衡Nacos 请求 ...

  6. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群

    前言 随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作.此时,我们可以将数据库扩展成 主从复制模式,将 读操作 和 写操作 分离开来,多台数据库 ...

  7. 使用docker compose部署MySQL主从复制集群

    使用docker compose部署MySQL主从复制集群 环境说明 宿主机:Ubuntu 14.04.6 LTS Docker Engine: 18.06.3-ce docker compose: ...

  8. 学习Docker容器网络模型 - 搭建分布式Zookeeper集群

    ZooKeeper是一个流行的分布式协调服务.它提供了两种不同的部署方式:单机模式和分布式模式.其中单机模式的部署非常简单,网上也有很多资料,我们今天会利用Docker搭建分布式Zookeeper集群 ...

  9. Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

    文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...

最新文章

  1. python如何将视频流实时传输到手机?(有问题,一次只能被一台访问)
  2. boost::fusion::make_fused_function_object用法的测试程序
  3. LeetCode—213. 打家劫舍 II
  4. 【HDU - 1083 】Courses (二分图)
  5. php数据回显是什么意思,jquery回显是什么意思
  6. Eclipse插件安装方式
  7. 数据操作语言DML及数据定义语言DDL的区别
  8. javax.comm的API
  9. SLF4J源码解析-LoggerFactory(二)
  10. GCC Link Time Optimization
  11. Keil 5 安装教程
  12. Google Earth Engine(GEE)——计算NDVI\EVI\RVI\DVI\SAVI归一化植被指数、比值植被指数、差值植被指数、土壤调节植被指数、增强型植被指数和绿度植被指数计算并下载
  13. 计算机组成原理 学后感,【计算机组成原理实验心得体会】_计算机组成原理实验心得_计算机组成原理实验感想...
  14. 计算机无法识别出硬件,电脑检测不到硬盘,电脑硬件故障检测工具
  15. MySQL实战系列3:视图、存储过程、函数、索引全解析
  16. 揪出系统中秘密隐藏的木马(下)
  17. 呕心沥血踩坑之:外星人M17电脑在一块硬盘上成功安装Windows与Ubuntu16.04双系统
  18. 今日学习之SQL基本语法与操作
  19. 牛客国庆集训派对Day1 New Game!+计算几何
  20. 华为交换机查看网口光功率命令

热门文章

  1. python中常见的流程结构-【Python2】04、Python程序控制结构
  2. python语言特点有哪些-python语言的有何特点?
  3. python和linux哪个难学-请不要重复犯我在学习Python和Linux系统上的错误
  4. python爬虫框架排行榜-公认8个效率最高的爬虫框架
  5. python处理数据的优势-选择python进行数据分析的理由和优势
  6. python实训项目-Python开发基础-项目实训-在线投票系统.pptx
  7. hduoj1021 Fibonacci Again
  8. java设计模式:prototype模式
  9. Vector的使用方法和自我理解
  10. HDU 1712 裸分组dp