欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/
作者简介: 孙宏鑫,OceanBase技术专家,主要负责oceanbase开源生态,运维监控相关工作。
OceanBase 自开源以来随着用户的不断增加及使用场景的不断丰富,其部署形态逐渐多元化,为了帮助用户更流畅地在不同环境部署,本文将从体验场景和生产环境两方面分别介绍在主机、容器环境中如何部署OceanBase。
众所周知,OceanBase 作为分布式数据库,以多副本的方式保证数据的可用性,在生产环境中至少要准备3台机器,如果仅学习体验 OceanBase 的功能,使用1台机器部署单节点集群即可。
操作系统
OceanBase 支持部署在主流的Linux操作系统上,下面列出了常用的操作系统:
主机资源
下表列出了部署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-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
此处涉及两种部署模式:快速部署与集群部署,下面依次介绍。
快速启动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
白屏服务支持通过-p
参数传服务端口,如果不传,服务启动在默认的8000
端口。使用浏览器打开服务地址:
白屏支持完全部署和精简部署两种方式,完整部署会部署OceanBase和其他相关的一些组件,精简部署只会部署OceanBase。
然后填写部署的节点信息,OceanBase 按照zone的topo结构进行填写,每个zone可以选择一台主机作为rootservice节点,OBProxy节点可以复用OceanBase的节点,也可以配置单独的主。部署用户配置以上节点都有权限的用户,所有节点的密码要一致,或者已经配置好ssh免密登录,所有的组件安装在统一的路径下,在路径下会再按照组件区分。
下一步进入集群配置,同样有两种部署模式,最大占用和最小可用,最大占用会尽量占用主机的资源,已达到最大的性能,最小可用仅占用进程启动所必须的资源,一般用于体验环境。
OceanBase 必要的配置包括数据目录,日志目录,监听端口等,其他组件的配置主要是监听端口。更多配置提供了常用的关键配置项,一般都可以自动分配,如果需要对特定的配置项进行配置,选择自定义,并填写相应的值。
接下来进入预检查,对于检查不通过的项会给出修复建议,有可以自动修复的项,通过点击自动修复,修改配置到合理的值,无法自动修复的项,手动处理之后,可以再发起预检查。
预检查通过后,点击部署开始进行部署,部署过程中会不断的输出日志信息。
部署完成后,会打印连接串信息,请及时保存。
容器化部署也分为两个运行场景,分别是单机版的Docker镜像和 Kubenetes(以下简称K8s)。
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>
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的运行状态。
因为 oceanbase-all-in-one
是安装在用户目录下,需要设置环境变量才可以正常使用,可以执行执行 source ~/.bash_profile
来使环境变量生效。
可以通过页面提示的命令来查看 log
信息,或者直接查看obd
的日志文件,日志文件在~/.obd/log/obd
,可以在处理完日志中的错误之后,单独使用命令 obd cluster start ${deploy_name} -c ${component}
来启动单个组件。
需要确认 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/