docker compose制作mysql主从复制项目
目录
项目介绍
本项目的目的是使用docker compose制作一个一主二从并且可以主从同步的mysql集群。我们在主库进行的修改会同步到两个从库上,同步策略就选默认的异步复制。
前置知识:
- dockerfile制作镜像
- dockercompose容器编排
- mysql主从复制
项目实现
首先介绍下项目的目录结构:
接下来我们一一介绍:
Compose文件
在dockercompose文件中,我们配置了三个服务,分别是主库服务:mysql-master,两个从库服务mysql-slave,mysql-slave2。从库服务启动依赖主库服务启动,每一个参数的介绍我都写在代码中了,大家可以看看:
services: mysql-master: #主库服务名称 build: #构建镜像 context: ./ #上下文 dockerfile: ./master/Dockerfile #dockfile位置 image: mysqlmaster:v1.0 #依赖的镜像,不存在就通过上面的build构建 restart: always #总是自动重启 container_name: mysql-master #容器名称 volumes: - ../mysql-data/master:/var/lib/mysql #绑定卷持久化数据到宿主容器,防止数据丢失 ports: - 8888:3306 #端口映射 environment: MYSQL_ROOT_PASSWORD: root #启动mysql镜像必要的环境变量,标识mysqlroot的密码 privileged: true #给容器修改宿主机的权限 command: ['--server-id=1', #server-id 唯一标识 '--log-bin=master-bin', #启动二进制日志并设置日志名称 '--binlog-ignore-db=mysql', #不复制的库 '--binlog_cache_size=256M', #设置二进制日志缓存的大小 '--binlog_format=mixed', #混合模式,可以切换成row模式 '--lower_case_table_names=1', #设置表名是否大小写不敏感,不同系统的表名大小可能不同 '--character-set-server=utf8', #设置编码为utf8 '--collation-server=utf8_general_ci'] #设置验证编码 mysql-slave: #从库服务名称 build: context: . dockerfile: ./slave/Dockerfile image: mysqlslave:v1.0 restart: always container_name: mysql-slave volumes: - ../mysql-data/slave/slave1:/var/lib/mysql ports: - 8889:3306 environment: MYSQL_ROOT_PASSWORD: root privileged: true #上面全部同上 command: ['--server-id=2', '--relay_log=slave-relay', #设置中继日志名称 '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci'] depends_on: - mysql-master #依赖主库,主库启动后从库才能启动 mysql-slave2: build: context: . dockerfile: ./slave/Dockerfile image: mysqlslave:v1.0 restart: always container_name: mysql-slave2 volumes: - ../mysql-data/slave/slave2:/var/lib/mysql ports: - 8890:3306 environment: MYSQL_ROOT_PASSWORD: root privileged: true command: ['--server-id=3', '--relay_log=slave-relay', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci'] depends_on: - mysql-master #全部同上主库配置
进入主库的目录,我们可以看到两个文件:
我们的目的是使用dockerfile制作镜像,docker compose中将制作的镜像启动成容器服务,容器会自动执行master.sql中的sql语句,然后完成从库连接的用户的配置。
dockefile文件:
#基础镜像 FROM mysql:5.7.36 #将本地时区设置为上海时区,保证主库从库时区一致 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #docker的mysql镜像启动后会执行docker-entrypoint-initdb.d目录下的所有sql,我们就将sql拷贝到这个目录下 COPY ./master/master.sql /docker-entrypoint-initdb.dmaster.sql文件:
这里就是主从集群复制用户的配置命令:
--创建用于主从复制的用户 CREATE USER 'copy'@'%' IDENTIFIED BY 'copy'; --给予它可以读取binlog日志的权限 grant replication slave, replication client on *.* to 'copy'@'%'; --刷新权限 flush privileges;从库配置
和主库同理,进入到这个目录后:
dockefile文件:
#同理 FROM mysql:5.7.36 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY ./slave/slave.sql /docker-entrypoint-initdb.dslave.sql文件:
这里是从库连接主库的配置命令:
--配置主库信息,mysql-master在docker中可以dns到该服务的ip change master to master_host='mysql-master', master_user='copy',master_password='copy',master_port=3306; --开启复制 start slave; --master_log_file和master_log_pos不写就从最新的地方开始同步
项目启动
完成上述目录的配置和文件的编写,我们先进入到docker-compose.yml文件所在的目录。
这里我们并没有compose文件中的数据库镜像,然后运行docker compose up -d命令。
制作并启动成功后我们分别查看镜像是否创建,容器是否启动:
镜像创建成功:
容器启动成功:
验证主从复制
首先我们分别登录主库和两个从库,通过端口区分:
主库:
从库1:
从库2:
我们在主库中创建一个text库,然后创建一个学生表并且插入一个数据:
再查看从库中的内容:
可以看到主库中新增的数据从库中也出现了,验证完成,同步成功。
代码
gitee:dockercompose主从复制/mysql_sync/master/Dockerfile · TSHHBYC/博客资源 - 码云 - 开源中国
更多推荐
















所有评论(0)