【SOP 系列 07】如何使用 OCP 接管 OBD 部署的 OceanBase 集群

1、前置条件

1.1 OBD 版本确认

OBD 版本要求不小于1.3.0,如果 OBD 版本低于1.3.0,可以执行 obd update 命令升级。

[root@172.30.199.126 ~]$obd --version
OceanBase Deploy: 1.3.0
REVISION: 8bd1db1cd8c32dd4cae6de8d062f730261db21fb
BUILD_BRANCH: publish
BUILD_TIME: Mar 30 2022 06:01:22OURCE
Copyright (C) 2021 OceanBase
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@172.30.199.126 ~]$

在 OBD 1.3.0 中新增了一个 check4ocp 子命令。

[root@172.30.199.126 ~]$obd cluster check4ocp
Usage: obd cluster check4ocp <deploy name> [options]

Options:
  -c COMPONENTS, --components=COMPONENTS
                        List the components. Multiple components are separated
                        with commas.
  -V VERSION, --version=VERSION
                        OCP Version
  -h, --help            Show help and exit.
  -v, --verbose         Activate verbose output.

1.2 OBServer 上 chkconfig 命令路径确认

which chkconfig 如果返回的命令不在 /usr/local/bin:/usr/bin 路径下包含,需要设置软链接修复,否则会报错:

2022-04-06 20:39:21.817  WARN 39 --- [pool-subtask-executor-thread-8,e52d6a2c544e48ee,dfc27a46e040] c.a.ocp.core.job.runner.RunnerFactory    : Execute task failed, subtask=SubtaskInstanceEntity{id=2555825, name=Pre check for create host, state=FAILED, operation=EXECUTE, className=com.alipay.ocp.service.task.business.host.PreCreateHostCheckTask, seriesId=24, startTime=2022-04-06T20:39:17.604+08:00, endTime=2022-04-06T20:39:21.817+08:00}, failedMessage=An unknown error has occurred. Cause: Cannot find command "chkconfig", you may need to include /usr/sbin or /sbin in your PATH. Error message: {1}. Contact the administrator.
...
Caused by: java.lang.RuntimeException: command failed, user: admin, args: which chkconfig, return code: 1, output: , err: , extOut: which: no chkconfig in (/usr/local/bin:/usr/bin)

修复 chkconfig
ln -s /usr/sbin/chkconfig /usr/local/bin

2、使用 OBD 检查是否满足 OCP 接管

[admin@172.30.199.126 ~]$obd cluster check4ocp test1 -c oceanbase-ce -V 3.1.1
Get local repositories and plugins ok
Load cluster param plugin ok
Open ssh connection ok
Connect to observer ok
[ERROR] The current user must be the admin user. Run the edit-config command to modify the user.username field
[ERROR] The user must have the privilege to run sudo commands without a password.
[ERROR] The password of root@sys is empty. Run the edit-config command to modify the root_password value of oceanbase-ce.
[ERROR] Zone: IDC information is missing for zone1,zone2,zone3. Run the chst command to change the configuration style of oceanbase-ce to cluster, and then run the edit-config command to add IDC information.
See https://open.oceanbase.com/docs/obd-cn/V1.2.0/10000000000017237.

说明:

  • test1 是指的使用 OBD 部署对应的 deploy_name,可以使用 obd cluster list 查看,对应的 Name 字段的值。
  • -c 后面跟 oceanbase-ce 表示检查的组件的名称。
  • -V (大写) 后面跟当前使用的 OCP 的版本。

OCP 版本确认:

通过以下命令验证 OCP-Server 版本信息,如果返回信息中 buildVersion 匹配对应版本则表示 OCP-Server 版本正确。

username:OCP 的管理员用户 admin。

password:admin 用户的密码,默认为 root。

curl --user <username>:<password> 'http://<OCP_HOST>:<OCP_PORT>/api/v2/info'

  • 通过 obd cluster check4ocp 命令检查,修复 ERROR 对应的问题,具体详情请参见步骤 3~6
  • 如果输出中有 oceanbase-ce Check passed. 说明可以使用 OCP 来接管了。



3、给 admin 用户添加 sudo 权限

在所有 OBServer 机器上使用 root 用户执行:

chmod u+w /etc/sudoers
echo 'admin ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
chmod u-w /etc/sudoers

4、调整部署的操作系统用户为 admin

这里假设之前使用 OBD 部署的时候 user 使用的是操作系统 root 用户。

obd cluster edit-config test1

修改前:

## Only need to configure when remote login is required
user:
   username: root
#   password: your password if need
   key_file: /root/.ssh/id_rsa
#   port: your ssh port, default 22
#   timeout: ssh connection timeout (second), default 30

在所有 OBServer 节点查看 observer 进程的用户是 root。

ps -ef | grep observer | grep -v grep | awk '{print $1}'

修改后:

注意这里 key_file 是用的私钥文件。

## Only need to configure when remote login is required
user:
   username: admin
#   password: your password if need
   key_file: /home/admin/.ssh/id_rsa
#   port: your ssh port, default 22
#   timeout: ssh connection timeout (second), default 30

保存并退出。

Search param plugin and load ok
Search param plugin and load ok
Parameter check ok
Save deploy "test1" configuration
Use `obd cluster restart test1 --wp` to make changes take effect.

根据提示重启 OceanBase 集群

obd cluster restart test1 --wp

如果在这个时候, 出现

[ERROR] OBD-2002: Failed to start server1(172.30.62.242) observer: bash: /xxxxx/ob/observer/bin/observer: Permission denied

是因为之前的OceanBase 是root 用户安装, 把binany 放在了/root/.obd/bin 下面, 切到admin下, 没有权限读取/root/.obd/bin 目录, 需要在每台机器执行一个动作

chmod +x /root

在所有 OBServer 节点查看 observer 进程的用户是 admin

ps -ef | grep observer | grep -v grep | awk '{print $1}'

5、设置 root@sys 用户密码

如果之前通过 OBD 部署的 OceanBase 集群没有设置 sys 租户下 root 用户的密码,需要在 yaml 文件里打开 root_password 的注释,并设置对应的密码。

obd cluster edit-config test1

obd cluster reload test1

mysql -h${obproxy_ip} -P2883 -uroot@sys#cluster_name -pxxx 登录验证。

6、添加 zone idc 属性

默认新部署的 OceanBase 集群 zone idc 属性为空,如下所示登录到 sys 租户的 root 用户下进行调整:

#修改idc
alter system modify zone 'zone1' idc 'cd';
alter system modify zone 'zone2' idc 'cd';
alter system modify zone 'zone3' idc 'cd';

#确认idc
select * from oceanbase.__all_zone where name='idc';

说明: idc 名字根据需要设置,这里只是示例。

注意:
如果是OB4.x,在待接管的OB sys租户下执行:
select * from dba_ob_zones;

需要确保待接管的OB idc/region在ocp meta中有对应的记录,如果在ocp meta中没有,建议不要直接修改,可以在ocp meta中新增对应的记录。
select * from compute_idc;
select * from compute_region;

原因:待接管的OB集群修改了zone的idc/region属性后不会自动同步到ocp meta库中,需要手动调整。

7、再次确认是否满足 ocp 接管

重复步骤 2 并参考相关说明,确认输出中有 oceanbase-ce Check passed. 表示可以使用 OCP 来接管了。

obd cluster check4ocp test1 -c oceanbase-ce -V 3.1.1

8 、其他检查项

  • 目前 OCP 只支持一台机器上部署一个 OBServer,在所有的 OBServer 节点,确认返回值是 1。

    pidof observer | tr ' ' '\n' | wc -l
    或者
    pgrep observer | wc -l
    
  • 每台 OBServer 的机器架构相同,比如同时是 x86 或者 arm。

    uname -p
    
  • 修改待接管集群中proxyro用户密码

在 OCP 接管集群之前,需要确认待接管集群中的 proxyro 如何没有设置密码或者设置了密码,都需将 OCP 中的 proxyro 密码修改为待接管集群中的 proxyro 用户的密码,原因是目前的OCP

内部使用的obproxy对应的proxyro用户密码是一个固定的密码,我们将在ocp 后续的版本中修复这个问题。

curl --user admin:aaAA11__ -X POST "http://172.30.199.126:8080/api/v2/obproxy/password" -H "Content-Type:application/json" -d '{"username":"proxyro","password":"Root123@@Root123"}'

说明:

ip:port 分别是 OCP 的IP和端口。

user:pass 分别为 OCP 的用户和密码,并且要求调用的用户需要有 admin 权限。

-d 参数后面的 password 为待接管集群的 proxyro 用户的明文密码。

该操作会生成运维任务,将 OCP 中现有 Oceanbase 集群的 proxyro 密码修改,同时修改OBProxy集群对应的配置。 您需等运维任务成功结束后才可进行后述步骤,如果任务失败,则需要重试并将任务执行成功之后才能执行后面的步骤。

  • 如果待接管的OB是ocp meta使用的,登录到ocp meta租户的ocp库调整
mysql> select * from config_properties where `key` like '%black%' \G
*************************** 1. row ***************************
            id: 1000171
           key: ocp.ob.cluster.ops.blacklist
         value:
   application: ocp
       profile: default
         label: master
         fatal: 1
   description: OB 集群运维操作黑名单
   create_time: 2022-06-06 13:43:42
   update_time: 2022-06-06 13:43:42
description_en: OB cluster ops blacklist
   is_az_level: 0
1 row in set (0.00 sec)

update config_properties set value='' 
where `key`='ocp.ob.cluster.ops.blacklist';

9、使用 OCP 接管使用 OBD 部署的集群

1、登录 OCP 控制台。

2、点击左侧导航栏【集群】 ,再点击 【接管集群】。

3、选择接管集群的连接方式。

这里需要注意如果使用最早发布的 OCP 3.1.1 版本,只能使用【直连】方式来接管,否则会提示:

2022-04-06 20:44:34.831  WARN 39 --- [pool-subtask-executor-thread-36,e52d6a2c544e48ee,05e4f253fb7f] c.a.ocp.core.job.runner.RunnerFactory    : Execute task failed, subtask=SubtaskInstanceEntity{id=2555836, name=Check observer process user, state=FAILED, operation=EXECUTE, className=com.alipay.ocp.service.task.business.host.CheckObserverProcessUserTask, seriesId=39, startTime=2022-04-06T20:44:34.781+08:00, endTime=2022-04-06T20:44:34.830+08:00}, failedMessage=Can not find observer process with port 2883

OCP 版本确认:

通过以下命令验证 OCP-Server 版本信息,如果返回信息中 buildVersion 匹配对应版本则表示 OCP-Server 版本正确。

username:OCP 的管理员用户 admin。

password:admin 用户的密码,默认为 root。

curl --user <username>:<password> 'http://<OCP_HOST>:<OCP_PORT>/api/v2/info'

关于升级 OCP 版本的示例可以参考: https://ask.oceanbase.com/t/topic/29700027

从 3.1.1-bp1 版本开始,可以使用 OBProxy 连接方式接管,如果使用 OBProxy 连接方式,对应的信息确认方法如下:

  • 集群名

    show parameters like 'cluster'; 
    
  • 集群 id(可选)

    show parameters like 'cluster_id';
    

4、提交接管任务。

5、在集群 → 系统管理 → 任务 ( Take over primary OB cluster ) 中可以看任务进度及报错日志。

10、OBProxy 接管

目前 OCP 不支持接管 OBProxy,可以通过先部署新的 OBProxy,再在 SLB 中添加,滚动替换原有的 OBProxy 方式来无缝完成在 OCP 中接管和管理 OBProxy。

通过以上步骤,我们就可以将之前使用 OBD 维护的 OceanBase 集群 使用 OCP 接管过来了。

2 个赞

终于可以接管集群了,下周搞起,辛苦工程师!

学习了

666

保姆级教程了,很厉害!!!

666

已经加了sudo权限为什么obd cluster restart obtest --wp报:

onnect to observer x

[ERROR] OBD-2002: Failed to start server1(172.16.xxx) observer: bash: /opt/cechealth/app/observer/bin/observer: Permission denied


如果之前的账号是root用户,要切换用户那的话,新的用户需要加入root用户组,或者执行chmod +1 /root 给root附上other 的执行权限。

学习学习


ocp 接管 有很多问题, 也可以参考 这篇文档进行解答 ocp 接管observer 出现问题

好东西