MySQL 外置
外置 MYSQL 5.7.x ONES 版本要求:3.14.x 需要大于等于【3.14.148】6.1.x 需要大于等于【6.1.57】
外置 MYSQL 5.7.x 版本:需要是 5.7.42 或 5.7.43,未来更新的版本可能存在兼容性问题
外置 MYSQL 8.0.x ONES 版本要求:需要大于等于【6.1.57】
外置 MYSQL 8.0.x 版本要求:需要大于 8.0.32 小于 8.1.0
迁移过程请停机,不要使用业务!!!
操作步骤
安装配置外置 MYSQL
示例安装命令,外置数据库的数据安全由提供方保证。请自行确保数据安全
mysqlRootPassword 可以参考下方获取数据库用户密码获取
docker run -d -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=<mysqlRootPassword> \
-v /path/to/your/mysql_data:/var/lib/mysql \
mysql:5.7.43
替换 my.cnf 文件
如果是其他方式安装的 MYSQL 请根据具体环境替换 my.cnf 配置文件
# mysql 8.x 请使用 curl -O https://res.ones.pro/script/k3stool/mysql_8_my.cnf
curl -O https://res.ones.pro/script/k3stool/my.cnf
docker cp my.cnf <containerID>:/etc/
docker restart <containerID>
如果客户不允许直接替换 my.cnf,请协调客户调整下面的配置项(必须修改)
注意!!!!仅调整如下配置可能存在性能问题,最好还是替换 my.cnf
[mysqld]
# 自增 id
auto_increment_increment=1
auto_increment_offset=1
# 字符集
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
# 事务级别
transaction_isolation = REPEATABLE-READ
# 默认存储引擎
default_storage_engin = InnoDB
# binlog
log_bin = mysql-bin
binlog_format = row
# GTID
gtid_mode=on
enforce_gtid_consistency=on
session_track_gtids=OWN_GTID
session_track_state_change=ON
[mysqldump]
quick # 该配置项找不到的话可以不用配置
max_allowed_packet = 1024M
登陆 MYSQL 查看服务是否正常
mysql -uroot -p<mysqlRootPassword>
ONES 服务外置 mysql
停止关键服务
kubectl -n ones scale --replicas=0 deploy project-api-deployment wiki-api-deployment
kubectl -n ones scale --replicas=0 sts wiz-editor-server-statefulset
导出 mysql 数据
导出完成后请将宿主机的 /tmp/all.sql 放到外置数据库服务器上,后面会使用该 sql 导入数据
涉及到数据安全,请严格按照文档说明操作!!!!
ones-ai-k8s.sh
# 获取 mysqlRootPassword
kubectl exec -n ones-installer -it $(kubectl -n ones-installer get po | grep installer-api | awk {'print $1'}) -c installer-api -- bash -c "cd /data/ones/ones-ai-k8s && make get_value KEY=mysqlRootPassword"
# 查看当前 ONES 服务的数据库,请加输出的内容填写到下面的 onesDatabases 变量中
awk '/\{\{\s*\$databaseSettings\s*:=\s*dict/,/\}\}/' overlay-templates/ones/v1/init-db/init-db.yaml | grep -oE '\$config\.\w+' | awk -F'.' '{print $2}' | xargs -I {} make get_value KEY={}
kubectl -n ones exec -it mysql-cluster-mysql-0 bash
mysqlRootPassword="" # 调整为前面获取的mysqlRootPassword密码
# 示例配置 onesDatabases="project wiki",空格分割,根据上面命令的实际输出调整!!!
# 根据上面命令的实际输出调整!!!
# 根据上面命令的实际输出调整!!!
# 根据上面命令的实际输出调整!!!
onesDatabases=""
mysqldump --host=localhost --port=3306 --user=root --password=${mysqlRootPassword} \
--master-data --max-allowed-packet=32M --single-transaction \
--skip-lock-tables --compact --quick --set-gtid-purged=OFF \
--extended-insert --hex-blob --default-character-set=utf8mb4 --databases $onesDatabases > /tmp/all.sql
exit
exit ## exit 两次是为了退出到宿主机
kubectl -n ones cp mysql-cluster-mysql-0:/tmp/all.sql /tmp/all.sql # 拷贝到宿主机的 /tmp/all.sql
外置 MYSQL 导入数据
登陆外置数据库导入数据,以下用 docker 部署的 mysql 作为示例
docker exec -it <containerID> bash
mysql -uroot -p<mysqlRootPassword>
SET FOREIGN_KEY_CHECKS = 0;
source /tmp/all.sql;
SET FOREIGN_KEY_CHECKS = 1;
修改配置
部分配置已经在
config/private.yaml
中存在,有则修改无则新增。建议都在文件末尾修改,方便维护
ones-ai-k8s.sh # 该命令是从宿主机进入 ONES 的操作机容器
vi config/private.yaml
# 调整如下配置
# dbRootUser: 默认是 root 用户,ONES 版本要求 3.14.x 需要大于等于【3.14.148】6.1.x 需要大于等于【6.1.57】;旧版本不支持该配置
# dbRootUser: 需要有类似 root 的权限,比如创建用户、授权、建库、建表等等权限
dbRootUser: <mysqlUser>
# !!! 注意: 新版本有可能有新增的数据库配置。可以通过 cat default/config.yaml | grep -E "mysql-cluster-mysql-master|3306" 查看当前环境的具体配置
# 外置数据库 host
mysqlHost: <mysqlHost>
platformMysqlHost: <mysqlHost>
pluginMysqlHost: <mysqlHost>
openapiMysqlHost: <mysqlHost>
# 外置数据库 port
mysqlPort: <mysqlPort>
platformMysqlPort: <mysqlPort>
pluginMysqlPort: <mysqlPort>
openapiMysqlPort: <mysqlPort>
internalComponentMysqlEnable: false # 关闭内置 mysql
# 下面的配置根据说明按需修改!!!
# 如果外置数据库允许 make init-db 直接创建和内置数据库一致的数据库用户和密码,则无需修改下面的配置。配置本身有默认值,init-db 会创建对应的用户
# 如果外置数据库有限制,比如只能使用一个数据库账号,那就把下面的配置都改成对应的账号密码
mysqlUser: <mysqlUser>
mysqlCamundaUser: <mysqlUser>
platformMysqlUser: <mysqlUser>
platformMysqlPluginUser: <mysqlUser>
platformMysqlPluginAdminUser: <mysqlUser>
pluginBuiltInGvmbef2yMysqlDbUser: <mysqlUser>
wizMysqlUser: <mysqlUser>
oauthMysqlUser: <mysqlUser>
eventsMysqlUser: <mysqlUser>
mysqlWatchUser: <mysqlUser>
identityMysqlUser: <mysqlUser>
mysqlRootPassword: <mysqlPassword> # 对应的是 dbRootUser 的密码
mysqlPassword: <mysqlPassword>
mysqlCamundaPassword: <mysqlPassword>
platformMysqlPassword: <mysqlPassword>
platformMysqlPluginPwd: <mysqlPassword>
platformMysqlPluginAdminPwd: <mysqlPassword>
pluginBuiltInGvmbef2yMysqlDbPwd: <mysqlPassword>
wizMysqlPassword: <mysqlPassword>
oauthMysqlPassword: <mysqlPassword>
eventsMysqlPassword: <mysqlPassword>
mysqlWatchPassword: <mysqlPassword>
identityMysqlPassword: <mysqlPassword>
执行 init-db 初始化外置数据库
# 在操作机中执行
# 如果当前在宿主机可以先执行 ones-ai-k8s.sh 进入操作机
# 执行后如果报错,根据报错查看问题。如果是权限等问题需要检查 dbRootUser 用户是否有足够的权限。
# 该命令执行时会检查对应数据库是否存在,如果存在会跳过该数据库的表创建
# 所以第一次执行失败后,第二次执行可能会漏掉创建某些表
make init-db
应用外置数据库配置到 ONES 服务
ones-ai-k8s.sh
make setup-ones
如果控制台显示如下内容,需要输入 yes
[WARN] Base component changelist
------------------------------
It is detected that the configuration of the following basic components has changed, and this change has certain risks!!!
- camunda
[INFO] View component details changes
------------------------------
1. Execute the following command to view changes in component details:
cat tmp/diff-apps/ones/ones/ones.v1.diff
[WARN] Risk estimate
------------------------------
Continuing to change the configuration may cause the service to be unavailable for a period of time, please operate with caution!!!
If you have identified the [Upgrade Risk] and are fully prepared, you can choose to continue.
Do you want to continue the deployment? [yes/no] (If in doubt, you can contact ONES technical support team.)
Please enter 'yes' to continue, otherwise exit: yes
启动关键服务
kubectl -n ones scale --replicas=1 deploy project-api-deployment wiki-api-deployment
kubectl -n ones scale --replicas=1 sts wiz-editor-server-statefulset
# 关闭内置 mysql 服务
kubectl -n ones scale --replicas=0 mysqlcluster mysql-cluster
kubectl -n ones scale --replicas=0 sts mysql-operator
kubectl -n ones scale --replicas=0 sts mysql-cluster-mysql
验证
- 确保所有的 pod 都是 running 状态
- 请对 ONES 服务做基本的功能检查
升级迁移
ONES v6.1.57 才开始支持 MySQL 8 升级迁移,如果是从低于 v6.1.57 版本升级到 v6.1.57 以上版本,需要先单独将 ones-ai-k8s 升级到 v6.1.57 以上版本后才能进行数据迁移和后续升级操作。
如果是从低于 v6.1.57 版本升级到 v6.1.57 以上版本主要有以下5个步骤:
- 从 ONES 镜像仓拉取
img.ones.pro/library/mysqldump8:8.0.34_2
镜像放到客户环境。 - 进入 ones-ai-k8s 调整 config/private.yaml。
migrationRuntime: "img.ones.pro/library/mysqldump8:8.0.34_2" # 从步骤1中拉取的镜像
onesAIK8sImage: "img.ones.pro/release/ones-ai-k8s:v6.1.57" # 需要升级到的 ONES 版本,至少是 v6.1.57
- 执行
make setup-installer-api
应用配置。 - 等 3 执行完 且 installer-api 重启完成后,执行
make setup-ones-cluster-operator
。 - 正常执行迁移和后续其他升级操作。
如果已经是 v6.1.57 或以上版本且 private.yaml 已经配置了 migrationRuntime
,不需要执行上述操作,直接按已有流程升级即可。