使用Docker-compose 搭建 MySQL 主从 集群

安装 docker

  • 系统要求

Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。

  • 安装命令

sudo yum install -y yum-utils 执行以下命令安装依赖包:

设置yum 软件源

sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 官方源
#  sudo yum-config-manager \
#     --add-repo \
#     https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io 安装 Docker sudo systemctl enable docker && sudo systemctl start docker 启动

  • 镜像加速

请首先执行以下命令,查看是否在 docker.service 文件中配置过镜像地址。 systemctl cat docker | grep '\-\-registry\-mirror' 如果该命令有输出,那么请执行 $ systemctl cat docker 查看 ExecStart= 出现的位置,修改对应的文件内容去掉 –registry-mirror 参数及其值,并按接下来的步骤进行配置。 如果以上命令没有任何输出,那么就可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

之后重新启动服务。

systemctl daemon-reload
sudo systemctl restart docker
  • docker-compose安装
sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
  • docker-compose mysql启动和配置

编写docker-compose.yml

version: "3.7"
services:
  db1:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - "13307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - "./conf/db1/mysql.cnf:/etc/mysql/conf.d/mysql.cnf"
      - "./data/db1:/var/lib/mysql/"
    expose:
      - 3306
  db2:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - "13308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - "./conf/db2/mysql.cnf:/etc/mysql/conf.d/mysql.cnf"
      - "./data/db2:/var/lib/mysql/"
    expose:
      - 3306

在当前文件夹下创建两个文件, conf, data, 用来存放配置和数据库文件

这里会启动两个service 名为 db1 db2, 对外提供端口13307,13308, expose是对内提供端口,让容器与容器之间可以通信

在conf目录创建两个目录db1 db2 用来区分两个db

db1 我们用来当master即我们的主库

[client]
port                    = 3306
default-character-set   = utf8mb4

[mysqld]
user                    = mysql
port                    = 3306
sql_mode                = ""
server_id               = 1 ## 全局id 这里用来区分
log_bin                 = mysql-bin
# 需要同步的数据库,如果不配置则同步全部数据库
#binlog-do-db=test_db
expire_logs_days        = 10  ## 存放天数 超过天数丢弃
binlog_format           = ROW ## 日志格式

default-storage-engine  = InnoDB
default-authentication-plugin   = mysql_native_password
character-set-server    = utf8mb4
collation-server        = utf8mb4_unicode_ci
init_connect            = 'SET NAMES utf8mb4'


slow_query_log
long_query_time         = 3
slow-query-log-file     = /var/lib/mysql/mysql.slow.log
log-error               = /var/lib/mysql/mysql.error.log

default-time-zone       = '+8:00'

[mysql]
default-character-set   = utf8mb4

编写db2的配置 即从库 slave

[client]
port                    = 3306
default-character-set   = utf8mb4

[mysqld]
user                    = mysql
port                    = 3306
sql_mode                = ""
server_id               = 2 ## 全局id 不能和其他库的一样
log_bin                 = mysql-bin
binlog_format           = ROW 
log_slave_updates        = ON ## 默认没有开启, 是从库自己也更新binlog
read_only                = ON ## 从库只读模式
super_read_only            = ON ## 通用只读但是是super也一样


default-storage-engine  = InnoDB
default-authentication-plugin   = mysql_native_password
character-set-server    = utf8mb4
collation-server        = utf8mb4_unicode_ci
init_connect            = 'SET NAMES utf8mb4'

slow_query_log
long_query_time         = 3
slow-query-log-file     = /var/lib/mysql/mysql.slow.log
log-error               = /var/lib/mysql/mysql.error.log

default-time-zone       = '+8:00'

[mysql]
default-character-set   = utf8mb4

启动 mysql docker-compose up -d 运行完之后我们就启动了两个db 这时候我们先设置 master 进入db1容器

docker inspect mysqls_db1_1 #查看容器ip
docker exec -it mysqls_db1_1 bash
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* to 'slave_user2'@'db2' identified by '123456'; # 这里db2 换成db2的IP
FLUSH PRIVILEGES; ## 刷新并应用
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 602      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.02 sec)

接来下编辑从库 进入db2容器

docker exec -it mysqls_db2_1 bash
mysql -u root -p
## 从库只需要指定master是谁就可以
change master to master_host='db1',master_port=3306,master_user='slave_user2',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=602; 
start slave; ## 启动
show slave status; ## 查看从库状态
##查看从库状态信息 Last_IO_Error是否正常

容器内可以通过名称来指定 因为docker内部有自己的dns指定了对应的ip, 正常情况都是指定IP, [master_log_file填写master上打印的信息master_log_pos也一样]

进入主节点查看所有从节点

SHOW SLAVE HOSTS;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         2 |      | 3306 |         1 | 16d57f3c-393e-11ec-bbc7-0242ac190002 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.03 sec)