k8s 部署mysql主从集群
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内,运行:
# 连接数据库, 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:3306This 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;