MySQL InnoDB Cluster

MySQL InnoDB Cluster

简介

MySQL 的一种高可用方案,具体实现方式参见下图:

MySQL InnoDB Cluster

服务部署

容器版

可以试用 mysql-docker-compose-examples 项目。

注:示例项目的 MySQL Router 只开放了 6446 端口,此端口仅供读写使用,还可以开放 6447 端口,此端口负责只读请求。

本地部署

注:此处需要提前搭建好 MySQL 服务器,可以参照 MySQL 文档。

使用如下命令进入交互式命令行:

1
mysqlsh

使用如下命令即可链接到数据库,并将其初始化:

1
2
shell.connect('root@localhost:3306')
dba.configureInstance()

在所有节点被初始化完成后即可使用如下命令创建 InnoDB 集群:

1
dba.createCluster('devCluster')

然后使用如下命令添加实例至集群:

1
dba.getCluster().addInstance('root@mysql-2:3306')

注:此处需要输入密码并选择恢复方式,建议在刚搭建的服务中采用 Clone 。配置完成后需要重启服务,如果使用容器记得配置持久卷。

之后可以采用如下命令检查集群状态:

1
dba.getCluster().status()

测试

负载均衡

使用如下命令安装依赖:

1
pip install sqlalchemy mysql-connector-python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker

DATABASE_URI = 'mysql+mysqlconnector://root:mysql@localhost:6447'

engine = create_engine(
DATABASE_URI,
pool_size=10,
max_overflow=20,
pool_recycle=3600,
pool_pre_ping=True
)

Session = sessionmaker(bind=engine)
session = Session()
query = text('SELECT @@server_id as server_id')
result = session.execute(query).fetchone()
print("Server ID" + result[0])
session.close()

多次运行此服务即可看到,请求被传输到了不同的设备上执行。

参考资料

MySQL 官方文档

mysql-docker-compose-examples


MySQL InnoDB Cluster
https://wangqian0306.github.io/2024/mysql-innodb-cluster/
作者
WangQian
发布于
2024年7月2日
许可协议