原文链接:【KWDB创作者计划】_KWDB部署之deploy.sh install --single命令分析 - OSCHINA - 中文开源技术交流社区
作者:IT从业者张某某
本博客是在在默认安装了 Ubuntu22.04 的基础上,执行的一系列操作,如果需要本地安装 Ubuntu 或安装 Ubuntu22.04 的云服务可以参考如下链接:
基于云服务器的 KWDB 安装:https://blog.csdn.net/m0_38139250/article/details/147234176
KWDB 支持的操作系统如下:
KWDB2.2 的下载页面如下: https://gitee.com/kwdb/kwdb/releases/tag/V2.2.0
下载地址: https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
安装的参考过程如下: https://gitee.com/kwdb/kwdb
安装的参考过程如下: https://blog.itpub.net/69947868/viewspace-3081066
安装完操作系统,就可以安装 KWDB 了,按照 gitee 的 README 文档 https://gitee.com/kwdb/kwdb,
1. 首先准备基础环境
准备的基础环境包括更新源,安装 cmake 与 go,升级 libprotobuf-dev 到最新版本
sudo apt updatesudo apt install cmake -y sudo snap install go --classicsudo apt install libprotobuf-dev
CMake 是一个跨平台的开源构建系统工具,它的主要作用是帮助开发者更方便地管理软件项目的构建过程。通过使用 CMake,开发者可以避免为每个支持的目标平台手动编写和维护低级构建文件(如 Makefile)。CMake 支持多种操作系统(如 Windows、macOS、Linux 等)以及不同的编译器和开发环境,使得同一个项目可以在不同平台上轻松构建。
snap 和 apt 类似,都是安装工具,使用 Snap 安装 Go 可更快获取最新版本,跨平台兼容性强,依赖管理更简单。而 Apt 提供的 Go 版本通常较旧,受限于发行版仓库更新周期。Snap 还支持自动更新和回滚,适合需要最新功能和便捷部署的开发者。--classic 选项指定了要使用的 confinement 级别。Snap 应用程序默认情况下在严格的沙箱环境中运行,限制了其对外部系统的访问。--classic
选项来放宽这些限制,使得应用(如开发工具、编程语言等)可访问系统文件或网络等功能。
libprotobuf-dev: libprotobuf-dev
是一个开发库,提供了 Protocol Buffers(简称 Protobuf)的开发所需文件。Protocol Buffers 是由 Google 开发的一种与语言无关、平台无关的可扩展机制,用于序列化结构化数据。它让你能够定义数据的结构一次,并生成便于在各种编程语言间交换数据的源代码。
2. 下载并解压 KWDB 安装包
通过 wget 命令下载安装包
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
解压压缩包
tar zxvf KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
解压后的目录名称为 kwdb_install,如下
3. 修改配置配置
进入解压后目录,并查看当前目录文件
cd kwdb_install/ls
kwdb_install 目录如下
dd_user.sh 用户添加用户,deploy.cfg 是部署的配置文件,deploy.sh 为 kwdb 的部署脚本
编辑 kwdb_install 目录的 deploy.cfg 配置文件
sudo vi deploy.cfg
编辑如下:注意 [cluster] 也需要用 #注释掉
[global] secure_mode=tls management_user=kaiwudb rest_port=8080 kaiwudb_port=26257 data_root=/var/lib/kaiwudb cpu=1 [local] node_addr=your-host-ip
#[cluster] 单节点安装时需要注释掉
#node_addr=your-host-ip, your-host-ip
#ssh_port=22
#ssh_user=admin
4. 修改~/.bashrc 与 /etc/profile 禁用 Go 模块功能,并生效设置。
本部分需要在~/.bashrc 与 /etc/profile 目录下新增一行,
export GO111MODULE=off
GO111MODULE=off
是一个环境变量设置,用于控制 Go 语言的模块(module)系统的行为。Go 模块是 Go 1.11 版本引入的一个重要的特性,旨在更好地管理项目依赖关系。将 GO111MODULE
设置为 off
时,意味着你关闭了 Go 模块支持,此时 Go 工具链会恢复到使用传统的依赖管理方式,即通过 GOPATH
和 vendor
目录来查找和管理依赖项。此设置主要用于向后兼容或在某些特定情况下避免与 Go 模块相关的复杂性。然而,随着 Go 模块逐渐成为标准做法,推荐的做法是在新的项目中开启 Go 模块支持,并利用它提供的更强大的依赖管理和构建功能。默认情况下,从 Go 1.16 开始,Go 模块支持是自动开启的,除非特别配置才会关闭。 特此提供基于 vim 编辑器的快捷方式,好用的 vi 快捷键
在一般模式 (刚进入的模式,esc 模式) Go 或 Shift+g 然后 o 先
G
或shift+g
到最后一行 然后 小写o
在该行下方新增一行
个人用户设置:修改~/.bashrc 文件
sudo vi ~/.bashrc
输入 Go,然后添加
export GO111MODULE=off
这个操作比较丝滑啊:100:。
系统设置:修改 /etc/profile 文件
sudo vi /etc/profile
输入 Go,然后添加
export GO111MODULE=off
这个操作依旧比较丝滑啊:100:。
立即生效
source ~/.bashrcsource /etc/profile
5. 安装 kwdb・要输入密码
./deploy.sh install --single
我的密码为 123456
6. 启动 kwdb
重新加载系统服务的方法有如下 3 种,区别如下:
命令 | 作用对象 | 行为 | 适用场景 | 对服务的影响 |
---|---|---|---|---|
systemctl restart 服务名 | 具体服务 | 强制停止服务,再重新启动。 | 配置或代码有重大变更,或服务出现异常需完全重启。 | 服务会中断,进程 PID 变化。 |
systemctl reload 服务名 | 具体服务 | 请求服务重新加载配置(不重启)。 | 仅需更新配置文件(如 Nginx、Apache),需保持服务不中断。 | 服务不中断,进程 PID 不变(需服务支持 reload 功能)。 |
systemctl daemon-reload | Systemd 管理器本身 | 重新加载所有单元文件(如 .service 、.timer ),使配置变更生效。 | 修改了服务的单元文件(如启动参数、依赖关系),或新增 / 删除了单元文件。 | 不会直接影响运行中的服务,需后续手动重启服务以应用变更。 |
使用 systemctl daemon-reload 命令重写加载配置文件 ,
systemctl daemon-reload
启动并查看 kwdb 状态
systemctl start kaiwudb.servicesystemctl status kaiwudb.service
7. 登录到命令行的 kwdb
执行 add_user.sh 脚本创建数据库用户。
./add_user.shPlease enter the username: Please enter the password:
如果跳过该步骤,系统将默认使用 root 用户,且无需密码访问数据库。
通过 kwbase 命令行链接 kwbase,代码如下:
sudo /usr/local/kaiwudb/bin/kwbase sql --host=xxx.xxx.xxx.xxx:26257 --certs-dir=/etc/kaiwudb/certs
注意,上面的 xxx.xxx.xxx.xxx 需要更换为你电脑的 ip 地址。
8. 测试数据
创建一个时序数据库 tsdb
CREATE TS DATABASE tsdb;
在 tsdb 时序数据库中创建 ts_table 时序表并写入数据。
CREATE TABLE tsdb.ts_table (ts timestamp not null, temperature double) tags(num_id int not null) primary tags(tag1);
插入数据
操作语句如下:
insert INTO tsdb.ts_table VALUES(now(),26.6,107);
语句说明
now () 表示当前时间,类型为 timestamp, 对应 ts 列
26.6 表示温度,类型为 double,对应 temperature 列
107 为机房 id,类型为 107,对应 num_id 标签列
查看表的内容。
select * FROM tsdb.ts_table;
输出如下:
ts temperature num_id
2020-04-23 21:44:33.411+00:00 26.6 107
以上提供了 KWDB 的安装与测试使用过程。
下面针对按照过程中的 deploy.sh install --single 进行分析,该脚本一共 870 行,下面对安装过程进行分析
执行
deploy.sh install --single
命令的主要目的是使用单节点模式安装 KaiwuDB 数据库。
脚本启动后,首先会进行一些基础的全局变量初始化:
# basic golbal variablesg_deploy_path=$(cd $(dirname $0);pwd) g_cur_usr=$(whoami) func_info=""# define export varsdeclare -a global_varssource $g_deploy_path/utils/kaiwudb_common.shsource $g_deploy_path/utils/utils.shsource $g_deploy_path/utils/kaiwudb_log.shfunction global_usage() { ... }
这部分代码解释如下:
g_deploy_path 对应当前目录
g_cur_usr 对应当前用户名
declare -a global_vars 声明一个名为 global_vars 的数组变量
source 命令会在当前 Shell 进程中读取并执行指定文件的内容。将指定路径下的三个脚本文件内容引入到当前的 deploy.sh 脚本中执行。关于这个是三个脚本的功能不进行拓展。
global_usage 函数用于输出一些提示信息
在 350-351 行会调用 cmd_check
函数对输入的命令行参数 install --single
进行解析:
# 350-351行# cmd line parameter parsingcmd_check $@
在 cmd_check
函数(182-238 行)中,会使用 getopt
工具解析参数,识别出 install
命令,并调用 install_usage
函数处理 --single
选项:
# 182-238行function cmd_check() { # ... 其他代码 ... case "$g_kw_cmd" in install) install_usage $options ;; # ... 其他代码 ... esac}
调用的 install_usage 函数 33-65 行
# 33-65行function install_usage() { eval set -- "$@" push_back "g_install_mode" if [ $# -eq 3 ];then case "$1" in --single) g_install_mode="single" return ;; # ... 其他代码 ... esac fi}
这一步将安装模式设置为 single
。
继续执行,在 353-354 行,调用 local_privileged
函数获取本地节点的密码。
# 353-354行# fetch local node passwdlocal_privileged
local_privileged
函数的定义位于 kaiwudb_common.sh 的第 271-288 行
function local_privileged() { if privileged;then local_cmd_prefix="sudo" else local_cmd_prefix="echo '$(read_passwd $g_cur_usr)' | sudo -S -p \"\"" echo eval $local_cmd_prefix -k -s >/dev/null 2>&1 if [ $? -ne 0 ];then echo -e "\033[31m[ERROR]\033[0m Incorrect password." >&2 exit 1 fi fi eval $local_cmd_prefix bash -c "exit" >/dev/null 2>&1 if [ $? -ne 0 ];then echo -e "\033[31m[ERROR]\033[0m Can not use command: 'sudo bash'." >&2 exit 1 fi}
该函数中,检查用户是否由权限,如果由有权限执行 sudo,没有权限就需要输入密码
接下来执行 log_init
函数,调用 log_init
函数初始化日志系统。
# init loglog_init $g_deploy_path $g_cur_usrpush_back "LOG_FILE"push_back "LOG_LEVEL"
log_init
函数位于 kaiwudb_log.sh 的 13-28 行
接下来执行 361-498 行的安装前检查和准备,如下
# 361-498行if [ "$g_kw_cmd" = "install" ];then # pipe kw_pipe=$g_deploy_path/kw_pipe if [ ! -p $kw_pipe ]; then func_info=$(mkfifo $kw_pipe 2>&1) if [ $? -ne 0 ];then log_err "Pipe create failed: $func_info." exit 1 fi fi exec 10<>$g_deploy_path/kw_pipe rm -rf $g_deploy_path/kw_pipe source $g_deploy_path/utils/kaiwudb_install.sh source $g_deploy_path/utils/kaiwudb_hardware.sh source $g_deploy_path/utils/process_bar.sh process_bar $$ & process_pid=$! echo "install#check:5" >&10 # whether installing KaiwuDB if $(install_check >/dev/null 2>&1);then log_err "KaiwuDB is already installed." exit 1 fi # ... 其他代码 ...
这部分代码创建了一个命名管道用于进度显示,引入了安装、硬件检查和进度条相关的脚本,启动进度条进程,并检查 KaiwuDB 是否已经安装。
接下来执行 384-393 行
# 384-393行echo "hardware#check:10" >&10# hardware checkcpu_infoif [ $? -eq 1 ];then log_warn "The number of CPU cores does not meet the requirement. KaiwuDB may running failed."fimem_infoif [ $? -eq 2 ];then log_warn "The memory does not meet the requirement. KaiwuDB may running failed."fi
调用 cpu_info
和 mem_info
函数检查 CPU 和内存是否满足安装要求。kwdb 的要求是 8GB 和 4 核。但看脚本中应该是 6G 就可以,如果内存不够,可以尝试调整这个设置。
cpu_info
函数位于 kaiwudb_hardware.sh
脚本的 3-8 行,
#cpu coresfunction cpu_info() { local cores=$(cat /proc/cpuinfo | grep "processor" | sort -u| wc -l ) if [ $cores -le 4 ];then return 1 fi }
mem_info
函数位于 kaiwudb_hardware.sh
脚本的 10-17 行,
#memory info function mem_info() { local mem=$(cat /proc/meminfo | grep MemTotal | grep -Eo "[0-9]+") # if [ `echo "$mem/1024/1024 < 6" | bc` -eq 1 ];then if [ $(expr $mem / 1024 / 1024) -lt 6 ];then return 1 fi }
接下来执行 394-397 行,调用 verify_files
函数验证文件,调用 cfg_check
函数检查配置文件的各项参数是否正确。
# 394-397行verify_filesecho "configure#file#check:15" >&10# parsing config filecfg_check
cfg_check
函数位于 deploy.sh 的 240-348 行。
接下来执行 398-402 行,调用 parallel_exec
函数在集群节点上检查 SSH 免密登录。
# 398-402行echo "ssh-passwd-free#check:20" >&10 parallel_exec "${g_cls_array[*]}" $g_ssh_port $g_ssh_user "ssh_passwd_free"if [ $? -ne 0 ];then exit 1fi
接下来会进行一系列安装操作,包括创建目录、分发文件、安装包、创建配置文件和证书等,在 411-438 行:
# 411-438行# ... 其他代码 ...echo "create#node#dir:35" >&10 parallel_exec "${g_cls_array[*]}" $g_ssh_port $g_ssh_user "node_dir"echo "local#dir#init:45" >&10# local node init directoryfunc_info=$(init_directory)if [ $? -eq 2 ];then log_warn $func_infofiecho "node#dir#init:50" >&10# parallel init remote node directoryparallel_exec "${g_cls_array[*]}" $g_ssh_port $g_ssh_user "init_directory"echo "distribute#packages:55" >&10# distribute filesparallel_distribute "${g_cls_array[*]}" $g_ssh_port $g_ssh_user "$g_deploy_path/packages"if [ $? -ne 0 ];then rollback_all "${g_cls_array[*]}" $g_ssh_port $g_ssh_user exit 1fiecho "local#install:60" >&10#install packagesfunc_info=$(install $g_local_addr)if [ $? -ne 0 ];then log_err "Install failed: $func_info" rollback_all "${g_cls_array[*]}" $g_ssh_port $g_ssh_user exit 1else g_image_name=$func_infofi# ... 其他代码 ...
接下来执行 493-497 行,当前行意味着安装 complete:100
# 493-497行echo "install#complete:100" >&10waitexec 10>&-echo -e "\e[1;32m[INSTALL COMPLETED]:\e[0mKaiwuDB has been installed successfully! To start KaiwuDB, please execute the command '\e[1;34msystemctl daemon-reload\e[0m'."exit 0
当所有安装步骤完成后,会输出安装成功的提示信息,并退出脚本。
综上所述,deploy.sh install --single
命令会依次完成参数解析、环境检查、硬件检查、配置文件检查、SSH 免密检查、安装操作等步骤,最终完成 KaiwuDB 的单节点模式安装。