生产级OceanBase分布式数据库三地三中心架构规划与部署流程

生产级OceanBase分布式数据库三地三中心架构规划与部署流程

Deng YongJie's blog 687 2022-10-15

Image

如图所示,数据服务层表示一个 OceanBase 数据库集群。该集群由三个子集群(Zone)组成,一个 Zone 由多台物理机器组成,每台物理机器称之为数据节点(OBServer)。OceanBase 数据库采用 Shared-Nothing 的分布式架构,每个数据节点都是对等的。

OceanBase 数据库中存储的数据分布在一个 Zone 的多个数据节点上,其它 Zone 存放多个数据副本。如图所示的 OceanBase 数据库集群中的数据有三个副本,每个 Zone 存放一份。这三个 Zone 构成一个整体的数据库集群,为用户提供服务。

根据部署方式的不同,OceanBase 数据库可以实现各种级别容灾能力:

  • 服务器(Server)级无损容灾:能够容忍单台服务器不可用,自动无损切换。
  • 机房(Zone)级无损容灾:能够容忍单个机房不可用,自动无损切换。
  • 地区(Region)级无损容灾:能够容忍某个城市整体不可用,自动无损切换。

当数据库集群部署在一个机房的多台服务器时,实现服务器级别容灾。当集群的服务器在一个地区的多个机房中时,能够实现机房级别容灾。当集群的服务器在多个地区的多个机房中时,能够实现地区级别容灾。

OceanBase 数据库的容灾能力可以达到 RPO=0,RTO=30 秒的国标最高的 6 级标准。

高可用

OceanBase 分布式集群的多台机器同时提供数据库服务,并利用多台机器提供数据库服务高可用的能力。在上图中,应用层将请求发送到代理服务(ODP,也称为 OBProxy),经过代理服务的路由后,发送到实际服务数据的数据库节点(OBServer),请求的结果沿着反向的路径返回给应用层。整个过程中不同的组件通过不同的方式来达到高可用的能力。

在数据库节点(OBServer)组成的集群中,所有的数据以分区为单位存储并提供高可用的服务能力,每个分区有多个副本。一般来说,一个分区的多个副本分散在多个不同的 Zone 里。多个副本中有且只有一个副本接受修改操作,叫做主副本(Leader),其他叫做从副本(Follower)。主从副本之间通过基于 Multi-Paxos 的分布式共识协议实现了副本之间数据的一致性。当主副本所在节点发生故障的时候,一个从节点会被选举为新的主节点并继续提供服务。

选举服务是高可用的基石,分区的多个副本通过选举协议选择其中一个作为主副本(Leader),在集群重新启动时或者主副本出现故障时,都会进行这样的选举。选举服务依赖集群中各台机器时钟的一致性,每台机器之间的时钟误差不能超过 200 毫秒,集群的每台机器应部署 NTP 或其他时钟同步服务以保证时钟一致。选举服务有优先级机制保证选择更优的副本作为主副本,优先级机制会考虑用户指定的 Primary Zone,考虑机器的异常状态等。

当主副本开始服务后,用户的操作会产生新的数据修改,所有的修改都会产生日志,并同步给其他的备副本(Follower)。OceanBase 数据库同步日志信息的协议是 Multi-Paxos 分布式共识协议。Multi-Paxos 协议保证任何需要达成共识的日志信息,在副本列表中的多数派副本持久化成功后即可保证,在任意少数派副本故障时,信息不会丢失。Multi-Paxos 协议同步的多个副本保证了在少数节点故障时系统的两个重要特性:数据不会丢失、服务不会停止。用户写入的数据可以容忍少数节点的故障,同时,在节点故障时,系统总是可以自动选择新的副本作为主副本继续数据库的服务。

OceanBase 数据库每个租户还有一个全局时间戳服务(GTS),为租户内执行的所有事务提供事务的读取快照版本和提交版本,保证全局的事务顺序。如果全局时间戳服务出现异常,租户的事务相关操作都会受到影响。OceanBase 数据库使用与分区副本一致的方案保证全局时间戳服务的可靠性与可用性。租户内的全局时间戳服务实际会由一个特殊的分区来决定其服务的位置,这个特殊分区与其他分区一样也有多副本,并通过选举服务选择一个主副本,主副本所在节点就是全局时间戳服务所在节点。如果这个节点出现故障,特殊分区会选择另一个副本作为主副本继续工作,全局时间戳服务也自动转移到新的主副本所在节点继续提供服务。

以上是数据库集群节点实现高可用的关键组件,代理服务(ODP,也称为 OBProxy)也需要高可用能力来保证其服务。用户请求首先到达的是代理服务,如果代理服务不正常用户请求也无法被正常服务。代理服务还需要处理数据库集群节点故障,并做出响应的容错处理。

代理服务不同于数据库集群,代理服务没有持久化状态,其工作依赖的所有数据库信息都来自于对数据库服务的访问,所以代理服务故障不会导致数据丢失。代理服务也是由多台节点组成集群服务,用户的请求具体会由哪个代理服务节点来执行,应由用户的F5或者其他负载均衡组件负责,同时代理服务的某台节点故障,也应由负载均衡组件自动剔除,保证之后的请求不会再发送到故障节点上。

代理服务工作过程会实时监控数据库集群的状态,一方面代理服务会实时获取集群系统表,通过系统表了解每台机器的健康状态和分区的实时位置,另一方面代理服务会通过网络连接探测数据库集群节点的服务状态,遇到异常时会标记相应节点的故障状态,并进行相应的服务切换。

容灾部署方案

OceanBase 数据库提供多种部署模式,可根据对机房配置以及性能和可用性的需求进行灵活选择。

部署方案 容灾能力 RTO RPO
同机房三副本 机器级无损容灾 / 机架级无损容灾 8s 内 0
同城三机房 机房级无损容灾 8s 内 0
三地三中心五副本 地域级无损容灾 8s内 0

为了达到不同级别的容灾能力,社区版 OceanBase 数据库提供了多副本高可用解决方案。多副本高可用解决方案基于 Paxos 协议实现,在少数派副本不可用情况下,能够自动恢复服务,并且不丢数据,始终保证 RTO 在 8 秒内,RPO 为 0。

同机房三副本

如果只有一个机房,可以部署三副本或更多副本,来达到机器级无损容灾。当单台 server 或少数派 server 宕机情况下,不影响业务服务,不丢数据。如果一个机房内有多个机架,可以为每个机架部署一个 Zone,从而达到机架级无损容灾。

同城三机房

如果同城具备三机房条件,可以为每个机房部署一个 Zone,从而达到机房级无损容灾能力。任何一个机房不可用时,可以利用剩下的两个机房继续提供服务,不丢失数据。

三地三中心五副本

为了支持地区级无损容灾,通过 Paxos 协议的原理可以证明,至少需要 3 个地区。OceanBase 数据库采用的是两地三中心的变种方案:三地三中心五副本。该方案包含三个城市,每个城市一个机房,前两个城市的机房各有两个副本,第三个城市的机房只有一个副本。和两地三中心的不同点在于,每次执行事务至少需要同步到两个城市,需要业务容忍异地复制的延时。

三地五中心五副本

和三地三中心五副本类似,不同点在于,三地五中心会把每个副本部署到不同的机房,进一步强化机房容灾能力。

部署流程:

当前架构规划:同机房三副本,机器级无损容灾 / 机架级无损容灾

三台物理服务器安装OBserver、OceanBase,三台虚拟机安装OBproxy

规划磁盘:

OceanBase 数据库的服务器依赖数据盘、事务日志盘和

OceanBase 数据库的安装盘。

  • 数据盘

    数据盘的配置参数为 data_dir。数据盘用来存储基线数据。在您首次启动 OceanBase 数据库时,${data_dir}/sstable 将自动创建。数据盘的大小由 datafile_disk_percentage 参数决定。datafile_disk_percentage 的默认值为 95data_dir 创建后无法调整大小。您可以通过加减机器为 OceanBase 数据库进行扩容和缩容。目前,OceanBase 数据库不支持单机的磁盘级扩容和缩容。

  • 事务日志盘

    事务日志盘的配置参数为 redo_dir。建议您将事务日志盘的大小设置为 OceanBase 数据库内存的 3 倍到 4 倍及以上。事务日志盘包含多个固定大小的文件。这些文件位于安装目录 ${redo_dir}/{clog,ilog,slog} 下。您可以根据您的需要自动创建和清除事务日志。事务日志达到磁盘总量的 80% 时,将触发自动清除。但是,只有事务日志对应的内存数据已经合并融至基线数据中时,事务日志才能被删除。在相同数据量的情况下,事务日志的大小约为内存数据大小的三倍。因此事务日志盘所需空间上限与两次合并后的数据总量成正比。经验公式:事务日志文件大小 = 增量数据内存上限的 3 到 4 倍。

  • OceanBase 数据库安装盘

    OceanBase 数据库安装盘的配置参数为 home_path。建议您为 OceanBase 数据库安装盘预留至少 200 G 空间,以保存 7 天及以上的日志。OceanBase 数据库的 RPM 包安装目录位于 ${home_path} 下。其中,基线数据文件和事务日志文件会通过软链接分别指向独立的数据盘和事务日志盘。OceanBase 数据库的运行日志位于 ${home_path}/log 下。运行日志会不断增长,并且 OceanBase 数据库无法自动删除运行日志。因此您需要定时删除运行日志。

image-20230216175609473

8C16G为例:数据盘200G,事务日志盘60G(内存的3倍以上),运行日志盘100G(保留7天及以上)

  • /data 为数据盘。

  • /redo 存放 redo 日志。

  • /home/admin/oceanbase 存放 OceanBase 数据库的二进制文件和运行日志。

名词解释

  • 中控机器

    存储 OceanBase 数据库安装包和集群配置信息的机器。

  • 目标机器

    安装 OceanBase 数据库的机器。

前提条件

中控机器要免密登录所有目标机器。

节省机器,中控机在第一个节点运行

架构图:

image-20230216175842391

系统基础环境优化: https://www.oceanbase.com/docs/community-observer-cn-10000000000900490

#从部署机上下载安装包
#安装包地址:https://open.oceanbase.com/softwareCenter/community
从 V4.0.0 开始,OceanBase 提供统一的安装包 all-in-one package。您可以通过这个统一的安装包一次性完成 OBD、OceanBase 数据库、OBProxy、obagent、Grafana 和 Prometheus 的安装;您可以根据实际需求选择部分组件安装或者指定组件的版本。
 
cd /home/admin/oceanbase/
#把下载好的安装包解压
tar zxf oceanbase-all-in-one.4.0.0.0-beta-100120221102135736.el7.x86_64.tar.gz
cd oceanbase-all-in-one/bin/
 
#该命令是安装部署机的obd和客户端,其它节点不需要安装。下面的流程使用OBD命令安装集群的时候,会把部署机的安装包发过去,自动安装
./install.sh
 
which obd
which obclient
chown -R admin.admin /home/admin/
su - admin
 
#obd工具的机器上,安装python模块。
#注意:anolis 8.6版本的python命令路径是/usr/libexec/platform-python
#先安装pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
/usr/libexec/platform-python get-pip.py
pip install pymysql
/usr/libexec/platform-python -m pip install --upgrade pip
 
#检查.oceanbase-all-in-one/obd/usr/obd/lib/site-packages/ 目录下面是否有pymysql
ls /root/.oceanbase-all-in-one/obd/usr/obd/lib/site-packages/
 
#创建/usr/obd/lib/site-packages目录,把模块复制过去。否则会启动集群失败!
mkdir -p /usr/obd/lib/site-packages
cp -r /root/.oceanbase-all-in-one/obd/usr/obd/lib/site-packages/* /usr/obd/lib/site-packages/
 
 
 
#配置 SSH 免密登录【admin】3台机器执行
ssh-keygen -t rsa
#复制key到oceanbase1机器,3台机器都执行
ssh-copy-id oceanbase-zone1-d1
ssh-copy-id oceanbase-zone2-d2
ssh-copy-id oceanbase-zone3-d3
#复制keygc另外两台机器
scp /home/admin/.ssh/authorized_keys oceanbase-zone2-d2:/home/admin/.ssh
scp /home/admin/.ssh/authorized_keys oceanbase-zone3-d3:/home/admin/.ssh
 
 
#如果obproxy是另外3台机器独立部署,则需要创建admin用户。3台obproxy机器执行
useradd -U admin -d /home/admin -s /bin/bash
sudo chown -R admin:admin /home/admin
echo "oceanbase#123" | passwd --stdin admin
 
echo 'admin       ALL=(ALL)       NOPASSWD: ALL' >> /etc/sudoers
chown -R admin:admin /home/admin
su - admin
ssh-keygen -t rsa
chmod u+s /usr/sbin/ping
 
#然后部署机的节点,需要再添加obproxy节点的hosts和ip地址,如果obproxy在oceanbase这三台机器上运行,则可以忽略。
cat >> /etc/hosts << 'EOF'
192.168.28.54 oceanbase-obproxy-d1
192.168.28.55 oceanbase-obproxy-d2
192.168.28.56 oceanbase-obproxy-d3
EOF
 
ssh-copy-id oceanbase-obproxy-d1
ssh-copy-id oceanbase-obproxy-d2
ssh-copy-id oceanbase-obproxy-d3
#复制keygc另外两台机器
scp /home/admin/.ssh/authorized_keys oceanbase-obproxy-d1:/home/admin/.ssh
scp /home/admin/.ssh/authorized_keys oceanbase-obproxy-d2:/home/admin/.ssh
scp /home/admin/.ssh/authorized_keys oceanbase-obproxy-d3:/home/admin/.ssh
 
 
 
#安装oceanbase数据库,修改配置文件。注意需要根据服务器内存和cpu进行调整!
#修改用户名和密码。每台机器的 IP、home_path、data_dir 和 redo_dir。
 
vim conf/distributed-with-obproxy-example.yaml
## Only need to configure when remote login is required。注释取消,填写admin用户密码、密钥
user:
  username: admin
  password: 123456
  key_file: /home/admin/.ssh/id_rsa
#   port: your ssh port, default 22
#   timeout: ssh connection timeout (second), default 30
oceanbase-ce:
  servers:
    - name: server1
      # Please don't use hostname, only IP can be supported。修改对应的ip地址,name名字需要与下面的对应
      ip: 192.168.28.57
    - name: server2
      ip: 192.168.28.58
    - name: server3
      ip: 192.168.28.59
  global:
    # Please set devname as the network adaptor's name whose ip is  in the setting of severs.
    # if set severs as "127.0.0.1", please set devname as "lo"
    # if current ip is 192.168.1.10, and the ip's network adaptor's name is "eth0", please use "eth0"。 修改对应的网卡名字
    devname: eth0
    # if current hardware's memory capacity is smaller than 50G, please use the setting of "mini-single-example.yaml" and do a small adjustment.
    memory_limit: 16G # The maximum running memory for an observer。 默认是64G,改成虚拟机对应的大小。开启了生产环境最低16G
    # The reserved system memory. system_memory is reserved for general tenants. The default value is 30G. 默认30G,改成4G
    system_memory: 4G
    #datafile_size: 192G # Size of the data file. 自动生成的,注释掉。如果盘不够该容量大,会安装报错
    #log_disk_size: 192G # The size of disk space used by the clog files. 注释掉,这个是日志盘的容量,如果盘不够大,则会报错
    syslog_level: INFO # System log level. The default value is INFO. 保持默认
    enable_syslog_wf: false # Print system logs whose levels are higher than WARNING to a separate log file. The default value is true.
    enable_syslog_recycle: true # Enable auto system log recycling or not. The default value is false. 保持默认
    max_syslog_file_count: 4 # The maximum number of reserved log files before enabling auto recycling. The default value is 0. 保持默认
    # observer cluster name, consistent with obproxy's cluster_name
    appname: obcluster
    # root_password: # root user password, can be empty
    root_password: xxxxxxxxUN3
    # proxyro_password: # proxyro user pasword, consistent with obproxy's observer_sys_password, can be empty
    proxyro_password: 123456
  # In this example , support multiple ob process in single node, so different process use different ports.
  # If deploy ob cluster in multiple nodes, the port and path setting can be same.
  server1:
    mysql_port: 2881 # External port for OceanBase Database. The default value is 2881. DO NOT change this value after the cluster is started.
    rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882. DO NOT change this value after the cluster is started.
    #  The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field. 下面需要加上对应的路径
    home_path: /home/admin/oceanbase/ob
    data_dir: /data/ob
    redo_dir: /redo/ob
    # The directory for data storage. The default value is $home_path/store.
    # data_dir: /data
    # The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
    # redo_dir: /redo
    zone: zone1
  server2:
    mysql_port: 2881 # External port for OceanBase Database. The default value is 2881. DO NOT change this value after the cluster is started.
    rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882. DO NOT change this value after the cluster is started.
    #  The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
    home_path: /home/admin/oceanbase/ob
    data_dir: /data/ob
    redo_dir: /redo/ob
    # The directory for data storage. The default value is $home_path/store.
    # data_dir: /data
    # The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
    # redo_dir: /redo
    zone: zone2
  server3:
    mysql_port: 2881 # External port for OceanBase Database. The default value is 2881. DO NOT change this value after the cluster is started.
    rpc_port: 2882 # Internal port for OceanBase Database. The default value is 2882. DO NOT change this value after the cluster is started.
    #  The working directory for OceanBase Database. OceanBase Database is started under this directory. This is a required field.
    home_path: /home/admin/oceanbase/ob
    data_dir: /data/ob
    redo_dir: /redo/ob
    # The directory for data storage. The default value is $home_path/store.
    # data_dir: /data
    # The directory for clog, ilog, and slog. The default value is the same as the data_dir value.
    # redo_dir: /redo
    zone: zone3
obproxy-ce:
  # Set dependent components for the component.
  # When the associated configurations are not done, OBD will automatically get the these configurations from the dependent components.
  depends:
    - oceanbase-ce
  servers:
    - 192.168.28.54
    - 192.168.28.55
    - 192.168.28.56
  global:
    listen_port: 2883 # External port. The default value is 2883.
    prometheus_listen_port: 2884 # The Prometheus port. The default value is 2884.
    home_path: /home/admin/obproxy
    # oceanbase root server list
    # format: ip:mysql_port;ip:mysql_port. When a depends exists, OBD gets this value from the oceanbase-ce of the depends. 取消注释,修改对应的ip
    rs_list: 192.168.28.57:2881;192.168.28.58:2881;192.168.28.59:2881
    enable_cluster_checkout: false
    # observer cluster name, consistent with oceanbase-ce's appname. When a depends exists, OBD gets this value from the oceanbase-ce of the depends. 取消注释,集群名字
    cluster_name: obcluster
    skip_proxy_sys_private_check: true
    enable_strict_kernel_release: false
    # obproxy_sys_password: # obproxy sys user password, can be empty. When a depends exists, OBD gets this value from the oceanbase-ce of the depends.注释
    # observer_sys_password: # proxyro user pasword, consistent with oceanbase-ce's proxyro_password, can be empty. When a depends exists, OBD gets this value from the oceanbase-ce of the depends.注释
    observer_root_password: xxxxxxxxUN3
    obproxy_sys_password: 123456  #这是proxysys用户,obproxy的超级管理员,可自定义。
    observer_sys_password: 123456 #这是proxyro用户的密码,需要跟上面设置的proxyro_password一致
 
 
#部署oceanbase集群。obcluster是配置文件里面的集群名字

 
#下载同版本的 oceanbase-ce-utils.rpm包

#把rpm包解压,默认在当前路径的./usr/bin/ob_admin

#把ob_admin脚本分发到每个ob节点的安装目录bin下

 
#首先需要扩容sys系统租户,默认是1C的。否则后面会出现内存不足,无法登录和连接。需要kill -9 observer,然后使用obd命令启动!

#租户下设置会话全局变量,防止超时,单位为微秒。

#该步骤是测试的,注意,首先创建资源单元,设定cpu、memory、iops等。才能创建其它资源池并使用。
#创建的资源单元实际上是资源单元的模版。可以被其他多个不同的资源池使用。比如,资源单元 unit1 创建后,可以创建资源池 pool1 和 pool2 并且 pool1 和 pool2 均使用 unit1 资源单元的配置。
#根据实际场景,自定义配置。
#配置文档:https://www.oceanbase.com/docs/community-observer-cn-10000000000901659
#创建资源单元后,就可以在创建资源池时指定资源单元,并最终分配给相应的租户。租户即实例
#修改资源单元的命令

#查看资源单元。使用 root 用户登录数据库的 sys 租户。

#创建资源池。没有配置资源单元是无法创建资源池的
#文档:https://www.oceanbase.com/docs/community-observer-cn-10000000000901661
#资源池创建后,将资源池分配给租户,也可以修改资源池

#查看资源池

#创建租户,并将资源池分配给租户使用。创建很慢,需要耐心等待
#每个资源池仅能绑定给一个租户,并且在创建租户时,一个租户仅支持指定一个资源池。

 
 
# OCP 接管 OBD 部署的集群前,先使用如下命令检查是否满足接管条件。https://www.oceanbase.com/docs/community-obd-cn-10000000000900362
obd cluster check4ocp obcluster
#报错提示需要修改root密码和设置IDC信息
[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.
 
#设置IDC信息。先把配置文件转换成集群模式的配置文件,然后再热更新IDC信息
obd cluster chst obcluster -c oceanbase-ce --style cluster
obd cluster edit-config obcluster
#然后热更新配置,添加以下配置:
  zones:
    zone1:
      idc: sz
      servers:
      - name: server1
        ip: 192.168.28.57
    zone2:
      idc: gx
      servers:
      - name: server2
        ip: 192.168.28.58
    zone3:
      idc: hz
      servers:
      - name: server3
        ip: 192.168.28.59
 
#热更新完配置文件,然后需要重载配置文件。
obd cluster reload obcluster
 
#这里是设置sys系统root密码,如果yaml文件配置好了密码,这里就可以省略操作。
#配置root密码,使用 OCP 接管集群时需要填写 sys 租户下 root 用户连接集群的密码。首先需要把上面的集群风格,改回默认风格。https://www.oceanbase.com/docs/community-obd-cn-10000000000900362
obd cluster chst obcluster -c oceanbase-ce --style default
obd cluster edit-config obcluster
#在global全局配置,添加一行root_password配置:
root_password: xxxxxx
 
#修改完之后,重载配置
obd cluster reload obcluster
 
#再次检查是否满足OCP接管集群的条件,如果满足条件。则需要部署OCP管理平台
obd cluster check4ocp obcluster
 
 
#部署OCP管理平台,需要部署docker。另外创建一台虚拟机部署。
#部署文档:https://www.oceanbase.com/docs/community-ocp-cn-10000000000866614
#主机规划文档:https://www.oceanbase.com/docs/community-ocp-cn-10000000000866510
#创建虚拟机部署OCP需要规划磁盘:https://www.oceanbase.com/docs/community-ocp-cn-10000000000866511
1、需要创建2个租户(数据库),分别是MetaDB、MonitorDB
2、修改OCP配置文件
3、需要使用admin普通用户并免密ssh登录
流程:
#登录系统的root@sys最高权限,创建meta的资源单元、资源池、租户。注意cpu、memory的限制,根据实际情况修改。至少4C8G。注意修改对应的名字和关系
 
创建资源单元:

创建资源池:

创建租户:

#重要:登录root@sys系统租户,授权白名单给普通租户,否则普通租户的root权限也登录不了!

#注意了:默认新的租户root是没有密码的,需要手动修改。登录到租户的root用户,修改自身密码!否则下面创建OCP的时候,会提示无法连接,没有权限连接等问题!
#登录的解释:使用租户的root用户,登录并进入meta_tenant租户里,属于obcluster集群。(非oceanbase集群系统租户的root用户,只有root@sys才是系统的最高权限!)

 
#登录系统的root@sys最高权限,创建monitor的资源单元、资源池、租户。至少4C16G
#重要:登录root@sys系统租户,授权白名单给普通租户,否则普通租户的root权限也登录不了!

创建资源单元:

创建资源池:

创建租户:

授权访问:

#注意:默认新的租户root是没有密码的,需要手动修改。登录到租户的root用户,修改自身密码!否则下面创建OCP的时候,会提示无法连接,没有权限连接等问题!
#登录的解释:使用租户的root用户,登录并进入monitor_tenant租户里,属于obcluster集群。(非oceanbase集群系统租户的root用户,只有root@sys才是系统的最高权限!)

#查看租户
SELECT * FROM oceanbase.DBA_OB_TENANTS\G
 
#查看资源单元。
SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS\G
 
#查看资源池
select * from oceanbase.DBA_OB_RESOURCE_POOLS\G;
 
 
#查看所有租户下的普通用户
直连observer的方式:
obclient -h127.0.0.1 -uroot@sys -P2881 -pxxxxxxxxUN3
 
连接obproxy的方式:
obclient -h192.168.28.56 -P2883 -uroot@sys -pxxxxxxxxUN3
 
select user,password from mysql.user;
 
 
 
#注意:需要登录租户级别的root用户,创建meta数据库。root@sys是系统集群级别的数据库,别搞混了
obclient -h192.168.28.54 -P2883 -uroot@meta_tenant#obcluster -p'xxxxxxxxUN3'
CREATE DATABASE meta_database DEFAULT CHARACTER SET UTF8;
 
#需要登录租户级别的root用户,创建meta租户的普通用户,创建用户。
obclient -h192.168.28.54 -P2883 -uroot@meta_tenant#obcluster -p'xxxxxxxxUN3'
CREATE USER IF NOT EXISTS meta_user IDENTIFIED BY 'fhx@HE65';
 
#需要登录租户级别的root用户,把meta数据库授权给meta用户,租户级别下数据库级别权限。
obclient -h192.168.28.54 -P2883 -uroot@meta_tenant#obcluster -p'xxxxxxxxUN3'
GRANT ALL ON *.* TO meta_user;
SHOW GRANTS FOR meta_user;
 
 
 
 
#注意:需要登录租户级别的root用户,创建monitor数据库。
obclient -h192.168.28.54 -P2883 -uroot@monitor_tenant#obcluster -p'xxxxxxxxUN3'
CREATE DATABASE monitor_database DEFAULT CHARACTER SET UTF8;
 
#需要登录租户级别的root用户,创建monitor租户的普通用户,创建用户。
obclient -h192.168.28.54 -P2883 -uroot@monitor_tenant#obcluster -p'xxxxxxxxUN3'
CREATE USER IF NOT EXISTS monitor_user IDENTIFIED BY 'fhx@HE65';
 
#需要登录租户级别的root用户,把monitor数据库授权给monitor用户,租户下的数据库级别权限。
GRANT ALL ON *.* TO monitor_user;
SHOW GRANTS FOR monitor_user;
 
 
 
 
 
#开始部署OCP管理平台,系统优化
echo never > /sys/kernel/mm/transparent_hugepage/enabled
 
#所有机器都执行,需要ssh免密登录
yum install -y expect
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
 
#密码更换,自己的root密码
export mypass=xxxxxxxxx
 
name=(oceanbase-zone1-d1 oceanbase-zone2-d2 oceanbase-zone3-d3 oceanbase-obproxy-d1 oceanbase-obproxy-d2 oceanbase-obproxy-d3)
 
cat >> /etc/hosts <<'EOF'
192.168.28.57 oceanbase-zone1-d1
192.168.28.58 oceanbase-zone2-d2
192.168.28.59 oceanbase-zone3-d3
192.168.28.54 oceanbase-obproxy-d1
192.168.28.55 oceanbase-obproxy-d2
192.168.28.56 oceanbase-obproxy-d3
EOF
 
for i in ${name[@]};do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
  expect {
    \"*yes/no*\" {send \"yes\r\"; exp_continue}
    \"*password*\" {send \"$mypass\r\"; exp_continue}
    \"*Password*\" {send \"$mypass\r\";}
  }"
done
 
#每台节点都创建admin用户
useradd -U admin -d /home/admin -s /bin/bash
sudo chown -R admin:admin /home/admin
echo "123456" | passwd --stdin admin
 
echo 'admin       ALL=(ALL)       NOPASSWD: ALL' >> /etc/sudoers
chown -R admin:admin /home/admin
 
 
#然后把OCP的tar包放到任意目录,解压修改配置文件。
tar zxf ocp-4.0.0-ce-x86_64.tar.gz
 
#然后修改配置文件
 cat config.yaml
# OCP deploy config
# Note:
# Do not use 127.0.0.1 or hostname as server address
# When a server has both public ip and private ip, if private ip is connectable, use private ip for faster connection
# If a vip is configured, it should be already created and bonded to the right server and port, the installation script won't do any work with vip maintainance, just use it to connect to the service
 
# Ignore precheck errors
# It's recommanded to not ignore precheck errors
precheck_ignore: true
 
# Create an obcluster as OCP's metadb
create_metadb_cluster: false
 
# Clean OCP's metadb cluster when uninstall
clean_metadb_cluster: false
 
# Metadb cluster deploy config
ob_cluster:
  name: obcluster
  home_path: /home/admin/oceanbase
  root_password: 'xxxxxxxxUN3'
  # The directory for data storage, it's recommanded to use an independent path
  data_path: /home/admin/data
  # The directory for clog, ilog, and slog, it's recommanded to use an independent path.
  redo_path: /home/admin/logs
  sql_port: 2881
  rpc_port: 2882
  zones:
    - name: zone1
      servers:
        - 192.168.28.57
    - name: zone2
      servers:
        - 192.168.28.58
    - name: zone3
      servers:
        - 192.168.28.59
  ## custom obd config for obcluster
  #custom_config:
  #  - key: devname
  #    value: eth0
  #  - key: cpu_count
  #    value: 0
  #  - key: memory_limit
  #    value: 0G
  #  - key: system_memory
  #    value: 8G
  #  - key: __min_full_resource_pool_memory
  #    value: 2147483648
  #  - key: datafile_maxsize
  #    value: 0
  #  - key: datafile_next
  #    value: 0
 
  # Meta user info
  meta:
    tenant: meta_tenant
    user: meta_user
    password: 'fhx@HE65'
    database: meta_database
    cpu: 2
    # Memory configs in GB, 4 means 4GB
    memory: 2
 
  # Monitor user info
  monitor:
    tenant: monitor_tenant
    user: monitor_user
    password: 'fhx@HE65'
    database: monitor_database
    cpu: 2
    # Memory configs in GB, 8 means 8GB
    memory: 2
 
# Obproxy to connect metadb cluster
obproxy:
  home_path: /home/admin/obproxy
  port: 2883
  servers:
    - 192.168.28.54
    - 192.168.28.55
    - 192.168.28.56
 
  ## custom config for obproxy
  # custom_config:
  #   - key: clustername
  #     value: obcluster
 
 
  ## Vip is optional, if vip is not configured, one of obproxy servers's address will be used
  # vip:
  #   address: 1.1.1.1
  #   port: 2883
 
# Ssh auth config
ssh:
  port: 22
  user: root
  # auth method, support password and pubkey
  auth_method: password
  timeout: 10
  password: xxxxxxxxUN3
 
# OCP config
ocp:
  # ocp container's name
  name: 'ocp'
 
  # OCP process listen port and log dir on host
  process:
    port: 8080
    log_dir: /tmp/ocp/log
  servers:
    - 192.168.28.62
  # OCP container's resource
  resource:
    cpu: 4
    # Memory configs in GB, 8 means 8GB
    memory: 8
  # Vip is optional, if vip is not configured, one of ocp servers's address will be used
  # vip:
  #   address: 1.1.1.1
  #   port: 8080
  # OCP basic auth config, used when upgrade ocp
  auth:
    user: admin
    password: xxxxxxxxUN3
  options:
    # enable front-end tracking, non-business sensitive data such as system information, user behavior, and front-end anomalies will be collected to improve the product experience and stability
    enable_web_tracking: false
  # OCP metadb config, for ocp installation, if "create_metadb_cluster" is configured true, this part will be replaced with the configuration of metadb cluster and obproxy
  metadb:
    host: 192.168.28.54 #注意,这里不能写haproxy和vip,否则无法启动。除非在上面注释掉的VIP填写相关信息
    port: 2883
    meta_user: meta_user@meta_tenant#obcluster
    meta_password: 'fhx@HE65'
    meta_database: meta_database
    monitor_user: monitor_user@monitor_tenant#obcluster
    monitor_password: 'fhx@HE65'
    monitor_database: monitor_database
 
 
#由于OCP启动检测时间太短,默认3分钟启动不成功就会提示检测失败。还有默认内存预占用是总内存的70%,降低成20%。需要重新制作镜像覆盖原镜像!!!OCP是预占用机制
cat > /home/admin/ocp-4.0.0-ce-x86_64/Dockerfile-ocp-all-in-one <<'EOF'
FROM reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce
 
RUN sed -i 's@1024 \* 7 / 10@1024 * 5 / 10@g' /home/admin/ocp-server/bin/ocp-server && cat /home/admin/ocp-server/bin/ocp-server
EOF
 
docker build -f ./Dockerfile-ocp-all-in-one -t reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce .
 
 
cat > /home/admin/ocp-4.0.0-ce-x86_64/Dockerfile << 'EOF'
FROM reg.docker.alibaba-inc.com/ocp2/ocp-installer:4.0.0-ce-x86_64
 
RUN sed -i 's@check_wait_time = 180@check_wait_time = 3600@g' /root/installer/task/ocp_check.py && cat /root/installer/task/ocp_check.py
EOF
 
docker build -f ./Dockerfile -t reg.docker.alibaba-inc.com/ocp2/ocp-installer:4.0.0-ce-x86_64 .
 
rm -rf ocp-installer.tar.gz
rm -rf ocp.tar.gz
docker save > ocp-installer.tar.gz reg.docker.alibaba-inc.com/ocp2/ocp-installer:4.0.0-ce-x86_64
docker save > ocp.tar.gz reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:v4.0.0-ce
 
 
 
#然后执行安装脚本,该过程非常久,耐心等待。可以开另一个窗口,打开docker容器的日志查看进度。
./ocp_installer.sh install -c config.yaml -i ./ocp-installer.tar.gz -o ./ocp.tar.gz
 
#这个是重新启动的命令,重启之前,先把容器删掉。如果已经安装好的,则只能使用该重启命令
docker stop ocp && docker rm ocp
./ocp_installer.sh replace  -c config.yaml -i ./ocp-installer.tar.gz -o ./ocp.tar.gz
 
 
#注意,执行完上面的安装脚本,如果提示检查失败,则是启动非常慢,而超过了默认的3分钟检查机制导致提示失败,如上面重新自定义镜像,则会延长至60分钟的检测机制。
#问答贴:https://ask.oceanbase.com/t/topic/35601903/12
报错检查失败:
2022-12-08 15:21:05 - INFO - 1 - [ocp_check.py:23] - query ocp to check...
2022-12-08 15:21:05 - INFO - 1 - [ocp_check.py:30] - ocp still not active
^CTraceback (most recent call last):
  File "pipeline/replace_ocp.py", line 33, in <module>
    run(context)
  File "pipeline/replace_ocp.py", line 23, in run
    replace_ocp_pipeline.run()
  File "/root/installer/core/pipeline.py", line 10, in run
    task.run()
  File "/root/installer/task/ocp_check.py", line 31, in run
    time.sleep(5)
KeyboardInterrupt
 
#检查进程,如果进程还在,端口没有,则需要继续等待,启动非常慢!同时查看是否有错误日志
ps -ef|grep admin
ss -lntup|grep 8080
tail -f -n 200 /tmp/ocp/log/ocp/ocp-server.0.err
 
#如果很久都还没有启动成功,docker日志提示反复重启,exit退出又启动,则需要检查数据库是否能成功连接,有可能内存不足导致无法连接。也可以进容器内部查看ocp.log日志,如果看到连接ob超时,大概率就是observer数据库挂掉了,可能内存不足!
第一种可能:observer数据库内存不足挂掉,导致ocp连接超时
第二种可能:ocp机器内存或cpu不足
 
#等待启动完成后,访问OCP页面,默认初始密码是:
http://192.168.28.62:8080/
账户:admin
密码:aaAA11__
 
#随后会跳转到强制修改密码
*g2uqK58PGC@2
 
#然后修改系统参数,把登录连续输错5次密码就会拒绝登录的参数调大。
搜索:login
 
 
#然后去云平台执行下面的接管流程

https://www.oceanbase.com/docs/community-ocp-cn-10000000000866526

#每台oceanbase节点都需要安装python2.7,否则接管集群失败!!!Anolis-8.6默认没有python2,所以需要下载安装` `dnf ``install` `python2 -y

image-20230216180148530

新增凭据和打上机型的名字
image-20230216180203808


详细版请联系


#OCP注意事项,如果上一个任务未完成或已暂停状态,则无法继续执行下一个任务,必须取消上一个任务

#还需手动把oceanbase-ce-utils包里面的ob_admin脚本放到每个ob节点安装目录bin下,赋予admin权限。否则OCP上面无法显示物理备份可恢复备份的区间范围

OBD运行参数命令和配置文件模板

https://www.oceanbase.com/docs/community-obd-cn-10000000001031927

配置文件说明:https://www.oceanbase.com/docs/community-obd-cn-10000000001031923

obd的运行命令:https://www.oceanbase.com/docs/community-obd-cn-10000000001031933

报错系列:

obd安装集群报错无法ping通的问题

实际上网卡名字是对的,并且每个节点的ssh免密登录。报错:
image-20230216180240758
解决方法:

chmod u+s /usr/sbin/ping

obd安装集群报错 import connect failed

报错截图:

image-20230216180250306

查看obd日志:

tail -f -n 200 .obd/log/obd

image-20230216180307259

解决方法:缺少python模块,需要安装pymysql模块。然后把模块复制到/usr/obd/lib/site-packages

特别注意,禁用此命令!obd cluster destroy

该命令会导致整个oceabase集群所有组件都直接删除。目前obd没有单独卸载或安装单个组件的功能!

如果使用ocp的话,是可以单独部署、清除obproxy的

如果需要单独删除obproxy集群,则需要去obproxy节点手动停止并删除相关目录。然后新增一份配置文件,不能使用原有的,配置文件必须只能新增obproxy的配置,否则会把原集群给覆盖掉。

只需要声明 obproxy-ce 这部分的OBD配置文件即可

obproxy-ce:
  depends:
    - oceanbase-ce
  servers:
    - 10.211.55.74
  global:
    home_path: /home/chris/obproxy
    skip_proxy_sys_private_check: true
    enable_strict_kernel_release: false
    listen_port: 2883
    prometheus_listen_port: 2884
    cluster_name: obcluster
    obproxy_sys_password: obproxy-sys
    observer_sys_password: obproxy
    rs_list: 10.211.55.74:2881;10.211.55.75:2881;10.211.55.76:2881
     
#然后换一个集群名字,不能使用现有集群的名字安装。
obd cluster deploy obproxy -c obd-proxy-add.yml
obd cluster start obproxy
obd cluster display obproxy