欢迎访问 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 所需的单台主机的资源,如果需要集群部署,推荐使用相同规格的主机。
用户配置
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
复制代码
配置文件修改后只会重启后生效,还需要使用下面命令立即生效。
设置内核参数
修改配置文件
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
复制代码
执行如下命令让配置生效
修改会话变量设置
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-ce
、obproxy-ce
、obagent
、grafana
、prometheus
。
# 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 为 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 的运行状态。
常见问题
找不到 obd 命令
因为 oceanbase-all-in-one
是安装在用户目录下,需要设置环境变量才可以正常使用,可以执行执行 source ~/.bash_profile
来使环境变量生效。
某个组件部署失败
可以通过页面提示的命令来查看 log
信息,或者直接查看obd
的日志文件,日志文件在~/.obd/log/obd
,可以在处理完日志中的错误之后,单独使用命令 obd cluster start ${deploy_name} -c ${component}
来启动单个组件。
使用 K8s 部署 pod 一直 pending
需要确认 node
的 label
和 yaml
文件中配置的是一致的,另外也需要确认 master
节点是否允许调度,可以通过 kubectl taint nodes --all node-role.kubernetes.io/master-
来设置。
总结
本文介绍了多种部署 OceanBase 的方式,场景从单机体验到集群,而物理机和容器的方式可以满足不同使用场景的部署需求。不断提升产品的易用性是我们一直追求的目标,欢迎广大 OceanBase 爱好者、用户、客户对我们提出建议和反馈(https://github.com/oceanbase/oceanbase),也希望大家在评论区与我们交流、探讨。
欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/
评论