NineData 社区版:从 MySQL 到 TiDB 数据复制新选择
在数据管理领域,一款优秀的工具能够极大地提升工作效率,而 NineData 社区版正是这样一款工具。NineData 社区版功能强大、永y久免费、一键安装,为开发者、初创团队、教育机构提供了极大的便利。
什么是 NineData 社区版
NineData 社区版是玖章算术推出的永y久免费、一键安装的数据管理解决方案。包含 NineData 的数据库 DevOps、数据复制、数据库对比三个核心功能。NineData 社区版是一个完全离线运行的本地化部署版本,所有数据与操作 100% 留存于您的本地环境,满足敏感业务的数据合规要求。NineData 提供用户管理,支持普通账号和 SSO 账号两种类型,提供权限管理,颗粒度细化到数据源、库、表、敏感列、模块、操作,并且支持 SQL 任务审核,为数据管理提供了安全保障。
NineData 社区版支持高性能实时数据迁移同步,基于自研 CDC 技术,专业解决数据库迁移、同步、容灾等业务需求,支持每秒数万 TPS 实时数据复制。NineData 社区版支持同构、异构数据源之间数据一致性校验,在不一致的情况下支持自动生成变更 SQL,支持结构对比、全量对比、抽样对比、周期性对比等多种对比方式,动态监测数据库负载,对比速度自适应,保障数据库稳定性。
如何安装 NineData 社区版
NineData 社区版基于 Docker 技术,用户通过几条简单的命令即可在本地电脑完成安装。
1. 前提条件
服务器中已安装 Docker 或者 Podman。服务器配置至少为 4 核 CPU / 16 GB 内存 / 200 GB 磁盘空间。
2. 拉取镜像
NineData 提供了多地域镜像下载,用户可以根据自己的地理位置选择合适的镜像地址,以获取更快的下载速度。
- NineData Docker Hub 官方地址:
ninedata/ninedata:latest
- 华北-北京:
swr.cn-north-4.myhuaweicloud.com/ninedata/ninedata:latest
- 华东-上海:
swr.cn-east-3.myhuaweicloud.com/ninedata/ninedata:latest
- 华南-广州:
swr.cn-south-1.myhuaweicloud.com/ninedata/ninedata:latest
登录服务器,执行命令,拉取镜像。
podman pull swr.cn-east-3.myhuaweicloud.com/ninedata/ninedata:latest
查看镜像信息。
[shawnyan@rl9 ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-east-3.myhuaweicloud.com/ninedata/ninedata latest 17f99ce461fa 2 days ago 2.67 GB
3. 启动容器
推荐使用 CentOS 7 操作系统。执行命令,启动容器。
docker run -p 9999:9999 --privileged -v /opt/ninedata:/u01 \
--name ninedata -d 17f99ce461fa
如果使用 Rocky Linux 9,可以使用 Podman 来管理容器。
podman run -p 9999:9999 --privileged -v /opt/ninedata:/u01 \
--cgroupns=host \
--name ninedata -d 17f99ce461fa
需要注意的是,由于 Rocky Linux 9 默认使用 cgroup-v2
。
[shawnyan@rl9 ~]$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
而当主机为 cgroups v2 时,podman 的 cgroup 命名空间模式默认使用 private
,来为容器创建一个新的 cgroup 命名空间,这会导致容器无法正常启动。
E0312 10:45:32.821969 42 kubelet_node_status.go:453] "Error getting the current node from lister" err="node \"server-sh90d\" not found"
E0312 10:45:32.824543 42 node_container_manager_linux.go:61] "Failed to create cgroup" err="cannot enter cgroupv2 \"/sys/fs/cgroup/kubepods\" with domain controllers -- it is in an invalid state" cgroupName=["kubepods"]
E0312 10:45:32.824844 42 kubelet.go:1566] "Failed to start ContainerManager" err="cannot enter cgroupv2 \"/sys/fs/cgroup/kubepods\" with domain controllers -- it is in an invalid state"
因而,启动容器时需增加参数 --cgroupns=host
指定容器使用宿主机的 cgroups 命名空间。
可通过命令 podman logs -f ninedata
来查看容器日志,成功启动后可看到如下输出。
也可通过命令 tail -f /opt/ninedata/server.log
来查看详细的 NineData 服务日志。
NineData 社区版容器运行时,内部依赖 Kubernetes(K3S)组件启动 NineData 集群,在容器内使用 kubectl 命令查看集群状态。
[shawnyan@rl9 ~]$ podman exec -it ninedata /bin/sh
~ # kubectl get nodes
NAME STATUS ROLES AGE VERSION
server-957dn Ready control-plane,master 27h v1.31.2+k3s1
~ # kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/jzcloud-console-6444d96646-tqnth 1/1 Running 0 27h
pod/jzcloud-console-frontend-8c6dc7df7-js9qj 1/1 Running 0 27h
pod/jzcloud-key-center-77c8b6554b-9vsnk 1/1 Running 0 27h
pod/jzcloud-scheduler-77f4464b57-pmshs 1/1 Running 0 27h
pod/kafka-0 1/1 Running 0 27h
pod/loki-0 1/1 Running 0 27h
pod/loki-promtail-zmq6f 1/1 Running 0 27h
pod/minio-0 1/1 Running 0 27h
pod/mongo-shell-parser-7b4df9b449-7qpxr 1/1 Running 0 27h
pod/mysql-0 2/2 Running 0 27h
pod/mysql-operator-85c4ccb784-lqcgm 1/1 Running 0 27h
pod/mysql-router-677676bc8c-ws5ww 1/1 Running 0 27h
pod/niup-wptfv 0/1 Completed 0 27h
pod/registry-58d877968d-v2t5t 1/1 Running 0 27h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/jzcloud-console ClusterIP 10.43.204.188 <none> 80/TCP 27h
service/jzcloud-console-front NodePort 10.43.163.101 <none> 80:9999/TCP 27h
service/jzcloud-key-center ClusterIP 10.43.187.155 <none> 80/TCP 27h
service/jzcloud-scheduler ClusterIP 10.43.62.0 <none> 80/TCP 27h
service/kafka-headless ClusterIP 10.43.158.72 <none> 9092/TCP 27h
service/loki ClusterIP 10.43.60.128 <none> 3100/TCP 27h
service/loki-headless ClusterIP 10.43.13.98 <none> 3100/TCP 27h
service/minio-local NodePort 10.43.113.158 <none> 9090:30070/TCP,30071:30071/TCP 27h
service/mongo-shell-parser ClusterIP 10.43.76.178 <none> 9002/TCP 27h
service/mysql ClusterIP 10.43.85.120 <none> 3306/TCP,33060/TCP,6446/TCP,6448/TCP,6447/TCP,6449/TCP,6450/TCP,8443/TCP 27h
service/mysql-instances ClusterIP None <none> 3306/TCP,33060/TCP,33061/TCP 27h
service/registry-local NodePort 10.43.248.170 <none> 32500:32500/TCP 27h
~ #
NineData 社区版的使用
1. 登录 NineData
容器启动完成后,NineData 服务会自动在容器内部署并初始化服务,该过程预计需要 5 ~ 10 分钟。初始化完成后,在浏览器中输入 NineData 的连接地址即可打开 NineData 控制台的登录页,NineData 服务默认端口号为 9999
,初始管理员账号与密码均为 admin
。首次登录后页面会弹出修改密码窗口,提示立即更改管理员密码。
(Ps. 原先登录页面太朴素,P了个logo上去)
2. 数据源管理
用户可以在 NineData 控制台中添加需要管理的数据源,支持多云、多类型、多个数据源。社区版目前支持添加 10 个数据源。
如下图,数据源已成功添加 MySQL 8.0、TiDB 8.5、IvorySQL 4.4、达梦数据库 DM8 等数据库。(Ps.支持直接修改数据源备注信息的设计不错。)
3. 敏感数据管理
对于涉及敏感信息的数据,用户可以利用 NineData 的【敏感数据】模块进行设置。NineData 提供了智能数据分类分级,内置 S0 到 S5 六个敏感等级,预设 27 种数据类型,预定 36 条脱敏算法,涵盖了大部分的脱敏方式,如果这些脱敏算法中未包含用户的场景,还可以自行创建新的脱敏算法。
用户可通过自动或手动添加敏感列,对敏感数据进行分类分级管控,并选择合适的脱敏算法对敏感列进行脱敏。
NineData 社区版,目前支持对 MySQL 数据源做敏感数据扫描,并对扫描结果直接生效敏感等级。
用户可在【数据库 DevOps】模块的【SQL 窗口】对数据进行查询,应用敏感规则后,查询结果为脱敏数据。
测试用例:
NineData 扫描数据库时,会识别字段、字段类型和备注,匹配敏感规则。
CREATE TABLE t_sensitive_data (
id int primary key auto_increment,
name varchar(50) not null comment "姓名",
gender char(10) not null comment "性别",
email varchar(50) not null comment "email",
card_no varchar(50) not null,
mac_address varchar(50) not null
);
INSERT INTO t_sensitive_data (name, gender, email, card_no, mac_address) VALUES
('米老鼠', '女', 'aaa@shawnyan.cn', '1111111111', '6D:C5:28:08:56:13'),
('唐老鸭', '男', 'bbb@shawnyan.cn', '2222222222', '61:99:DF:2D:FE:53'),
('哈利波特', '男', 'ccc@shawnyan.cn', '3333333333', 'A0:F8:30:A9:76:3A');
在【敏感数据大盘】页面,我们可以看到敏感数据保护、数据源数量、表数量、敏感列数量、敏感数据访问等相关指标。
典型场景:从 MySQL 复制数据到 TiDB
众所周知,MySQL 是蓝色星球上广泛流行的开源数据库。自 MySQL 诞生至今已有三十年,生命力依旧旺盛。TiDB 是一款 HTAP 分布式数据库产品,兼容 MySQL 协议和 MySQL 生态。面对企业业务高速增长,数据量级增长到 TB 或 PB 后,MySQL 的性能和扩展性严重受限。可以将 MySQL 按微服务对应的库表进行拆分,且不说拆分后成百上千个实例的运维成本很高,有很多金融业务和传统行业库表之间强耦合,关联业务代码改造的成本也极高。云原生分布式数据库 TiDB 可以帮助用户应对挑战,在保障数据库可靠性、数据一致性的前提下,可有效提升开发效率、降低维护成本、提升写入性能。将数据从 MySQL 迁移、整合到 TiDB 数据库,从容面对未来五到十年甚至更长线的挑战。
NineData 社区版提供数据复制和数据库对比功能。数据复制支持多种同异构数据源之间的离线、实时数据复制,支持结构复制、全量复制、增量复制。数据库对比功能则可以对两个数据源之间的内容进行一致性对比,支持结构对比、数据对比、增量对比,并在结构不一致的情况下自动生成变更 SQL。这些功能均可在 NineData 可视化控制台中进行操作,简单易用、轻松上手。
以 MySQL 到 TiDB 为例,演示如何使用 NineData 社区版的数据复制功能。
1. 环境准备
演示环境,这里准备了 MySQL 8.0.41 和 TiDB 8.5.1。
mysql> select version()\G
*************************** 1. row ***************************
version(): 8.0.41
1 row in set (0.00 sec)
tidb> select tidb_version()\G
*************************** 1. row ***************************
tidb_version(): Release Version: v8.5.1
Edition: Community
Git Commit Hash: fea86c8e35ad4a86a5e1160701f99493c2ee547c
Git Branch: HEAD
UTC Build Time: 2025-01-16 07:38:34
GoVersion: go1.23.4
Race Enabled: false
Check Table Before Drop: false
Store: tikv
1 row in set (0.00 sec)
2. 操作步骤
- 创建复制
在 NineData 控制台上,点击【数据复制】-【数据复制】-【创建复制】。填写任务名称,选择源数据源和目标数据源,选择结构复制和全量复制。
- 选择复制对象
选择需要复制的表,这里有一项黑名单功能,可以排除指定对象。
- 配置映射
配置映射环节中的【映射与过滤】功能,可以自定义列名同步到目标数据源之后的名称。并且,还支持设置数据过滤条件,仅符合过滤条件的数据会同步到目标数据源。
- 预检查
预检查提供 16 项检测,通过检查后,点击【启动任务】,可以勾选【开启数据一致性对比】,当全量数据复制完成后,会自动进行数据比对。
- 启动任务
同步任务开始运行,可返回列表查看数据复制状态。
- 查验数据
同步任务完成后,控制台返回比对结果“一致”。
演示数据较少,我们分别登陆 MySQL 和 TiDB 查验表结构和数据。
一次完整的数据复制流程演示到这里,还有一些注意事项参见 NineData 官方文档:
https://docs.ninedata.cloud/replication/mysql_to_others/mysql_to_tidb
总结
NineData 社区版通过本地化部署、永y久免费,及极简而有效的用户体验,为数据管理提供了安全高效的解决方案。帮助个人开发者、初创团队提升全链路数据管控能力、数据流转处理效率,从容应对未来业务增长需求和数据管理中的各种挑战。