# 如何重启 OceanBase 集群

OB 自身并没有提供“重启集群”的命令。OB 的核心能力就是高可用，前提是三副本部署。当少数派节点故障时，OB 内部可能会自动切换，依然可以为业务提供读写服务。OB 提供了停止和启动某个副本（`zone` 级别或者 `server` 级别）的功能，并且只允许停止少数派节点。

所以，OB 集群的重启是靠外部操作。比如说用 `kill` 命令杀进程，然后再启动进程 `observer` 。

上面修改参数的时候已经演示了如何杀单副本集群里的节点进程，下面演示三副本集群里的重启集群方法。在生产环境为了尽可能的缩短集群不可用时间，重启集群采取一种保险的策略：按 `zone` 或 `server` 逐个重启集群节点。这个过程可能会比较长，持续几分钟到十几分钟。在刚开始学习 OceanBase 的时候，我们先掌握简单的重启方法，后面深入介绍 OceanBase 运维的时候，再介绍安全稳妥的重启方法。

## 直接手动重启 OceanBase 集群节点


```bash
# ssh 到 节点 1
ssh 172.20.249.52
# 正常 kill 进程，除非是测试用或者评估过风险，否则不要用 `kill -9` 。
kill  `pidof observer`
# 等待 60s，等进程完全退出
sleep 60
# 反复确认进程完全退出
ps -ef | grep observer
# 配置 LIBRARY PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/
# 启动进程
cd /home/admin/oceanbase-ce && bin/observer
# 等待 10s 进程启动
sleep 10
# 反复确认进程启动时没有退出
ps -ef | grep observer | grep -v grep
# 等待 60s，等进程完全启动并恢复完毕
sleep 60
# 查看进程监听成功（默认监听 2881 和  2882 端口）
netstat -ntlp

# 在集群中查看节点状态（`status`）、开始服务时间（`start_service_time`）是否正常。
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version  from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;

```

只有第一个节点重启成功后，再重复操作第二个节点。
当然，如果只是测试，不在乎可用性。就可以忽略上面的确认过程，直接杀掉所有集群节点的进程，然后启动进程。这个时候集群节点起来后也许要几分钟恢复数据和通信。如果集群重启之前有大量的数据读写，这个节点进程的恢复时间可能会很长，要十几分钟甚至几十分钟。

## 使用 OBD 重启集群

上面是手动重启 OceanBase 集群节点的原理，下面是使用 OBD 工具自动化做这个操作。但是注意，当前 OBD 的重启集群可能并没有包含必要的检查操作，所以，测试环境可以用，生产环境要谨慎使用。

使用 OBD 重启集群的命令是：`obd cluster restart ` 。

```bash
obd cluster restart obce-3zones

输出：
[admin@obce00 oceanbase-ce]$ obd cluster restart obce-3zones
Get local repositories and plugins ok
Open ssh connection ok
Stop observer ok
Stop obproxy ok
obce-3zones stopped
Get local repositories and plugins ok
Open ssh connection ok
Cluster param config check ok
Check before start observer ok
Check before start obproxy ok
Start observer ok
observer program health check ok
Connect to observer ok
Wait for observer init ok
+-------------------------------------------------+
|                     observer                    |
+---------------+---------+------+-------+--------+
| ip            | version | port | zone  | status |
+---------------+---------+------+-------+--------+
| 172.20.249.49 | 3.1.0   | 2881 | zone2 | active |
| 172.20.249.51 | 3.1.0   | 2881 | zone3 | active |
| 172.20.249.52 | 3.1.0   | 2881 | zone1 | active |
+---------------+---------+------+-------+--------+

Start obproxy ok
obproxy program health check ok
Connect to obproxy ok
Initialize cluster
+-------------------------------------------------+
|                     obproxy                     |
+---------------+------+-----------------+--------+
| ip            | port | prometheus_port | status |
+---------------+------+-----------------+--------+
| 172.20.249.52 | 2883 | 2884            | active |
| 172.20.249.49 | 2883 | 2884            | active |
| 172.20.249.51 | 2883 | 2884            | active |
+---------------+------+-----------------+--------+
obce-3zones running
```

上面 OBD 重启集群的时候，默认重启了所有组件（包括 `OBSERVER` 和  `OBPROXY` ）。也可以通过 `-c `命令指定重启具体的组件。

有关 OBPROXY 的重启特点跟 OBSERVER 是一样的，也有工作目录和启动参数。这里就先不介绍了。后面在 OceanBase 的运维章节也会介绍 OBPROXY 的相关运维。

