物理机部署
目前在物理机上安装 ByConity 的方式是通过软件包管理器,例如为 Debian OS 安装 Debian 软件包,为 Centos OS 安装 rpm 软件包。 由于 ByConity 使用 FoundationDB 作为元存储,使用 HDFS 作为数据存储。因此,在开始部署 ByConity 之前,我们需要先部署 FoundationDB 和 HDFS。步骤是首先安装 FoundationDB(FDB),然后安装 HDFS,最后再部署 ByConity 软件包,具体说明如下。
安装 FoundationDB
本章节我们将在 3 台物理机上设置 Foundation DB 集群。它们都使用 debian 操作系统。参考了官方指南:在 Linux 上入门 和 构建一个集群。
首先,我们需要在官方下载下载二进制文件进行安装。如果国内访问较慢,我们提供了国内下载地址。分别下载 server,monitor 和 cli 二进制文件,以及对应的 sha256 校验和文件(我们以版本 7.1.25为例)。
在本地创建 foundationdb/bin
文件夹中,并下载安装文件:
curl -L -o fdbserver.x86_64 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbserver.x86_64
curl -L -o fdbserver.x86_64.sha256 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbserver.x86_64.sha256
curl -L -o fdbmonitor.x86_64 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbmonitor.x86_64
curl -L -o fdbmonitor.x86_64.sha256 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbmonitor.x86_64.sha256
curl -L -o fdbcli.x86_64 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbcli.x86_64
curl -L -o fdbcli.x86_64.sha256 https://github.com/apple/foundationdb/releases/download/7.1.25/fdbcli.x86_64.sha256
- 国内下载地址
https://release-bin.tos-cn-beijing.volces.com/fdb/7.1.25/fdbcli.x86_64
https://release-bin.tos-cn-beijing.volces.com/fdb/7.1.25/fdbmonitor.x86_64
https://release-bin.tos-cn-beijing.volces.com/fdb/7.1.25/fdbserver.x86_64
https://release-bin.tos-cn-beijing.volces.com/fdb/7.1.25/foundationdb-clients-7.1.25-1.el7.x86_64.rpm
https://release-bin.tos-cn-beijing.volces.com/fdb/7.1.25/foundationdb-clients_7.1.25-1_amd64.deb
下载完成后,检查校验码:
$ sha256sum --binary fdbserver.x86_64
73b70a75464e64fd0a01a7536e110e31c3e6ce793d425aecfc40f0be9f0652b7 *fdbserver.x86_64
$ cat fdbserver.x86_64.sha256
73b70a75464e64fd0a01a7536e110e31c3e6ce793d425aecfc40f0be9f0652b7 fdbserver.x86_64
重命名可执行文件,并添加可执行权限,删除多余文件:
rm *.sha256
mv fdbcli.x86_64 fdbcli
mv fdbmonitor.x86_64 fdbmonitor
mv fdbserver.x86_64 fdbserver
chmod ug+x fdbcli fdbmonitor fdbserver
创建文件夹用以存储配置、数据和日志:
mkdir -p /<your_directory>/fdb_runtime/config
mkdir -p /<your_directory>/fdb_runtime/data
mkdir -p /<your_directory>/fdb_runtime/logs
在/<your_directory>/fdb_runtime/config/
文件夹下创建foundationdb.conf
配置文件,内容如下:
$ cat /<your_directory>/fdb_runtime/config/foundationdb.conf
[fdbmonitor]
user = root
[general]
cluster-file = /<your_directory>/fdb_runtime/config/fdb.cluster
restart-delay = 60
[fdbserver]
command = /<your_directory>/foundationdb/bin/fdbserver
datadir = /<your_directory>/fdb_runtime/data/$ID
logdir = /<your_directory>/fdb_runtime/logs/
public-address = auto:$ID
listen-address = public
[fdbserver.4500]
class=stateless
[fdbserver.4501]
class=transaction
[fdbserver.4502]
class=storage
[fdbserver.4503]
class=stateless
在相同的文件夹中创建名为fdb.cluster
的文件,内容如下:
$ cat /<your_directory>/fdb_runtime/config/fdb.cluster
# <your_ip_address> 换成本地ip地址
clusterdsc:test@<your_ip_address>:4500
将 FDB 安装为systemd
服务。在同一文件夹中,创建名为fdb.service
的文件,内容如下:
$ cat /<your_directory>/fdb_runtime/config/fdb.service
[Unit]
Description=FoundationDB (KV storage for cnch metastore)
[Service]
Restart=always
RestartSec=30
TimeoutStopSec=600
ExecStart=/<your_directory>/foundationdb/bin/fdbmonitor --conffile /<your_directory>/fdb_runtime/config/foundationdb.conf --lockfile /<your_directory>/fdb_runtime/fdbmonitor.pid
[Install]
WantedBy=multi-user.target
目前已经完成了配置文件的准备工作。现在将 FDB 安装到systemd
中。
将服务文件复制到/etc/systemd/system/
目录下:
cp fdb.service /etc/systemd/system/
重新加载服务文件以包括新服务:
systemctl daemon-reload
启用并启动服务:
systemctl enable fdb.service
systemctl start fdb.service
检查服务并查看它是否处于活动状态:
$ systemctl status fdb.service
fdb.service - FoundationDB (KV storage for cnch metastore)
Loaded: loaded (/etc/systemd/system/fdb.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2023-01-17 18:35:42 CST; 20s ago
现在已经在一台机器上安装了 FDB 服务,重复相同的步骤在另外两台机器上安装 FDB 服务。
安装完成之后,需要连接三台 FDB 服务以形成一个集群。 现在回到第一台节点,使用 fdbcli 连接到 FDB。
$ ./foundationdb/bin/fdbcli -C fdb_runtime/config/fdb.cluster
Using cluster file `fdb_runtime/config/fdb.cluster'.
The database is unavailable; type `status' for more information.
Welcome to the fdbcli. For help, type `help'.
fdb>
执行以下命令来初始化数据库:
configure new single ssd
将 3 台机器都设置为 coordinator,并将地址替换为你的机器地址:
coordinators <node_1_ip_address>:4500 <node_2_ip_address>:4500 <node_3_ip_address>:4500
然后退出 fdbcli,你会发现fdb.cluster
文件现在有了新内容:
$ cat fdb_runtime/config/fdb.cluster
# DO NOT EDIT!
# This file is auto-generated, it is not to be edited by hand
clusterdsc:wwxVEcyLvSiO3BGKxjIw7Sg5d1UTX5ad@example1.host.com:4500,example2.host.com:4500,example3.host.com:4500
将此文件复制到另外两台机器并替换旧文件,然后重新启动 fdb 服务:
systemctl restart fdb.service
然后返回第一台机器,再次使用 fdbcli 连接到 FDB,并执行以下命令将冗余模式更改为double
:
configure double
然后在 fdbcli 中执行status
命令以查看结果,你应该看到类似以下的内容:
fdb> status
Using cluster file `fdb_runtime/config/fdb.cluster'.
Configuration:
Redundancy mode - double
Storage engine - ssd-2
Coordinators - 3
Usable Regions - 1
证明你完成了 FoundationDB 服务器的安装。现在你拥有了fdb.cluster
文件。我们将在 Byconity 的配置中使用它。
安装 HDFS
这里我们使用 3 台机器上安装 HDFS,其中 1 台机器用于 namenode,其他 2 台机器用于 datanode。详细参考官方文档SingleCluster和ClusterSetup。我将安装 HDFS 版本 3.3.4,基于 Java-8 版本。
首先,在 3 台机器上安装 Java。有很多安装 Java 的方法,这里将使用以下两个命令进行安装:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
接下来,我们需要下载一个 Hadoop 发行版,可以在官网下载,我们同样也提供了国内快速下载地址,解压缩并进入该目录
$ curl -L -o hadoop-3.3.4.tar.gz https://dlcdn.apache.org/hadoop/common/stable/hadoop-3.3.4.tar.gz
$ tar xvf hadoop-3.3.4.tar.gz
$ ls
hadoop-3.3.4 hadoop-3.3.4.tar.gz
$ cd hadoop-3.3.4
- 国内下载地址
https://release-bin.tos-cn-beijing.volces.com/hdfs/3.3.6/hadoop-3.3.6.tar.gz
然后编辑文件etc/hadoop/hadoop-env.sh
以设置环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-byteopenjdk-amd64
export HADOOP_HOME=/<your_directory>/hdfs/hadoop-3.3.4
export HADOOP_LOG_DIR=/<your_directory>/hdfs/logs
使用以下内容编辑文件etc/hadoop/core-site.xml
:
#value标签需替换您的namenode地址的值
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://<your_name_node_ip_address>:12001</value>
</property>
</configuration>
目前所有三台机器的通用设置已经完成,下面针对 namenode 和 datanode 的做不同的配置安装。
首先在 namenode 的节点上,创建一个包含 datanode 列表的文件。例如datanodes_list.txt
内容如下:
$ cat /root/user_xyz/hdfs/datanodes_list.txt
<datanode_1_address>
<datanode_2_address>
然后创建一个目录以存储 namenode 运行时数据
mkdir -p /<your_directory>/hdfs/root_data_path_for_namenode
接下来,使用以下内容编辑文件etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///<your_directory>/hdfs/root_data_path_for_namenode</value>
</property>
<property>
<name>dfs.hosts</name>
<value>/<your_directory>/hdfs/datanodes_list.txt</value>
</property>
</configuration>
到此完成 namenode 的配置,接下来配置另外两个 datanode 节点。 首先在 datanode 节点上创建一个目录,来存储数据节点的运行时数据:
mkdir -p /root/user_xyz/hdfs/root_data_path_for_datanode
接下来编辑文件etc/hadoop/hdfs-site.xml
,内容如下:
<configuration>
<property>
<name>dfs.data.dir</name>
<value>file:///<your_directory>/hdfs/root_data_path_for_datanode</value>
</property>
</configuration>
完成配置后,再转到 namenode 节点,进入 hadoop 目录,格式化文件系统并使用以下命令启动 namenode
bin/hdfs namenode -format
bin/hdfs --daemon start namenode
然后进入另外两个 datanode 节点,进入 hadoop 目录并使用以下命令启动 datanode 节点:
bin/hdfs --daemon start datanode
在完成整个 HDFS 集群的配置后,我们必须创建一个目录来存储数据。 进入 namenode 节点,在 hadoop 目录中执行以下命令:
bin/hdfs dfs -mkdir -p /user/clickhouse/
bin/hdfs dfs -chown clickhouse /user/clickhouse
bin/hdfs dfs -chmod -R 775 /user/clickhouse
最后通过如下命令,查看下整个 hdfs 的状态,查看 dn 节点是否是 active:
bin/hdfs dfsadmin -report
安装 FoundationDB 客户端
ByConity 软件包部署依赖于 FoundationDB 客户端软件包。FoundationDB 客户端软件包与 FoundationDB 服务器版本紧密耦合。因此,我们需要选择与 FoundationDB 服务器版本匹配的客户端软件包。 FoundationDB 客户端软件包可以在官网下载,本例我们下载版本 7.1.27 用于 Debian OS amd64 机器。
curl -L -o foundationdb-clients_7.1.27-1_amd64.deb https://github.com/apple/foundationdb/releases/download/7.1.27/foundationdb-clients_7.1.27-1_amd64.deb
执行安装命令:
sudo dpkg -i foundationdb-clients_7.1.27-1_amd64.deb
部署 ByConity 软件包
接下来,我们将部署 ByConity 软件包,我们发布在 官方下载 中找到它们。或者可以自己构建软件包,请按照此 软件包构建指南。
安装软件包
安装 ByConity 需要的各个组件。
VERSION=0.4.3
ARCH=amd64
# 首先 `byconity-common-static`,这是所有其他软件包的依赖
dpkg -i byconity-common-static_${VERSION}_${ARCH}.deb
# 然后以相同的方式,安装 ByConity 资源管理器、ByConity 服务器、
# ByConity 工作器、ByConity 工作器写入和 ByConity 守护程序管理器。
# `byconity-resource-manager`、`byconity-daemon-manger` 和 `byconity-tso` 是轻量级服务,
# 因此可以安装在共享机器上与其他软件包一起使用。
# 但是,对于 `byconity-server`、`byconity-worker` 和 `byconity-worker-write`,
# 我们应该将它们分别安装在不同的机器上。
dpkg -i byconity-tso_${VERSION}_${ARCH}.deb
dpkg -i byconity-resource-manager_${VERSION}_${ARCH}.deb
dpkg -i byconity-server_${VERSION}_${ARCH}.deb
dpkg -i byconity-worker_${VERSION}_${ARCH}.deb
dpkg -i byconity-worker-write_${VERSION}_${ARCH}.deb
dpkg -i byconity-daemon-manager_${VERSION}_${ARCH}.deb
推荐的配置文件结构示例
通常,一项配置要么是专属于一种组件的,要么是集群共用的(如 HDFS/FDB 的连接参数), 因此下列配置文件组织结构展示了如何同时支持专用配置和公共配置。
- /etc/byconity-server/
- fdb.cluster
- byconity-tso.xml
- byconity-server.xml
- byconity-worker.xml
- byconity-worker-write.xml
- conf.d/
- xxx.xml
fdb.cluster
是客户端连接 FoundationDB 集群的配置文件。byconity-{tso,server,worker,worker-write}.xml
分别是各个组件使用的配置文件。conf.d/
是一个固定的文件夹名称,用于存放共用配置。对于 ByConity 来说,其内部的所有文件(没有命名方式、文件数量的限制)都会被自动合并 到组件的配置文件中。因此诸如<service_discovery/>
以及<hdfs_nnproxy/>
等公共配置都推荐存放在此处。
cnch_config
的方式已经不再建议使用,其内容可以直接迁移到 conf.d/
中。
除了 XML 格式,ByConity 同样支持 YAML 格式。在相互转换的过程中,请注意 XML 格式有一个额外的最外层 Tag —— <yandex />
。
编辑配置文件
一些值得注意的配置项包括:
在 conf.d/
新建任意 XML
文件,配置 service_discovery
标签和 hdfs_nnproxy
标签。
在 ByConity 中,组件之间有三种相互发现的方式。mode
标签用于指定方式,有三种模式:local
、dns
和 consul
。
在 local
模式下,用户需要在此配置文件中指定所有组件的 IP 地址或主机名,通过替换占位符 {your_xxx_address}
(例如 {your_server_address}
),该占位符实际上是组件的 IP 地址,例如 10.0.2.72
。
在 local
模式下,服务之间主要通过 host
(service_discovery > xxx > node[] > host
) 来获取某个服务的具体地址。
因此,请务必确保该项的值(比如可用于外部访问的 IP 或者域名)能够用于服务发现。
对于 hdfs_nnproxy
标签,包含 HDFS 的 namenode 地址。
启动程序
首先启动 TSO。
systemctl start byconity-tso
也可通过如下命令检查 TSO 状态:
systemctl status byconity-tso
注意:下次再次安装该软件包(如升级),则无需执行 start
命令
然后以同样的方式启动各个组件:
systemctl start byconity-server // 以及byconity-worker、byconity-resource-manager、byconity-daemon-manager
查看各组件启动状态:
systemctl status | grep byconity-
通过同样的方式安装更多的工作节点。每个工作节点都有一个名为WORKER_ID
的设置项,在配置文件/etc/byconity-server/(byconity-worker|byconity-worker-write).xml
中配置工作节点的worker id
,worker id
在工作节点之间必须是唯一的,配置文件中WORKER_ID
的默认值为空。
请尽量以 \w*-\d+
的正则方式命名 WORKER_ID
。
- 查看计算组状态
clickhouse client --port 9010
:) select * from system.workers