docker-compose搭建MySQL主从复制集群

17 min read

创建master结点的相关内容

在编写之前我们先要创建一个配置master的my.cnf配置文件

[mysqld]
log_bin = mysql-bin
server_id = 10
 

之后我们创建master结点的Dockerfile

FROM mysql:5.7
ADD ./master/my.cnf /etc/mysql/my.cnf  

创建slave结点的相关内容

在编写之前我们先要创建一个配置slave结点my.cnf配置文件

[mysqld]
log_bin = mysql-bin
server_id = 11
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
 

之后我们创建master结点的Dockerfile

FROM mysql:5.7
ADD ./slave/my.cnf /etc/mysql/my.cnf  

编写docker-compose.yml文件

其中master文件夹存放关于master结点的my.cnf和Dockerfile,slave文件夹存放关于slave结点的my.cnf和Dockerfile。

version: "3"
services:
 db-master:
 build: 
 context: ./
 dockerfile: master/Dockerfile
 restart: always
 environment:
 MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
 MYSQL_USER: 'user'
      # You can use whatever password you like
 MYSQL_PASSWORD: 'password'
      # Password for root access
 MYSQL_ROOT_PASSWORD: 'password'
 ports:
      # <Port exposed> : < MySQL Port running inside container>
 - '3306:3306'
    # Where our data will be persisted
 volumes:
 - my-db-master:/var/lib/mysql
 networks:
 - net-mysql
  
 db-slave:
 build: 
 context: ./
 dockerfile: slave/Dockerfile
 restart: always
 environment:
 MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
 MYSQL_USER: 'user'
      # You can use whatever password you like
 MYSQL_PASSWORD: 'password'
      # Password for root access
 MYSQL_ROOT_PASSWORD: 'password'
 ports:
      # <Port exposed> : < MySQL Port running inside container>
 - '3307:3306'
    # Where our data will be persisted
 volumes:
 - my-db-slave:/var/lib/mysql
 networks:
 - net-mysql
  
# Names our volume
volumes:
 my-db-master:
 my-db-slave: 

networks: 
 net-mysql:
 driver: bridge
 

现在我们就可以通过docker-compose来启动这两个结点了

docker-compose up -d
 

接下来我们就可以看到一些镜像的构建信息,当两个结点都启动之后我们来查看一下两个结点的状态

docker-compose ps -a
 

可以看到两个结点的状态已经是Up了,并且主结点映射在宿主机的3306端口,从结点映射在宿主机的3307端口。

我们再来查看一下这两个结点的网络信息,以便后续使用

docker network ls
 

这个就是我们刚才创建的网络,刚才创建的两个结点也挂载在这个网络上,我们来查看一下详细信息

docker inspect 62fa5033ce48
 

这样我们就差看到来两个结点的具体IP地址,因为Docker网络的配置,两个连接到同一network的容器会直接相互连通。

主从配置

启动之后进入从结点

docker-compose exec db-slave bash
 

进入从结点mysql中

mysql -u root -p
 

在从结点上配置主节点信息,然后把当前结点设置为从结点。

mysql> CHANGE MASTER TO MASTER_HOST='192.168.64.3', MASTER_USER='root', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0;
Query OK, 0 rows affected, 2 warnings (0.11 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
 

正常情况我们应该创建一个用户然后赋予其相应的权限,而不是将root用户配置给他

现在查看一下从结点的状态

mysql> show slave status\G;
 

都显示为YES的话那么我们的主从配置已经成功,现在我们在主节点创建一个test_db3数据库

然后切换到从结点,可以看到数据已经同步到从结点了

到这里一个简单的单主节点单从结点的MySQL架构已经搭建完毕。