最近在项目里需要用到 KingbaseES 数据库,尝试了用 Docker 来部署,发现这种方式比传统安装省了不少事。整个过程不算复杂,但有些细节不注意容易踩坑。这篇文章就把我实际操作的步骤和遇到的问题整理出来,希望能给同样需要部署 KingbaseES 的朋友做个参考。
一、先把环境准备到位
部署前得确保软硬件都符合要求,不然后面容易出各种奇怪的问题。我当时就是一开始没注意 Docker 版本,导致镜像导入时总报错,耽误了不少时间。
硬件方面不用太纠结
KingbaseES 的 Docker 镜像兼容性还不错,我测试过 X86_64 架构的服务器,运行很稳定。后来在公司的鲲鹏服务器上也试了下,同样能正常启动。据说龙芯、飞腾这些国产 CPU 也支持,不过我没实际用过,有相关需求的可以自己测试下。
软件环境得盯紧版本
Docker 是必须的,而且版本不能太低,官方要求是 20.10.0 及以上。我之前服务器上的 Docker 还是 19.x 版本,结果导入镜像时一直提示错误,升级到 20.10.12 版本后就好了。检查 Docker 版本的命令很简单:
docker --version
如果版本不够,需要先升级。不同 Linux 发行版的升级命令不一样,比如 CentOS 可以用 yum,Ubuntu 用 apt-get,按自己的系统来操作就行。
二、创建数据存储目录
数据库这东西,数据是核心,可不能随便丢了。用 Docker 部署的话,最好把数据挂载到宿主机上,这样就算容器坏了,数据还在。我是这么做的:
先用 root 用户创建目录,毕竟数据库文件权限要求比较严格:
mkdir -p /opt/kingbase/data
这里为什么要建两级目录呢?其实/opt/kingbase
可以放一些和 KingbaseES 相关的其他文件,比如镜像包,data
子目录专门存数据库数据,这样显得整齐些。
然后一定要改权限:
chmod -R 755 /opt/kingbase/data
我一开始没改权限,启动容器后发现数据库日志里全是权限错误,折腾了半天才找到原因。改完权限后,容器里的进程才能正常读写数据目录。
改完可以用ls -ld
命令检查一下:
ls -ld /opt/kingbase /opt/kingbase/data
看到权限是drwxr-xr-x
就对了。
三、导入 KingbaseES 镜像
镜像这东西,得从官方渠道弄,我是联系电科金仓的技术支持拿到的,文件名大概是kingbase.tar
。拿到后先传到服务器上,我习惯放在/opt/kingbase
目录下,好找。
然后用 docker load 命令导入:
docker load -i /opt/kingbase/kingbase.tar
导入的时候会显示各个层的加载进度,耐心等一会儿。我那时候服务器网速一般,一个几百兆的镜像导了好几分钟。
导完了别忘检查一下是不是成功了:
docker images | grep kingbase
如果能看到类似kingbase:v1
这样的记录,就说明导入成功了。要是没看到,可能是导入过程出错了,这时候可以试试用 docker import 命令:
docker import /opt/kingbase/kingbase.tar kingbase:v1
我有次就是用 load 命令不行,换了 import 就成功了,具体原因没深究,可能和镜像的打包方式有关。
四、启动容器实例
启动容器有两种方式,看你是测试用还是正式用了。
临时测试用的启动方式
如果只是想临时测试一下,数据丢了也没关系,可以用这种方式:
docker run -tid --privileged \
-p 54321:54321 \
--name kingbase \
kingbase:v1 /usr/sbin/init
这里面几个参数得说一下:
--privileged
给了容器特权模式,KingbaseES 运行的时候需要一些特殊权限,不加这个参数可能启动不了。
-p 54321:54321
是把容器的 54321 端口映射到宿主机,KingbaseES 默认用这个端口,映射后外部才能访问数据库。
--name kingbase
给容器起了个名字,后面操作容器的时候直接用这个名字就行,不用记长长的容器 ID。
最后那个/usr/sbin/init
是容器启动后执行的命令,用来初始化系统环境。
执行完这个命令,会返回一个容器 ID,说明启动成功了。
正式环境用的持久化启动
正式用的话,必须得保证数据不丢,所以要把数据目录挂载到宿主机:
docker run -tid --privileged \
-p 54321:54321 \
--name kingbase \
–v /opt/kingbase/data:/home/kingbase/userdata \
kingbase:v1 /usr/sbin/init
比临时启动多了-v /opt/kingbase/data:/home/kingbase/userdata
这一行,意思是把宿主机的/opt/kingbase/data
目录和容器里的/home/kingbase/userdata
目录关联起来,数据库的数据就会存在宿主机的这个目录里了。
我在生产环境就是用的这种方式,后来有一次不小心把容器删了,重新启动一个新容器,还是挂载这个目录,数据一点没丢,特别方便。
五、验证部署是否成功
启动完容器,不能就这么不管了,得确认一下数据库是不是真的能用了。
首先看看容器是不是在运行:
docker ps | grep kingbase
如果 STATUS 那一列显示 “Up”,后面跟着运行时间,就说明容器没问题。要是没看到,可能是容器启动失败了,可以用docker logs kingbase
看看日志,找找原因。
接下来进入容器内部:
docker exec -it kingbase /bin/bash
这个命令能让我们进入容器的命令行界面,-it
参数是为了能交互,/bin/bash
是启动 bash shell。
进入容器后,就可以用 KingbaseES 的客户端工具 ksql 连接数据库了:
ksql -U kingbase -d test
-U kingbase
是指定用户名,默认就是 kingbase,-d test
是连接 test 数据库,这也是默认存在的数据库。
如果连接成功,会出现test=#
这样的提示符,这时候就可以执行 SQL 命令了。比如查一下数据库版本:
test=# SELECT version();
执行后会显示 KingbaseES 的版本信息,说明数据库确实在正常运行。
一些实用的小技巧
-
要是想停止容器,用
docker stop kingbase
;想重新启动,用docker start kingbase
。 -
要是容器出了问题,想删掉重新建一个,先
docker stop kingbase
,再docker rm kingbase
,然后重新执行启动命令就行,记得持久化启动的话数据还在。 -
外部程序连接数据库的时候,用宿主机的 IP 地址,端口 54321,用户名 kingbase,默认没有密码,正式环境一定要记得设置密码。
总结
用 Docker 部署 KingbaseES 确实比传统的源码安装或者 rpm 包安装简单多了,尤其是在多环境部署的时候,能保证环境一致性,减少很多麻烦。整个过程主要就是准备环境、创建目录、导入镜像、启动容器、验证这几步,只要注意权限和数据持久化这两个关键点,一般都能顺利完成。
我这也是第一次部署,中间踩了几个小坑,不过解决了之后觉得也不难。希望这篇文章能帮到那些刚开始接触 KingbaseES 和 Docker 的朋友,少走点弯路。如果大家在部署过程中遇到其他问题,也欢迎一起交流。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/g310773517/article/details/150619350