安装部署#

软硬件要求#

操作系统#

发行的预编译包支持:CentOS 7.x, Ubuntu 20.04, SUSE 12 SP3, macOS 12。因此Linux要求glibc version >= 2.17。对于其他操作系统发行版本,预编译包未做充分测试,无法保证其完全兼容。你可以尝试 从源码编译,来支持其他的操作系统。

Note

Linux可通过以下命令来检查系统的支持情况。

cat /etc/os-release # most linux
cat /etc/redhat-release # redhat only
ldd --version
strings /lib64/libc.so.6 | grep ^GLIBC_

通常ldd版本>=2.17,libc.so.6中也会有GLIBC_2.17,也就是该系统支持glibc 2.17的程序/动态库运行。如果系统的glibc版本低于2.17,则需要尝试从源码编译。

第三方组件依赖#

如果需要部署 ZooKeeper 和 TaskManager,则需要有 Java 运行环境。

硬件#

  • CPU:

    • x86 CPU,推荐 不少于 4 核

    • 如果使用预编译包,则需要支持 AVX2 指令集;否则请从 源码编译

    • 内存:推荐至少 8 GB;如果业务场景数据量较大,推荐 128 GB 或者以上

  • 其他硬件:无特殊需求,但磁盘以及网络的性能,均可能会影响 OpenMLDB 的延迟和吞吐性能表现。

部署包#

下载/源码编译#

如果你的操作系统可以直接运行预编译包,则可以从以下地址下载:

其中预编译包和可支持的操作系统的对应关系为:

  • openmldb-x.x.x-linux.tar.gz: CentOS 7.x, Ubuntu 20.04, SUSE 12 SP3

  • openmldb-x.x.x-darwin.tar.gz: macOS 12

如果用户的操作系统不在列表,或者期望从源代码编译,则参考我们的 源码编译文档

Linux 平台预测试#

由于 Linux 平台的多样性,发布包可能在你的机器上不兼容,请先通过简单的运行测试。比如,下载预编译包 openmldb-0.8.5-linux.tar.gz 以后,运行:

tar -zxvf openmldb-0.8.5-linux.tar.gz
./openmldb-0.8.5-linux/bin/openmldb --version

结果应显示该程序的版本号,类似

openmldb version 0.8.5-xxxx
Debug build (NDEBUG not #defined)

如果未运行成功,则需要通过源码编译 OpenMLDB。

配置环境#

为了保证部署的正确性和稳定性,建议进行如下的系统配置操作。以下操作假设在 Linux 系统下命令。

配置 coredump 文件大小限制和最多文件打开数目#

ulimit -c unlimited
ulimit -n 655360

通过ulimit命令配置的参数,只对当前session有效,如果希望持久化配置,需要在/etc/security/limits.conf添加如下配置:

*       soft    core    unlimited
*       hard    core    unlimited
*       soft    nofile  655360
*       hard    nofile  655360

关闭操作系统 swap#

查看当前系统swap是否关闭

$ free
              total        used        free      shared  buff/cache   available
Mem:      264011292    67445840     2230676     3269180   194334776   191204160
Swap:             0           0           0

如果swap一项全部为0表示已经关闭,否则运行下面命令关闭swap

swapoff -a

关闭 THP(Transparent Huge Pages)#

使用如下命令,查看THP是否关闭

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

如果上面两个配置中 never 没有被选中([never]),则需要使用如下命令进行配置:

echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag

查看是否设置成功,如下所示:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

注:以上三项也可以通过脚本一键修改,参考修改机器环境配置

时间和时区设置#

OpenMLDB 数据过期删除机制依赖于系统时钟, 如果系统时钟不正确会导致过期数据没有删掉或者删掉了没有过期的数据。

网络白名单#

OpenMLDB 集群的服务组件之间需要保证网络连通。客户端到 OpenMLDB 集群则分为两种情况:

  • Client(CLI 以及 SDKs)连接到 OpenMLDB 集群,除了与 ZooKeeper 的连通,还需要保证和Nameserver/TabletServer/TaskManager的连通

  • 如果服务仅使用 APIServer 进行通信,那么客户端只需保证能访问 APIServer 端口

部署高可用集群#

在生产环境中,我们建议部署具备高可用能力的 OpenMLDB 集群。关于高可用部署架构,请参照我们推荐的 高可用部署最佳实践

守护进程启动方式#

OpenMLDB 提供了两种启动模式:普通和守护进程启动。守护进程额外提供了一层保护,在服务进程意外退出的情况下,可以自动重新启动。关于守护进程启动:

  • 守护进程并非系统服务,如果守护进程意外推出,将会失去守护作用。

  • 每一个服务进程均有一个关联的独立的守护进程。

  • 守护进程如果被 SIGKILL 信号杀死,则关联的被守护进程不会退出。此时如果想恢复正常的守护进程启动方式,需要把关联的进程杀掉,再以守护进程方式启动。

  • 守护进程如果被非 SIGKILL 信号杀死,则守护进程退出时也会把相关联的进程同时退出。

如果想要使守护进程模式启动,请使用bash bin/start.sh start <component> mon或者sbin/start-all.sh mon的方式启动。守护进程模式中,bin/<component>.pid将是 mon 进程的 pid,bin/<component>.pid.child 为组件真实的 pid。

部署方式一:一键部署(推荐)#

OpenMLDB集群版需要部署ZooKeeper、NameServer、TabletServer、TaskManager等模块。其中ZooKeeper用于服务发现和保存元数据信息。NameServer用于管理TabletServer,实现高可用和failover。TabletServer用于存储数据和主从同步数据。APIServer是可选的,如果要用http的方式和OpenMLDB交互需要部署此模块。TaskManager 用于管理离线 job。我们提供了一键部署脚本,可以简化手动在每台机器上下载和配置的复杂性。

注意: 同一台机器部署多个组件时,一定要部署在不同的目录里,便于单独管理。尤其是部署TabletServer,一定不能重复使用目录,避免数据文件和日志文件冲突。

DataCollector和SyncTool暂不支持一键部署。请参考手动部署方式。

环境要求#

  • 部署机器(执行部署脚本的机器)可以免密登录其他部署节点

  • 部署机器需安装 rsync 工具

  • 部署机器需安装 Python3

  • Zookeeper和TaskManager的运行机器上需安装 JRE (Java Runtime Environment)

下载OpenMLDB发行版#

wget https://github.com/4paradigm/OpenMLDB/releases/download/v0.8.5/openmldb-0.8.5-linux.tar.gz
tar -zxvf openmldb-0.8.5-linux.tar.gz
cd openmldb-0.8.5-linux

脚本使用逻辑#

部署脚本均在sbin中,我们也称一键部署为sbin部署。初次部署过程一般是“修改环境和配置文件 -> sbin/deploy-all.sh -> sbin/start-all.sh”。如果需要停止服务,执行sbin/stop-all.sh。清理已部署的数据和日志,执行sbin/clear-all.sh。Docker镜像中的/work/init.sh脚本便是进行“deploy-all -> stop-all -> clear-all -> start-all”。

如果集群正在运行,需要修改配置(不能只deploy到单台,但全部覆盖配置不影响进程运行)并重启某一个组件(不能指定单进程,但可以指定组件),需要“修改配置 -> deploy-all.sh -> stop-tablets.sh -> start-tablets.sh”。但需要注意重启tablet可能会导致数据加载失败(影响服务),需要进行集群诊断与恢复,可使用一键inspect。数据量较大或不可出现服务中断时,更推荐使用扩缩容方式或手动重启单进程。

环境配置#

环境变量定义在conf/openmldb-env.sh,主要变量如下表所示:

环境变量

默认值

定义

OPENMLDB_VERSION

0.8.5

OpenMLDB版本,主要用于spark下载,一般不改动。

OPENMLDB_MODE

cluster

standalone或者cluster

OPENMLDB_HOME

当前发行版的根目录

openmldb发行版根目录,不则使用当前根目录,也就是openmldb-0.8.5-linux所在目录。

SPARK_HOME

$OPENMLDB_HOME/spark

openmldb spark发行版根目录,如果该目录不存在,自动从网上下载。此路径也将成为TaskManager运行机器上的Spark安装目录。

RUNNER_EXISTING_SPARK_HOME

配置此项,运行TaskManager的机器将使用该Spark环境,将不下载、部署OpenMLDB Spark发行版。

OPENMLDB_USE_EXISTING_ZK_CLUSTER

false

是否使用已经运行的ZooKeeper集群。如果是true,将跳过ZooKeeper集群的部署与管理。

OPENMLDB_ZK_HOME

$OPENMLDB_HOME/zookeeper

ZooKeeper发行版根目录,如果该目录不存在,自动从网上下载。

OPENMLDB_ZK_CLUSTER

ZooKeeper集群地址,为空时自动从conf/hosts中的[zookeeper]配置获取。建议自建ZooKeeper集群时在hosts中创建,使用已有ZooKeeper集群时配置此项。

OPENMLDB_ZK_ROOT_PATH

/openmldb

OpenMLDB在ZooKeeper集群的根目录

OPENMLDB_FORCE_LOCAL

false

如果为true,所有部署将认定为本地拷贝。单机部署集群,又需要使用公网IP时,开启此项,避免ssh

RUNNER_JAVA_HOME

运行ZooKeeper和TaskManager的机器ssh可能无Java相关环境变量,可使用此变量设置。不设置则不覆盖环境。

CLEAR_OPENMLDB_INSTALL_DIR

false

sbin/clear-all.sh只清理运行产生的数据与日志,如果是true,将把运行机器上的整个安装目录删除。

通常来讲,需要确认以下几点:

  • ZooKeeper集群地址,如果使用已有ZooKeeper集群,需要配置OPENMLDB_USE_EXISTING_ZK_CLUSTER=true,并配置OPENMLDB_ZK_CLUSTER。(如果在conf/hosts中配置外部ZK集群,请注释标注其不受sbin部署影响,避免混乱。)

  • 需要此工具部署ZooKeeper集群时,在conf/hosts中配置[zookeeper]。填写多个ZooKeeper节点,即部署ZooKeeper集群,无需额外配置。

  • Spark环境,如果需要使用运行机器上已有的Spark环境,需要配置RUNNER_EXISTING_SPARK_HOME(地址为TaskManager运行机器上的路径)。如果部署机器存在Spark环境,并想要在TaskManager机器上使用此套环境,可配置SPARK_HOME(部署到TaskManager机器同名路径上)。SPARK_HOME不进行配置时,将自动下载、使用OpenMLDB Spark发行版。

默认端口#

环境变量

默认值

定义

OPENMLDB_TABLET_PORT

10921

TabletServer默认端口

OPENMLDB_NAMESERVER_PORT

7527

NameServer默认端口

OPENMLDB_TASKMANAGER_PORT

9902

TaskManager默认端口

OPENMLDB_APISERVER_PORT

9080

APIServer默认端口

默认端口只会在节点配置不显式配置端口号时才会被使用,更推荐直接在节点配置文件hosts中配置好端口号

ZooKeeper高级配置#

环境变量

默认值

定义

OPENMLDB_ZK_CLUSTER_CLIENT_PORT

2181

ZooKeeper client port, 即zoo.cfg里面的clientPort

OPENMLDB_ZK_CLUSTER_PEER_PORT

2888

ZooKeeper peer port,即zoo.cfg里面这种配置server.1=zoo1:2888:3888中的第一个端口配置

OPENMLDB_ZK_CLUSTER_ELECTION_PORT

3888

ZooKeeper election port, 即zoo.cfg里面这种配置server.1=zoo1:2888:3888中的第二个端口配置

节点配置#

节点配置文件为conf/hosts,示例如下:

[tablet]
node1:10921 /tmp/openmldb/tablet
node2:10922 /tmp/openmldb/tablet

[nameserver]
node3:7527

[apiserver]
node3:9080

[taskmanager]
node3:9902

[zookeeper]
node3:2181:2888:3888 /tmp/openmldb/zk-1

配置文件分为四个区域,以[]来识别:

  • [tablet]:配置部署TabletServer的节点列表

  • [nameserver]:配置部署NameServer的节点列表

  • [apiserver]:配置部署APIServer的节点列表

  • [taskmanager]:配置部署TaskManager的节点列表

  • [zookeeper]:配置部署ZooKeeper的节点列表

每个区域的节点列表,每一行代表一个节点,每行格式为host:port WORKDIR。 对于[zookeeper], 会有额外端口参数,包括follower用来连接leader的zk_peer_port和用于leader选择的zk_election_port, 其格式为host:port:zk_peer_port:zk_election_port WORKDIR

每一行节点列表,除了host是必须的,其他均为可选,如果没有提供,会使用默认配置,默认配置参考conf/openmldb-env.sh。无WORKDIR配置的节点,所有OpenMLDB Server的默认运行目录为OPENMLDB_HOME,ZooKeeper默认目录为OPENMLDB_ZK_HOME

host配置为localhost或127.0.0.1时,将自动识别为部署到本地,不会进行ssh和rsync。当集群在本地部署且需要对外暴露服务,hosts中节点需配置为外网IP,如果不想配置本机ssh免密,可在conf/openmldb-env.sh中配置OPENMLDB_FORCE_LOCAL=true

Warning

如果在不同机器上部署多个 TaskManager,其 offline.data.prefix 配置的路径,这些机器必须可以访问,建议配置hdfs路径。

修改机器环境配置 (可选)#

bash sbin/init_env.sh

说明:

  • 需要用root用户执行此脚本。执行其他脚本不需要root

  • 此脚本只修改limit配置,关闭swap和关闭THP

部署#

sbin/deploy-all.sh

该脚本会把相关的文件分发到conf/hosts里面配置的机器上,同时根据conf/hostsconf/openmldb-env.sh的配置,对相关组件的配置做出相应的更新。

如果希望为每个节点添加一些额外的相同的定制化配置,可以在执行deploy脚本之前,修改conf/xx.template的配置。只有和openmldb-env.sh中相关的配置会被部署工具自动追加到配置尾部,其他配置不会被覆盖,可放心修改。执行deploy,将配置文件分发到运行节点中,重复执行sbin/deploy-all.sh会覆盖上一次的配置。

详细配置说明见配置文件,请注意TaskManager Spark的选择与细节配置Spark Config详解

执行阶段日志类似下文,请注意部署到的host与目录:

deploy tablet to localhost:10921 /tmp/openmldb/tablet-1
copy /work/openmldb to localhost:/tmp/openmldb/tablet-1
deploy tablet to localhost:10922 /tmp/openmldb/tablet-2
copy /work/openmldb to localhost:/tmp/openmldb/tablet-2
deploy nameserver to localhost:7527 /work/openmldb
skip rsync as dest=src: /work/openmldb
deploy apiserver to localhost:9080 /work/openmldb
skip rsync as dest=src: /work/openmldb
/work/openmldb/spark already exists. Skip deploy spark locally
deploy taskmanager to localhost:9902 /work/openmldb
skip rsync as dest=src: /work/openmldb
/work/openmldb/zookeeper already exists. Skip download zookeeper.
deploy zookeeper to localhost:2181 /tmp/openmldb/zk-1
copy /work/openmldb/zookeeper to localhost:/tmp/openmldb/zk-1

对环境变量有疑问,注意日志OPENMLDB envs:的打印结果。

  • 配置 deploy不支持对单个组件的配置更新,更改单个组件也需要使用deploy-all.sh。如果你在部署host上单独修改,需要修改xx.flags/taskmanager.properties而不是template配置,而且deploy-all.sh将对该配置进行覆盖,请谨慎配置。检查配置时以host的运行目录中的xx.flags/taskmanager.properties为准。

  • 日志 相应的,各个节点的日志也在各自的运行目录中,具体位置参考部署方式二:手动部署中各个组件的日志位置说明。

收集日志与配置,可以使用诊断工具检查内容,默认将各个节点的配置和日志都收集到/tmp/diag_collect目录中,可以统一查看。

启动服务#

普通模式启动:

sbin/start-all.sh

或者,使用守护进程模式启动:

sbin/start-all.sh mon

该脚本会把 conf/hosts 里面配置的所有服务启动起来。启动完成以后,可以通过辅助脚本启动 CLI (sbin/openmldb-cli.sh),来验证集群是否正常启动。对环境变量有疑问,注意日志OPENMLDB envs:的打印结果。

Tip

start-all.sh 是一个非常有用的工具。除了在部署阶段可以使用,也可以在运维阶段用于启动某一个下线的 OpenMLDB 进程。比如某一个 tablet 进程意外下线,你可以直接执行 start-all.sh。该脚本对于已经启动的进程不会产生副作用,对于已配置、但是未启动的进程,将会自动进行启动。

停止服务#

如果需要停止所有服务,可以执行以下脚本:

sbin/stop-all.sh

清理数据和日志#

如果需要清理所有服务的数据和日志,可以执行以下脚本:

sbin/clean-all.sh

如果需要保留集群数据,请不要执行该脚本。

部署方式二:手动部署#

OpenMLDB集群版需要部署ZooKeeper、NameServer、TabletServer、TaskManager等模块。其中ZooKeeper用于服务发现和保存元数据信息。NameServer用于管理TabletServer,实现高可用和failover。TabletServer用于存储数据和主从同步数据。APIServer是可选的,如果要用http的方式和OpenMLDB交互需要部署此模块。TaskManager用于管理离线job。

注意 1: 同一台机器部署多个组件时,一定要部署在不同的目录里,便于单独管理。尤其是部署TabletServer,一定不能重复使用目录,避免数据文件和日志文件冲突。

注意 2: 下文均使用常规后台进程模式启动组件,如果想要使守护进程模式启动组件,请使用命令格式如 bash bin/start.sh start <component> mon

部署 ZooKeeper#

ZooKeeper 要求版本在 3.4 到 3.6 之间, 建议部署3.4.14版本。如果已有可用ZooKeeper集群可略过此步骤。如果想要部署ZooKeeper集群,参考这里。本步骤只演示部署standalone ZooKeeper。

1. 下载ZooKeeper安装包

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zxvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14
cp conf/zoo_sample.cfg conf/zoo.cfg

2. 修改配置文件 打开文件conf/zoo.cfg修改dataDirclientPort

dataDir=./data
clientPort=7181

3. 启动ZooKeeper

bash bin/zkServer.sh start

启动成功将如下图所示,有STARTED提示。 zk started

通过ps f|grep zoo.cfg也可以看到ZooKeeper进程正在运行。

zk ps

Attention

如果发现ZooKeeper进程启动失败,请查看当前目录的zookeeper.out日志。

4. 记录ZooKeeper服务地址与连接测试

后续TabletServer、NameServer与TaskManager连接ZooKeeper,均需要配置这个ZooKeeper服务地址。跨主机访问ZooKeeper服务需要使用公网IP(这里我们假设为172.27.128.33,实际请获得你的ZooKeeper部署机器IP),又由第二步填写的clientPort,可知ZooKeeper服务地址为172.27.128.33:7181

你可以使用zookeeper-3.4.14/bin/zkCli.sh来进行连接ZooKeeper的测试,仍在zookeeper-3.4.14目录中运行

bash bin/zkCli.sh -server 172.27.128.33:7181

可以进入zk客户端程序,如下图所示,有CONNECTED提示。

zk cli

输入quit回车或Ctrl+C退出zk客户端。

部署 TabletServer#

注意,TabletServer 至少需要部署两台,否则会出错无法正确完成部署。

1. 下载OpenMLDB部署包

wget https://github.com/4paradigm/OpenMLDB/releases/download/v0.8.5/openmldb-0.8.5-linux.tar.gz
tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-tablet-0.8.5
cd openmldb-tablet-0.8.5

2. 修改配置文件conf/tablet.flags

# 可以在示例配置文件的基础上,进行修改
cp conf/tablet.flags.template conf/tablet.flags

Attention

注意,配置文件是conf/tablet.flags,不是其他配置文件。启动多台TabletServer时(多TabletServer目录应该独立,不可共享),依然是修改该配置文件。

  • 修改endpointendpoint是用冒号分隔的部署机器IP/域名和端口号(endpoint不能用0.0.0.0和127.0.0.1,必须是公网IP)。

  • 修改zk_cluster为已经启动的zk服务地址(见 部署 ZooKeeper - 4. 记录ZooKeeper服务地址与连接测试)。如果zk服务是集群,可用逗号分隔,例如,172.27.128.33:7181,172.27.128.32:7181,172.27.128.31:7181

  • 修改zk_root_path,本例中使用/openmldb_cluster。注意,同一个集群下的组件zk_root_path是相同的。所以本次部署中,各个组件配置的zk_root_path都为/openmldb_cluster

--endpoint=172.27.128.33:9527
--role=tablet

# if tablet run as cluster mode zk_cluster and zk_root_path should be set
--zk_cluster=172.27.128.33:7181
--zk_root_path=/openmldb_cluster

注意:

  • 如果endpoint配置项使用的是域名, 所有使用openmldb client的机器都得配上对应的host. 不然会访问不到

3. 启动服务

bash bin/start.sh start tablet

启动后应有success提示,如下所示。

Starting tablet ...
Start tablet success

通过ps f | grep tablet查看进程状态。 tablet ps

通过curl http://<tablet_ip>:<port>/status也可以测试TabletServer是否运行正常。

Attention

如果发现TabletServer启动失败,或进程运行一阵子后就退出了,可以检查该TabletServer启动目录下的logs/tablet.WARNING,更详细可以检查logs/tablet.INFO。如果是IP地址已被使用,请自行更改TabletServer的endpoint端口,再次启动。启动前请保证启动目录中没有db  logs  recycle三个目录。可以使用命令删除 rm -rf db logs recycle,以防止遗留的文件与日志对当前的判断造成干扰。如果无法解决,请联系开发社区,并提供日志。

4. 重复以上步骤部署多个TabletServer

Important

集群版的TabletServer数量必须2台及以上,如果只有1台TabletServer,启动NameServer将会failed。NameServer的日志(logs/nameserver.WARNING)中会包含”is less then system table replica num”的日志。

在另一台机器启动下一个TabletServer只需在该机器上重复以上步骤。如果是在同一个机器上启动下一个TabletServer,请保证是在另一个目录中,不要重复使用已经启动过TabletServer的目录。

比如,可以再次解压压缩包(不要cp已经启动过TabletServer的目录,启动后的生成文件会造成影响),并命名目录为openmldb-tablet-0.8.5-2

tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-tablet-0.8.5-2
cd openmldb-tablet-0.8.5-2

再修改配置并启动。注意,TabletServer如果都在同一台机器上,请使用不同端口号,否则日志(logs/tablet.WARNING)中将会有”Fail to listen”信息。

注意:

  • 服务启动后会在bin目录下产生tablet.pid文件, 里边保存启动时的进程号。如果该文件内的pid正在运行则会启动失败

部署 NameServer#

Attention

请保证所有TabletServer已经启动成功,再部署NameServer,不能更改部署顺序。

1. 下载OpenMLDB部署包

wget https://github.com/4paradigm/OpenMLDB/releases/download/v0.8.5/openmldb-0.8.5-linux.tar.gz
tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-ns-0.8.5
cd openmldb-ns-0.8.5

2. 修改配置文件conf/nameserver.flags

# 可以在示例配置文件的基础上,进行修改
cp conf/nameserver.flags.template conf/nameserver.flags

Attention

注意,配置文件是conf/nameserver.flags,不是其他配置文件。启动多台NameServert时(多NameServer目录应该独立,不可共享),依然是修改该配置文件。

  • 修改endpointendpoint是用冒号分隔的部署机器IP/域名和端口号(endpoint不能用0.0.0.0和127.0.0.1,必须是公网IP)。

  • 修改zk_cluster为已经启动的zk服务地址(见 部署 ZooKeeper - 4. 记录ZooKeeper服务地址与连接测试)。如果zk服务是集群,可用逗号分隔,例如,172.27.128.33:7181,172.27.128.32:7181,172.27.128.31:7181

  • 修改zk_root_path,本例中使用/openmldb_cluster。注意,同一个集群下的组件zk_root_path是相同的。所以本次部署中,各个组件配置的zk_root_path都为/openmldb_cluster

--endpoint=172.27.128.31:6527
--zk_cluster=172.27.128.33:7181
--zk_root_path=/openmldb_cluster

3. 启动服务

bash bin/start.sh start nameserver

启动后应有success提示,如下所示。

Starting nameserver ...
Start nameserver success

同样可以通过curl http://<ns_ip>:<port>/status检测NameServer是否正常运行。

4. 重复上述步骤部署多个NameServer

NameServer 可以只存在一台,如果你需要高可用性,可以部署多 NameServer。

在另一台机器启动下一个 NameServer 只需在该机器上重复以上步骤。如果是在同一个机器上启动下一个 NameServer,请保证是在另一个目录中,不要重复使用已经启动过 namserver 的目录。

比如,可以再次解压压缩包(不要cp已经启动过 namserver 的目录,启动后的生成文件会造成影响),并命名目录为openmldb-ns-0.8.5-2

tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-ns-0.8.5-2
cd openmldb-ns-0.8.5-2

然后再修改配置并启动。

注意:

  • 服务启动后会在bin目录下产生namserver.pid文件, 里边保存启动时的进程号。如果该文件内的pid正在运行则会启动失败

  • 请把所有 TabletServer 部署完再部署 NameServer

5. 检查服务是否启动

Attention

必须部署了至少一个NameServer,才可以使用以下方式查询到当前集群已启动的服务组件。

echo "show components;" | ./bin/openmldb --zk_cluster=172.27.128.33:7181 --zk_root_path=/openmldb_cluster --role=sql_client

结果类似下图,可以看到你已经部署好了的所有TabletServer和NameServer。

 ------------------- ------------ --------------- -------- ---------
  Endpoint            Role         Connect_time    Status   Ns_role
 ------------------- ------------ --------------- -------- ---------
  172.27.128.33:9527  tablet       1665568158749   online   NULL
  172.27.128.33:9528  tablet       1665568158741   online   NULL
  172.27.128.31:6527  nameserver   1665568159782   online   master
 ------------------- ------------ --------------- -------- ---------

部署 APIServer#

APIServer负责接收http请求,转发给OpenMLDB集群并返回结果。它是无状态的。APIServer并不是OpenMLDB必须部署的组件,如果不需要使用http接口,可以跳过本步骤,进入下一步部署TaskManager

运行前需确保OpenMLDB集群的TabletServer和NameServer进程已经启动(TaskManager不影响APIServer的启动),否则APIServer将初始化失败并退出进程。

1. 下载OpenMLDB部署包

wget https://github.com/4paradigm/OpenMLDB/releases/download/v0.8.5/openmldb-0.8.5-linux.tar.gz
tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-apiserver-0.8.5
cd openmldb-apiserver-0.8.5

2. 修改配置文件conf/apiserver.flags

# 可以在示例配置文件的基础上,进行修改
cp conf/apiserver.flags.template conf/apiserver.flags
  • 修改endpointendpoint是用冒号分隔的部署机器IP/域名和端口号(endpoint不能用0.0.0.0和127.0.0.1,必须是公网IP)。

  • 修改zk_cluster为已经启动的zk服务地址(见 部署 ZooKeeper - 4. 记录ZooKeeper服务地址与连接测试)。如果zk服务是集群,可用逗号分隔,例如,172.27.128.33:7181,172.27.128.32:7181,172.27.128.31:7181

  • 修改zk_root_path,本例中使用/openmldb_cluster。注意,同一个集群下的组件zk_root_path是相同的。所以本次部署中,各个组件配置的zk_root_path都为/openmldb_cluster

--endpoint=172.27.128.33:8080
--zk_cluster=172.27.128.33:7181
--zk_root_path=/openmldb_cluster

注意:

  • 如果http请求并发度较大,可自行调大APIServer的线程数,--thread_pool_size,默认为16,重启生效。

  • 可以通过--user--password指定连接服务端的用户名和密码

  • 默认会用root用户空密码去连接服务端,如果修改了root密码,需要用--password指定新密码

3. 启动服务

bash bin/start.sh start apiserver

启动后应有success提示,如下所示。

Starting apiserver ...
Start apiserver success

Attention

APIServer是非必需组件,所以不会出现在show components;中。

可以通过curl http://<apiserver_ip>:<port>/status检测 APIServer 是否正常运行,更推荐通过执行sql的方式来测试是否正常:

curl http://<apiserver_ip>:<port>/dbs/foo -X POST -d'{"mode":"online","sql":"show components;"}'

结果中应该有已启动的所有TabletServer和NameServer的信息。

部署TaskManager#

TaskManager 可以只存在一台,如果你需要高可用性,可以部署多 TaskManager ,需要注意避免IP端口冲突。如果 TaskManager 主节点出现故障,从节点将自动恢复故障取代主节点,客户端无需任何修改可继续访问 TaskManager 服务。

1. 下载 OpenMLDB 部署包和面向特征工程优化的 Spark 发行版

Spark发行版:

wget https://github.com/4paradigm/spark/releases/download/v3.2.1-openmldb0.8.5/spark-3.2.1-bin-openmldbspark.tgz
# 中国镜像地址:https://www.openmldb.com/download/v0.8.5/spark-3.2.1-bin-openmldbspark.tgz
tar -zxvf spark-3.2.1-bin-openmldbspark.tgz 
export SPARK_HOME=`pwd`/spark-3.2.1-bin-openmldbspark/

OpenMLDB部署包:

wget https://github.com/4paradigm/OpenMLDB/releases/download/v0.8.5/openmldb-0.8.5-linux.tar.gz
tar -zxvf openmldb-0.8.5-linux.tar.gz
mv openmldb-0.8.5-linux openmldb-taskmanager-0.8.5
cd openmldb-taskmanager-0.8.5

2. 修改配置文件conf/taskmanager.properties

# 可以在示例配置文件的基础上,进行修改
cp conf/taskmanager.properties.template conf/taskmanager.properties
  • 修改server.host。host是部署机器的IP/域名。

  • 修改server.port。port是部署机器的端口号。

  • 修改zk_cluster为已经启动的zk集群地址。IP为zk所在机器的IP, port为zk配置文件中clientPort配置的端口号. 如果zk是集群模式用逗号分割, 格式为ip1:port1,ip2:port2,ip3:port3。

  • 如果和其他OpenMLDB共用zk需要修改zookeeper.root_path。

  • 修改batchjob.jar.path为BatchJob Jar文件路径,如果设置为空会到上一级lib目录下寻找。如果使用Yarn模式需要修改为对应HDFS路径。

  • 修改offline.data.prefix为离线表存储路径,如果使用Yarn模式需要修改为对应HDFS路径。

  • 修改spark.master为离线任务运行模式,目前支持local和yarn模式。

  • 修改spark.home为Spark环境路径,如果不配置或配置为空则使用SPARK_HOME环境变量的配置。也可在配置文件中设置,路径为绝对路径。

  • 可以通过userpassword指定连接server端用户名和密码。默认会用root用户空密码去连接服务端,如果修改了root密码,需要指定新密码.

server.host=172.27.128.33
server.port=9902
zookeeper.cluster=172.27.128.33:7181
zookeeper.root_path=/openmldb_cluster
batchjob.jar.path=
offline.data.prefix=file:///tmp/openmldb_offline_storage/
spark.master=local
spark.home=

更多Spark相关配置说明,见Spark Config详解

Attention

分布式部署的集群,请不要使用客户端本地文件作为源数据导入,推荐使用hdfs路径。

spark.master=yarn时,必须使用hdfs路径。 spark.master=local时,如果一定要是有本地文件,可以将文件拷贝至TaskManager运行的主机上,使用TaskManager主机上的绝对路径地址。

离线数据量较大时,也推荐offline.data.prefix使用hdfs,而不是本地file。

3. 启动服务

bash bin/start.sh start taskmanager

ps f|grep taskmanager应运行正常,curl http://<taskmanager_ip>:<port>/status可以查询到taskmanager进程状态。

Note

TaskManager的日志分为TaskManager进程日志和每个离线命令的job日志。默认路径为<启动目录>/taskmanager/bin/logs,其中:

  • taskmanager.log/.out为TaskManager进程日志,如果TaskManager进程退出,请查看这个日志。

  • job_x_error.log为单个job的运行日志,job_x.log为单个job的print日志(如果是异步select,结果将打印在此处)。如果离线任务失败,例如job 10失败,可通过SHOW JOBLOG 10;来获取日志信息。如果版本较低不支持JOBLOG,请到TaskManager所在机器上找到对应的日志job_10.log和job_10_error.log。

4. 检查服务是否启动

$ ./bin/openmldb --zk_cluster=172.27.128.33:7181  --zk_root_path=/openmldb_cluster --role=sql_client
> show components;

结果应类似下表,包含所有集群的组件(APIServer除外)。

 ------------------- ------------ --------------- -------- ---------
  Endpoint            Role         Connect_time    Status   Ns_role
 ------------------- ------------ --------------- -------- ---------
  172.27.128.33:9527  tablet       1665568158749   online   NULL
  172.27.128.33:9528  tablet       1665568158741   online   NULL
  172.27.128.31:6527  nameserver   1665568159782   online   master
  172.27.128.33:9902  taskmanager  1665649276766   online   NULL
 ------------------- ------------ --------------- -------- ---------

在sql client中,可以通过执行以下sql命令,读写简单的表测试一下集群功能是否正常。(为了简单起见,这里只测试在线部分)

create database simple_test;
use simple_test;
create table t1(c1 int, c2 string);
set @@execute_mode='online';
Insert into t1 values (1, 'a'),(2,'b');
select * from t1;

部署在离线同步工具 (可选)#

在离线同步工具中的DataCollector需要部署在TabletServer所在机器上,所以,如果有在离线同步需求,可以在所有TabletServer部署目录中再进行DataCollector的部署。

SyncTool需要Java运行环境,没有额外要求,建议单独部署在一台机器上。

SyncTool的同步任务管理工具SyncTool Helper,在部署包的tools/synctool_helper.py,需要Python3运行环境,无额外要求,可以远程使用,但由于支持不够完善,查看Tool的调试信息需要在SyncTool所在机器上使用Helper。

具体部署方式见在离线同步工具,请仔细阅读在离线同步工具的版本条件与功能边界。