基于Docker搭建MySQL Cluster
1.整体介绍
1.1整体结构

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

执行docker ps三个mysql 实例都启动了。

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。

3.2.2 创建集群
执行下列语句,定义集群名称和密码。
var dbPass = "my123456"
var clusterName = "devCluster"

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

检查mysql配置,是否满足集群创建条件。
dba.checkInstanceConfiguration()
如果不满足创建条件,会提示具体哪些配置不满足,显示当前的配置值和期望的配置值,根据提示修改配置。
MySQL的配置文件中已经添加了指定的配置和选项,没有错误会显示OK

创建集群
var cluster = dba.createCluster(clusterName);

显示创建集群成功,但需要添加实例。
可以到mysql中查看,多了一个集群的元信息数据库。

添加实例到集群中

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

继续添加剩下的实例到集群中。
cluster.addInstance({user: "root", host: "mysql-server-3", password: dbPass})

集群创建完毕使用\q退出mysql shell。
现在3301,3302,3303三个mysql中都有了集群元数据信息表,同时实例表中实例有三个。

现在集群搭建完毕,我们登录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

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


现在我们就有了
router1 读写端口6446,只读端口6447.
router2 读写端口6448,只读端口6449.
至此集群搭建完毕。

浙公网安备 33010602011771号