dataease-dm/installer/dataease/dectl

407 lines
12 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
action=$1
target=$2
args=$@
DE_BASE=/opt
source ${DE_BASE}/dataease/.env
export COMPOSE_HTTP_TIMEOUT=180
compose_files="-f docker-compose.yml"
compose_cmd="docker-compose"
server_url=""
current_version=""
latest_version=""
owner=""
repo=""
docker-compose version >/dev/null 2>&1
if [ $? -ne 0 ]; then
docker compose version >/dev/null 2>&1
if [ $? -ne 0 ]; then
compose_cmd="docker compose"
fi
fi
if [ "${DE_ENGINE_MODE}" = "local" ]; then
if [[ ! ${DE_EXTERNAL_KETTLE} ]] || [ ${DE_EXTERNAL_KETTLE} = "false" ]; then
compose_files="${compose_files} -f docker-compose-kettle.yml"
fi
if [[ ! ${DE_EXTERNAL_DORIS} ]] || [ ${DE_EXTERNAL_DORIS} = "false" ]; then
compose_files="${compose_files} -f docker-compose-doris.yml"
fi
fi
if [[ ! ${DE_EXTERNAL_MYSQL} ]] || [ ${DE_EXTERNAL_MYSQL} = "false" ]; then
compose_files="${compose_files} -f docker-compose-mysql.yml"
fi
function usage() {
echo "DATAEASE 控制脚本"
echo
echo "Usage: "
echo " ./dectl [COMMAND] [ARGS...]"
echo " ./dectl --help"
echo
echo "Commands: "
echo " status 查看 DATAEASE 服务运行状态"
echo " start 启动 DATAEASE 服务"
echo " stop 停止 DATAEASE 服务"
echo " restart 重启 DATAEASE 服务"
echo " reload 重新加载 DATAEASE 服务"
echo " uninstall 卸载 DATAEASE 服务"
echo " upgrade 升级 DATAEASE 服务"
echo " backup 备份 DATAEASE 服务"
echo " restore xxx.tar.gz 还原 DATAEASE 服务"
echo " version 查看 DATAEASE 版本信息"
echo " clear-images 清理 DATAEASE 旧版本的相关镜像"
echo " clear-logs 清理 DATAEASE 历史日志以及 Doris 临时日志"
}
function _healthcheck() {
echo
container_name=$(grep "container_name" $DE_BASE/dataease/docker-compose.yml | awk -F': ' '{print $2}')
sleep 1
if [ -z $(docker ps --filter "name=$container_name" -q) ];then
echo "未找到容器 $container_name"
exit 1
fi
for b in {1..90}
do
sleep 1
read status healthy<<<$(docker inspect $container_name --format '{{.State.Status}} {{.State.Health.Status}}')
if [[ "$healthy" == "starting" ]];then
printf "\rDataEase 服务状态 : 正在启动 ... %3ds" $b
elif [[ "$status" == "running" ]] && [[ "$healthy" == "healthy" ]];then
printf "\rDataEase 服务状态 : 正常运行 "
echo
return;
else
echo
echo -e "DataEase 服务状态 : \033[31m无法访问\033[0m"
exit 1
fi
done
echo
echo "【警告】服务在等待时间内未完全启动!请稍后使用 dectl status 检查服务运行状况。"
echo
}
function _get_current_version() {
de_current_version=$(grep "^ image:.*/dataease:" ${DE_BASE}/dataease/docker-compose.yml | awk -F'dataease:' '{print $2}')
if test -z $de_current_version; then
echo "获取当前版本失败,请检查当前版本是否正确"
exit 1
fi
current_version=$de_current_version
}
function _get_available_server() {
git_urls=('gitee.com' 'github.com')
for git_url in ${git_urls[*]}
do
echo -ne "检测 ${git_url} ... "
curl -m 5 -kIs https://${git_url} >/dev/null
if [ $? != 0 ];then
echo "failed"
else
echo "ok"
server_url=${git_url}
break
fi
done
}
function _get_latest_version() {
if [[ -x "$(command -v python)" ]];then
py_cmd='python'
elif [[ -x "$(command -v python3)" ]]; then
py_cmd='python3'
fi
_get_available_server
if [[ "x${server_url}" == "x" ]];then
echo "无法连接版本服务器,请稍候重试"
exit 1
fi
if [[ "${server_url}" == "gitee.com" ]];then
owner='fit2cloud-feizhiyun'
repo='DataEase'
gitee_release_content=$(curl -s https://gitee.com/api/v5/repos/${owner}/${repo}/releases/latest)
# export LC_ALL="en_US.utf8"
latest_version=$($py_cmd -c "import json; obj=json.loads('$gitee_release_content', strict=False); print(obj['tag_name']);")
else
owner='dataease'
repo='dataease'
latest_version=$(curl -s https://api.github.com/repos/${owner}/${repo}/releases/latest | grep -e "\"tag_name\"" | sed -r 's/.*: "(.*)",/\1/')
fi
}
function status() {
echo
echo "DataEase 容器运行状态"
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} ps
echo
docker_root_dir=$(docker info | grep "Docker Root Dir" | awk -F': ' '{print $2}')
echo "Docker 目录及文件大小 : "
du -sh $docker_root_dir
echo
echo "Docker 目录所在磁盘使用情况 : "
df -H $docker_root_dir
echo
echo "日志文件大小 : "
du -Sh ${DE_BASE}/dataease/logs/
echo
echo "DataEase 运行目录及文件大小 : "
du -sh ${DE_BASE}
echo
echo "DataEase 运行目录使用情况 : "
df -H ${DE_BASE}
echo
read available_disk percent_disk<<< $(df -H --output=avail,pcent ${DE_BASE} | tail -1)
available_disk=${available_disk%?}
percent_disk=${percent_disk%?}
if [[ $available_disk < 2.0 ]] && [[ $percent_disk > 85 ]];then
echo -e "\033[31m[警告] DataEase 运行目录所在磁盘剩余空间不足 2G 且磁盘使用率超过 85%Apache Doris 可能无法正常启动!\033[0m"
fi
_healthcheck
}
function start() {
echo
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} start ${target}
_healthcheck
}
function stop() {
echo
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} stop ${target}
}
function restart() {
echo
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} restart ${target}
_healthcheck
}
function reload() {
echo
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} up -d
_healthcheck
}
function uninstall() {
echo
cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} down -v ${target}
}
function version() {
echo
_get_current_version
echo "current version is $current_version"
_get_latest_version
echo "latest version is $latest_version"
}
function _clear_component_docker_images() {
component=$1
compose_file=${DE_BASE}/dataease/docker-compose-${component}.yml
if [ $1 = "dataease" ];then
compose_file=${DE_BASE}/dataease/docker-compose.yml
fi
component_image_defined=$(grep "^ image:.*/$component:" ${compose_file} | uniq)
component_version=$(echo ${component_image_defined} | awk -F"${component}:" '{print $2}' | uniq)
component_image=$(echo ${component_image_defined} | awk -F'image: ' '{print $2}' | awk -F':' '{print $1}')
if [[ $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version ") == 0 ]]; then
echo "$component_image 不存在旧版本镜像"
else
echo "清理${component}镜像"
docker rmi $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version " | awk -F' ' '{print $1":"$2}')
echo "清理完毕"
fi
}
function clear_images() {
echo
_clear_component_docker_images 'dataease'
_clear_component_docker_images 'doris'
_clear_component_docker_images 'kettle'
_clear_component_docker_images 'mysql'
if test ! -z "$(docker images -f dangling=true -q)"; then
echo "清理虚悬镜像"
docker rmi $(docker images -f dangling=true -q)
echo "清理完毕"
fi
}
function clear_logs() {
echo "开始清理 DataEase 历史日志"
rm -rf ${DE_BASE}/dataease/logs/dataease/history/*
echo "清理完毕"
echo "开始清理 Apache Doris FE 日志"
rm -rf ${DE_BASE}/dataease/logs/fe/fe.gc.log.*
echo "" > ${DE_BASE}/dataease/logs/fe/fe.out
echo "清理完毕"
echo "开始清理 Apache Doris BE 日志"
echo "" > ${DE_BASE}/dataease/logs/be/be.INFO
echo "" > ${DE_BASE}/dataease/logs/be/be.WARNING
echo "" > ${DE_BASE}/dataease/logs/be/be.out
echo "清理完毕"
}
function upgrade() {
version
if [ "${latest_version}" = "" ];then
echo "未获取到最新版本"
exit 1
elif [ "${latest_version}" = "${current_version}" ];then
echo "最新版本与当前版本一致,退出升级过程"
exit 0
else
if [[ "$latest_version" =~ ^v2.* ]];then
echo "获取到的最新版本与当前版本不匹配,请访问 https://community.fit2cloud.com/#/products/dataease/downloads 下载离线安装包"
exit 1
else
echo -e "\e[32m 检测到最新版本为\e[1;33m${latest_version}\e[0;32m 即将执行在线升级...\e[0m"
fi
fi
sleep 2s
echo "使用下载服务器 ${server_url}"
cd /tmp
download_url="https://${server_url}/${owner}/${repo}/releases/download/${latest_version}/dataease-${latest_version}-online.tar.gz"
curl -LOk -m 60 -o dataease-${latest_version}-online.tar.gz $download_url
if [ $? -ne 0 ]; then
echo -e "\e[31m升级失败:连接下载服务器超时!\n可手动下载升级包然后执行\e[1;33m /bin/bash install.sh \e[0;31m离线升级也可以重新执行一次 dectl upgrade 命令。\e[0m"
return 2
fi
if [ ! -f dataease-${latest_version}-online.tar.gz ];then
echo "下载在线安装包失败,请试试重新执行一次安装命令。"
exit 1
fi
tar zxf dataease-${latest_version}-online.tar.gz
if [ $? != 0 ];then
echo "下载在线安装包失败,请试试重新执行一次安装命令。"
rm -f dataease-${latest_version}-online.tar.gz
exit 1
fi
cd dataease-${latest_version}-online
/bin/bash install.sh
cd ..
rm -rf /tmp/dataease-${latest_version}-online
}
function backup() {
need_stop=0
if [[ -z $1 ]];then
echo "如需备份 DataEase 数据,建议您先停止 DataEase 服务,以保证备份数据的完整性。"
read -r -p "即将备份 DataEase 数据,是否需要停止 DataEase 服务? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "Yes"
need_stop=1
;;
[nN][oO]|[nN])
echo "No"
;;
*)
echo "无效输入..."
exit 1
;;
esac
elif [[ "$1" == "stop" ]];then
need_stop=1
fi
if [[ $need_stop == 1 ]];then
service dataease stop
else
echo "不停服进行备份"
fi
echo "开始备份,建议在备份时先停止 DataEase 服务!"
backup_file_name=dataease-backup-$(date +%Y%m%d)_$(date +%H%M%S).tar.gz
tar --exclude=logs/* -zcf $backup_file_name -C $DE_BASE/dataease .
if [ $? -ne 0 ]; then
echo "备份失败"
exit 1
else
echo "备份成功,备份文件 : $backup_file_name"
fi
if [[ $need_stop == 1 ]];then
service dataease start
fi
}
function restore() {
if [[ -z $target ]];then
echo "未指定需要恢复的备份文件!"
exit 1
elif [[ -f $target ]];then
service dataease stop
if [[ ! -d $DE_BASE/dataease ]];then
mkdir -p $DE_BASE/dataease
fi
echo "恢复备份 $target"
tar -zxf $target --directory=$DE_BASE/dataease
service dataease start
else
echo "未找到备份文件 $target"
exit 1
fi
}
function main() {
case "${action}" in
status)
status
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
uninstall)
uninstall
;;
upgrade)
upgrade
;;
backup)
backup $target
;;
restore)
restore $target
;;
version)
version
;;
clear-images)
clear_images
;;
clear-logs)
clear_logs
;;
help)
usage
;;
--help)
usage
;;
*)
echo "不支持的参数,请使用 help 或 --help 参数获取帮助"
;;
esac
}
main