一键部署openGauss6.0.2轻量版单节点
本文提供了一个在CentOS7上部署openGauss6.0.2的自动化脚本。该脚本包含以下功能:1) 检查并安装必要依赖(python3/pip3等);2) 下载openGauss安装包;3) 创建数据库用户和组;4) 配置系统参数(sysctl/limits.conf);5) 创建安装和数据目录。脚本支持自定义服务器IP、端口、密码等参数,并提供了详细的执行状态提示。通过root用户运行即可完
·
这是一个懒人部署openGauss的shell脚本,经测试可以在生产环境部署轻量版单节点的openGauss6.0.2。
以下是shell脚本全文,使用前请将IP、端口等变量改为自己的实际环境。
#!/bin/bash
# 在CentOS7上部署openGauss6.0.2的脚本
# 配置参数
INSTALL_PACKAGE="openGauss-Server-6.0.2-CentOS7-x86_64.tar.bz2"
DOWNLOAD_URL="https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.2/CentOS7/x86/${INSTALL_PACKAGE}"
INSTALL_DIR="/app/openGauss"
DATA_DIR="/data/openGauss"
USER="omm"
GROUP="dbgrp"
PASSWORD="YourPassWord"
SERVER_IP="192.168.1.11"
PORT="5432"
# 检查是否以root用户运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本需要以root用户运行。" >&2
exit 1
fi
# 打印信息函数
info() {
echo -e "\033[1;34m[INFO] $1\033[0m"
}
# 打印成功信息函数
success() {
echo -e "\033[1;32m[SUCCESS] $1\033[0m"
}
# 打印错误信息函数
error() {
echo -e "\033[1;31m[ERROR] $1\033[0m" >&2
exit 1
}
info "开始部署openGauss 6.0.2..."
# 检查并安装必要的依赖,确保包含python3和pip3
info "检查并安装必要的依赖,包括python3和pip3..."
yum install -y bzip2 libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core net-tools python3 python3-devel python3-pip
# 验证python3和pip3是否安装成功
info "验证python3和pip3安装..."
if ! command -v python3 &> /dev/null; then
error "python3安装失败,请手动安装"
fi
if ! command -v pip3 &> /dev/null; then
error "pip3安装失败,请手动安装"
fi
success "python3和pip3验证通过"
# 检查安装包是否存在
info "检查安装包是否存在..."
if [ -f "${INSTALL_PACKAGE}" ]; then
info "安装包已存在,无需下载。"
else
info "安装包不存在,开始从服务器下载..."
if ! wget "${DOWNLOAD_URL}"; then
error "下载安装包失败,请检查网络连接或下载地址。"
fi
success "安装包下载成功。"
fi
# 检查并创建组
info "检查并创建组 ${GROUP}..."
if grep -q "^${GROUP}:" /etc/group; then
info "组 ${GROUP} 已存在。"
else
groupadd ${GROUP}
if [ $? -eq 0 ]; then
success "组 ${GROUP} 创建成功。"
else
error "组 ${GROUP} 创建失败。"
fi
fi
# 检查并创建用户
info "检查并创建用户 ${USER}..."
if id -u "${USER}" >/dev/null 2>&1; then
info "用户 ${USER} 已存在。"
else
useradd -g ${GROUP} ${USER}
if [ $? -eq 0 ]; then
echo "${PASSWORD}" | passwd --stdin ${USER}
success "用户 ${USER} 创建并设置密码成功。"
else
error "用户 ${USER} 创建失败。"
fi
fi
# 配置sysctl参数,将kernel.sem设置为"250 32000 100 512"
info "配置sysctl参数..."
SYSCTL_CONF="/etc/sysctl.conf"
SYSCTL_PARAMS=(
"kernel.sem=250 32000 100 512" # 按要求设置kernel.sem的值
"kernel.shmmni=4096"
"kernel.shmall=1073741824"
"kernel.shmmax=4398046511104"
"net.core.netdev_max_backlog=10000"
"net.core.rmem_default=262144"
"net.core.rmem_max=4194304"
"net.core.wmem_default=262144"
"net.core.wmem_max=1048576"
"net.ipv4.ip_local_port_range=9000 65500"
"net.ipv4.tcp_fin_timeout=60"
"net.ipv4.tcp_synack_retries=5"
"vm.overcommit_memory=0"
"vm.swappiness=1"
)
# 先备份sysctl.conf
cp "${SYSCTL_CONF}" "${SYSCTL_CONF}.bak-$(date +%F_%H%M%S)"
for param in "${SYSCTL_PARAMS[@]}"; do
key=$(echo "${param}" | awk '{print $1}' | cut -d'=' -f1)
value=$(echo "${param}" | cut -d'=' -f2-)
if grep -q "^${key}=" "${SYSCTL_CONF}"; then
current_value=$(sysctl -n "${key}")
# 处理有空格的参数值
if [ "$(echo ${current_value} | tr -d ' ')" != "$(echo ${value} | tr -d ' ')" ]; then
info "更新sysctl参数 ${key} 为 ${value}"
sed -i "s/^${key}=.*/${key}=${value}/g" "${SYSCTL_CONF}"
else
info "sysctl参数 ${key} 已正确配置"
fi
else
info "添加sysctl参数 ${key}=${value}"
echo "${key}=${value}" >> "${SYSCTL_CONF}"
fi
done
# 应用sysctl配置
if sysctl -p >/dev/null 2>&1; then
success "sysctl参数配置完成并生效。"
else
error "sysctl参数应用失败,请检查配置。"
fi
# 配置limits.conf
info "配置limits.conf..."
LIMITS_CONF="/etc/security/limits.conf"
LIMITS_ENTRIES=(
"${USER} soft nofile 65536"
"${USER} hard nofile 65536"
"${USER} soft nproc 131072"
"${USER} hard nproc 131072"
)
# 备份limits.conf
cp "${LIMITS_CONF}" "${LIMITS_CONF}.bak-$(date +%F_%H%M%S)"
for entry in "${LIMITS_ENTRIES[@]}"; do
user=$(echo "${entry}" | awk '{print $1}')
type=$(echo "${entry}" | awk '{print $2}')
item=$(echo "${entry}" | awk '{print $3}')
if grep -q "^${user} ${type} ${item}" "${LIMITS_CONF}"; then
info "limits.conf中已存在 ${user} ${type} ${item} 的配置"
else
info "添加 ${entry} 到limits.conf"
echo "${entry}" >> "${LIMITS_CONF}"
fi
done
success "limits.conf配置完成。"
# 检查并创建安装目录
info "检查并创建安装目录 ${INSTALL_DIR}..."
if [ -d "${INSTALL_DIR}" ]; then
if [ "$(ls -A ${INSTALL_DIR})" ]; then
error "安装目录 ${INSTALL_DIR} 已存在且不为空,可能导致冲突。"
else
info "安装目录 ${INSTALL_DIR} 已存在且为空,将使用该目录。"
fi
else
# 创建目录时同时设置父目录权限
mkdir -p -m 755 "$(dirname "${INSTALL_DIR}")"
mkdir -p -m 755 "${INSTALL_DIR}"
if [ $? -eq 0 ]; then
success "安装目录 ${INSTALL_DIR} 创建成功。"
else
error "安装目录 ${INSTALL_DIR} 创建失败。"
fi
fi
# 检查并创建数据目录
info "检查并创建数据目录 ${DATA_DIR}..."
if [ -d "${DATA_DIR}" ]; then
if [ "$(ls -A ${DATA_DIR})" ]; then
error "数据目录 ${DATA_DIR} 已存在且不为空,可能导致冲突。"
else
info "数据目录 ${DATA_DIR} 已存在且为空,将使用该目录。"
fi
else
# 创建目录时同时设置父目录权限
mkdir -p -m 755 "$(dirname "${DATA_DIR}")"
mkdir -p -m 755 "${DATA_DIR}"
if [ $? -eq 0 ]; then
success "数据目录 ${DATA_DIR} 创建成功。"
else
error "数据目录 ${DATA_DIR} 创建失败。"
fi
fi
# 设置目录权限 - 确保omm用户拥有完全权限
info "设置目录权限,确保${USER}用户拥有完全访问权限..."
# 先设置父目录权限,确保可以访问
chown -R ${USER}:${GROUP} "$(dirname "${INSTALL_DIR}")"
chown -R ${USER}:${GROUP} "$(dirname "${DATA_DIR}")"
chmod -R 755 "$(dirname "${INSTALL_DIR}")"
chmod -R 755 "$(dirname "${DATA_DIR}")"
# 设置实际目录的完全权限
chown -R ${USER}:${GROUP} "${INSTALL_DIR}"
chown -R ${USER}:${GROUP} "${DATA_DIR}"
chmod -R 700 "${INSTALL_DIR}" # 更严格的权限,仅所有者可访问
chmod -R 700 "${DATA_DIR}" # 更严格的权限,仅所有者可访问
# 验证权限设置
info "验证目录权限设置..."
if [ "$(stat -c %U "${INSTALL_DIR}")" != "${USER}" ] || [ "$(stat -c %G "${INSTALL_DIR}")" != "${GROUP}" ]; then
error "安装目录 ${INSTALL_DIR} 所有者或组设置不正确"
fi
if [ "$(stat -c %U "${DATA_DIR}")" != "${USER}" ] || [ "$(stat -c %G "${DATA_DIR}")" != "${GROUP}" ]; then
error "数据目录 ${DATA_DIR} 所有者或组设置不正确"
fi
success "目录权限设置完成,${USER}用户拥有完全访问权限"
# 解压安装包
info "解压安装包到 ${INSTALL_DIR}..."
if tar -jxf "${INSTALL_PACKAGE}" -C "${INSTALL_DIR}"; then
# 解压后再次确认权限
chown -R ${USER}:${GROUP} "${INSTALL_DIR}"
chmod -R 700 "${INSTALL_DIR}"
success "安装包解压成功,并重新确认权限。"
else
error "安装包解压失败。"
fi
# 修改安装脚本中的数据目录
info "修改安装脚本中的数据目录为 ${DATA_DIR}..."
INSTALL_SCRIPT="${INSTALL_DIR}/simpleInstall/install.sh"
if [ -f "${INSTALL_SCRIPT}" ]; then
# 备份原始安装脚本
cp "${INSTALL_SCRIPT}" "${INSTALL_SCRIPT}.bak-$(date +%F_%H%M%S)"
# 替换默认数据目录$app/data/single_node为自定义目录
sed -i "s|\$app/data/single_node|${DATA_DIR}|g" "${INSTALL_SCRIPT}"
sed -i "s|^dataDir=.*|dataDir=${DATA_DIR}|g" "${INSTALL_SCRIPT}"
sed -i "s|^GAUSSHOME=.*|GAUSSHOME=${INSTALL_DIR}/gaussdb|g" "${INSTALL_SCRIPT}"
# 确保安装脚本有执行权限
chmod +x "${INSTALL_SCRIPT}"
chown ${USER}:${GROUP} "${INSTALL_SCRIPT}"
# 验证替换结果
if grep -q "${DATA_DIR}" "${INSTALL_SCRIPT}"; then
success "安装脚本数据目录替换完成"
else
error "数据目录替换失败,请手动检查安装脚本"
fi
else
error "未找到安装脚本 ${INSTALL_SCRIPT}"
fi
# 切换到omm用户执行安装,并自动输入yes创建演示数据库
info "切换到 ${USER} 用户执行安装,将自动创建演示数据库..."
# 使用echo "yes" | 自动应答创建演示数据库的提示
install_cmd="cd ${INSTALL_DIR}/simpleInstall && echo 'yes' | sh install.sh -w '${PASSWORD}' -p ${PORT}"
# 执行安装并捕获输出日志
if su - ${USER} -c "${install_cmd}"; then
success "安装命令执行完成"
else
error "安装命令执行失败,详细日志请查看 ${INSTALL_DIR}/simpleInstall/install.log"
fi
# 检查安装是否成功
info "检查安装是否成功..."
if [ -f "${DATA_DIR}/postmaster.pid" ]; then
success "openGauss 6.0.2 安装成功!"
info "数据库安装目录: ${INSTALL_DIR}"
info "数据存储目录: ${DATA_DIR}"
info "数据库用户: ${USER}"
info "数据库密码: ${PASSWORD}"
info "数据库端口: ${PORT}"
info "登录命令: su - ${USER} && gsql -d postgres -p ${PORT} -r"
else
error "安装失败,详细原因请查看日志:${INSTALL_DIR}/simpleInstall/install.log"
fi
info "部署流程结束"
华为鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)