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.envimage: 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/mysqlrestart: unless-stopped#指定网络networks:- install_mysql_defaultports:- "3301:3306"mysql-server-2:env_file:- mysql-server.envimage: mysql/mysql-server:8.0.32volumes:- /data/mysql/config/3302:/etc/mysql- /data/mysql/3302:/var/lib/mysql- /var/log/mysql/3302:/var/log/mysqlrestart: unless-stoppednetworks:- install_mysql_defaultports:- "3302:3306"mysql-server-3:env_file:- mysql-server.envimage: mysql/mysql-server:8.0.32volumes:- /data/mysql/config/3303:/etc/mysql- /data/mysql/3303:/var/lib/mysql- /var/log/mysql/3303:/var/log/mysqlrestart: unless-stoppednetworks:- install_mysql_defaultports:- "3303:3306"# 该网络需要创建,后续安装过程中会创建
networks:install_mysql_default:external: true
2.3 MySQL配置文件
3301/my.cnf
[mysqld]
server-id=1
port=3306datadir=/var/lib/mysqlgtid_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=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
3302/my.cnf
[mysqld]
server_id=2
port=3306datadir=/var/lib/mysqlgtid_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=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password
3303/my.cnf
[mysqld]
server_id=3
port=3306datadir=/var/lib/mysqlgtid_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=XXHASH64user=mysql
skip-host-cache
skip-name-resolvecharacter-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.envimage: mysql/mysql-router:8.0.32ports:- "6446:6446" #读写端口- "6447:6447" #只读端口networks:- install_mysql_default restart: on-failuremysql-router-2:env_file:- mysql-router.envimage: mysql/mysql-router:8.0.32ports:- "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
进入/script/innodb-cluster/install_router/目录下,
执行 docker compose up -d
通过dokcer ps查看启动的路由。
现在我们就有了
router1 读写端口6446,只读端口6447.
router2 读写端口6448,只读端口6449.
至此集群搭建完毕。
参考资料:
Docker Compose Setup for InnoDB Cluster