前言
随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡和读写分离,一主一丛或一主多从。
主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。
主从复制方式可以分为:
主从同步:当用户写数据主服务器必须和从服务器同步了才告诉用户写入成功,等待时间比较长。
主从异步:只要用户访问写数据主服务器,立即返回给用户。
主从半同步:当用户访问写数据主服务器写入并同步其中一个从服务器就返回给用户成功。
主从复制的常见架构:一主一从、一主多从、多主多从、双主复制、级联复制(一主+一级从+二级从,一级从复制主库,二级从复制一级从库)
本文以一主三从架构为例,在docker中配置mysql集群,在实际多台服务器中原理基本差不多。
原理和过程
- 主库开启 bin-log,主库会生成一个 Log Dump 线程,用来给从库 I/O 线程传 bin-log;
- 从库生成两个线程,一个 I/O 线程(Slave_IO),一个 SQL 线程(Slave_SQL);
- 从库I/O 线程去请求主库的 bin-log,并将得到的 binlog 日志写到 relay-log (中继日志) 文件中;
- 从库SQL 线程会读取 relay-log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。
拉取镜像
docker pull mysql:5.7
创建容器
执行下面的命令分别创建一台主数据库和3台从数据库,端口分别映射到3306-3309,其中mysql5.7为master库,其余为slave库,如果需要修改目录映射请自行修改参数
docker run -d --restart=always --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.7
docker run -d --restart=always --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456