Docker容器技术搭建Mysql主从复制集群

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

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

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

主从复制的流程

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

主服务器 将数据的更新记录到 二进制日志(Binary log)中,用于记录二进制日志事件,这一步由 主库线程 完成;

从库 将 主库 的 二进制日志 复制到本地的 中继日志(Relay log),这一步由 从库 I/O 线程 完成;

从库 读取 中继日志 中的 事件,将其重放到数据中,这一步由 从库 SQL 线程 完成。

主从模式的优点

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

  2. 异地容灾备份
    可以将主服务器上的数据同步到 异地从服务器 上,极大地提高了 数据安全性。

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

  4. 高扩展性
    主从复制 模式支持 2 种扩展方式:

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

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

主从模式的缺点

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

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

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

主从复制的前提条件
主从服务器 操作系统版本 和 位数 一致。

主数据库和从数据库的 版本 要一致。

主数据库和从数据库中的 数据 要一致。

主数据库 开启 二进制日志,主数据库和从数据库的 server_id 在局域网内必须 唯一。

具体配置
① .编写主库从库配置文件
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

max_allowed_packet=2048M

wait_timeout=288000

interactive_timeout = 288000

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

max_allowed_packet=2048M

wait_timeout=288000

interactive_timeout = 288000  

② . Docker 分别创建主从Mysql数据库

主库:

docker run --restart=always --privileged=true --name mysql5.7 -p 33061:3306 \
-v /usr/local/docker/mysql5.7/data:/var/lib/mysql \
-v /usr/local/docker/mysql5.7/conf:/etc/mysql/conf.d \
-v /usr/local/docker/mysql5.7/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

在这里插入图片描述

从库:

docker run --restart=always --privileged=true --name mysql5.7 -p 33062:3306 \
-v /usr/local/docker/mysql5.7/data:/var/lib/mysql \
-v /usr/local/docker/mysql5.7/conf:/etc/mysql/conf.d \
-v /usr/local/docker/mysql5.7/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

在这里插入图片描述
③ .选取主服务器,对主服务器进行设置,创建主服务器的用户,允许从服务器访问的用户名密码以及ip

#创建用户
#前面的slave是用户名,后面的slave 是密码
#10.0.88.75是允许访问的远程IP地址,这里要写从属服务器的IP
create user 'slave'@'10.0.88.75' IDENTIFIED by 'slave';

④ .为slave用户授予主从复制的权限

grant replication slave on *.* to 'slave'@'10.0.88.75' identified by 'slave';

⑤ .激活权限

flush PRIVILEGES;

⑥ .查看主服务器状态

#查看主服务器的状态
show master status

# File属性=主服务的日志文件
# Position属性=日志最后一个编号,最近执行的日志

# 查看日志内容
show binlog events in 'replicas-mysql-bin.000003';

⑦ .配置从库操作

# 关闭io线程
STOP SLAVE IO_THREAD; 

#CHANGE MASTER TO指向连接的是哪一台主服务器
#MASTER_HOST 主服务器的ip
#MASTER_PORT 主服务器的端口,如果主服务默认端口3306也可以不写这个
#,MASTER_USER配置主服务器设置的用户
#MASTER_LOG_FILE当前从哪个日志文件读取,写上主服务器的日志文件
#MASTER_LOG_POS :这里填写最后操作的日志,那么3319之后的操作编号都会进行主从复制
CHANGE MASTER TO
     MASTER_HOST='10.0.88.77'
    ,MASTER_PORT=33061
    ,MASTER_USER='slave'
    ,MASTER_PASSWORD='slave'
    ,MASTER_LOG_FILE='replicas-mysql-bin.000003'
    ,MASTER_LOG_POS=3319

# 开启io线程
 start SLAVE IO_THREAD

⑧ .开始主从复制

start slave; 

⑨ .查看从服务器状态

show slave status;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值