原文链接:【KWDB创作者计划】_KWDB部署之deploy.sh uninstall命令分析 - OSCHINA - 中文开源技术交流社区
作者:万少
本博客是在完成了 KWDB 部署的基础上,对 KWDB 部署脚本的进一步分析,关于安装 Ubuntu22.04 和 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 安装的极简版说明。
deploy.sh 中,根据输入参数的不同,可以执行如下操作:
前文基于 install 完成了单节点安装,本文基于 uninstall 参数完成卸载步骤。
在前面博客中,
链接:【KWDB 创作者计划】_KWDB 部署之 deploy.sh install --single 命令分析
对 KWDB 的部署命令进行了分析,如果项更换 KWDB 版本,就需要使用更新或是卸载再安装的方式,本文提供基于 deploy.sh 的卸载 KWDB 再安装的方案分析。
关于 KWDB 的 deploy.sh 脚本,我们在上一篇博客中,已经从
1. 脚本初始化
2. 命令行参数解析
3. 获取本地节点密码
4. 初始化日志
5. 安装前检查和准备
6. 硬件检测
7. 配置文件检测
8.SSH 免密检测
9. 安装过程
10. 安装完成提示
等 10 个方面进行分析,前 4 个步骤是执行安装 KWDB 或卸载 KWDB 的通用步骤,前四个步骤的内容可参考上篇博客,本文接下来分析 KWDB 的卸载过程。
下面针对按照过程中的 deploy.sh uninstall
进行分析,该脚本一共 870 行,下面对安装过程进行分析
执行
deploy.sh uninstall --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/KWDB_common.shsource $g_deploy_path/utils/utils.shsource $g_deploy_path/utils/KWDB_log.shfunction global_usage() { ... }
这部分代码解释如下:
g_deploy_path 对应当前目录
g_cur_usr 对应当前用户名
declare -a global_vars 声明一个名为 global_vars 的数组变量
source 命令会在当前 Shell 进程中读取并执行指定文件的内容。将指定路径下的三个脚本文件内容引入到当前的 deploy.sh 脚本中执行。关于这个是三个脚本的功能不进行拓展。
global_usage 函数用于输出一些提示信息
调用 cmd_check
函数对输入的命令行参数 install --single
进行解析:
# 350-351行# cmd line parameter parsingcmd_check $@
在 cmd_check
函数中,会使用 getopt
工具解析参数,识别出 install
命令,并调用 install_usage
函数处理 --single
选项:
# 182-238行function cmd_check() { # ... 其他代码 ... case "$g_kw_cmd" in install) install_usage $options ;; # ... 其他代码 ... esac}# 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行# fetch local node passwdlocal_privileged
调用 local_privileged
函数获取本地节点的密码。
local_privileged
函数位于 KWDB_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}
# init loglog_init $g_deploy_path $g_cur_usrpush_back "LOG_FILE"push_back "LOG_LEVEL"
调用 log_init
函数初始化日志系统。
log_init
函数位于 KWDB_log.sh 的 13-28 行
如果输入的参数为 uninstall,则进入卸载环节,位于 500-521 行。
if [ "$g_kw_cmd" = "uninstall" ];then source $g_deploy_path/utils/kaiwudb_uninstall.sh if ! $(install_check >/dev/null 2>&1);then log_err "KaiwuDB does not exist. Please install KaiwuDB first." exit 1 fi if $(kw_status >/dev/null 2>&1);then log_err "Please stop KaiwuDB first." exit 1 fi
引入 kaiwudb_uninstall.sh
脚本,该脚本包含卸载相关的函数。具体函数信息如下:
| 函数名称 | 开始行数 | 结束行数 | 函数作用 | 核心命令 | | --------------- | -------- | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | uninstall
| 4 | 34 | 卸载 KaiwuDB 软件包,根据安装类型(裸机安装或容器安装)采取不同的卸载方式 | 裸机安装时:dpkg -r
或 rpm -e
卸载软件包,sudo rm -rf
删除安装目录;容器安装时:docker rm
删除容器,docker rmi
删除镜像 | | umount_loop
| 36 | 49 | 卸载指定前缀的挂载设备,在卸载过程中若出现错误会输出错误信息并返回非零状态码 | losetup -a
列出所有环回设备,awk
和 tr
处理输出,umount
卸载设备 | | uninstall_dir
| 51 | 73 | 卸载 KaiwuDB 相关目录,根据用户选择决定是否删除数据目录,在卸载过程中会先尝试卸载挂载设备 | rm -rf
删除配置文件和服务文件(/etc/kaiwudb/etc/systemd/system/kaiwudb.service),调用 umount_loop
卸载设备,rm -rf
删除数据目录 | | delete_user
| 75 | 86 | 在裸机安装模式下,删除 KaiwuDB 相关用户和组,并从 /etc/sudoers
文件中移除该用户的免密权限 | userdel -r
删除用户,sed -i
从 /etc/sudoers
文件中删除用户相关行 |
调用 install_check
函数检查 KaiwuDB 是否已经安装,如果未安装则输出错误信息并退出脚本。该函数的实现位于 kaiwudb_common.sh 中的 40-48 行,如下,主要通过!-e /etc/systemd/system/kaiwudb.service 确定 kaiwudb 是否安装
# whether installing KaiwuDBfunction install_check() { if [ ! -e /etc/systemd/system/kaiwudb.service ];then echo "KaiwuDB is not install." return 1 fi echo "KaiwuDB is already installed." return 0}
调用 kw_status
函数检查 KaiwuDB 是否正在运行,该函数位于 kaiwudb_common.sh 中 185-203 行,如果正在运行则输出错误信息并退出脚本。
510-511 行主要用于询问用户是否删除数据,代码如下
clear_opt="n" read -t60 -p "When uninstalling KaiwuDB, you can either delete or keep all user data. Please confirm your choice: Do you want to delete the data? (y/N)" -e clear_opt
使用 read
命令提示用户在 60 秒内输入是否删除用户数据的选择,默认值为 n
(不删除)。
clear_opt 变量会在 kaiwudb_uninstall.sh 的 65 行被使用,65 行位于 uninstall_dir 函数中,代码如下
function uninstall_dir() { local ret="" if [ "$REMOTE" = "ON" ];then prefix=$node_cmd_prefix else prefix=$local_cmd_prefix fi local data_root=$(kw_data_dir) eval $prefix rm -rf /etc/kaiwudb /etc/systemd/system/kaiwudb.service if [ -n "$data_root" ];then # 看这里 if [ "$clear_opt" = "yes" ] || [ "$clear_opt" = "y" ]; then ret=$(umount_loop $data_root) if [ $? -ne 0 ];then echo $ret return 1 fi ret=$(eval $prefix rm -rf $data_root 2>&1) if [ $? -ne 0 ];then echo $ret return 1 fi fi fi}
512-518 行调用了 kaiwudb_uninstall.sh 中对应的函数,命令如下:
uninstall delete_user func_info=$(uninstall_dir)if [ $? -ne 0 ];then log_err "dir uninstall error:$func_info" exit 1 fi
uninstall
函数执行主要的卸载操作。delete_user
函数删除相关用户。uninstall_dir
函数删除相关目录,如果删除失败则输出错误信息并退出脚本。519-520 行是输出卸载完成提示,
echo -e "\e[1;32m[UNINSTALL COMPLETED]:\e[0mKaiwuDB has been uninstalled successfully."exit 0
输出绿色的卸载完成提示信息,并退出脚本。
519 行的代码如下:
echo -e "\e[1;32m[UNINSTALL COMPLETED]:\e[0mKaiwuDB has been uninstalled successfully."
下面详细解释这行命令的各个部分:
echo
命令echo` 是 Shell 脚本中常用的命令,用于将指定的文本输出到标准输出(通常是终端)。
-e
选项
-e
是echo
命令的一个选项,它的作用是启用对反斜杠转义字符的解释。在没有这个选项的情况下,echo
会将反斜杠和后面的字符作为普通字符输出;加上-e
选项后,就可以识别并处理像\n
(换行符)、\t
(制表符)等转义字符。转义序列
\e[1;32m
和\e[0m
这两个是 ANSI 转义序列,用于在终端中设置文本的样式和颜色:
\e[1;32m
:\e
代表转义字符(也可以用\033
表示),1
表示设置文本为粗体,32
表示设置文本颜色为绿色。所以\e[1;32m
的作用是将后续输出的文本设置为绿色粗体。\e[0m
:这个转义序列的作用是将文本样式和颜色恢复为默认值。在输出绿色粗体文本后,使用\e[0m
可以确保后续输出的文本不会继续保持绿色粗体样式。输出文本
[UNINSTALL COMPLETED]:KaiwuDB has been uninstalled successfully.
是实际要输出的提示信息,表明 KaiwuDB 已经成功卸载。
这个输出过程还是蛮上心的:100:
到此通过如上 8 个步骤,deploy.sh uninstall
命令会依次完成参数解析、环境检查、询问用户是否删除数据、执行卸载操作等步骤,最终完成 KaiwuDB 的卸载。
安装完操作系统,就可以安装 KWDB 了,按照 gitee 的 README 文档 https://gitee.com/kwdb/kwdb,
准备基础环境
sudo apt update sudo apt install cmake -y sudo snap install go --classic sudo apt install libprotobuf-dev
下载
wget https://gitee.com/kwdb/kwdb/releases/download/V2.2.0/KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
解压 KWDB
tar zxvf KWDB-2.2.0-ubuntu22.04-x86_64-debs.tar.gz
进入 kwdb 安装目录
cd kwdb_install/
编辑配置文件
sudo vi deploy.cfg
在~/.bashrc 与 /etc/profile 目录下新增一行
export GO111MODULE=off
生效~/.bashrc 与 /etc/profile 配置
source ~/.bashrc source /etc/profile
安装 KWDB
./deploy.sh install --single
启动 kwdb
systemctl daemon-reload
systemctl start kaiwudb.service systemctl status kaiwudb.service
执行 add_user.sh 脚本创建数据库用户
./add_user.sh
通过 kwbase 命令行链接 kwbase
sudo /usr/local/kaiwudb/bin/kwbase sql --host=xxx.xxx.xxx.xxx:26257 --certs-dir=/etc/kaiwudb/certs
以上提供了 KWDB 的安装基本过程,更详细参考对应文档。