# mysql-master-slave-docker-compose **Repository Path**: phial3/mysql-master-slave-docker-compose ## Basic Information - **Project Name**: mysql-master-slave-docker-compose - **Description**: mysql主从同步、读写分离 docker-compose 快速部署 - **Primary Language**: Docker - **License**: 0BSD - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 13 - **Created**: 2021-12-26 - **Last Updated**: 2022-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### mysql 部署主从同步、实现读写分离 > 1.本篇主要是快速部署一套主从同步的mysql服务器, 方便程序实现读写分离. > 2.注意事项:主从同步、读写分离一般都会部署在不同的服务器,但是如果数据库服务器配置比较高,又考虑到一个进程对服务器资源的利用率是有限的,那么结合docker容器虚拟化技术,我们就可以在一台服务器实现多台的效果,对高配服务器的资源,也做到了利用率最大化. ### 主从同步原理示意图 - 1.主数据库开启binlog日志记录功能,这样针对 `dml(create、insert、update、delete等)` 操作类sql,mysql服务器主进程就会在主服务器指定的目录,生成二进制日志文件(binlog). - 2.主服务器的 `Binlog Dump线程` 负责监控`binlog` 日志变化,实时发送最新的操作内容发送给 `slave` 的 `i/o线程` ,然后继续等待主服务器 `binlog` 日志新的变化. - 3.从服务器的 `i/o线程` 接受到主服务器发送的 `binlog` 数据后,写入中继日志 `RelayLog` ,然后由 `sql 线程` 从 `RelayLog` 中解析出 sql命令,执行它,从而实现了主从数据一致性. - 4.mysql8主从复制官方参考资料:`https://dev.mysql.com/doc/refman/8.0/en/replication-threads-monitor-main.html` ![master_status](https://www.ginskeleton.com/images/master-to-slave.png) #### 1.相关配置项介绍 - 1.1主数据库(master)配置文件 ```code # 该路径下的配置文件默认即可,如果需要修改,请您确保熟悉每项的含义 ./conf/master/my.cnf ``` - 1.2.从数据库(slave)配置文件 ```code # 该路径下的配置文件默认即可,如果需要修改,请您确保熟悉每项的含义 ./conf/slave/my.cnf ``` #### 2.构建步骤 - 1.下载本项目,进入 docker-compose.yml 文件同目录 ```code # 首先给配置文件设置权限,否则后面的配置都不会生效(mysql8必须操作) chmod 644 ./conf/master/my.cnf ./conf/slave/my.cnf # 执行命令快速启动主从服务容器 docker-compose up -d # 查看主、从数据库容器是否启动ok docker-compose ps ``` #### 3.数据库配置其他命令 - 3.1.主数据库(master)执行的命令 > 相关参数解释 > 在主服务器创建用户,从数据库就可以使用此账号连接服务器,读取binlog日志 ```code # mysql5.7 版本 > *.* 表示任意数据库、任意数据表 > data_sync 表示账号 > 192.168.6.113 表示客户端来源IP > v9#QKUeS*6 密码,尽量有大写、小写、字母、特殊符号 GRANT REPLICATION SLAVE ON *.* TO 'data_sync'@'192.168.6.113' IDENTIFIED BY 'v9#QKUeS*6'; # mysql8 版本 CREATE USER data_sync IDENTIFIED BY 'v9#QKUeS*6'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'data_sync'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'data_sync'@'%' ; # 改变新建用户的密码加密方式,以便兼容老版本的客户端程序 # *5DF8A12065BDA0EE2CD5B9D28322F2C773C069C5 就是 v9#QKUeS*6 的密文, # 您可以在 mysql5.7 环境调用命令自己生成自己设置的密码,相关命令: SELECT PASSWORD('v9#QKUeS*6') update mysql.user set plugin='mysql_native_password' , authentication_string='*5DF8A12065BDA0EE2CD5B9D28322F2C773C069C5' where User='data_sync' # 刷新权限 FLUSH PRIVILEGES; # 获取主数据库 binlog 日志状态 # 记录一下File 和Position, 用于在从服务器配置连接的主服务器时的部分参数 SHOW MASTER STATUS; ``` ![master_status](https://www.ginskeleton.com/images/master_status.jpg) - 3.2.从数据库(slave)执行的命令 ```code # 首先停止数据同步相关的线程: slave I/O 线程和 slave SQL 线程 STOP SLAVE #设置主从同步隶属关系 # mysql_master 为主数据库的容器服务名称,如果是非容器部署,就填写主服务器的ip # MASTER_LOG_FILE=db_ginskeleton.000005 为主数据库binlog状态参数 # MASTER_LOG_POS=156 为binlog日志同步时的位置标记参数 CHANGE MASTER TO MASTER_HOST='mysql_master',MASTER_PORT=3306,MASTER_USER='data_sync',MASTER_PASSWORD='v9#QKUeS*6',MASTER_LOG_FILE='db_ginskeleton.000005',MASTER_LOG_POS=156; #启动slaver 服务 START SLAVE // 如果报错,请重置:RESET SLAVE ,然后启动 # 查看从数据库的状态 SHOW SLAVE STATUS ``` ![master_status](https://www.ginskeleton.com/images/slave_status.png) #### 4.读写分离验证 > 4.1 至此我们已经配置完成了 主从同步,那么接下来就可以把主、从数据库的ip、账号、密码、端口配置在程序,实现读写分离方案. > 4.2 您可以在程序操作数据库(增删改查),在主从数据库监听,看看sql命令的执行位置,就可以确定本方案是否生效. ```code # 主、从数据库开启sql监听日志打印功能,在数据库系统层面进行独立验证 # 指定sql执行监听日志文件 SET GLOBAL general_log_file='/tmp/mysql.log'; # 开启sql监听 SET GLOBAL general_log=on; # 实时打印sql执行记录 tail -f -n 100 ./mysql.log # 验证后关闭sql监听即可 SET GLOBAL general_log=off; ``` #### 5.关于主从同步,读写分离可能带来的其他问题 > 1.理论上主从同步方案,两个数据库之间的数据的确存在延迟问题,但是经过我们验证,在实际使用中几乎没有出现任何异常. > 2.当然我们的环境并发不是很大,实际面临的环境可能更多杨样、更复杂,只有您熟悉每种方案的适用范围以及它的局限性,才能做出正确的技术选型. ```code # 请自行阅读相关资料,了解主从同步存在的数据延迟问题 https://blog.csdn.net/weixin_33066433/article/details/113944731 http://blog.csdn.net/u012845423/article/details/88977955 ```