【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】odb版本4.3.4
【问题描述】obd部署单集群,开机怎么自启动配置
【复现路径】问题出现前后相关操作
可以使用service文件的方式
[Unit]
Description=observer
After=network.target
[Service]
User=root
Type=forking
KillSignal=SIGKILL
ExecStartPre=/home/admin/myoceanbase/oceanbase//bin/obshell admin stop
ExecStart=/home/admin/myoceanbase/oceanbase//bin/obshell admin start --takeover 0 --ob
ExecStartPost=/home/admin/myoceanbase/oceanbase//bin/obshell admin stop
ExecStop=/home/admin/myoceanbase/oceanbase//bin/obshell admin stop
PIDFile=/home/admin/myoceanbase/oceanbase//run/observer.pid
Restart=always
RestartSec=5
TimeoutStartSec=300
SuccessExitStatus=SIGKILL
[Install]
WantedBy=multi-user.target
一、推荐方案:通过 systemd 服务管理 OBD 集群
虽然直接通过 OBD 命令管理集群存在风险(如指出跨节点操作可能导致重复启动),但通过 限制作用范围为本机 可安全实现自启。以下是操作步骤:
1. 创建 systemd 服务文件
sudo vim /etc/systemd/system/ob_cluster.service
文件内容如下:
[Unit]
Description=OceanBase Cluster Service
After=network.target syslog.target time-sync.target # 确保网络、时间同步完成
[Service]
Type=forking
User=admin # 替换为实际部署用户(如 admin 或 root)
WorkingDirectory=/home/admin/oceanbase # OB 安装目录
ExecStart=/usr/bin/obd cluster start <deploy_name> # 替换为集群名称
ExecStop=/usr/bin/obd cluster stop <deploy_name>
Restart=on-failure
RestartSec=10s
Environment=PATH=/usr/bin:/bin:/usr/local/bin
[Install]
WantedBy=multi-user.target
2. 启用服务并测试
sudo systemctl daemon-reload
sudo systemctl enable ob_cluster # 开启自启
sudo systemctl start ob_cluster # 手动启动测试
sudo systemctl status ob_cluster # 检查状态
二、备选方案:手动编写启动脚本(适用无 OBD 场景)
若需避免 OBD 的集群管理风险,可编写脚本直接启动本机 observer 进程:
1. 创建启动脚本
sudo vim /home/admin/start_observer.sh
脚本内容:
#!/bin/bash
# 设置环境变量
export LD_LIBRARY_PATH=/home/admin/oceanbase/lib:$LD_LIBRARY_PATH
# 检查进程是否已运行
if ! pgrep observer >/dev/null; then
cd /home/admin/oceanbase && bin/observer # 需在安装目录执行
echo "Observer started at $(date)" >> /home/admin/ob_start.log
fi
2. 配置 systemd 或 rc.local
- systemd 方式:创建服务(参考上述格式),ExecStart 指向脚本路径
-
rc.local 方式(兼容旧系统):
echo "su - admin -c '/home/admin/start_observer.sh'" | sudo tee -a /etc/rc.local sudo chmod +x /etc/rc.local
三、关键注意事项
-
启动用户与目录
- 必须使用部署时的用户(如
admin),否则权限错误会导致启动失败。 - 必须在 OB 安装目录执行启动命令(如
/home/admin/oceanbase),否则依赖文件缺失。
- 必须使用部署时的用户(如
-
依赖服务检查
- 时间同步(NTP):OB 对时间敏感,需确保先于数据库启动。
-
磁盘挂载:若使用独立日志盘(推荐),需在脚本中检查
/data或/clog挂载状态。
-
生产环境风险规避
- 避免直接 Kill 进程:使用 OBD 或脚本停止服务,防止数据损坏。
-
合并转储后再重启:重启前执行
ALTER SYSTEM MAJOR FREEZE释放内存数据,减少恢复时间。 - 分 Zone 滚动重启:三副本集群需按 Zone 顺序重启,避免多数派同时宕机。
-
日志监控
启动后检查日志确认状态:tail -f /home/admin/oceanbase/log/observer.log # 观察启动进度
四、验证与调试
-
手动测试脚本
sh /home/admin/start_observer.sh # 检查进程是否拉起 ps -ef | grep observer -
模拟重启验证
sudo reboot # 重启后观察服务状态 obd cluster list # 确认集群状态为 RUNNING
结论
-
推荐方案:通过
systemd管理 OBD 启停(需限定为本机操作),兼顾标准化和可维护性。 - 特殊场景:若 OBD 部署异常,改用脚本直接启动 observer 并配置自启目录。
- 生产铁律:重启前务必完成合并转储,采用分 Zone 操作,避免集群不可用。
注:以上代码中的
<deploy_name>需替换为实际集群名称(通过obd cluster list查看)。若环境涉及多节点,需在每个 OBServer 节点单独配置。
我是 4.3.5.2 版本的 ob,使用您给出的 obd cluster 的 service,我发现会出现报错但无法捕获错误日志,使用 systemd-run 一次性运行 systemd 服务,成功获取到了错误日志,错误信息为:
[WARN] OBD-1011: (127.0.0.1) The recommended value of fs.aio-max-nr is 1048576 (Current value: 65536) [ERROR] OBD-1007: (127.0.0.1) The value of the ulimit parameter "open files" must not be less than 655350 (Current value: 1024), Please execute echo -e "* soft nofile 655350\n* hard nofile 655350" >> /etc/security/limits.d/nofile.conf as root in 127.0.0.1. if it dosen't work, please check whether UsePAM is yes in /etc/ssh/sshd_config. [WARN] OBD-1007: (127.0.0.1) The recommended number of core file size is unlimited (Current value: 0) [WARN] OBD-1007: (127.0.0.1) The recommended number of stack size is unlimited (Current value: 8192)
似乎是 systemd 的运行环境未采用 root 用户的 ulimit 配置,因此我手动增加了相关配置,运行成功。最后的 service 文件如下(使用 chatgpt 帮我做的修改,仅作为参考,source /etc/profile.d/obd.sh 这部分似乎没有作用,但我没有再做测试了):
[Unit]
Description=OceanBase Cluster nrlj managed by OBD
Wants=network-online.target
After=network-online.target time-sync.target
[Service]
Type=oneshot
User=root
Group=root
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
LimitNOFILE=655350
LimitCORE=infinity
LimitSTACK=infinity
ExecStart=/bin/bash -c 'source /etc/profile.d/obd.sh && exec /usr/bin/obd cluster start nrlj'
ExecStop=/bin/bash -c 'source /etc/profile.d/obd.sh && exec /usr/bin/obd cluster stop nrlj'
RemainAfterExit=yes
Restart=on-failure
TimeoutStartSec=10min
TimeoutStopSec=10min
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target