最近类Git数据库Dolt火了,主要是他给我们带来了数据版本管理的功能。最近正好有个项目用了这个组件,遇到了一些坑,下面主要讲下他的使用模式及在Versioned Mysql Replica场景下的坑。
官网文档docs.dolthub.com
Dolt的三种使用模式
Dolt支持三种使用模式,三种都可对数据进行版本控制
使用时通过类Mysql客户端连接和操作
使用时就像使用Git一样,本地修改后推送到远端,只是操作的是表和数据,编辑具体的数据是用dolt sql -q "增册改查sql"来实现。
- 数据库副本模式 将Dolt配置为Mysql的副本,与Mysql主备模式类似
Dolt的三种运行方式
- Hosted Dolt:官方为你提供云资源,即IaaS;
- DoltHub:官方为你提供云平台,即PaaS,托管你的库,类似GigHub。优点:有完备的功能,可部署成集群、Web UI、Web API等;问题:不能用于“数据库副本模式”;
- DoltLab:自建类似官方的DoltHub;
- Dolt数据库副本服务: 专门用于同步和访问Mysql的副本。问题:无法搭建集群(但可设置多个副本)、没有Web UI、Web API等功能
数据库副本模式的使用
-
getting started搭建说明:docs.dolthub.com/introductio…
建议使用详细搭建说明,log_level设置为trace,可能会避免一些问题,或者能得到错误提示
我就不具体翻译搭建的详细过程了,重点说下
遇到的大坑
1. 使用 getting started 的方法搭建时,Dolt的root用户完全失效
问题:start replica后,Dolt的root用户完全失效,已经用mysql客户登录的,不能做任何操作,退出后也不能再登录,啥也干不了,只能把 .doltcfg目录 和 已经同步的数据(以database名为目录名)删除后重新搞。
原因:我用的腾讯云Mysql8,有些字符排序规则Dolt还没有支持,造成Dolt同步Mysql里的mysql库相关表时出错,造成user表等创建失败,Dolt在内部判断有mysql库的相关表,就不使用启动程序的root账号而使用mysql库里的root账号,所以造成root账号失效。
解决办法:在Replica Warming阶段的Export databases步骤(详细搭建说明)只导出业务库,不导出mysql库等系统库。
2. 不支持一些字符排序规则,例如:utf8mb4_0900_ai_ciutf8mb4_0900_ai_ci
问题:如题,我用的腾讯云Mysql8,mysql库里的表有多种排序规则。至少有三种还未支持。 具体支持详细可参考官网 docs.dolthub.com/sql-referen…
解决办法:
- 在Dolt的git里增加issue, Dolt的作者可能会支持,但发release版的时间不确定;
- 如果只是系统库里有不支持的排序规则,而且也不需对系统库做版本管理,则可以按坑1的解决方案解决。
3. Dolt部分设置没有做持久化,每次重启时需要重新设置
问题:如题,我遇到的没有做持久化的配置项有:
- SET @@GLOBAL.SERVER_ID
- CHANGE REPLICATION SOURCE
- CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE
- CHANGE REPLICATION FILTER REPLICATE_ON_TABLE
- START REPLICA
解决思路:写一个服务启动脚本,在脚本中使用mysql客户端设置和启动replica。
具体脚本内容如下:
# 启动dolt
dolt sql-server --config config.yml 1>./logs/$(date +%Y%m%d).log 2>./logs/$(date +%Y%m%d)-err.log &
# 等待服务启动
sleep 5s
# 每次重启都需要重新配置dolt replica
mysql --login-path=client < ./reset_replica.sql
echo "$(date +%Y%m%d_%H:%M) 启动成功!"
为了不在指令中暴露密码:
- 把dolt的密码等启动配置放在了config.yml里了;
log_level: trace
behavior:
read_only: false
autocommit: true
user:
name: root
password: "……"
listener:
host: 0.0.0.0
port: 8039
max_connections: 100
read_timeout_millis: 28800000
write_timeout_millis: 28800000
performance:
query_parallelism: null
- 把要设置dolt的replica等命令(包含密码)放在reset_replica.sql里了;
SET @@GLOBAL.SERVER_ID=11;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='IP...', SOURCE_USER='slave', SOURCE_PORT=8036, SOURCE_PASSWORD='pwd...';
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(database1.table1,database1.table2);
START REPLICA;
- 把登录源mysql的配置,放在--login-path里了(用mysql_config_editor工具设置)
mysql_config_editor set --login-path=client --host=127.0.0.1 --port=8039 --user=root --password