diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/doris.md" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/doris.md" new file mode 100644 index 0000000000000000000000000000000000000000..a7db42e5933472d5c2405ebe5384e4cfe0acb7a7 --- /dev/null +++ "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/doris.md" @@ -0,0 +1,74 @@ +> 本次采用 TPCH 以及 TPCDS 数据集对 doris 进行测试验证。注意:TPCDS 需要 gcc 9 版本,可下载 gcc 9源码进行编译 + +### TPCH 数据集 + +##### 测试步骤 + +1. build dbgen 工具 + + `./bin/build-tpch-dbgen.sh` + +2. 生成1GB的 tpc-h 数据 + + `./bin/gen-tpch-data.sh -s 1` + +3. 建表 + + `./bin/create-tpch-tables.sh -s 1` + + ![](./imgs/tpch_create_table_result.png) + +4. 导入数据 + + `./bin/load-tpch-data.sh` + + ![](./imgs/load-tpch-data_result.png) + +5. 测试 + + `./bin/run-tpch-queries.sh -s 1` + +##### 测试结果 + +1GB TPCH 数据集全部测试通过,Cold run time 总计 9249 ms, Hot run time 总计 4865 ms。 +具体执行时间及状态如下图所示: + +![](./imgs/tpch_test_result.png) + +### TPCDS 数据集 + +> TPCDS 需要 gcc 9进行编译,与 doris 所需 gcc 版本冲突,因此需要单独安装 gcc 9 + +1. build dbgen 工具 + + `export PATH=/usr/bin/:$PATH + ./bin/build-tpcds-tools.sh` + +2. 生成1GB的 tpc-h 数据 + + `./bin/gen-tpcds-data.sh -s 1` + +3. 生成 tpc-ds queries + + `./bin/gen-tpcds-queries.sh -s 1` + +4. 建表 + + `./bin/create-tpcds-tables.sh -s 1` + +5. 导入数据 + + `./bin/load-tpcds-data.sh` + +6. 测试 + + `./bin/run-tpcds-queries.sh -s 1` + +##### 测试结果 + +1GB TPCDS 数据集总计 99 条 queries,通过 61 条,取消 pipefail 后执行测试,cold run time 总计 17142 ms, hot run time 总计 15436 ms。 +具体执行时间及状态如下图所示: + +![](./imgs/tpcds_test_result.png) + +通过测试的 queries 数目为38,具体信息如下:![](./imgs/passed_queries_list.png) diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/load-tpch-data_result.png" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/load-tpch-data_result.png" new file mode 100644 index 0000000000000000000000000000000000000000..84c63ba61dd779ef0aa21e891c5d1e5211f7afb7 Binary files /dev/null and "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/load-tpch-data_result.png" differ diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/passed_queries_list.png" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/passed_queries_list.png" new file mode 100644 index 0000000000000000000000000000000000000000..87f7a8f3bc191a00ffcd8972f3408d2de0b8e8c7 Binary files /dev/null and "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/passed_queries_list.png" differ diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpcds_test_result.png" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpcds_test_result.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cff7c8574b0db36ef8f850a11b2c402574c7196 Binary files /dev/null and "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpcds_test_result.png" differ diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_create_table_result.png" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_create_table_result.png" new file mode 100644 index 0000000000000000000000000000000000000000..9159c1667692965984a561d5f83494c6ad0993f3 Binary files /dev/null and "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_create_table_result.png" differ diff --git "a/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_test_result.png" "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_test_result.png" new file mode 100644 index 0000000000000000000000000000000000000000..2806d9750492ff8c2a01047302e36d3739e36f28 Binary files /dev/null and "b/Docs/\346\265\213\350\257\225\346\212\245\345\221\212/doris/imgs/tpch_test_result.png" differ diff --git "a/Docs/\347\247\273\346\244\215\346\214\207\345\215\227/doris.md" "b/Docs/\347\247\273\346\244\215\346\214\207\345\215\227/doris.md" new file mode 100644 index 0000000000000000000000000000000000000000..d61ae454bc6ce350a70c81173d7f02247210ac1d --- /dev/null +++ "b/Docs/\347\247\273\346\244\215\346\214\207\345\215\227/doris.md" @@ -0,0 +1,230 @@ +# Doris 移植 + +--- + +硬件环境: + +1. 系统架构:ARM X64 +2. CPU:至少4 C +3. 内存:至少16 GB +4. 硬盘:至少40GB(SSD)、至少100GB(SSD) + +--- + +1. 创建软件下载安装包根目录和软件安装根目录 + + ``` + # 创建软件下载安装包根目录 + mkdir /opt/tools + # 创建软件安装根目录 + mkdir /opt/software + ``` + +2. 安装 git + + `yum install -y git` + +3. 安装 java 环境 + + ``` + cd /opt/tools + wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz && \ + tar -zxvf jdk-8u291-linux-aarch64.tar.gz && \ + mv jdk1.8.0_291 /opt/software/jdk8 + ``` + +4. 安装 maven + + ``` + cd /opt/tools + # wget 工具下载后,直接解压缩配置环境变量使用 + wget https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz && \ + tar -zxvf apache-maven-3.6.3-bin.tar.gz && \ + mv apache-maven-3.6.3 /opt/software/maven + ``` + +5. 安装 nodejs + + ``` + cd /opt/tools + # 下载 arm64 架构的安装包 + wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz && \ + tar -xvf node-v16.3.0-linux-arm64.tar.xz && \ + mv node-v16.3.0-linux-arm64 /opt/software/nodejs + ``` + +6. 安装 LDB_Toolchain + + ``` + cd /opt/tools + # 下载 LDB-Toolchain ARM 版本 + wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.9.1/ldb_toolchain_gen.aarch64.sh && \ + sh ldb_toolchain_gen.aarch64.sh /opt/software/ldb_toolchain/ + ``` + +7. 配置环境变量 + + ``` + # 配置环境变量 + vim /etc/profile.d/doris.sh + export JAVA_HOME=/opt/software/jdk8 + export MAVEN_HOME=/opt/software/maven + export NODE_JS_HOME=/opt/software/nodejs + export LDB_HOME=/opt/software/ldb_toolchain + export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$NODE_JS_HOME/bin:$LDB_HOME/bin:$PATH + + # 保存退出并刷新环境变量 + source /etc/profile.d/doris.sh + ``` + +8. 安装其他额外环境和组件 + + ``` + sudo yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 bison zip util-linux wget git python3 + + # install autoconf-2.69 + cd /opt/tools + wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \ + tar zxf autoconf-2.69.tar.gz && \ + mv autoconf-2.69 /opt/software/autoconf && \ + cd /opt/software/autoconf && \ + ./configure && \ + make && \ + make install + ``` + +9. 下载源码 + + ``` + cd /opt + git clone https://github.com/apache/doris.git + ``` + +10. 打开 doris 根目录下的 env.sh 脚本,将 115 行设置为 ` DORIS_TOOLCHAIN=gcc`, 更换为 gcc 编译器 + + ``` + if [[ -z "${DORIS_TOOLCHAIN}" ]]; then + if [[ "$(uname -s)" == 'Darwin' ]]; then + DORIS_TOOLCHAIN=clang + else + DORIS_TOOLCHAIN=gcc + fi + fi + ``` + +11. 编辑 /thirdparty下的 `build-thirdparty.sh` 文件,将 1656 行的 `build_hadoop_libs()` 函数替换为以下内容 + + ``` + build_hadoop_libs() { + check_if_source_exist "${HADOOP_LIBS_SOURCE}" + cd "${TP_SOURCE_DIR}/${HADOOP_LIBS_SOURCE}" + echo "THIRDPARTY_INSTALLED=${TP_INSTALL_DIR}" >env.sh + + ASAN_SYMBOLIZER_PATH_TEMP=ASAN_SYMBOLIZER_PATH + BUILD_SYSTEM_TEMP=BUILD_SYSTEM + BUILD_THIRDPARTY_WIP_TEMP=BUILD_THIRDPARTY_WIP + CC_TEMP=CC + CCACHE_COMPILERCHECK_TEMP=CCACHE_COMPILERCHECK + CCACHE_PCH_EXTSUM_TEMP=CCACHE_PCH_EXTSUM + CCACHE_SLOPPINESS_TEMP=CCACHE_SLOPPINESS + CLANG_COMPATIBLE_FLAGS_TEMP=CLANG_COMPATIBLE_FLAGS + CMAKE_CMD_TEMP=CMAKE_CMD + CMAKE_PREFIX_PATH_TEMP=CMAKE_PREFIX_PATH + CXX_TEMP=CXX + DORIS_BIN_UTILS_TEMP=DORIS_BIN_UTILS + DORIS_CLANG_HOME_TEMP=DORIS_CLANG_HOME + DORIS_GCC_HOME_TEMP=DORIS_GCC_HOME + DORIS_HOME_TEMP=DORIS_HOME + DORIS_THIRDPARTY_TEMP=DORIS_THIRDPARTY + GENERATOR_TEMP=GENERATOR + LC_ALL_TEMP=LC_ALL + LD_LIBRARY_PATH_TEMP=LD_LIBRARY_PATH + PKG_CONFIG_PATH_TEMP=PKG_CONFIG_PATH + PYTHON_TEMP=PYTHON + REPOSITORY_URL_TEMP=REPOSITORY_URL + TP_DIR_TEMP=TP_DIR + TP_INCLUDE_DIR_TEMP=TP_INCLUDE_DIR + TP_INSTALL_DIR_TEMP=TP_INSTALL_DIR + TP_JAR_DIR_TEMP=TP_JAR_DIR + TP_LIB_DIR_TEMP=TP_LIB_DIR + TP_PATCH_DIR_TEMP=TP_PATCH_DIR + TP_SOURCE_DIR_TEMP=TP_SOURCE_DIR + + unset ASAN_SYMBOLIZER_PATH + unset BUILD_SYSTEM + unset BUILD_THIRDPARTY_WIP + unset CC + unset CCACHE_COMPILERCHECK + unset CCACHE_PCH_EXTSUM + unset CCACHE_SLOPPINESS + unset CLANG_COMPATIBLE_FLAGS + unset CMAKE_CMD + unset CMAKE_PREFIX_PATH + unset CXX + unset DORIS_BIN_UTILS + unset DORIS_CLANG_HOME + unset DORIS_GCC_HOME + unset DORIS_HOME + unset DORIS_THIRDPARTY + unset GENERATOR + unset LC_ALL + unset LD_LIBRARY_PATH + unset PKG_CONFIG_PATH + unset PYTHON + unset REPOSITORY_URL + unset TP_DIR + unset TP_INCLUDE_DIR + unset TP_INSTALL_DIR + unset TP_JAR_DIR + unset TP_LIB_DIR + unset TP_PATCH_DIR + unset TP_SOURCE_DIR + + ./build.sh + + ASAN_SYMBOLIZER_PATH=ASAN_SYMBOLIZER_PATH_TEMP + BUILD_SYSTEM=BUILD_SYSTEM_TEMP + BUILD_THIRDPARTY_WIP=BUILD_THIRDPARTY_WIP_TEMP + CC=CC_TEMP + CCACHE_COMPILERCHECK=CCACHE_COMPILERCHECK_TEMP + CCACHE_PCH_EXTSUM=CCACHE_PCH_EXTSUM_TEMP + CLANG_COMPATIBLE_FLAGS=CLANG_COMPATIBLE_FLAGS_TEMP + CMAKE_CMD=CMAKE_CMD_TEMP + CMAKE_PREFIX_PATH=CMAKE_PREFIX_PATH_TEMP + CXX=CXX_TEMP + DORIS_BIN_UTILS=DORIS_BIN_UTILS_TEMP + DORIS_CLANG_HOME=DORIS_CLANG_HOME_TEMP + DORIS_GCC_HOME=DORIS_GCC_HOME_TEMP + DORIS_HOME=DORIS_HOME_TEMP + DORIS_THIRDPARTY=DORIS_THIRDPARTY_TEMP + GENERATOR=GENERATOR_TEMP + LC_ALL=LC_ALL_TEMP + LD_LIBRARY_PATH=LD_LIBRARY_PATH_TEMP + PKG_CONFIG_PATH=PKG_CONFIG_PATH_TEMP + PYTHON=PYTHON_TEMP + REPOSITORY_URL=REPOSITORY_URL_TEMP + TP_DIR=TP_DIR_TEMP + TP_INCLUDE_DIR=TP_INCLUDE_DIR_TEMP + TP_INSTALL_DIR=TP_INSTALL_DIR_TEMP + TP_JAR_DIR=TP_JAR_DIR_TEMP + TP_LIB_DIR=TP_LIB_DIR_TEMP + TP_PATCH_DIR=TP_PATCH_DIR_TEMP + TP_SOURCE_DIR=TP_SOURCE_DIR_TEMP + + mkdir -p "${TP_INSTALL_DIR}/include/hadoop_hdfs/" + mkdir -p "${TP_INSTALL_DIR}/lib/hadoop_hdfs/" + cp -r ./hadoop-dist/target/hadoop-libhdfs-3.3.4/* "${TP_INSTALL_DIR}/lib/hadoop_hdfs/" + cp -r ./hadoop-dist/target/hadoop-libhdfs-3.3.4/include/hdfs.h "${TP_INSTALL_DIR}/include/hadoop_hdfs/" + rm -rf "${TP_INSTALL_DIR}/lib/hadoop_hdfs/native/*.a" + find ./hadoop-dist/target/hadoop-3.3.4/lib/native/ -type f ! -name '*.a' -exec cp {} "${TP_INSTALL_DIR}/lib/hadoop_hdfs/native/" \; + find ./hadoop-dist/target/hadoop-3.3.4/lib/native/ -type l -exec cp -P {} "${TP_INSTALL_DIR}/lib/hadoop_hdfs/native/" \; + + } + ``` + +12. 在根目录下执行编译脚本(由于网络原因下载第三方库时可能会失败,需要多尝试几次) + + ``` + export REPOSITORY_URL=https://doris-thirdparty-repo.bj.bcebos.com/thirdparty + USE_AVX2=OFF sh build.sh + ``` diff --git "a/Docs/\351\203\250\347\275\262\346\214\207\345\215\227/doris.md" "b/Docs/\351\203\250\347\275\262\346\214\207\345\215\227/doris.md" new file mode 100644 index 0000000000000000000000000000000000000000..e00fa892b4fe3a1a6884460047e7998a22598d4b --- /dev/null +++ "b/Docs/\351\203\250\347\275\262\346\214\207\345\215\227/doris.md" @@ -0,0 +1,316 @@ +# 标准部署 + +该文档主要介绍了部署 Doris 所需软硬件环境、建议的部署方式、集群扩容缩容,以及集群搭建到运行过程中的常见问题。 +在阅读本文档前,请先根据编译文档编译 Doris。 + +## 软硬件需求[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E8%BD%AF%E7%A1%AC%E4%BB%B6%E9%9C%80%E6%B1%82 "软硬件需求的直接链接") + +### 概述[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E6%A6%82%E8%BF%B0 "概述的直接链接") + +Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势,以及 Doris 的高可用特性,我们建议 Doris 的部署遵循以下需求: + +#### Linux 操作系统版本需求[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#linux-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%89%88%E6%9C%AC%E9%9C%80%E6%B1%82 "Linux 操作系统版本需求的直接链接") + +| Linux 系统 | 版本 | +| -------- | --------- | +| CentOS | 7.1 及以上 | +| Ubuntu | 16.04 及以上 | + +#### 软件需求[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E8%BD%AF%E4%BB%B6%E9%9C%80%E6%B1%82 "软件需求的直接链接") + +| 软件 | 版本 | +| ---- | --------- | +| Java | 1.8 及以上 | +| GCC | 4.8.2 及以上 | + +#### 操作系统安装要求[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%A6%81%E6%B1%82 "操作系统安装要求的直接链接") + +##### 设置系统最大打开文件句柄数[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E8%AE%BE%E7%BD%AE%E7%B3%BB%E7%BB%9F%E6%9C%80%E5%A4%A7%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E5%8F%A5%E6%9F%84%E6%95%B0 "设置系统最大打开文件句柄数的直接链接") + +``` +vi /etc/security/limits.conf * soft nofile 65536* hard nofile 65536 +``` + +##### 时钟同步[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E6%97%B6%E9%92%9F%E5%90%8C%E6%AD%A5 "时钟同步的直接链接") + +Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。 + +##### 关闭交换分区(swap)[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E5%85%B3%E9%97%AD%E4%BA%A4%E6%8D%A2%E5%88%86%E5%8C%BAswap "关闭交换分区(swap)的直接链接") + +Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区 + +##### Linux文件系统[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#linux%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F "Linux文件系统的直接链接") + +ext4和xfs文件系统均支持。 + +#### 开发测试环境[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E5%BC%80%E5%8F%91%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83 "开发测试环境的直接链接") + +| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量 | +| -------- | --- | ----- | ------------------ | ---- | ----- | +| Frontend | 8核+ | 8GB+ | SSD 或 SATA,10GB+ * | 千兆网卡 | 1 | +| Backend | 8核+ | 16GB+ | SSD 或 SATA,50GB+ * | 千兆网卡 | 1-3 * | + +#### 生产环境[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83 "生产环境的直接链接") + +| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量(最低要求) | +| -------- | ---- | ----- | --------------------- | ---- | ---------- | +| Frontend | 16核+ | 64GB+ | SSD 或 RAID 卡,100GB+ * | 万兆网卡 | 1-3 * | +| Backend | 16核+ | 64GB+ | SSD 或 SATA,100G+ * | 万兆网卡 | 3 * | + +> 注1: +> +> 1. FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个 GB 不等。 +> 2. BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量 * 3(3副本)计算,然后再预留额外 40% 的空间用作后台 compaction 以及一些中间数据的存放。 +> 3. 一台机器上可以部署多个 BE 实例,但是**只能部署一个 FE**。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。**多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)** +> 4. 测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。 +> 5. 所有部署节点关闭 Swap。 + +> 注2:FE 节点的数量 +> +> 1. FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower)。 +> 2. FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。 +> 3. Follower 的数量**必须**为奇数,Observer 数量随意。 +> 4. 根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。 + +- **通常我们建议 10 ~ 100 台左右的机器,来充分发挥 Doris 的性能(其中 3 台部署 FE(HA),剩余的部署 BE)** +- **当然,Doris的性能与节点数量及配置正相关。在最少4台机器(一台 FE,三台 BE,其中一台 BE 混部一个 Observer FE 提供元数据备份),以及较低配置的情况下,依然可以平稳的运行 Doris。** +- **如果 FE 和 BE 混部,需注意资源竞争问题,并保证元数据目录和数据目录分属不同磁盘。** + +#### Broker 部署[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#broker-%E9%83%A8%E7%BD%B2 "Broker 部署的直接链接") + +Broker 是用于访问外部数据源(如 hdfs)的进程。通常,在每台机器上部署一个 broker 实例即可。 + +#### 网络需求[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E7%BD%91%E7%BB%9C%E9%9C%80%E6%B1%82 "网络需求的直接链接") + +Doris 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口 + +| 实例名称 | 端口名称 | 默认端口 | 通讯方向 | 说明 | +| ------ | ---------------------- | ---- | ---------------------------- | ------------------------------------ | +| BE | be_port | 9060 | FE --> BE | BE 上 thrift server 的端口,用于接收来自 FE 的请求 | +| BE | webserver_port | 8040 | BE <--> BE | BE 上的 http server 的端口 | +| BE | heartbeat_service_port | 9050 | FE --> BE | BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳 | +| BE | brpc_port | 8060 | FE <--> BE, BE <--> BE | BE 上的 brpc 端口,用于 BE 之间通讯 | +| FE | http_port | 8030 | FE <--> FE,用户 <--> FE | FE 上的 http server 端口 | +| FE | rpc_port | 9020 | BE --> FE, FE <--> FE | FE 上的 thrift server 端口,每个fe的配置需要保持一致 | +| FE | query_port | 9030 | 用户 <--> FE | FE 上的 mysql server 端口 | +| FE | edit_log_port | 9010 | FE <--> FE | FE 上的 bdbje 之间通信用的端口 | +| Broker | broker_ipc_port | 8000 | FE --> Broker, BE --> Broker | Broker 上的 thrift server,用于接收请求 | + +> 注: +> +> 1. 当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。 +> 2. 部署前请确保各个端口在应有方向上的访问权限。 + +#### IP 绑定[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#ip-%E7%BB%91%E5%AE%9A "IP 绑定的直接链接") + +因为有多网卡的存在,或因为安装过 docker 等环境导致的虚拟网卡的存在,同一个主机可能存在多个不同的 ip。当前 Doris 并不能自动识别可用 IP。所以当遇到部署主机上有多个 IP 时,必须通过 priority_networks 配置项来强制指定正确的 IP。 + +priority_networks 是 FE 和 BE 都有的一个配置,配置项需写在 fe.conf 和 be.conf 中。该配置项用于在 FE 或 BE 启动时,告诉进程应该绑定哪个IP。示例如下: + +`priority_networks=10.1.3.0/24` + +这是一种 [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) 的表示方法。FE 或 BE 会根据这个配置项来寻找匹配的IP,作为自己的 localIP。 + +**注意**:当配置完 priority_networks 并启动 FE 或 BE 后,只是保证了 FE 或 BE 自身的 IP 进行了正确的绑定。而在使用 ADD BACKEND 或 ADD FRONTEND 语句中,也需要指定和 priority_networks 配置匹配的 IP,否则集群无法建立。举例: + +BE 的配置为:`priority_networks=10.1.3.0/24` + +但是在 ADD BACKEND 时使用的是:`ALTER SYSTEM ADD BACKEND "192.168.0.1:9050";` + +则 FE 和 BE 将无法正常通信。 + +这时,必须 DROP 掉这个添加错误的 BE,重新使用正确的 IP 执行 ADD BACKEND。 + +FE 同理。 + +BROKER 当前没有,也不需要 priority_networks 这个选项。Broker 的服务默认绑定在 0.0.0.0 上。只需在 ADD BROKER 时,执行正确可访问的 BROKER IP 即可。 + +#### 表名大小写敏感性设置[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E8%A1%A8%E5%90%8D%E5%A4%A7%E5%B0%8F%E5%86%99%E6%95%8F%E6%84%9F%E6%80%A7%E8%AE%BE%E7%BD%AE "表名大小写敏感性设置的直接链接") + +doris默认为表名大小写敏感,如有表名大小写不敏感的需求需在集群初始化时进行设置。表名大小写敏感性在集群初始化完成后不可再修改。 + +## 集群部署 + +### 手动部署[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E6%89%8B%E5%8A%A8%E9%83%A8%E7%BD%B2 "手动部署的直接链接") + +#### FE 部署[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#fe-%E9%83%A8%E7%BD%B2 "FE 部署的直接链接") + +- 拷贝 FE 部署文件到指定节点 + + 将源码编译生成的 output 下的 fe 文件夹拷贝到 FE 的节点指定部署路径下并进入该目录。 + +- 配置 FE + + 1. 配置文件为 conf/fe.conf。其中注意:`meta_dir`是元数据存放位置。默认值为 `${DORIS_HOME}/doris-meta`。需**手动创建**该目录。 + + **注意:生产环境强烈建议单独指定目录不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好),测试开发环境可以使用默认配置** + + 2. fe.conf 中 JAVA_OPTS 默认 java 最大堆内存为 4GB,**建议生产环境调整至 8G 以上**。 + +- 启动FE + + `bin/start_fe.sh --daemon` + + FE进程启动进入后台执行。日志默认存放在 log/ 目录下。如启动失败,可以通过查看 log/fe.log 或者 log/fe.out 查看错误信息。 + +#### BE 部署[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#be-%E9%83%A8%E7%BD%B2 "BE 部署的直接链接") + +- 拷贝 BE 部署文件到所有要部署 BE 的节点 + + 将源码编译生成的 output 下的 be 文件夹拷贝到 BE 的节点的指定部署路径下。 + + > 注意:`output/be/lib/debug_info/` 目录下为调试信息文件,文件较大,但实际运行不需要这些文件,可以不部署。 + +- 修改所有 BE 的配置 + + 修改 be/conf/be.conf。主要是配置 `storage_root_path`:数据存放目录。默认在be/storage下,需要**手动创建**该目录。多个路径之间使用英文状态的分号 `;` 分隔(**最后一个目录后不要加 `;`**)。 + 可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号`,`隔开。如果用户不是SSD和HDD磁盘混合使用的情况,不需要按照如下示例一和示例二的配置方法配置,只需指定存储目录即可;也不需要修改FE的默认存储介质配置 + + 示例1如下: + + **注意:如果是SSD磁盘要在目录后面加上`.SSD`,HDD磁盘在目录后面加`.HDD`** + + `storage_root_path=/home/disk1/doris.HDD;/home/disk2/doris.SSD;/home/disk2/doris` + + **说明** + + - /home/disk1/doris.HDD : 表示存储介质是HDD; + - /home/disk2/doris.SSD: 表示存储介质是SSD; + - /home/disk2/doris: 表示存储介质是HDD(默认) + + 示例2如下: + + **注意:不论HDD磁盘目录还是SSD磁盘目录,都无需添加后缀,storage_root_path参数里指定medium即可** + + `storage_root_path=/home/disk1/doris,medium:HDD;/home/disk2/doris,medium:SSD` + + **说明** + + - /home/disk1/doris,medium:HDD: 表示存储介质是HDD; + - /home/disk2/doris,medium:SSD: 表示存储介质是SSD; + +- BE webserver_port端口配置 + + 如果 be 部署在 hadoop 集群中,注意调整 be.conf 中的 `webserver_port = 8040` ,以免造成端口冲突 + +- 配置 JAVA_HOME 环境变量 + + SinceVersion 1.2.0 由于从 1.2 版本开始支持 Java UDF 函数,BE 依赖于 Java 环境。所以要预先配置 `JAVA_HOME` 环境变量,也可以在 `start_be.sh` 启动脚本第一行添加 `export JAVA_HOME=your_java_home_path` 来添加环境变量。 + +- 安装 Java UDF 函数 + + SinceVersion 1.2.0 安装Java UDF 函数因为从 1.2 版本开始支持 Java UDF 函数,需要从官网下载 Java UDF 函数的 JAR 包放到 BE 的 lib 目录下,否则可能会启动失败。 + +- 在 FE 中添加所有 BE 节点 + + BE 节点需要先在 FE 中添加,才可加入集群。需要下载 mysql,使用命令 `sudo service mysqld start` 启动mysql 后使用以下命令连接到 FE: + + `mysql -h fe_host -P query_port -uroot` + + 其中 fe_host 为 FE 所在节点 ip;query_port 在 fe/conf/fe.conf 中的;默认使用 root 账户,无密码登录。 + + 登录后,执行以下命令来添加每一个 BE: + + `ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port";` + + 其中 be_host 为 BE 所在节点 ip;heartbeat_service_port 在 be/conf/be.conf 中。 + +- 启动 BE + + `bin/start_be.sh --daemon` + + BE 进程将启动并进入后台执行。日志默认存放在 be/log/ 目录下。如启动失败,可以通过查看 be/log/be.log 或者 be/log/be.out 查看错误信息。 + +- 查看BE状态 + + 使用 mysql-client 连接到 FE,并执行 `SHOW PROC '/backends';` 查看 BE 运行情况。如一切正常,`isAlive` 列应为 `true`。 + +## 常见问题[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 "常见问题的直接链接") + +### 进程相关[​](https://doris.incubator.apache.org/zh-CN/docs/1.2/install/standard-deployment/#%E8%BF%9B%E7%A8%8B%E7%9B%B8%E5%85%B3 "进程相关的直接链接") + +1. 如何确定 FE 进程启动成功 + + FE 进程启动后,会首先加载元数据,根据 FE 角色的不同,在日志中会看到 `transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER`。最终会看到 `thrift server started` 日志,并且可以通过 mysql 客户端连接到 FE,则表示 FE 启动成功。 + + 也可以通过如下连接查看是否启动成功: + `http://fe_host:fe_http_port/api/bootstrap` + + 如果返回: + `{"status":"OK","msg":"Success"}` + + 则表示启动成功,其余情况,则可能存在问题。 + + > 注:如果在 fe.log 中查看不到启动失败的信息,也许在 fe.out 中可以看到。 + +2. 如何确定 BE 进程启动成功 + + BE 进程启动后,如果之前有数据,则可能有数分钟不等的数据索引加载时间。 + + 如果是 BE 的第一次启动,或者该 BE 尚未加入任何集群,则 BE 日志会定期滚动 `waiting to receive first heartbeat from frontend` 字样。表示 BE 还未通过 FE 的心跳收到 Master 的地址,正在被动等待。这种错误日志,在 FE 中 ADD BACKEND 并发送心跳后,就会消失。如果在接到心跳后,又重复出现 `master client, get client from cache failed.host: , port: 0, code: 7` 字样,说明 FE 成功连接了 BE,但 BE 无法主动连接 FE。可能需要检查 BE 到 FE 的 rpc_port 的连通性。 + + 如果 BE 已经被加入集群,日志中应该每隔 5 秒滚动来自 FE 的心跳日志:`get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx`,表示心跳正常。 + + 其次,日志中应该每隔 10 秒滚动 `finish report task success. return code: 0` 的字样,表示 BE 向 FE 的通信正常。 + + 同时,如果有数据查询,应该能看到不停滚动的日志,并且有 `execute time is xxx` 日志,表示 BE 启动成功,并且查询正常。 + + 也可以通过如下连接查看是否启动成功: + `http://be_host:be_http_port/api/health` + + 如果返回: + `{"status": "OK","msg": "To Be Added"}` + + 则表示启动成功,其余情况,则可能存在问题。 + + > 注:如果在 be.INFO 中查看不到启动失败的信息,也许在 be.out 中可以看到。 + +3. 搭建系统后,如何确定 FE、BE 连通性正常 + + 首先确认 FE 和 BE 进程都已经单独正常启动,并确认已经通过 `ADD BACKEND` 或者 `ADD FOLLOWER/OBSERVER` 语句添加了所有节点。 + + 如果心跳正常,BE 的日志中会显示 `get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx`。如果心跳失败,在 FE 的日志中会出现 `backend[10001] got Exception: org.apache.thrift.transport.TTransportException` 类似的字样,或者其他 thrift 通信异常日志,表示 FE 向 10001 这个 BE 的心跳失败。这里需要检查 FE 向 BE host 的心跳端口的连通性。 + + 如果 BE 向 FE 的通信正常,则 BE 日志中会显示 `finish report task success. return code: 0` 的字样。否则会出现 `master client, get client from cache failed` 的字样。这种情况下,需要检查 BE 向 FE 的 rpc_port 的连通性。 + +4. Doris 各节点认证机制 + + 除了 Master FE 以外,其余角色节点(Follower FE,Observer FE,Backend),都需要通过 `ALTER SYSTEM ADD` 语句先注册到集群,然后才能加入集群。 + + Master FE 在第一次启动时,会在 doris-meta/image/VERSION 文件中生成一个 cluster_id。 + + FE 在第一次加入集群时,会首先从 Master FE 获取这个文件。之后每次 FE 之间的重新连接(FE 重启),都会校验自身 cluster id 是否与已存在的其它 FE 的 cluster id 相同。如果不同,则该 FE 会自动退出。 + + BE 在第一次接收到 Master FE 的心跳时,会从心跳中获取到 cluster id,并记录到数据目录的 `cluster_id` 文件中。之后的每次心跳都会比对 FE 发来的 cluster id。如果 cluster id 不相等,则 BE 会拒绝响应 FE 的心跳。 + + 心跳中同时会包含 Master FE 的 ip。当 FE 切主时,新的 Master FE 会携带自身的 ip 发送心跳给 BE,BE 会更新自身保存的 Master FE 的 ip。 + + > **priority_network** + > + > priority_network 是 FE 和 BE 都有一个配置,其主要目的是在多网卡的情况下,协助 FE 或 BE 识别自身 ip 地址。priority_network 采用 CIDR 表示法:[RFC 4632](https://tools.ietf.org/html/rfc4632) + > + > 当确认 FE 和 BE 连通性正常后,如果仍然出现建表 Timeout 的情况,并且 FE 的日志中有 `backend does not found. host: xxx.xxx.xxx.xxx` 字样的错误信息。则表示 Doris 自动识别的 IP 地址有问题,需要手动设置 priority_network 参数。 + > + > 出现这个问题的主要原因是:当用户通过 `ADD BACKEND` 语句添加 BE 后,FE 会识别该语句中指定的是 hostname 还是 IP。如果是 hostname,则 FE 会自动将其转换为 IP 地址并存储到元数据中。当 BE 在汇报任务完成信息时,会携带自己的 IP 地址。而如果 FE 发现 BE 汇报的 IP 地址和元数据中不一致时,就会出现如上错误。 + > + > 这个错误的解决方法:1)分别在 FE 和 BE 设置 **priority_network** 参数。通常 FE 和 BE 都处于一个网段,所以该参数设置为相同即可。2)在 `ADD BACKEND` 语句中直接填写 BE 正确的 IP 地址而不是 hostname,以避免 FE 获取到错误的 IP 地址。 + +5. BE 进程文件句柄数 + + BE进程文件句柄数,受min_file_descriptor_number/max_file_descriptor_number两个参数控制。 + + 如果不在[min_file_descriptor_number, max_file_descriptor_number]区间内,BE进程启动会出错,可以使用ulimit进行设置。 + + min_file_descriptor_number的默认值为65536。 + + max_file_descriptor_number的默认值为131072. + + 举例而言:ulimit -n 65536; 表示将文件句柄设成65536。 + + 启动BE进程之后,可以通过 cat /proc/$pid/limits 查看进程实际生效的句柄数 + + 如果使用了supervisord,遇到句柄数错误,可以通过修改supervisord的minfds参数解决。 + + ``` + vim /etc/supervisord.confminfds=65535 ; (min. avail startup file descriptors;default 1024) + ```