乐趣区

关于数据库:一文讲透|如何部署OceanBase社区版4x版

欢送拜访 OceanBase 官网获取更多信息:https://www.oceanbase.com/


作者简介: 孙宏鑫,OceanBase 技术专家,次要负责 oceanbase 开源生态,运维监控相干工作。

OceanBase 自开源以来随着用户的一直减少及应用场景的不断丰富,其部署状态逐步多元化,为了帮忙用户更流畅地在不同环境部署,本文将从体验场景和生产环境两方面别离介绍在主机、容器环境中如何部署 OceanBase。

环境筹备

家喻户晓,OceanBase 作为分布式数据库,以多正本的形式保证数据的可用性,在生产环境中至多要筹备 3 台机器,如果仅学习体验 OceanBase 的性能,应用 1 台机器部署单节点集群即可。

操作系统

OceanBase 反对部署在支流的 Linux 操作系统上,上面列出了罕用的操作系统:

  • Redhat / CentOS 7.x/8.x
  • SUSE / OpenSUSE 15.x
  • Anlios 7.x/8.x
  • Debian 9.x
  • Ubuntu 20.x

主机资源

下表列出了部署 OceanBase 所需的单台主机的资源,如果须要集群部署,举荐应用雷同规格的主机。

我的项目 资源大小 阐明
cpu 2c 生产环境举荐 4c 以上
内存 8G 生产环境举荐 16G 以上
磁盘 内存的 6 倍以上 举荐应用 SSD, 生产环境要配置多块磁盘,将日志盘和数据盘离开
文件系统 EXT4 戓 XFS 当数据超过 16T 时,应用 XFS

用户配置

OceanBase 能够应用任意有目录读写权限的用户进行部署,如果应用了多台主机,则要求这些主机应用雷同的用户和明码登录,或者配置同一个用户的免密登录 如果思考之后应用 OCP 接管部署的 OceanBase 集群,倡议应用 admin 用户进行部署。

时钟同步设置

分布式数据库产品是集群软件,对各个节点之间的工夫同步性有要求。OceanBase 要求所有节点之间的时间误差管制在 50ms 以内。理论生产环境 为了稳定性和性能思考,倡议时间误差管制在 10ms 以内。通常只有节点配置工夫同步服务器跟公网工夫放弃同步即可。实际上在企业机房里,企业会有对立的工夫服务器跟机房提供的工夫服务器或公网工夫服务器同步,OceanBase 节点只须要跟机房对立的工夫服务器进行同步即可

CentOS 或 RedHat 7.x 版本举荐应用 chrony 服务做工夫源。Chrony 是 NTP(Network Time Protocol,网络工夫协定,服务器工夫同步的一种协定)的另一种实现,与 ntpd 不同,它能够更快且更精确地同步零碎时钟,最大水平缩小工夫和频率误差。无关工夫同步技术请参考工夫同步产品官网介绍。

敞开防火墙

查看防火墙状态

systemctl status firewalld

如果输入后果非 inactive, 能够通过如下命令进行敞开

systemctl disable firewalld 
systemctl stop firewalld

敞开 SELinux

批改配置文件,将 SELINUX 的配置批改为disabled

vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

配置文件批改后只会重启后失效,还须要应用上面命令立刻失效。

setenforce 0

设置内核参数

批改配置文件

net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.ip_local_port_range = 3500 65535
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_slow_start_after_idle=0

vm.swappiness = 0
vm.min_free_kbytes = 2097152
vm.max_map_count=655360
fs.aio-max-nr=1048576

执行如下命令让配置失效

sysctl -p

批改会话变量设置

OceanBase 数据库过程波及的限度包含线程最大栈空间大小(Stack)、最大文件句柄数(Open Files)和 core 文件大小(Core File Size)。

在以后会话中进行批改

# 应用如下命令进行查看
ulimit -a

# 批改某一个变量
ulimit -c unlimited

批改配置文件,批改为以下推荐值

vi /etc/security/limits.conf

* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
* soft stack unlimited
* hard stack unlimited

退出以后会话并从新登录

主机间接部署 OceanBase

下载安装 oceanbase-all-in-one

首先,在线形式 应用以下命令能够间接下载并装置 oceanbase-all-in-one:

bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/oceanbase-all-in-one/installer.sh)"

其次,离线形式 从 OceanBase 社区下载核心 下载最新的 oceanbase-all-in-one 安装包, 应用以下命令解压:

tar -xzf oceanbase-all-in-one.4.0.0.0-beta-100120221102135736.el7.x86_64.tar.gz

应用以下命令执行装置脚本:

cd oceanbase-all-in-one
bin/install.sh

装置脚本会在主机上部署好 OBD 和 OBClient, 并且将携带的 rpm 包都导入到 OBD 的环境中,装置后的输入后果如下。

  Install Finished
  =====================================================================
  Setup Environment:     source ~/.oceanbase-all-in-one/bin/env.sh
  Quick Start:           obd demo
  More Details:          obd -h
  =====================================================================

在执行下一步操作之前,须要依据提醒设置环境变量,命令如下:

# set environment
source ~/.oceanbase-all-in-one/bin/env.sh
# check obd and obclient command
which obd
which obclient

部署启动 OceanBase

此处波及两种部署模式:疾速部署与集群部署,上面顺次介绍。

疾速启动 demo 环境

demo 部署形式采纳最小规格部署,部署的组件版本默认为最新版本默认部署的组件蕴含 oceanbase-ceobproxy-ceobagentgrafanaprometheus

# use obd demo command to quickly launch a demo cluster
obd demo

部署实现后,OBD 会将各个组件的连贯形式打印进去:

+---------------------------------------------+
|                   observer                  |
+-----------+---------+------+-------+--------+
| ip        | version | port | zone  | status |
+-----------+---------+------+-------+--------+
| 127.0.0.1 | 4.0.0.0 | 2881 | zone1 | ACTIVE |
+-----------+---------+------+-------+--------+
obclient -h127.0.0.1 -P2881 -uroot -Doceanbase
+---------------------------------------------+
|                   obproxy                   |
+-----------+------+-----------------+--------+
| ip        | port | prometheus_port | status |
+-----------+------+-----------------+--------+
| 127.0.0.1 | 2883 | 2884            | active |
+-----------+------+-----------------+--------+
obclient -h127.0.0.1 -P2883 -uroot -Doceanbase
+----------------------------------------------------+
|                      obagent                       |
+----------------+-------------+------------+--------+
| ip             | server_port | pprof_port | status |
+----------------+-------------+------------+--------+
| 172.30.135.208 | 8088        | 8089       | active |
+----------------+-------------+------------+--------+
+-------------------------------------------------------+
|                       prometheus                      |
+----------------------------+------+----------+--------+
| url                        | user | password | status |
+----------------------------+------+----------+--------+
| http://192.168.1.1:9090    |      |          | active |
+----------------------------+------+----------+--------+
+---------------------------------------------------------------------+
|                               grafana                               |
+----------------------------------------+-------+-----------+--------+
| url                                    | user  | password  | status |
+----------------------------------------+-------+-----------+--------+
| http://192.168.1.1:3000/d/oceanbase    | admin | oceanbase | active |
+----------------------------------------+-------+-----------+--------+

装置后,能够应用 OBClient 客户端连贯进行验证:

[root@****]# obclient -h127.0.0.1 -uroot -P2881
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 5751
Server version: 5.6.25 OceanBase 4.0.0 (r10100032022041510-a09d3134c10665f03fd56d7f8bdd413b2b771977) (Built Oct 15 2022 02:16:22)

Copyright (c) 2000, 2022, OceanBase and/or its affiliates. All  rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient> 

通过拜访 grafana 地址,能够查问 oceanbase 的监控图表,在进行性能测试的时候,能够直观的进行观测。

集群模式部署

OBD 反对以配置文件的形式进行配置,能够参考配置文件 OBD 的阐明,本文次要介绍 oceanbase-all-in-one 提供的白屏方。

应用以下命令拉起白屏服务:

# obd-web without parameter
obd-web
# obd-web with specific port
obd-web -p <port>

白屏服务反对通过 -p 参数传服务端口,如果不传,服务启动在默认的 8000 端口。应用浏览器关上服务地址:

白屏反对齐全部署和精简部署两种形式,残缺部署会部署 OceanBase 和其余相干的一些组件,精简部署只会部署 OceanBase。

而后填写部署的节点信息,OceanBase 依照 zone 的 topo 构造进行填写,每个 zone 能够抉择一台主机作为 rootservice 节点,OBProxy 节点能够复用 OceanBase 的节点,也能够配置独自的主。部署用户配置以上节点都有权限的用户,所有节点的明码要统一,或者曾经配置好 ssh 免密登录,所有的组件装置在对立的门路下,在门路下会再依照组件辨别。

下一步进入集群配置,同样有两种部署模式,最大占用和最小可用,最大占用会尽量占用主机的资源,已达到最大的性能,最小可用仅占用过程启动所必须的资源,个别用于体验环境。

OceanBase 必要的配置包含数据目录,日志目录,监听端口等,其余组件的配置次要是监听端口。更多配置提供了罕用的要害配置项,个别都能够主动调配,如果须要对特定的配置项进行配置,抉择自定义,并填写相应的值。

接下来进入预查看,对于查看不通过的项会给出修复倡议,有 能够主动修复的项,通过点击主动修复,批改配置到正当的值,无奈主动修复的项,手动解决之后,能够再发动预查看。

预查看通过后,点击部署开始进行部署,部署过程中会一直的输入日志信息。

部署实现后,会打印连贯串信息,请及时保留。

容器化部署 OceanBase

容器化部署也分为两个运行场景,别离是单机版的 Docker 镜像和 Kubenetes(以下简称 K8s)。

单机版 Docker 镜像

OceanBase 提供了单机版本的 Docker 镜像,能够通过 Docker 的形式屏蔽对操作系统的依赖,对于应用非 Linux 零碎的开发者疾速体验 OceanBase 比拟敌对。

不同操作系统装置 Docker 的办法,能够参考以下链接

Mac

Windows

Linux

OceanBase 单机版镜像提供了两个能够设置的环境变量

变量 默认值 形容
MINI_MODE false 是否应用 mini mode 进行部署,应用 mini mode 会尽可能少的占用系统资源,仅占用能够保障 oceanbase 启动的资源
EXIT_WHILE_ERROR true oceanbase 启动失败之后是否退出容器

作为疾速体验的环境,能够设置 MINI_MODE 为 true 以缩小资源的占用,应用以下命令拉起 oceanbase 容器:

 docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE='true' -d oceanbase/oceanbase-ce

oceanbase 容器启动大概须要 2 分钟左右,当容器日志呈现 boot success! 时,阐明 曾经启动胜利了。

启动胜利之后能够应用 OBClient 连贯进行验证,没有安 OBClient 的话,也能够应用 MySQL 客户端;

[root@****]# obclient -h127.0.0.1 -uroot -P2881
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 5751
Server version: 5.6.25 OceanBase 4.0.0 (r10100032022041510-a09d3134c10665f03fd56d7f8bdd413b2b771977) (Built Oct 15 2022 02:16:22)

Copyright (c) 2000, 2022, OceanBase and/or its affiliates. All  rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient> 

Kubenetes 环境运行 OceanBase

OceanBase 分布式高可用的能力须要部署多个节点才能够体现,而且越来越多的客户应用容器的形式来部署本人的业务,OceanBase 也提供了在 K8s 环境中运行的计划:通过 OceanBase 的自定义资源并且提供对应的 operator, 利用 ob-operator 来实现 OceanBase 在 K8s 中的全生命周期治理。

K8s 环境的部署能够参考 部署 K8s

第一步,部署 ob-operator

部署 CRD:

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/crd.yaml

部署 ob-operator:

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/operator.yaml

部署之后能够通过一下命令验证 ob-operator 部署胜利,看到 STATUS 为 Running 状态,READY 是 2/2 的时候示意部署胜利。

kubectl get pods -n oceanbase-system

第二步,部署 OceanBase 集群。

先设置 K8s node 节点的 label。思考到 OceanBase 分布式的个性,能够配置多个可用区,在 K8s 中能够依据 node 节点的 label 来抉择 pod 部署的节点,能够给 node 打上 label, 举荐应用 topology.kubernetes.io/zone 作为 label

kubectl label node nodename topology.kubernetes.io/zone=zonename
kubectl label node ${node_name} topology.kubernetes.io/zone=${zone_name}

而后部署 local-path-provisioner,应用如下命令部署 local-path-provisioner, 更多信息能够参考 https://github.com/rancher/local-path-provisioner, 如果应用其余存储,须要部署对应的 storage class,本文中以 local-path 为例:

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.22/deploy/local-path-storage.yaml

再部署 OceanBase,应用以下命令间接以 github 上的默认配置文件来部署 OceanBase, 如需进行自定义配置,能够下载文件进行批改后再用批改后的文件进行部署。

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/obcluster.yaml

部署实现后能够查看 CR 以及 pod 的状态

# 查看 CR 状态
kubectl get obclusters.cloud.oceanbase.com -n obcluster -o yaml
# 查看 POD 状态
kubectl get pods -n obcluster -o yaml

第三步,部署其余组件。

OceanBase 部署好了之后就能够部署 OBProxy, 通过 OBProxy 可能将申请转发到正确的 OBServer, 取得更好的性能。

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/obproxy/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/obproxy/service.yaml

OBProxy 部署好之后,会主动创 service,能够通过 service 的地址来连贯 OceanBase 集群。

OceanBase 部署的时候会在 OBServer 所在的 pod 中同时也部署 OBAgent 作为 sidecar 容器来采集监控数据,OBAgent 反对 prometheus 协定,以 exporter 的模式提供数据,通过部署 Prometheus 和 Grafana 能够直观地看到 OceanBase 的运行状态。

部署 Prometheus 的命令如下:

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/prometheus/cluster-role.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/prometheus/cluster-role-binding.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/prometheus/configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/prometheus/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/prometheus/service.yaml

部署 Grafana 的命令如下:

kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/grafana/configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/grafana/pvc.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/grafana/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/master/deploy/grafana/service.yaml

部署实现后,能够通过页面来查看 OceanBase 的运行状态。

常见问题

  1. 找不到 obd 命令

因为 oceanbase-all-in-one是装置在用户目录下,须要设置环境变量才能够失常应用,能够执行执行 source ~/.bash_profile来使环境变量失效。

  1. 某个组件部署失败

能够通过页面提醒的命令来查看 log信息,或者间接查看 obd 的日志文件,日志文件在 ~/.obd/log/obd, 能够在解决完日志中的谬误之后,独自应用命令 obd cluster start ${deploy_name} -c ${component} 来启动单个组件。

  1. 应用 K8s 部署 pod 始终 pending

须要确认 nodelabelyaml文件中配置的是统一的,另外也须要确认 master节点是否容许调度,能够通过 kubectl taint nodes --all node-role.kubernetes.io/master-来设置。

总结

本文介绍了多种部署 OceanBase 的形式,场景从单机体验到集群,而物理机和容器的形式能够满足不同应用场景的部署需要。一直晋升产品的易用性是咱们始终谋求的指标,欢送宽广 OceanBase 爱好者、用户、客户对咱们提出倡议和反馈(https://github.com/oceanbase/oceanbase),也心愿大家在评论区与咱们交换、探讨。


欢送拜访 OceanBase 官网获取更多信息:https://www.oceanbase.com/

退出移动版