基于Docker搭建MySQL Cluster

1.整体介绍

1.1整体结构

image

1.2搭建步骤

  • 搭建3个MySQL实例.
  • 将3个MySQL实例组建集群.
  • 搭建MySQL Router.

2.搭建MySQL

2.1 MySQL配置文件及数据文件目录结构

/data
└── mysql
    ├── 3301 #存放数据目录
    ├── 3302
    ├── 3303
    └── config  # mysql配置文件存储目录
        ├── 3301
        │   └── my.cnf
        ├── 3302
        │   └── my.cnf
        └── 3303
            └── my.cnf
# 日志目录
/var/log/mysql/
  ├── 3301
  ├── 3302
  ├── 3303

上述目录是宿主机目录,docker中对应数据,配置文件,日志会挂载到宿主机。

2.2 MySQL docker-compose.yml

version: '3'
services:
  mysql-server-1:
    env_file:
      - mysql-server.env
    image: mysql/mysql-server:8.0.32
    # 将配置文件,数据文件,日志文件挂载到宿主机。
    volumes:
      - /data/mysql/config/3301:/etc/mysql
      - /data/mysql/3301:/var/lib/mysql
      - /var/log/mysql/3301:/var/log/mysql
    restart: unless-stopped
    #指定网络
    networks:
      - install_mysql_default
    ports:
      - "3301:3306"
  mysql-server-2:
    env_file:
      - mysql-server.env
    image: mysql/mysql-server:8.0.32
    volumes:
      - /data/mysql/config/3302:/etc/mysql
      - /data/mysql/3302:/var/lib/mysql
      - /var/log/mysql/3302:/var/log/mysql
    restart: unless-stopped
    networks:
      - install_mysql_default
    ports:
      - "3302:3306"
  mysql-server-3:
    env_file:
      - mysql-server.env
    image: mysql/mysql-server:8.0.32
    volumes:
      - /data/mysql/config/3303:/etc/mysql
      - /data/mysql/3303:/var/lib/mysql
      - /var/log/mysql/3303:/var/log/mysql
    restart: unless-stopped
    networks:
      - install_mysql_default
    ports:
      - "3303:3306"

# 该网络需要创建,后续安装过程中会创建      
networks:
  install_mysql_default:
    external: true      

2.3 MySQL配置文件

3301/my.cnf

[mysqld]
server-id=1
port=3306

datadir=/var/lib/mysql

gtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64


user=mysql
skip-host-cache
skip-name-resolve

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

3302/my.cnf

[mysqld]
server_id=2
port=3306

datadir=/var/lib/mysql

gtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64

user=mysql
skip-host-cache
skip-name-resolve

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

3303/my.cnf

[mysqld]
server_id=3
port=3306

datadir=/var/lib/mysql

gtid_mode=ON
binlog_checksum=NONE
enforce_gtid_consistency=ON
log_bin
log_slave_updates=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64

user=mysql
skip-host-cache
skip-name-resolve

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

2.4 安装MySQL

将MySQL docker-compose.yml放置在指定目录下。同时添加mysql-server.env文件。

/script/innodb-cluster/install_mysql/
  ├── docker-compose.yml
  └── mysql-server.env

mysql-server.env文件

MYSQL_ROOT_PASSWORD=my123456
MYSQL_ROOT_HOST=%

进入/script/innodb-cluster/install_mysql/目录下。

创建网络install_mysql_default,之前docker-compose.yml中使用了install_mysql_default网络。

docker network create install_mysql_default

执行docker compose up -d
image
执行docker ps三个mysql 实例都启动了。
image

3.创建集群

3.1 安装mysql shell

mysql shell文件结构如下。

/script/innodb-cluster/creater_cluster/
├── docker-compose.yml
├── mysql-shell.env

进入/script/innodb-cluster/creater_cluster/目录,执行docker compose up -d

3.2使用MySQL Shell创建集群。

3.2.1 使用mysql shell脚本。

先执行docker exec -it install_mysql-mysql-server-1-1 mysqlsh
image

3.2.2 创建集群

执行下列语句,定义集群名称和密码。

  var dbPass = "my123456"
  var clusterName = "devCluster"

image

连接mysql

shell.connect('root@mysql-server-1:3306', dbPass)

image

检查mysql配置,是否满足集群创建条件。

dba.checkInstanceConfiguration()

如果不满足创建条件,会提示具体哪些配置不满足,显示当前的配置值和期望的配置值,根据提示修改配置。
MySQL的配置文件中已经添加了指定的配置和选项,没有错误会显示OK
image

创建集群

var cluster =   dba.createCluster(clusterName);

image
显示创建集群成功,但需要添加实例。

可以到mysql中查看,多了一个集群的元信息数据库。
image

添加实例到集群中
image
恢复方式根据具体需要选择即可,此处选择克隆。
可以看到当前节点已经被加入集群,元数据信息表中实例已经显示有2个了。
image

继续添加剩下的实例到集群中。

cluster.addInstance({user: "root", host: "mysql-server-3", password: dbPass})

image
集群创建完毕使用\q退出mysql shell。

现在3301,3302,3303三个mysql中都有了集群元数据信息表,同时实例表中实例有三个。
image

现在集群搭建完毕,我们登录3301端口的数据库,创建一个test库,创建一个表,会发现在3302,3303中也同步自动创建了。

4.创建路由

集群搭建完毕,为什么需要路由,MySQL集群中如果节点出现故障,会自动进行故障转移,将其中一个节点升级为主节点,此时写服务器地址发生了变化,那么此时代码中对应连接的地址也需要改变。此时如果有路由这个中间件,如果发生了切换,路由可以知道那个是新的主服务器,将写请求转发到主服务器。这样一来,路由屏蔽了切换过程,对代码来说始终是连接路由,集群内部发生切换路由会自行处理好,对于使用者来说是无感的。

当前配置中使用两个路由连接MySQL集群,但其中一个路由宕机,另一个路由还可以正常工程。jdbc连接中同时配置两个路由的地址,以实现高可用。

4.1 MySQL Router安装文件及结构

/script/innodb-cluster/install_router/
├── docker-compose.yml
└── mysql-router.env

docker-compose.yml

version: '3'
services:
  mysql-router-1:
    env_file:
      - mysql-router.env
    image: mysql/mysql-router:8.0.32
    ports:
      - "6446:6446" #读写端口
      - "6447:6447" #只读端口
    networks:
      - install_mysql_default 
    restart: on-failure
  mysql-router-2:
    env_file:
      - mysql-router.env
    image: mysql/mysql-router:8.0.32
    ports:
      - "6448:6446"
      - "6449:6447"
    networks:
      - install_mysql_default  
    restart: on-failure

# 保证路由及mysql在同一个网络
networks:
  install_mysql_default:
    external: true

mysql-router.env

MYSQL_USER=root
MYSQL_HOST=mysql-server-1
MYSQL_PORT=3306
MYSQL_PASSWORD=my123456
MYSQL_INNODB_NUM_MEMBERS=3

4.2 安装MySQL Router

进入/script/innodb-cluster/install_router/目录下,
执行 docker compose up -d
image

通过dokcer ps查看启动的路由。
image

image
现在我们就有了
router1 读写端口6446,只读端口6447.
router2 读写端口6448,只读端口6449.

至此集群搭建完毕。

参考资料:
Docker Compose Setup for InnoDB Cluster

posted @ 2025-10-12 20:07  gcmh  阅读(12)  评论(0)    收藏  举报