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中,其中注意:

  1. 不要配置"basedir",会导致找不到库和message配置的错误,但可以启动
  2. "[client]"段不要配置"default-character-set",会导致mysqlsh无法连接数据库,报无法识别配置项。
  3. 增加"gtid_mode=on"和"enforce_gtid_consistency=ON"。gtid是全局事务标识符。
  4. 增加"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;