目录

项目介绍

项目实现

Compose文件

主库配置

从库配置        

项目启动

验证主从复制

代码


项目介绍

         本项目的目的是使用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.d

        master.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.d

        slave.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/博客资源 - 码云 - 开源中国

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐