Docker Compose搭建mysql主从复制

系统环境

  • docker 1.12.3
  • mysql5.7.17

要点说明

  • 使用docker bridge网络,设置静态IP
  • 使用volumes挂载,不使用数据卷容器
  • 镜像使用build创建(保留扩展性),不使用image
  • 目前为止,没有暴露端口号,只是两个slavelink了master.马上着手研究使用mycat完成mysql的主从复制+读写分离,敬请期待.
  • 挂载hosts文件,以便于使用hostname代替ip地址

Begin

docker-engine安装

这个直接参考官方文档吧.debian下安装docker-engine

docker-compose安装

debian下安装docker-compose

拉取mysql:5.7.17镜像

docker pull mysql:5.7.17

需要挂载的配置文件

简要说明
  • mysql-master: 存放master配置文件
  • mysql-s1: 存放第一个slave配置文件
  • mysql-s2: 存放第二个slave配置文件
  • hosts: 本地路由

mysql-master的配置

没多少东西,只有一个mysqld.cnf需要在末尾追加:

  #表名不区分大小写
  lower_case_table_names=1
  #给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号
  server-id=2
  log-bin=master-bin
  log-bin-index=master-bin.index

mysql-s1/mysql-s2的配置

跟master一样,也只有一个mysqld.cnf需要在末尾追加:

  server-id=3 #第一个用3,第二个用4
  log-bin=s1-bin.log #第一个用s1-bin.log,第二个用s2-bin.log
  sync_binlog=1
  lower_case_table_names=1

hosts文件配置

127.0.0.1    localhost
172.18.0.2    m1
172.18.0.3    s1
172.18.0.4    s2

docker-compose配置文件和Dockerfile

Dockerfile

其实master s1 s2的Dockerfile都是一致的,咱就是为了保持一定的扩展性才这么写的. 我们完全可以用docker-composeimage代替.

在docker-compose.yml中image和build不能一起使用的

好吧,看一下这个Dockerfile

FROM mysql:5.7.17
MAINTAINER 
<
ssab [email protected]
>

EXPOSE 3306
CMD ["mysqld"]
docker-compose.yml

好吧,重点来了.

version: '2' # 这个version是指dockerfile解析时用的版本,不是给我们自己定义版本号用的.
services:
  m1: # master
    build: ./master # ./master文件下需要有Dockerfile文件,并且build属性和image属性不能一起使用
    container_name: m1 # 容器名
    volumes: # 挂载 下边每行前边的`-`代表这个东西是数组的一个元素.就是说volumes属性的值是一个数组
      - /home/ssab/config/mysql-master/:/etc/mysql/:ro # 注意改下映射关系
      - /etc/localtime:/etc/localtime:ro
      - /home/ssab/config/hosts:/etc/hosts:ro # 注意改下映射关系
    networks: # 网络
      mysql: # 见跟services平级的networks,在最下边
        ipv4_address: 172.18.0.2 # 设置静态ipv4的地址
    ulimits: # 操作系统限制
      nproc: 65535
    hostname: m1 # hostname
    mem_limit: 1024m # 最大内存使用不超过1024m,我在本地机器上测试,才只写了1024m,生产上需要根据自己的服务器配置,以及docker容器数进行调优.
    restart: always # 容器重启策略
    environment: # 设置环境变量
      MYSQL_ROOT_PASSWORD: m1test
  s1: # slave1
      build: ./s1
      container_name: s1
      volumes:
        - /home/ssab/config/mysql-s1/:/etc/mysql/:ro
        - /etc/localtime:/etc/localtime:ro
        - /home/ssab/config/hosts:/etc/hosts:ro
      networks:
        mysql:
          ipv4_address: 172.18.0.3
      links:
        - m1
      ulimits:
        nproc: 65535
      hostname: s1
      mem_limit: 1024m
      restart: always
      environment:
        MYSQL_ROOT_PASSWORD: s1test
  s2:# slave2
    build: ./s2
    container_name: s2
    volumes:
      - /home/ssab/config/mysql-s2/:/etc/mysql/:ro
      - /etc/localtime:/etc/localtime:ro
      - /home/ssab/config/hosts:/etc/hosts:ro
    links:
      - m1
    networks:
      mysql:
        ipv4_address: 172.18.0.4
    ulimits:
      nproc: 65535
    hostname: s2
    mem_limit: 1024m
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: s2test
networks: # docker网络设置
  mysql: # 自定义网络名称
    driver: bridge # 桥接
    ipam: # 要使用静态ip必须使用ipam插件
      driver: default
      config:
      - subnet: 172.18.0.0/24
        gateway: 172.18.0.1

run

docker-compose.yml文件的目录下运行

  docker-compose up -d

别激动,我们现在才只是完成了一半….

设置mysql主从复制.

配置master

  • 进入master的mysql命令行

    docker exec -it m1 /bin/bash
    
    mysql -u root -p
    

    输入MYSQL_ROOT_PASSWORD:的值m1test,进入mysql命令行模式.

  • 创建用于主从复制的用户repl

    mysql
    >
     create user repl;
    
  • repl用户授予slave的权限

    #repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为repl。说明一下172.18.0.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示172.18.0.0-172.18.0.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。
    mysql
    >
     GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.18.0.%' IDENTIFIED BY 'repl';
    
  • 锁库,不让数据再进行写入动作,这个命令在结束终端会话的时候会自动解锁

    FLUSH TABLES WITH READ LOCK;
    
  • 查看master状态

    mysql
    >
     show master status;
    

    显示如下:

    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | master-bin.000003 |      636 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    记下master-bin.000003636一会在slave用.

配置slave1

  • 进入s1的mysql命令行

    docker exec -it s1 /bin/bash
    
    mysql -u root -p
    

输入MYSQL_ROOT_PASSWORD:的值s1test,进入mysql命令行模式.

  • 连接master

    mysql
    >
     change master to master_host='m1',master_port=3306,master_user='repl',master_password='repl',master_log_file='master-bin.000003',master_log_pos=636;
    
  • 启动slave

    mysql
    >
     start salve;
    

配置slave2

几乎跟slave一致….咱就不写了…

实验

好了,到此位置,配置已经完成,那是否成功了捏… 我们来试一下.

测试master写入后是否能够同步到slave

  • 在master的mysql命令行下创建数据库:ms-test

    mysql
    >
     create database mstest;
    
  • 去两台slave上查看是否也有了mstest数据库.

    mysql
    >
     show databases;
    

    如果显示如下:

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mstest             |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.00 sec)
    

    则证明成功.

总结

通过以上步骤,咱们搭建了一个以docker-compose管理的mysqlmaster-slave模式的主从复制. 下一步,我们需要进行暴露端口,或者使用links属性来让应用或者其他客户端工具能够访问我们的mysql. 再下一步,我们需要使用mycat中间件来完成我们的读写分离.

results matching ""

    No results matching ""