请问observer和obproxy进程如何优雅关闭呢?直接找到进程id然后kill吗?
kill肯定不是优雅的关闭方式了。
可以参考ocp关闭的步骤
看日志,主要是以下两步:
alter system stop server ?
ALTER SYSTEM MINOR FREEZE SERVER=(?)
嗯,不直接kill进程,kill之前先做上面的几步。只不过OCP不开源,没有详细的操作流程
最后一步 依然是 kill pidof observer
OB 进程和 OBProxy 进程的关闭方式 就是 KILL 。不怕杀,不怕折腾,所以估计也不会有 shutdown
这种接口或命令。
停单个 OBServer
- 设置永久下线时间的参数
评估停机时间,设置 server_permanent_offline_time 参数。避免因停机时间长,超过 server_permanent_offline_time 参数的默认值 3600s(1h),导致节点恢复后重新复制副本。
这里假设停机维护时间窗口为 24 小时,具体时间应根据实际场景来评估:
alter system set server_permanent_offline_time=‘86400’;
2、stop server 切主
执行 stop server 后,RootService 会尽可能的把停止服务的这台 OBServer 上的 Leader 副本切换到其他节点,当该 server 上没有分区 Leader 的情况下,系统将内部标记 server 为 stopped 状态,客户端请求不会再次发送到该 server 。执行时间长短跟要切换的 leader 副本个数多少有关,命令等待时间会相对长一些,执行 stop server 命令前,需在当前会话里调大 ob_query_timeout 变量。
set ob_query_timeout=100000000000000;
alter system stop server ‘xx.xx.xx.xx:xx’ zone ‘zone1’;
3.检查待停机的 OBServer 上 Leader 数量
select concat(svr_ip,’:’,svr_port),leader_count
from __all_virtual_server_stat where svr_ip='xx.xx.xx.xx and svr_port=xx;
leader_count 为 0 时,说明该节点上的 Leader 副本已切换完成。
4、确认待停止 OBServer 的工作目录
因为手动启动 OBServer 的时候需要进入到 OBServer 的工作目录下找 etc 目录下的参数文件,所以我们在停止进程前先确认并记录一下 OBServer 的工作目录。
ls -l /proc/$(pgrep observer)/cwd | awk ‘{print $NF}’
5.停止 OBServer 进程
kill -15 $(pgrep observer)
或者
kill -9 $(pgrep observer)
6.停机
有多个 OBProxy,且使用 LB
1.从 LB 中剔除待停机维护的 OBProxy
2.确认待停机 OBProxy 的工作目录
ls -l /proc/$(pgrep obproxy)/cwd | awk ‘{print $NF}’
3.停掉 OBProxy 进程
ps -ef | grep obproxy | grep -v grep
kill -9 xx