OB 是个单进程软件,启动方式特别简单。OB 又往往是以集群形式运行,机器可能会有点多。有些客户希望如果 OB 集群有服务器重启了,能自动将 OB 进程拉起来。这类客户通常是 OB 社区版用户 和早期 OB 企业版客户。
su - admincd /home/admin/oceanbase && bin/observer
OB 社区版从 4.0 后已经推出了 OCP 开源版,这个非常接近 OB 企业版的部署和运维了,强烈推荐用这个部署。已经上线了老的 OB 社区版集群,也可以通过部署 OCP 社区版去接管。接管成功后,就不要再用 OBD 去管理 OB 社区版集群了。
OBD 自动化运维思路是通过将参数写到配置文件里去实现集群的管理。当 OB 上线后会面临一些新的挑战。如节点资源规格扩容;租户资源扩容或缩容、集群扩容或缩容、节点替换;OB 备集群/备租户部署、OB 备份和还原等。当客户把越来越多的业务放到 OB 上后,对 OB 运维提出的要求自然就会越来越多,这些远不是 OBD 用配置文件加自动化能应付的了。所以 OB 要具备的能力不可能是简单的,否则面对海量数据的运维就捉襟见肘无能为力了。
OBD 启动和停止 OB 集群是很方便,不过用起来要谨慎。一个生产 OB 集群上线后基本上就不可能去停了。即使是要做机房搬迁,客户往往也是选择在线搬迁方案。除非那个业务实在不重要,停机搬迁。所以对于一个在运行中的业务 OB 集群,OBD 一个命令就给停了,甚至给销毁掉了(destroy),这是很大的风险。加上如果数据库碰到 BUG ,不停还能勉强使用,一停再启动,就要等很久并且可能还启动不成功。OB 读写原理是 LSMTree,增量在内存中。在没有合并甚至转储前,近期产生的大量业务写数据还在内存没有落盘持久化(生成新版本)。这个时候把 OB 进程停了再拉起,它是需要更多时间去恢复的。
所以 OB 的启动时间相比 MySQL、ORACLE 的启动时间可能会更长。ORACLE 其实也类似,高峰期重启 ORACLE ,恢复时间也是分钟级别的(有很多事务日志要前滚和回滚)。
所以生产上的 OB 集群,是不轻易的去停止,或者至少不是同时停。一个三副本的 OB 集群,如果要重启,严谨的做法是先合并;然后切主;然后重启某个 ZONE下的 OB 进程;然后再切主;再重启下一个 ZONE 下的 OB 进程。有很多步骤,OCP 运维 OB 的时候就是一步步这么做的。当然 OBD 重启集群的时候也可以这么做。只是,如果这个过程有异常,用户能干预的很少。特别是 DBA 如果不熟悉 OB 进程的手动启动和停止方法以及原理时,面对 OBD 报错会不知所措。
所以用 OBD 或 OCP 运维 OB 的前提是都要知道手动运维 OB 的方法,然后发挥 OBD 或 OCP 的自动化特性。从使用门槛上,OCP 要低于 OBD。
[root@server061 ~]# cat etc/systemd/system/observer.service[Unit]Description=observer systemd serviceAfter=network.target[Service]Type=forkingUser=adminEnvironment="LD_LIBRARY_PATH=/home/admin/oceanbase/lib"WorkingDirectory=/home/admin/oceanbaseExecStart=/home/admin/oceanbase/bin/observerExecStartPost=/bin/sleep 1ExecStop=/usr/bin/kill -9 $MAINPIDExecStopPost=/bin/sleep 3[Install]WantedBy=multi-user.target
在使用这个脚本之前,先在 OB 机器上把 observer 进程杀掉。
kill -9 `pidof observer`sleep 3ps -ef|grep observer |grep -v grep之所以 sleep 一下,是生产环境,杀一个进程,是需要点时间。
然后就可以使用 systemd 服务来管理 observer 启动。
[root@server061 ~]# systemctl start observer[root@server061 ~]# systemctl status observer● observer.service - observer systemd serviceLoaded: loaded (/etc/systemd/system/observer.service; enabled; vendor preset: disabled)Active: active (running) since Sat 2024-06-22 08:59:35 CST; 7s agoProcess: 10587 ExecStopPost=/bin/sleep 3 (code=exited, status=0/SUCCESS)Process: 10584 ExecStop=/usr/bin/kill -9 $MAINPID (code=exited, status=0/SUCCESS)Process: 10689 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)Process: 10679 ExecStart=/home/admin/oceanbase/bin/observer (code=exited, status=0/SUCCESS)Main PID: 10688 (observer)Tasks: 65Memory: 191.1MCGroup: system.slice/observer.service└─10688 home/admin/oceanbase/bin/observerJun 22 08:59:34 server061 systemd[1]: Starting observer systemd service...Jun 22 08:59:35 server061 systemd[1]: Started observer systemd service.[root@server061 ~]# ps -ef|grep observeradmin 10688 1 8 08:59 ? 00:00:01 home/admin/oceanbase/bin/observerroot 10920 2040 0 08:59 pts/2 00:00:00 grep --color=auto observer停止 observer 进程。
[root@server061 ~]# systemctl stop observer
[root@server061 ~]# ps -ef|grep observer
root 11805 2040 0 09:00 pts/2 00:00:00 grep --color=auto observer
将这个服务设置为 自启动模式。
[root@server062 ~]# systemctl enable observerCreated symlink from /etc/systemd/system/multi-user.target.wants/observer.service to /etc/systemd/system/observer.service.
这个脚本我用企业版测试了一下是可以的。社区版用户需要调整脚本中的 user 和 workingdirectory 等。不过我对 systemd 服务文件的理解并不深,有可能这个脚本文件写的有隐患。如果有懂这个的或者发现有问题的,欢迎留言指点我一下。或者点开文末“阅读原文”到 OB 论坛上交流。谢谢!




