管理 OBServer 节点状态 
=====================================

OceanBase 数据库提供了命令行方式来管理 OBServer 的节点状态

在运维操作中，如果需要替换节点、维修节点或者对节点进行诊断，可以通过 `STOP SERVER` 命令将该节点的分区 Leader 切到其他节点上。然后该 Server 状态将变为 `stopped` 并且不会对外提供服务。

节点的 `stopped` 状态并非等价于进程退出，进程可能仍然在运行，仅仅是集群的状态标志认为该节点为 `stopped` 状态。同理与之对应的是节点的 `started` 状态。



**Start Server 操作** 
----------------------------------------

Start Server 操作对应 Stop Server 操作。当集群中的 OBServer 启动后，默认状态是 `started`。在执行 Stop Server 操作后，需要通过 Start Server 操作将 Server 状态置为 `started`。Start Server 操作的命令如下所示：

```sql
ALTER SYSTEM START SERVER 'ip:port' [,'ip:port'...] [ZONE='zone']
```



示例语句如下所示：

```sql
obclient> ALTER SYSTEM START SERVER "10.10.10.1:2882"
```



**Stop Server 操作** 
---------------------------------------

Stop Server 操作的目的是将该 Server 上的分区 Leader 切到其他节点。当该 Server 上没有分区 Leader 的情况下，系统将内部标记 Server 为 `stopped` 状态，客户端请求不会再次发送到该 Server，该 Server 也不会再对外提供服务。

Stop Server 操作通常是特殊运维操作时执行，比如机器硬件维修、替换和升级，或者对该 Server 进行诊断等而进行的动作。Stop Server 操作的命令如下所示：

```sql
ALTER SYSTEM STOP SERVER 'ip:port' [,'ip:port'...] [ZONE='zone']
```



示例语句如下所示：

```sql
obclient> ALTER SYSTEM STOP SERVER "10.10.10.1:2882" zone='z1'
```



**Add Server 操作** 
--------------------------------------

Add Server 操作的目的是添加节点到集群，该操作是运维扩容的操作。被添加的新节点要求是空的，即 CLog 和 ILog 目录下为空。Add Server 操作的命令如下所示：

```sql
ALTER SYSTEM ADD SERVER 'ip:port' [,'ip:port'...] [ZONE [=] 'zone']
```



示例语句如下所示：

```sql
obclient> ALTER SYSTEM ADD SERVER "10.10.10.1:2882" zone='z1'
```



**Delete Server 操作** 
-----------------------------------------

Delete Server 用于从集群中删除节点。Delete Server 操作的命令如下所示：

```sql
ALTER SYSTEM DELETE SERVER 'ip:port' [,'ip:port'...] [ZONE [=] 'zone']
```



示例语句如下所示：

```sql
obclient> ALTER SYSTEM DELETE SERVER "192.168.100.1:2882" zone='z1'
```



**Cancel Delete Server 操作** 
------------------------------------------------

Delete Server 的动作会涉及到负载均衡。被删除的 Server 上的资源单元会在同一个 Zone 中进行资源单元（Unit）迁移。Unit 的迁移动作是 Unit 自动均衡过程由 RootService 控制。Unit 均衡过程中可能发生资源不足，其他同 Zone 的机器资源不足容纳这个新迁移的 Unit。这样将导致 Unit 迁移失败，通过 `/home/admin/oceanbase/log/rootservice.log` 可以看到迁移 Unit 失败的错误代码 -4624。如果希望取消 Delete Server 动作，可以通过 Cancel Delete Server 操作实现。 Cancel Delete Server 操作的命令如下所示：

```sql
ALTER SYSTEM CANCEL DELETE SERVER 'ip:port' [,'ip:port'...] [ZONE [=] 'zone']
```



示例语句如下所示：

```sql
obclient> ALTER SYSTEM CANCEL DELETE SERVER "10.10.10.1:2882" zone='z1'
```



操作限制说明 
---------------------------

对节点执行操作时：

* 不能跨 Zone 执行 Stop Server 操作，同一个 Zone 可以同时 Stop 多个 Server。

  

* 一个 Stop 操作发起没有结束前，不能发起第二个操作。

  

* `enable_auto_leader_switch`参数必须设置为开启。

* 分区副本满足多数派。

  

* 如果分区数多，或者被 Stop Server 的节点分区的 Leader 数量多， Alter System Stop Server 操作时间会比较长，如果超时，可以加大 SQL 超时时间。

  

* 如果命令很快失败，那么可能是日志不同步。

  

* 检查 `__all_rootservice_event_history `可以确认是否有 Stop Server 动作。

  

* Stop Server 后该 Server 的状态仍为 `Active` ，但 `stop_service_time `的值由 0 变为 Stop Server 的时间点。

  




