本部分旨在为技术人员提供崖山数据库企业版 23.2 在 CentOS 7 x86_64 操作系统上进行安装部署操作的全面且清晰的指引。通过对系统架构、集群拓扑和部署需求的精确阐述,使读者能够在安装过程开始前形成系统的概念架构,为后续的详细安装、配置和调试步骤奠定坚实基础,确保崖山数据库能够在目标环境中实现高效、稳定和安全的运行,符合企业级生产环境的要求。
崖山数据库企业版 23.2 采用了多层模块化架构设计,这种设计确保了系统在处理复杂业务场景时能够具备高性能、高可靠性和卓越的可扩展性。
在一主二备集群架构下,主节点是整个集群的核心写入点,承担着所有的写入操作以及部分高优先级的读取操作。主节点内部采用了日志先行(Write - Ahead Logging,WAL)机制,即所有的数据修改操作在应用到数据文件之前,先记录到预写日志中。这种机制确保了在系统故障时能够通过回放日志来恢复数据的完整性。
两个备节点与主节点之间的数据同步存在两种机制:
备节点通过基于日志的异步复制机制与主节点保持数据同步。备节点会周期性地从主节点获取最新的预写日志,并按照日志顺序在本地重放操作,以确保数据的一致性。在主节点出现故障时,集群监控系统将根据预定义的策略,自动从两个备节点中选举出一个合适的节点切换为主节点,整个切换过程对上层应用透明,最大限度地保障了业务的连续性。
除了异步复制机制外,崖山主备架构还支持同步复制机制。在同步复制模式下,当主节点执行写入操作时,会等待备节点确认已经成功接收并写入对应的日志数据后,才认为本次写入操作成功。这种机制确保了在任何时刻主节点和备节点的数据都处于完全一致的状态,提高了数据的可靠性和可用性,但可能会在一定程度上影响系统的写入性能。通过这种方式,在对数据一致性要求极高的场景下,可以确保数据不会因为系统故障而丢失或出现不一致的情况。
通过异步复制和同步复制这两种机制,崖山主备架构能够灵活地适应不同业务场景下对数据一致性和系统性能的需求,保障了整个集群的稳定运行和数据安全。
崖山数据库一主二备集群的网络拓扑结构经过精心规划,以确保在高负载和高并发场景下的数据传输可靠性和高效性。
主节点和两个备节点通过高速冗余网络连接,推荐采用千兆以太网(Gigabit Ethernet)或更高速率的网络技术,如万兆以太网(10 - Gigabit Ethernet)。为确保网络的高可用性,建议采用双网络链路冗余设计,即每个节点配置双网卡,并通过链路聚合技术(如 802.3ad 链路聚合协议)将两个物理链路绑定为一个逻辑链路,实现网络流量的负载均衡和故障切换。
网络中的交换机应选用企业级高性能设备,具备足够的端口密度、背板带宽和包转发能力,以满足数据库集群在高并发数据传输时的需求。同时,为保障网络安全,应在网络边界部署防火墙和入侵检测 / 预防系统(IDS/IPS),通过配置严格的访问控制策略和入侵防范策略,防止外部网络攻击对数据库集群造成威胁。
在集群正常运行状态下,数据流向遵循从主节点到备节点的单向路径。当主节点有新的数据写入操作时,数据变更首先被记录到主节点的二进制日志(Binary Log)中。二进制日志采用了高效的日志格式,记录了数据修改操作的详细信息,包括操作类型、操作数据和操作顺序等。
备节点通过专用的复制线程定期轮询主节点的二进制日志。一旦发现有新的日志记录,备节点将使用基于网络的 I/O 操作将这些日志拉取到本地的中继日志(Relay Log)中。中继日志作为备节点数据同步的临时存储,确保在复制过程中数据的顺序和完整性。备节点随后按照中继日志中的顺序,依次执行日志中的数据修改操作,将数据变更应用到本地数据库中,从而实现与主节点的数据同步。这种基于日志的异步复制机制在保障数据一致性的同时,能够有效减少主节点的复制负担,提高系统的整体性能。
整个安装部署过程的时间消耗受多种因素影响,包括但不限于硬件性能、网络环境和操作人员的熟练程度。
综合考虑,从开始准备操作系统到完成数据库集群的初步测试和基本配置,预计总共需要 9 - 14 小时。在实际操作过程中,建议预留足够的时间进行全面的测试、优化和问题排查,确保数据库集群能够在生产环境中稳定、可靠地运行。
集群环境各服务器应具有相同体系架构
集群环境各服务器应满足以下最低硬件需求,生产环境应根据业务需求适时调整硬件配置。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
超线程,非超线程 推荐4C及以上 |
|
|
|
数据盘建议配置RAID5(规划4组RAID5数据盘安装 推荐使用SSD 推荐存储空间50G及以上 |
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
为保障 YashanDB 顺利安装与稳定运行,请依下述来源及最低版本要求,于所有服务器环境中配置必备依赖项。
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
注:部署生产分布式集群时建议关闭生成 core 文件开关
-- 开发测试环境为方便定位问题可打开生成 core 文件开关
-- 查看当前是否开启系统 core 文件开关
# ulimit -c [0 表示禁用核心转储]
-- 开启核心转储文件生成
# ulimit -c unlimited [ core 文件大小无限制,ulimit -c 100000 表示限制大小为 100000kb ]
# vi /etc/security/limits.conf
## 添加以下信息并保存:
- soft core unlimited
- hard core unlimited
注:为避免内存交换影响性能,建议关闭交换分区
-- 查看当前系统交换分区状态
# sysctl -a | grep swappiness
-- 关闭系统交换分区
# sysctl -w vm.swappiness=0
# echo "vm.swappiness=0">> /etc/sysctl.conf
注:为减少端口冲突,建议调整本地端口范围
-- 查看当前系统本地端口范围
# cat /proc/sys/net/ipv4/ip_local_port_range
-- 调整本地端口范围,建议大于 30000
# sysctl -w net.ipv4.ip_local_port_range='32768 60999'
# echo "net.ipv4.ip_local_port_range=32768 60999" >> /etc/sysctl.conf
注:生产环境建议调整虚拟内存地址上线
-- [VMA(Virtual Memory Address)虚拟内存地址 ]
-- 查看当前 VMA 上限
# sysctl -a|grep vm.max_map_count
-- 调整系统 VMA 上限,建议生产环境不低于 2000000
# sysctl -w vm.max_map_count=2000000
# echo "vm.max_map_count=2000000" >> /etc/sysctl.conf
注:调整部分资源限制,生产环境应不低于推荐值
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注:可通过如下命令写入
-- 使用 root 用户执行
sudo bash -c 'cat <<EOF >> /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
* soft rss unlimited
* hard rss unlimited
* soft stack 8192
* hard stack 8192
EOF'
注:生产环境建议 启用大页内存、关闭透明大页
-- 查看当前大页内存配置
# grep -i huge /proc/meminfo
-- 查看当前透明大页配置
# cat /sys/kernel/mm/transparent_hugepage/enabled [若显示 always madvise [never],表明透明大页已禁用]
-- BIOS 系统可通过如下脚本 启用大页内存和关闭透明大页
cat << 'EOF' > configure-hugepages-thp.sh
#!/bin/bash
# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "此脚本必须以root权限运行" 1>&2
exit 1
fi
# 配置大页数量
REQUIRED_HUGEPAGES=<required_hugepages> # 替换为实际计算值
echo "配置 $REQUIRED_HUGEPAGES 大页内存..."
echo "vm.nr_hugepages=$REQUIRED_HUGEPAGES" | tee -a /etc/sysctl.conf
sysctl -p
# 禁用透明大页
echo "正在修改GRUB配置以禁用透明大页..."
GRUB_CMDLINE="transparent_hugepage=never"
if grep -q '^GRUB_CMDLINE_LINUX' /etc/default/grub; then
sed -i "s/^\(GRUB_CMDLINE_LINUX=\".*\)\"/\1 $GRUB_CMDLINE\"/" /etc/default/grub
else
echo "GRUB_CMDLINE_LINUX=\"$GRUB_CMDLINE\"" | tee -a /etc/default/grub
fi
# 更新GRUB配置
echo "更新GRUB配置..."
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重启系统
echo "准备重启系统以应用更改..."
read -p "是否现在重启系统?(y/n): " answer
if [[ $answer =~ ^[Yy]$ ]]
then
reboot
else
echo "更改将在下次重启后生效。"
fi
EOF
--设置权限
# chmod +x configure-hugepages-thp.sh
-- 执行脚本
# sh configure-hugepages-thp.sh
-- 根据提示重启操作系统,输入 y
注:为优化YashanDB性能,建议配置适量大页内存以减少页表开销并提高内存效率。以下是配置示例。
计算总内存需求
1)基本内存配置 :
总计基本内存需求(UserSize): 164 MB
2)额外内存需求 :
计算大页所需空间
配置大页
注意:建议关闭所有数据库服务器 SELinux
-- 临时关闭 SELinux
# setenforce 0
-- 永 久关闭SELinux
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
-- 检查 SELinux 状态
# getenforce
-- 状态为Disabled表明SELinux已关闭
注意:建议关闭所有数据库服务器防火墙
-- 停止 firewalld 服务
# systemctl stop firewalld.service
-- 禁用 firewalld 服务
# systemctl disable firewalld.service
-- 查看 firewalld 服务状态 [ Active: inactive (dead) 表示已关闭防火墙 ]
# systemctl status firewalld
-- 若防火墙不能关闭,可通过添加白名单方式将相关端口添加到白名单中
-- 以下演示将 1688 端口添加至防火墙白名单
-- 添加(--permanent表示永 久生效,没有此参数重启后失效)
# firewall-cmd --zone=public --add-port=1688/tcp --permanent
-- 重新载入
# firewall-cmd --reload
-- 查看规则生效情况
# firewall-cmd --zone=public --query-port=1688/tcp
-- 禁用 SSH 登录时的横幅(Banner)
# sed -i '/Banner/s/^/#/' /etc/ssh/sshd_config
-- 目的是禁用允许以 root 用户登录的配置选项
# sed -i '/PermitRootLogin/s/^/#/' /etc/ssh/sshd_config
# echo -e "\n" >> /etc/ssh/sshd_config
# echo "Banner none " >> /etc/ssh/sshd_config
# 修改Banner配置,去掉连接到系统时,系统提示的欢迎信息。欢迎信息会干扰安装时远程操作的返回结果,影响安装正常执行
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
# cat /etc/ssh/sshd_config |grep -v ^#|grep -E 'PermitRootLogin|Banner'
-- 重启 SSH 服务生效
# systemctl restart sshd.service
-- 查看 SSH 服务状态
# systemctl status sshd.service
注:建议安装配置 chrony 设置时钟同步
-- 可使用如下脚本安装配置 chrony 服务
cat << 'EOF' > setup_chrony.sh
#!/bin/bash
# 检查是否具有 root 权限
if [ "$EUID" -ne 0 ]; then
echo "请以 root 用户或使用 sudo 执行此脚本。"
exit 1
fi
# 安装 chrony
echo "安装 chrony..."
yum install -y chrony
# 配置 chrony(修改 /etc/chrony.conf)
echo "配置 chrony..."
cat > /etc/chrony.conf <<EOL
# 默认公共 NTP 服务器
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 允许本地网络同步
allow 192.168.0.0/16
# 日志记录
logdir /var/log/chrony
EOL
# 启动并启用 chrony 服务
echo "启动并设置 chrony 服务开机自启..."
systemctl start chronyd
systemctl enable chronyd
# 检查服务状态
echo "检查 chrony 服务状态..."
systemctl status chronyd
# 验证同步状态
echo "验证时钟同步状态..."
chronyc tracking
# 设置硬件时钟同步
echo "同步硬件时钟..."
hwclock --systohc
# 输出完成信息
echo "Chrony 安装与配置完成。"
EOF
--设置权限
# chmod +x setup_chrony.sh
-- 执行脚本
# sh setup_chrony.sh
注:硬件时钟(RTC,Real-Time Clock)在集群环境中是时间管理的关键,其准确性直接影响多节点间的协作效率、数据一致性和系统稳定性。建议生产环境配置硬件时钟同步。
-- 确认硬件时钟当前状态
# hwclock --show
-- 确保系统时钟与硬件时钟同步
# hwclock --systohc
-- 选择硬件时钟的时间基准
-- 设置为 UTC 时间(推荐,尤其是服务器和集群环境)
# timedatectl set-local-rtc 0
-- 验证时钟同步
# timedatectl
-- 配置自动同步硬件时钟 [示例]
0 * * * * /sbin/hwclock --systohc
注:为避免操作系统因字符集异常,建议前期设置为所需字符集
-- 此处已修改字符集为 en_US.UTF-8 为例
-- 设置字符集到 /etc/profile
# echo "export.UTF-8" >> /etc/profile
-- 重新加载配置文件
# source /etc/profile
-- 检查字符集
# env | grep -i lang
-- 安装 tar、gz、openssl 依赖包
-- 通过如下脚本安装以上依赖包
cat << 'EOF' > install_openssl.sh
#!/bin/bash
# 检查是否具有 root 权限
if [ "$EUID" -ne 0 ]; then
echo "请以 root 用户或使用 sudo 执行此脚本。"
exit 1
fi
# 定义变量
OPENSSL_VERSION="1.1.1w"
OPENSSL_TAR="openssl-${OPENSSL_VERSION}.tar.gz"
OPENSSL_SHA256="openssl-${OPENSSL_VERSION}.tar.gz.sha256"
INSTALL_DIR="/usr/local/openssl"
SOURCE_DIR="/root/soft"
# 安装解压工具
echo "检查并安装必要的解压工具..."
yum install -y tar gzip
# 安装开发工具(如 gcc)
echo "检查并安装开发工具..."
yum groupinstall -y "Development Tools"
yum install -y gcc
# 检查安装包和校验文件是否存在
if [ ! -f "${SOURCE_DIR}/${OPENSSL_TAR}" ]; then
echo "未找到 ${SOURCE_DIR}/${OPENSSL_TAR},请确认文件路径正确。"
exit 1
fi
if [ ! -f "${SOURCE_DIR}/${OPENSSL_SHA256}" ]; then
echo "未找到 ${SOURCE_DIR}/${OPENSSL_SHA256},请确认文件路径正确。"
exit 1
fi
# 进入文件目录
cd "${SOURCE_DIR}" || exit
# 校验文件格式修复
if ! grep -q "${OPENSSL_TAR}" "${OPENSSL_SHA256}"; then
echo "修复校验文件格式..."
SHA256_VALUE=$(cat "${OPENSSL_SHA256}" | awk '{print $1}')
echo "${SHA256_VALUE} ${OPENSSL_TAR}" > "${OPENSSL_SHA256}"
fi
# 校验文件完整性
echo "校验文件完整性..."
sha256sum -c "${OPENSSL_SHA256}"
if [ $? -ne 0 ]; then
echo "校验失败,请检查安装包是否损坏或下载是否完整。"
exit 1
fi
# 解压安装包
echo "解压安装包..."
tar xzf "${OPENSSL_TAR}"
# 进入解压后的目录
cd "openssl-${OPENSSL_VERSION}" || exit
# 编译安装 OpenSSL
echo "开始编译和安装 OpenSSL..."
./config --prefix="${INSTALL_DIR}"
make -j$(nproc) && make install
if [ $? -ne 0 ]; then
echo "OpenSSL 编译或安装失败,请检查日志。"
exit 1
fi
# 配置系统路径
echo "配置系统路径..."
ln -sf "${INSTALL_DIR}/bin/openssl" /usr/bin/openssl
ln -sf "${INSTALL_DIR}/include/openssl" /usr/include/openssl
echo "${INSTALL_DIR}/lib" >> /etc/ld.so.conf
ldconfig -v
# 验证安装
echo "验证 OpenSSL 版本..."
openssl version -a
# 清理临时文件
cd ..
rm -rf "openssl-${OPENSSL_VERSION}"
echo "OpenSSL ${OPENSSL_VERSION} 安装和配置完成!"
EOF
--设置权限
# chmod +x install_openssl.sh
-- 执行脚本
# sh install_openssl.sh
-- 每个节点数据库服务器都要创建相同目录
# mkdir -p /data/yashan
# chmod -R 777 /data/yashan
-- 通过如下脚本方式创建 yashan 用户并设置 sudo 免密
cat << 'EOF' > setup_user.sh
#!/bin/bash
# 检查是否具有 root 权限
if [ "$EUID" -ne 0 ]; then
echo "请以 root 用户或使用 sudo 执行此脚本。"
exit 1
fi
# 定义变量
USERNAME="yashan"
HOMEDIR="/home/${USERNAME}"
USERGROUP="YASDBA"
PASSWORD="yashan!1234" # 定义密码变量
# 创建用户及设置密码
echo "创建用户 ${USERNAME}..."
if ! id -u "${USERNAME}" >/dev/null 2>&1; then
useradd -m -d "${HOMEDIR}" -s /bin/bash "${USERNAME}"
echo "${USERNAME}:${PASSWORD}" | chpasswd
echo "用户 ${USERNAME} 已创建,密码设置为 '${PASSWORD}'。"
else
echo "用户 ${USERNAME} 已存在,跳过创建步骤。"
fi
# 配置 sudo 免密权限
echo "配置 sudo 免密权限..."
if ! grep -q "^${USERNAME} ALL=(ALL) NOPASSWD: ALL" /etc/sudoers; then
echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "已为用户 ${USERNAME} 配置 sudo 免密权限。"
else
echo "用户 ${USERNAME} 已配置 sudo 免密权限,跳过。"
fi
# 确保 /etc/sudoers 文件属性恢复为只读
echo "恢复 /etc/sudoers 文件为只读属性..."
chmod 440 /etc/sudoers
# 创建用户组并将用户加入组
echo "创建用户组 ${USERGROUP} 并将用户加入组..."
if ! grep -q "^${USERGROUP}:" /etc/group; then
groupadd "${USERGROUP}"
echo "用户组 ${USERGROUP} 已创建。"
else
echo "用户组 ${USERGROUP} 已存在,跳过创建。"
fi
usermod -aG "${USERGROUP}" "${USERNAME}"
echo "用户 ${USERNAME} 已加入用户组 ${USERGROUP}。"
echo "所有操作已完成。"
EOF
--设置权限
# chmod +x setup_user.sh
-- 执行脚本
# sh setup_user.sh
方式一:
登录崖山数据库官网 https://download.yashandb.com/download 下载页面,下载 YashanDB 企业版,截止到 2024年12月-11日,当前官网可供下载的最新企业版为 YashanDB 23.2.4 版本,并选择对应的 Linux X86 数据库版本进行下载,然后将下载的数据库软件上传到数据库服务器指定目录下。
方式二:
如果服务器可以连接外网,可以在数据库服务器上通过如下方式进行下载。
-- 下载数据库软件
$ cd /home/yashan/install
$ wget https://linked.yashandb.com/upload1010/yashandb-23.2.4.100-linux-x86_64.tar.gz
$ cd /home/yashan/install
$ tar zxf yashandb-23.2.4.100-linux-x86_64.tar.gz
注:执行yasboot package命令生成 toml 配置文件
-- 使用 yashan 用户在其中节点执行
# su - yashan
$ cd install
$ ./bin/yasboot package de gen --cluster yashandb --recommend-param \
-u yashan -p 'yashan!1234' --ip 10.xxx.xxx.131,10.xxx.xxx.132,10.xxx.xxx.133 --port 22 \
--install-path /data/yashan/yasdb_home --data-path /data/yashan/yasdb_data \
--begin-port 1688 --mn 3 --cn 2 --dn 1-3
-- 参数说明
-- cluster 指定数据库集群名称,该名称也将作为初始数据库名称
-- port 指定SSH服务端口
-- install-path 指定数据库安装路径
-- data-path 指定数据存放目录
-- begin-port 指定第一个CN节点上数据库监听端口
-- mn/cn/dn 分别指定MN节点/CN节点/DN组-节点数量
-- 上述命令执行后会在 install 目录下生成 yashandb.toml 和 hosts.toml 两个配置文件
-- yashandb.toml:数据库集群配置文件。
-- hosts.toml:服务器配置文件
-- toml 配置文件如附件
场景一:直接安装
-- 使用 yashan 用户在生成 toml 配置文件的服务器上进行安装
$ cd install
$ ./bin/yasboot package install -t hosts.toml -i yashandb-23.2.1.100-linux-x86_64.tar.gz
场景二:扩展插件安装
注:如需使用DBLINK功能和更丰富的内置函数,可借助 plugin 插件包进行安装,若前期采用了直接安装,安装后,无法再单独安装插件包
-- 本次采用了扩展插件安装
-- 首先登录官网下载并上传 yashandb-plugins-all-23.2.4.100-linux-x86_64.tar.gz 插件到 /home/yashan/install 目录
-- 执行安装命令
$ cd install
$ ./bin/yasboot package install -t hosts.toml -i yashandb-23.2.4.100-linux-x86_64.tar.gz --plugin yashandb-plugins-all-23.2.4.100-linux-x86_64.tar.gz
-- 使用 yashan 用户执行
-- 使用参数 “-d” 或 “--child”,可展示任务及其子任务信息,便于查看部署进度。
$ cd install
$ ./bin/yasboot cluster deploy -t yashandb.toml -d
-- 执行结果出现 task completed, status: SUCCESS 提示安装部署成功
-- 执行过程可查看 /data/yashan/yasdb_home/yashandb/23.2.4.100/om/yashandb/log 目录下 yasom.log 和 yasagent.log 查看安装过程日志
注:为确保 YashanDB 相关命令正常执行,需将生成的环境变量配置文件加入当前用户环境,请参照如下步骤配置环境变量。
登录到每台服务器执行如下相同操作
1)定位环境变量文件
-- 部署完成后,环境变量文件存于 $YASDB_HOME/conf 目录,示例路径:
-- yashan 用户操作
$ cd /data/yashan/yasdb_home/yashandb/23.2.4.100/conf
2)更新用户环境变量
-- 将文件内容追加至 ~/.bashrc:
-- yashan 用户操作
$ cat yashandb.bashrc >> ~/.bashrc
3)立即生效
-- 执行以下命令生效:
$ source ~/.bashrc
以上操作可通过如下脚本实现:
#!/bin/bash
# 定义变量
CONF_DIR="/data/yashan/yasdb_home/yashandb/23.2.4.100/conf"
ENV_FILE="yashandb.bashrc"
BASHRC="$HOME/.bashrc"
TEST_VAR="YASDB_HOME" # 用于验证的环境变量名
YASHAN_CMD="yasboot --help" # 用于验证的 YashanDB 命令
BIN_DIR="bin" # 假设 yasboot 在 $YASDB_HOME/bin 下
# 检查环境变量文件是否存在
if [[ ! -f "$CONF_DIR/$ENV_FILE" ]]; then
echo "环境变量文件不存在:$CONF_DIR/$ENV_FILE"
exit 1
fi
# 备份原有的 .bashrc 文件
echo "备份当前 .bashrc 文件为 .bashrc.bak"
cp "$BASHRC" "$BASHRC.bak"
# 删除已有的 YashanDB 环境变量
echo "清除旧的 YashanDB 环境变量配置"
sed -i '/# YashanDB 环境变量配置开始/,/# YashanDB 环境变量配置结束/d' "$BASHRC"
# 添加新环境变量配置
echo "添加新的 YashanDB 环境变量配置"
echo -e "\n# YashanDB 环境变量配置开始" >> "$BASHRC"
cat "$CONF_DIR/$ENV_FILE" >> "$BASHRC"
echo "export PATH=\$YASDB_HOME/$BIN_DIR:\$PATH" >> "$BASHRC" # 添加 bin 目录到 PATH
echo "# YashanDB 环境变量配置结束" >> "$BASHRC"
# 使环境变量立即生效
echo "使环境变量立即生效"
source "$BASHRC"
export PATH=$YASDB_HOME/$BIN_DIR:$PATH # 确保当前会话生效
# 检查环境变量是否配置成功
if [[ -z "${!TEST_VAR}" ]]; then
echo "环境变量未生效,请检查配置!"
exit 1
else
echo "环境变量已成功配置,$TEST_VAR=${!TEST_VAR}"
fi
# 测试 YashanDB 命令
echo "执行 YashanDB 测试命令:$YASHAN_CMD"
if command -v yasboot >/dev/null 2>&1; then
if $YASHAN_CMD >/dev/null 2>&1; then
echo "YashanDB 命令执行成功,环境变量已正确配置!"
else
echo "YashanDB 命令执行失败,请检查数据库状态!"
exit 1
fi
else
echo "yasboot 未找到,请检查 PATH 配置或 yasboot 是否存在!"
exit 1
fi
echo "所有配置完成!"
source $HOME/.bashrc
--设置权限
# chmod +x setup_env.sh
-- 执行脚本
# sh setup_env.sh
注:YashanDB 无初始系统口令,可通过安装用户使用 yasboot 工具设置 sys 用户密码。
-- 使用如下命令初始 sys 密码
-- yasboot cluster password set -n newpasswd -c yashandb
-- 注意:如果密码有特殊字符要加 '' 符号
$ yasboot cluster password set -n 'yashan!a1357' -c yashandb
-- 通过 yasboot 命令查看集群和数据库状态
$ yasboot cluster status -c yashandb -d
注:
表格列解析
hostid
每个节点的主机名或标识符。
node_type
节点类型,通常包括:
nodeid
节点唯一标识符,格式 x-y-z,表示集群逻辑分区。
pid
每个节点对应进程 ID,用于标识该节点进程。
instance_status
节点实例运行状态为 open,表示节点正常运行。
database_status
数据库状态,通常包括:
database_role
数据库角色,包括:
listen_address
节点的监听地址,用于通信和连接。
data_path
节点数据存储路径指向该节点在磁盘上的数据目录。
注:使用 yasql 工具连接数据库,查看实例状态。
-- 如密码包含特殊字符,请对特殊字符进行转义处理。
-- 使用如下命令登录数据库
-- yasql sys/sys_password@cn_hostname:port
$ yasql sys/'yashan!a1357'@10.xxx.xxx.132:1688
注:通过命令行安装的 YashanDB 默认不支持 monit 守护进程功能,需安装配置。
-- 使用 yashan 用户
$ cd /home/yashan/install
-- 执行如下命令检查 monit 状态
yasboot monit status --cluster cluster_name
$ ./bin/yasboot monit status --cluster yashandb
-- 以下表示未启动 monit
-- 使用 yashan 用户
$ cd /home/yashan/install
$ ./bin/yasboot monit start --cluster yashandb
-- 使用 yashan 用户
$ cd /home/yashan/install
$ ./bin/yasboot monit status --cluster yashandb
注:可通过如下脚本实现
#!/bin/bash
# 检查 monit 是否已安装
MONIT_PATH=$(which monit)
if [ -z "$MONIT_PATH" ]; then
echo "[ERROR] monit 未安装,请先安装 monit。"
exit 1
fi
echo "[INFO] monit 安装路径为: $MONIT_PATH"
# 检查 monit 是否运行
if ! pgrep -x "monit" > /dev/null; then
echo "[INFO] monit 服务未运行,正在启动..."
$MONIT_PATH
if [ $? -ne 0 ]; then
echo "[ERROR] monit 服务启动失败,请检查配置。"
exit 1
fi
else
echo "[INFO] monit 服务已运行。"
fi
# 启动守护进程
cd /home/yashan/install || exit 1
./bin/yasboot monit start --cluster yashandb
if [ $? -ne 0 ]; then
echo "[ERROR] 无法启动守护进程,请检查配置。"
exit 1
fi
echo "[INFO] 守护进程已成功启动。"
# 打印服务信息
./bin/yasboot monit status --cluster yashandb
if [ $? -ne 0 ]; then
echo "[ERROR] 无法获取守护进程状态,请检查配置。"
exit 1
fi
echo "[INFO] 服务信息已打印。"
# 配置开机启动
RC_LOCAL="/etc/rc.local"
START_COMMAND="su yashan -c '$MONIT_PATH -c /data/yashan/yasdb_home/yashandb/23.2.4.100/ext/monit/monitrc'"
if [ -f "$RC_LOCAL" ]; then
sudo chmod +x "$RC_LOCAL"
grep -q "$START_COMMAND" "$RC_LOCAL" || echo "$START_COMMAND" | sudo tee -a "$RC_LOCAL" > /dev/null
echo "[INFO] 开机启动配置完成。"
else
echo "[ERROR] $RC_LOCAL 文件不存在,请检查系统。"
exit 1
fi
exit 0
--设置权限
# chmod +x setup_yashandb_autostart.sh
-- 执行脚本
# sh setup_yashandb_autostart.sh
注:自动选主功能由参数 HA_ELECTION_ENABLED 控制,默认值为 false,即默认关闭自动选主功能。若需启用,可将该参数设置为 true。
在分布式集群部署中,自动选主功能默认启用。
HA_ELECTION_ENABLED 参数支持在线调整,可通过以下命令在主备节点上查看或修改:
--查看参数HA_ELECTION_ENABLED值
SQL> SHOW PARAMETER HA_ELECTION_ENABLED;
--修改参数HA_ELECTION_ENABLED值
SQL> ALTER SYSTEM SET HA_ELECTION_ENABLED=TRUE;
注:
自动选主功能依赖以下两个时间参数:
当备节点在超过 HA_ELECTION_TIMEOUT 时间未收到心跳信号时,会自动发起选举。
在配置文件中,需在对应节点的 group.node.config 配置域下新增参数 ha_election_timeout 和 ha_heartbeat_interval,并设置为规划值。
注意事项:
默认值
:
如果未指定上述参数,系统将按默认值配置:
参数调整 :
组内一致性
参数修改方法 :
-- 查看心跳超时时间
SQL> SHOW PARAMETER HA_ELECTION_TIMEOUT
-- 查看心跳发送周期
SQL> SHOW PARAMETER HA_HEARTBEAT_INTERVAL
-- 修改心跳超时时间
SQL> ALTER SYSTEM SET HA_ELECTION_TIMEOUT=10;
-- 使用yasboot工具批量修改心跳超时时间
$ yasboot group config set --key HA_ELECTION_TIMEOUT --value 10 --cluster yashandb --group-id 1
注:
自动降备由 HA_ELECTION_LEADER_LEASE_ENABLED 参数控制,仅对主节点有效,用户可改,默认 FALSE 即关闭。
当设为 TRUE 时,在以下情况主节点心跳超 HA_ELECTION_TIMEOUT 后自动降备:
其中N为所有节点(包含主节点)数量,syncNum为用户定义的同步备数量。
--查看是否开启主节点自动降备功能
SHOW PARAMETER HA_ELECTION_LEADER_LEASE_ENABLED;
--开启主节点自动降备功能
ALTER SYSTEM SET HA_ELECTION_LEADER_LEASE_ENABLED=TRUE;
注:
节点优先级通过 HA_ELECTION_PRIORITY 参数设定数值,数值越大则优先级越高。在自动选主开启时,较高优先级的节点,只要能保障数据安全,就更有机会成为主节点;而当此参数值为 0 时,该节点不会参与自动选主的选举过程。
此参数支持在线修改,默认值是 1,用户可依据自身业务系统的实际状况灵活设置该参数值,以满足不同的业务需求和架构规划。
--查看主备节点优先级值
SHOW PARAMETER HA_ELECTION_PRIORITY;
--修改主备节点优先级值
ALTER SYSTEM SET HA_ELECTION_PRIORITY=2;
注:
自动换主功能由 HA_ELECTION_AUTO_PRIMARY_SWITCH 参数控制开关,仅对主库有效,支持在线修改,默认值为 FALSE,即关闭状态。
当该参数设为 TRUE 时,主库每 60 秒检测一次是否有更高优先级节点,若有则执行主备切换。如需调整 60 秒的检测间隔时间,需联系技术支持。用户可依业务情况自行设置该参数。
--查看是否开启主库自动换主功能
SHOW PARAMETER HA_ELECTION_AUTO_PRIMARY_SWITCH;
--开启主库自动换主功能
ALTER SYSTEM SET HA_ELECTION_AUTO_PRIMARY_SWITCH=TRUE;
注:
YashanDB 提供三种保护模式:最大性能模式(MAXIMIZE PERFORMANCE)、最大可用模式(MAXIMIZE AVAILABILITY)和最大保护模式(MAXIMIZE PROTECTION)。使用 yasboot 部署时,根据组内节点数(MN组和DN组)自动调整保护模式:
-- 切换前保护模式
SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$DATABASE;
-- 切换保护模式(分布式部署下需直连MN或DN节点)
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
-- 切换后保护模式
SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$DATABASE;
切换前保护模式
切换后保护模式
5.6.3 主备切换
注:
YashanDB 支持以下切换功能:
注:Switchover切换方式适用于主备库同步正常的情况,可选择任意一个备库执行操作。
-- 确认主备库角色
SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE;
-- 确认备库连接状况
SELECT connection, status, peer_addr, transport_lag, apply_lag FROM V$REPLICATION_STATUS;
-- 执行主备切换
ALTER DATABASE SWITCHOVER;
-- 确认主备库角色
SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE;
注:Failover切换用于主库损坏或宕机等故障,需立即切换以快速恢复业务。
Failover 测试可参照如下方式:
-- 确认主备库角色
SELECT DATABASE_ID,DATABASE_NAME,LOG_MODE,OPEN_MODE,DATABASE_ROLE FROM V$DATABASE;
-- 确认备库连接已经断连,并且RECEIVED_LFN是剩余备库里最大的,GAP_SEQ#为0
SELECT CONNECTION,STATUS,RECEIVED_LFN,GAP_SEQ# FROM V$REPLICATION_STATUS;
-- 在被选定备库执行Failover,将备库激活为可读写状态
ALTER DATABASE FAILOVER;
-- 再次确认主备库角色
SELECT DATABASE_ID,DATABASE_NAME,LOG_MODE,OPEN_MODE,DATABASE_ROLE FROM V$DATABASE;
通过集群检查,将当前 dn 为 primary 的节点选择宕,一段时间后,观察结果如下:
注:因为分布式集群一主二备环境默认配置了自动选主,当主节点宕后,在较短的时间内,可以观察到三个节点的 dn 都为 standby 角色,然后在较短的时间后会选择其中一个节点作为 primary。
注:hosts.toml 是服务器的配置文件
# 整个配置文件的全局 UUID(用于唯一标识集群)
uuid = "6759b30f67de5c865896f3bee8996686" # 集群的唯一标识符
# 集群名称
cluster = "yashandb" # 集群名称
# yas_type 说明数据库的类型,可能是 DE (开发环境) 或者其他类型
yas_type = "DE" # 数据库类型(开发环境)
# secret_key 用于配置中涉及的加密操作,通常用于验证
secret_key = "1dd20e0b3d78d136" # 密钥
# add_yasdba 表示是否添加 DB 管理员(DBA),值为 true 表示添加
add_yasdba = true # 是否添加数据库管理员
# recommend_param 可能用于启用或推荐某些数据库参数的配置
recommend_param = true # 是否推荐数据库参数配置
# [om] 块是数据库集群的管理配置
[om]
# 管理节点的 hostid,唯一标识每一个管理节点
hostid = "host0001" # 管理节点的 ID(host0001)
# 管理节点的配置信息
[om.config]
# LISTEN_ADDR 是管理节点监听的 IP 地址和端口号
LISTEN_ADDR = "10.xxx.xxx.131:1675" # 管理节点的监听地址与端口
# [[host]] 用于定义每一个数据库节点的配置,下面列出了多个主机配置
[[host]]
# 节点的唯一标识符
hostid = "host0001" # 数据库节点的 ID(host0001)
# 节点所属的分组,可以根据需求分类多个节点
group = "yashan" # 节点分组,所有主机都属于同一个组
# 节点的登录用户名
user = "yashan" # 数据库主机的登录用户名
# 登录密码
password = "yashan!1234" # 数据库主机的登录密码
# 主机的 IP 地址
ip = "10.xxx.xxx.131" # 节点的 IP 地址
# SSH 端口号,默认为 22
port = 22 # SSH 端口
# 数据库安装路径(Yashan DB 的数据存储路径)
path = "/data/yashan/yasdb_home" # 数据库主机的数据目录
# 每个节点的内存限制
memory_limit = "7870M" # 节点的内存限制( 7870 MB)
# 配置该主机的 yasagent(崖山数据库的代理)设置
[host.yasagent]
# yasagent 配置块,下面定义了代理的详细配置
[host.yasagent.config]
# 代理监听的地址和端口
LISTEN_ADDR = "10.xxx.xxx.131:1676" # yasagent 监听的地址与端口
# 另外两个主机的配置与上面的配置结构相似,分别是 host0002 和 host0003。
[[host]]
hostid = "host0002" # 数据库节点的 ID(host0002)
group = "yashan" # 节点分组
user = "yashan" # 登录用户名
password = "yashan!1234" # 登录密码
ip = "10.xxx.xxx.132" # 节点的 IP 地址
port = 22 # SSH 端口
path = "/data/yashan/yasdb_home" # 数据库安装路径
memory_limit = "7870M" # 内存限制
[host.yasagent]
[host.yasagent.config]
LISTEN_ADDR = "10.xxx.xxx.132:1676" # yasagent 监听的地址与端口
[[host]]
hostid = "host0003" # 数据库节点的 ID(host0003)
group = "yashan" # 节点分组
user = "yashan" # 登录用户名
password = "yashan!1234" # 登录密码
ip = "10.xxx.xxx.133" # 节点的 IP 地址
port = 22 # SSH 端口
path = "/data/yashan/yasdb_home" # 数据库安装路径
memory_limit = "7870M" # 内存限制
[host.yasagent]
[host.yasagent.config]
LISTEN_ADDR = "10.xxx.xxx.133:1676" # yasagent 监听的地址与端口
注:yashandb.toml 是数据库集群的配置文件
# 全局配置部分
cluster = "yashandb" # 定义集群名称,用于唯一标识当前崖山数据库集群。
create_simple_schema = false # 是否创建简单的默认Schema,通常用于快速初始化。
deploy_mode = "NORMAL" # 集群部署模式,支持NORMAL(标准模式)和其他模式。
recommend_param = true # 是否启用推荐的系统参数配置,提升系统性能。
table_type = "LSC" # 默认表存储类型,LSC表示日志结构合并表。
uuid = "6759b30f67de5c865896f3bee8996686" # 唯一标识符,用于识别当前配置的集群。
yas_type = "DE" # 数据库类型,DE表示分布式版。
# 组定义部分
[[group]]
group_type = "mn" # 组类型,mn代表元数据节点(Meta Node)。
name = "mng1" # 组名称,用于标识该组。
[group.config]
CHARACTER_SET = "utf8" # 数据库字符集,默认utf8。
ISARCHIVELOG = true # 是否启用归档日志,影响日志保留策略。
REDO_FILE_NUM = 4 # 重做日志文件数量。
REDO_FILE_SIZE = "128M" # 单个重做日志文件大小。
# 元数据节点配置
[[group.node]]
data_path = "/data/yashan/yasdb_data" # 数据存储路径。
hostid = "host0003" # 节点主机标识符。
memory_limit = "1536M" # 节点内存限制。
role = 1 # 节点角色,1代表主节点,2代表备份节点。
[group.node.config]
CGROUP_ROOT_DIR = "/sys/fs/cgroup" # cgroup的根目录,用于资源限制。
DB_BLOCK_SIZE = "8K" # 数据块大小。
DDL_LOCK_TIMEOUT = 60 # DDL锁超时时间(秒)。
DEFAULT_TABLE_TYPE = "LSC" # 默认表存储类型。
DICTIONARY_CACHE_SIZE = 20 # 字典缓存大小。
DIN_ADDR = "10.xxx.xxx.133:1679" # 数据输入监听地址。
DSTB_POOL_SIZE = 10 # 分布式池大小。
LISTEN_ADDR = "10.xxx.xxx.133:1678" # 节点监听地址。
OPEN_CURSORS = 310 # 最大游标数。
REPLICATION_ADDR = "10.xxx.xxx.133:1680" # 复制监听地址。
RUN_LOG_FILE_PATH = "/data/yashan/yasdb_home/yashandb/23.2.4.100/log/yashandb/mn-1-1/run" # 运行日志路径。
RUN_LOG_LEVEL = "INFO" # 日志级别。
SLOW_LOG_FILE_PATH = "/data/yashan/yasdb_home/yashandb/23.2.4.100/log/yashandb/mn-1-1/slow" # 慢查询日志路径。
SQL_POOL_SIZE = 45 # SQL线程池大小。
TRANSACTION_LOCK_TIMEOUT = 300 # 事务锁超时时间(秒)。
UNDO_RETENTION = 300 # Undo段保留时间(秒)。
# 其他节点配置类似于上述,只更改特定的节点参数如地址、角色等。
[[group]]
group_type = "cn" # 组类型,cn代表计算节点(Compute Node)。
name = "cng1" # 组名称。
[group.config]
CHARACTER_SET = "utf8" # 数据库字符集。
ISARCHIVELOG = true # 是否启用归档日志。
REDO_FILE_NUM = 4 # 重做日志文件数量。
REDO_FILE_SIZE = "128M" # 单个重做日志文件大小。
[[group.node]]
data_path = "/data/yashan/yasdb_data" # 数据存储路径。
hostid = "host0001" # 主机标识。
memory_limit = "2375M" # 内存限制。
role = 1 # 节点角色。
[group.node.config]
MAX_REACTOR_CHANNELS = 1 # Reactor模型的最大通道数。
# 其余配置参数与元数据节点类似。
[[group]]
group_type = "dn" # 组类型,dn代表数据节点(Data Node)。
name = "dng1" # 组名称。
[group.config]
CHARACTER_SET = "utf8" # 数据库字符集。
ISARCHIVELOG = true # 是否启用归档日志。
REDO_FILE_NUM = 4 # 重做日志文件数量。
REDO_FILE_SIZE = "128M" # 单个重做日志文件大小。
[[group.node]]
data_path = "/data/yashan/yasdb_data" # 数据存储路径。
hostid = "host0001" # 主机标识。
memory_limit = "3950M" # 内存限制。
role = 1 # 节点角色。
[group.node.config]
# 配置参数与其他节点类似。
注释说明
配置文件分为全局设置和分组设置两部分。分组按功能分为管理节点(mn)、协调节点(cn)和数据节点(dn)。
节点内的配置详细说明了资源限制(内存、线程池)、地址监听(数据输入、复制)、日志路径等关键信息。
添加了每个参数的详细描述,以便用户理解和调整配置文件。
注:此脚本用于集群安装部署完成后对 yashan 用户的环境变量设置
-- setup_env.sh
#!/bin/bash
# 定义变量
CONF_DIR="/data/yashan/yasdb_home/yashandb/23.2.4.100/conf"
ENV_FILE="yashandb.bashrc"
BASHRC="$HOME/.bashrc"
TEST_VAR="YASDB_HOME" # 用于验证的环境变量名
YASHAN_CMD="yasboot --help" # 用于验证的 YashanDB 命令
BIN_DIR="bin" # 假设 yasboot 在 $YASDB_HOME/bin 下
# 检查环境变量文件是否存在
if [[ ! -f "$CONF_DIR/$ENV_FILE" ]]; then
echo "环境变量文件不存在:$CONF_DIR/$ENV_FILE"
exit 1
fi
# 备份原有的 .bashrc 文件
echo "备份当前 .bashrc 文件为 .bashrc.bak"
cp "$BASHRC" "$BASHRC.bak"
# 删除已有的 YashanDB 环境变量
echo "清除旧的 YashanDB 环境变量配置"
sed -i '/# YashanDB 环境变量配置开始/,/# YashanDB 环境变量配置结束/d' "$BASHRC"
# 添加新环境变量配置
echo "添加新的 YashanDB 环境变量配置"
echo -e "\n# YashanDB 环境变量配置开始" >> "$BASHRC"
cat "$CONF_DIR/$ENV_FILE" >> "$BASHRC"
echo "export PATH=\$YASDB_HOME/$BIN_DIR:\$PATH" >> "$BASHRC" # 添加 bin 目录到 PATH
echo "# YashanDB 环境变量配置结束" >> "$BASHRC"
# 使环境变量立即生效
echo "使环境变量立即生效"
source "$BASHRC"
export PATH=$YASDB_HOME/$BIN_DIR:$PATH # 确保当前会话生效
# 检查环境变量是否配置成功
if [[ -z "${!TEST_VAR}" ]]; then
echo "环境变量未生效,请检查配置!"
exit 1
else
echo "环境变量已成功配置,$TEST_VAR=${!TEST_VAR}"
fi
# 测试 YashanDB 命令
echo "执行 YashanDB 测试命令:$YASHAN_CMD"
if command -v yasboot >/dev/null 2>&1; then
if $YASHAN_CMD >/dev/null 2>&1; then
echo "YashanDB 命令执行成功,环境变量已正确配置!"
else
echo "YashanDB 命令执行失败,请检查数据库状态!"
exit 1
fi
else
echo "yasboot 未找到,请检查 PATH 配置或 yasboot 是否存在!"
exit 1
fi
echo "所有配置完成!"
source $HOME/.bashrc复制
注:在登录数据库,对 SQL 语句做格式化时,某些 set 参数不可用
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042688/viewspace-3059082/ ,如需转载,请注明出处,否则将追究法律责任。