docker官方hub:https://hub.docker.com/_/mysql
下载image
docker pull docker.m.daocloud.io/mysql:8.4.6
从镜像地址下载,如果从docker下载,即使配置了代理,也会下载中断
创建k8s部署文件
helm create mysql
具体文件下载:https://download.csdn.net/download/xgw1010/91645185
镜像地址改为上一节的地址
mysql配置项说明
基本中上是将原来安装在主机的mysql配置复制保存到了k8s的configmap中,其中注意:
- 不要配置"basedir",会导致找不到库和message配置的错误,但可以启动
- "[client]"段不要配置"default-character-set",会导致mysqlsh无法连接数据库,报无法识别配置项。
- 增加"gtid_mode=on"和"enforce_gtid_consistency=ON"。gtid是全局事务标识符。
- 增加"report-host = mysql-{{ $index }}.mysql-service", 表示添加的集群中时使用的主机名,否则会连接不上。
部署到k8s
在安装了helm的k8s的master节点上执行
helm upgrade --install mysql ./mysql -n mysql-dev -f ./mysql/values.yaml
配置主从集群
进入到mysql pod内,运行:
shell
# 连接数据库, 33060端口表示使用X protocol
>mysqlsh --mysqlx -u root -h mysql-0.mysql-service -P 33060
# 切换到js mode
>\js
# 创建副本集
> var rs = dba.createReplicaSet("dev")
A new replicaset with instance 'mysql-1:3306' will be created.
* Checking MySQL instance at mysql-1:3306
This instance reports its own address as mysql-1:3306
mysql-1:3306: Instance configuration is suitable.
* Checking connectivity and SSL configuration...
* Updating metadata...
ReplicaSet object successfully created for mysql-1:3306.
Use rs.addInstance() to add more asynchronously replicated instances to this replicaset and rs.status() to check its status.
# 查看副本集状态
MySQL localhost:33060+ ssl JS > rs.status()
{
"replicaSet": {
"name": "dev",
"primary": "mysql-1:3306",
"status": "AVAILABLE",
"statusText": "All instances available.",
"topology": {
"mysql-1:3306": {
"address": "mysql-1:3306",
"instanceRole": "PRIMARY",
"mode": "R/W",
"status": "ONLINE"
}
},
"type": "ASYNC"
}
}
# 第二次进入时,需要先获取rs实例
> var rs=dba.getReplicaSet()
# 添加从服务器
> rs.addInstance('root@mysql-1.mysql-service:3306')
#选择"clone"
# 结果
MySQL mysql-0.mysql-service:33060+ ssl JS > rs.status()
{
"replicaSet": {
"name": "dev",
"primary": "mysql-0.mysql-service:3306",
"status": "AVAILABLE",
"statusText": "All instances available.",
"topology": {
"mysql-0.mysql-service:3306": {
"address": "mysql-0.mysql-service:3306",
"instanceRole": "PRIMARY",
"mode": "R/W",
"status": "ONLINE"
},
"mysql-1.mysql-service:3306": {
"address": "mysql-1.mysql-service:3306",
"instanceRole": "SECONDARY",
"mode": "R/O",
"replication": {
"applierStatus": "APPLIED_ALL",
"applierThreadState": "Waiting for an event from Coordinator",
"applierWorkerThreads": 4,
"receiverStatus": "ON",
"receiverThreadState": "Waiting for source to send event",
"replicationLag": "applier_queue_applied",
"replicationSsl": "TLS_AES_128_GCM_SHA256 TLSv1.3",
"replicationSslMode": "REQUIRED"
},
"status": "ONLINE"
}
},
"type": "ASYNC"
}
}
常用命令
删除集群
rs.dissolve()
测试网络连通性
mysqladmin ping -uroot -p123456 -hmysql-0.mysql-service
查询主从同步状态
在从机运行
SHOW REPLICA STATUS;