Doris 部署和升级文档
Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势,以及 Doris 的高可用特性,我们建议 Doris 的部署遵循以下需求:
Linux 操作系统版本需求
软件需求
开发测试环境
生产环境
- 通常我们建议 10 ~ 100 台左右的机器,来充分发挥 Doris 的性能(其中 3 台部署 FE(HA),剩余的部署 BE)
- 当然,Doris的性能与节点数量及配置正相关。在最少4台机器(一台 FE,三台 BE,其中一台 BE 混部一个 Observer FE 提供元数据备份),以及较低配置的情况下,依然可以平稳的运行 Doris。
- 不建议 FE 和 BE 混部,可能会造成资源竞争。
Broker 部署
Broker 是用于访问外部数据源(如 hdfs)的进程。通常,在每台机器上部署一个 broker 实例即可。
网络需求
Doris 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口
注: 1. 当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。 2. 部署前请确保各个端口在应有方向上的访问权限。
IP 绑定
因为有多网卡的存在,或因为安装过 docker 等环境导致的虚拟网卡的存在,同一个主机可能存在多个不同的 ip。当前 Doris 并不能自动识别可用 IP。所以当遇到部署主机上有多个 IP 时,必须通过 priority_networks 配置项来强制指定正确的 IP。
priority_networks 是 FE 和 BE 都有的一个配置,配置项需写在 fe.conf 和 be.conf 中。该配置项用于在 FE 或 BE 启动时,告诉进程应该绑定哪个IP。示例如下:
这是一种 的表示方法。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 即可。
集群部署
手动部署
手动部署请参阅 安装编译文档
注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 。如需使用守护进程启动,需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号
(TODO)
Doris 可以很方便的扩容和缩容 FE、BE、Broker 实例。
FE 扩容和缩容
用户可以通过 mysql 客户端登陆 Master FE。通过:
SHOW PROC '/frontends';
来查看当前 FE 的节点情况。
也可以通过前端页面连接: 或者
http://fe_hostname:fe_http_port/system?path=//frontends
来查看 FE 节点的情况。
以上方式,都需要 Doris 的 root 用户权限。
FE 节点的扩容和缩容过程,不影响当前系统运行。
增加 FE 节点
Doris 支持增加两种 FE 节点:Follower 和 Observer。具体说明见: Doris 元数据设计文档
FE 节点的增加方式同 中 FE 高可用 一节中的方式相同。
删除 FE 节点
使用以下命令删除对应的 FE 节点:
ALTER SYSTEM DROP FOLLOWER[OBSERVER] "fe_host:edit_log_port";
FE 缩容注意事项: 1. 删除 Follower FE 时,确保最终剩余的 Follower(包括 Master)节点为奇数。 2. 当删除一个 FE 后,不能再使用相同的 fe_host:edit_log_port 添加 FE。新的 FE 必须使用新的 ip 或者新的 edit_log_port。
用户可以通过 mysql 客户端登陆 Master FE。通过:
SHOW PROC '/backends';
来查看当前 BE 的节点情况。
以上方式,都需要 Doris 的 root 用户权限。
BE 节点的扩容和缩容过程,不影响当前系统运行以及正在执行的任务,并且不会影响当前系统的性能。数据均衡会自动进行。根据集群现有数据量的大小,集群会在几个小时到1天不等的时间内,恢复到负载均衡的状态。集群负载情况,可以参见 前端页面 一节中, system 小节的 backends 介绍。
增加 BE 节点
BE 节点的增加方式同 安装编译文档 中 多 BE 部署 一节中的方式相同。
删除 BE 节点
删除 BE 节点有两种方式:DROP 和 DECOMMISSION
DROP 语句如下:
ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";
注意:DROP BACKEND 会直接删除该 BE,并且其上的数据将不能再恢复!!!所以我们强烈不推荐使用 DROP BACKEND 这种方式删除 BE 节点。当你使用这个语句时,会有对应的防误操作提示。
DECOMMISSION 语句如下:
ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";
DECOMMISSION 命令说明: 1. 该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。 2. 该命令是一个异步操作。执行后,可以通过SHOW PROC '/backends';
看到该 BE 节点的 isDecommission 状态为 true。表示该节点正在进行下线。 3. 该命令不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于 isDecommission 为 true 的状态。 4. DECOMMISSION 的进度,可以通过SHOW PROC '/backends';
中的 TabletNum 查看,如果正在进行,TabletNum 将不断减少。 5. 该操作可以通过:CANCEL ALTER SYSTEM DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";
命令取消。取消后,该 BE 上的数据将维持当前剩余的数据量。后续 Doris 重新进行负载均衡
对于多租户部署环境下,BE 节点的扩容和缩容,请参阅 多租户设计文档。
Broker 扩容缩容
Broker 实例的数量没有硬性要求。通常每台物理机部署一个即可。Broker 的添加和删除可以通过以下命令完成:
ALTER SYSTEM ADD BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";
ALTER SYSTEM DROP ALL BROKER broker_name;
Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即可。
Doris 升级
Doris 可以通过滚动升级的方式,平滑进行升级。建议按照以下步骤进行安全升级。
测试 BE 升级正确性
- 任意选择一个 BE 节点,部署最新的 palo_be 二进制文件。
- 重启 BE 节点,通过 BE 日志 be.INFO,查看是否启动成功。
- 如果启动失败,可以先排查原因。如果错误不可恢复,可以直接通过 DROP BACKEND 删除该 BE、清理数据后,使用上一个版本的 palo_be 重新启动 BE。然后重新 ADD BACKEND。(该方法会导致丢失一个数据副本,请务必确保3副本完整的情况下,执行这个操作!!!)
测试 FE 元数据兼容性(重要!!元数据兼容性异常很可能导致数据无法恢复!!)
- 单独使用新版本部署一个测试用的 FE 进程(比如自己本地的开发机)。
- 在 fe.conf 添加配置:cluster_id=123456
- 在 fe.conf 添加配置:metadata_failure_recovery=true
- 拷贝线上环境 Master FE 的元数据目录 palo-meta 到测试环境
- 将拷贝到测试环境中的 palo-meta/image/VERSION 文件中的 cluster_id 修改为 123456(即与第3步中相同)
- 在测试环境中,运行 sh bin/start_fe.sh 启动 FE
- 通过 FE 日志 fe.log 观察是否启动成功。
- 如果启动成功,运行 sh bin/stop_fe.sh 停止测试环境的 FE 进程。
- 以上 2-6 步的目的是防止测试环境的FE启动后,错误连接到线上环境中。
升级准备
- 在完成数据正确性验证后,将 BE 和 FE 新版本的二进制文件分发到各自目录下。
- 通常小版本升级,BE 只需升级 palo_be;而 FE 只需升级 palo-fe.jar。如果是大版本升级,则可能需要升级其他文件(包括但不限于 bin/ lib/ 等等)如果您不清楚是否需要替换其他文件,建议全部替换即可。
升级
- 确认新版本的文件部署完成后。逐台重启 FE 和 BE 实例即可。
- 建议逐台重启 FE 后,再逐台重启 BE。因为如果升级导致新旧 FE、BE 不兼容,从新 FE 发出的命令可能会导致旧的 BE 挂掉。但是因为已经部署了新的 BE 文件,BE 通过守护进程自动重启后,即已经是新的 BE 了。
- 建议确认前一个实例启动成功后,在重启下一个实例。实例启动成功的标识,请参阅 常见问题 一节
Doris 可以通过 FE 的 http_port,在浏览器显示系统展示页面。使用浏览器登陆:
然后输入 root 用户名及密码即可登录页面(该页面仅支持 root 用户登录)。以下简要介绍导航栏的各个标签页
- Doris(首页)
首页主要展示一些版本信息和硬件信息(待完善)
- System
System 页面主要展示各类元数据信息。下面按字母序分别介绍各个子条目的内容。
注: 1. 点击任意表格的标题列,可以按照该列排序。 2. 修改表格左上角 records per page
可以修改每页展示的条目。 3. 在表格右上角的 Search:
中可以按关键词过滤表格。 4. Current path:
后面的路径称为 PROC。如果无法通过浏览器显示页面,则可以在 mysql 客户端执行 SHOW PROC '/current_path';
来显示结果页的表格。
- access_resource
该页面展示系统内所有用户及其权限信息、以及每个用户最大连接数:MaxConn
。该连接数表示一个用户在一台 FE 上的最大连接数量。
- backends
- brokers
- 该页面展示所有已添加的 brokers
- dbs
- frontends
- 该页面展示所有 FE 节点。包括 Ip、edit_log_port、角色、cluster id 等信息。
- <code>Join</code> 列表示是否已经通过 bdbje 加入集群。当通过 <code>ADD FRONTEND</code> 添加 FE,并且 FE 未启动前,该列应为 false。FE 正常启动并加入集群后,该列会变为 true。
- jobs
- load_error_hub_url
- statistic
- tasks
- 该页面展示所有正在运行的 task 的信息。task 既对应 job 的子任务。该页面通常用于查看这些 task 是否**运行正常**,或者 task 是否有**堆积**。
- <code>FailedNum</code> 表示失败的 task 的数量。<code>TotalNum</code> 表示总数。
- 正常情况下,<code>FailedNum</code> 应该为**零**,表示没有失败的情况。<code>TotalNum</code> 应该维持在可接受的数量内,表示 task 没有堆积。
- 点击子页面的 <code>BackendId</code> 可以查看该类型的 task,在指定 BE 上,失败的 task 以及其重试次数。通常一个 task 对应的是一个 tablet,所以 <code>TaskSignature</code> 列即为 tablet id。可以前往该 BE,查看 BE 日志中有关该 tablet 的错误信息。
- logs
- 该页面展示最新的 10MB 的 fe.warn.log 日志内容。
ADD
输入框可以动态的打开或关闭某个 java package 或文件的 DEBUG 日志。(仅限 FE)- 比如想打开 Clone.java 这个文件中的 DEBUG 日志,则在 ADD 输入框中输入
org.apache.doris.clone.Clone
(既文件对应包的路径+文件名),然后点击ADD
,即可打开 Clone.java 这个文件中的 DEBUG 日志。DEBUG 日志在 fe.log 中,不在 fe.warn.log 中,所以该页面看不到 DEBUG 日志。 - 比如想打开 load 这个 pakage 下所有文件的 DEBUG 日志,则添加
org.apache.doris.load
(即仅包路径)即可。 - 在
Delete
输入框可以输入对应ADD
的内容,即可删除(关闭)相应 DEBUG 日志。- queries
- 该页面显示最新 100 个 query 的详细信息。注意,只有在 mysql 中设置 session 变量:
set is_report_success=true;
之后,后续的查询才会显示在这里。 - 对于 query 查询,
Query State
为 EOF 即表示正常。 - 点击最后一列
Profile
,可以查看该 query 的详细执行情况。- sessions
- 该页面展示当前连接到这个 FE 的连接信息,包括 session id、用户、来自哪个主机等。
- 该页面的信息,可以通过执行 mysql 命令
SHOW PROCESSLIST;
查看。 如果需要杀死某个 session,可以通过 mysql 命令
KILL session_id;
执行。- variables
该页面分为
Configure Info
和Variable Info
两部分。Configure Info
展示了当前 FE 的配置信息。Variable Info
为当前 mysql 的(global)session variable 信息。Configure Info
中的配置项可以通过以下 http 接口动态修改而不用重启 FE:fe_host:http:port/api/_set_config?config_name=config_value
但参数是否能生效,要看具体的实现。并且这种修改方式,只作用于该 FE,且在 FE 重启后失效。- ha
该页面展示了 FE 高可用的一些信息。包括当前 FE 的角色、当前写入的 journal id、checkpoint、其他 FE 节点的信息。
Electable nodes
中是所有 Follower(包括 Master)FE。Observer nodes
中是所有 Observer FE。Checkpoint Info
的last checkpoint version
是当前 image(checkpoint) 中包含的最大的 journal id。而 是最新的 image 生成时间。默认每 100000 条日志生成一次 image。如果发现很久都没有生成新的 image 了,有可能是 checkpoint 遇到了问题。需要到 fe 的 fe.log 日志中,搜索由Checkpoint.java
文件中打印出来的日志信息,查看具体问题。Database names
是 BDBJE 内部的 db 名称,和用户数据库名称无关。Allowed Frontends
包含所有当前的 FE 节点。Removed Frontends
包含所有曾经移除过的 FE 节点。这些节点对应的 ip:port 不能在重复使用。需要更换 ip 或者 port 后,才能重新加入。- help
该页面用户搜索和展示各类语句帮助。
- Help 是唯一一个不需要 root 权限即可查看的页面。 可以直接通过:
fe_host:http_port/help
访问。 - 在输入框中输入想要搜索的语句的关键词,比如
load
,即可查找相关关键词对应的语法的帮助。
常见问题
- 如何确定 FE 进程启动成功
FE 进程启动后,会首先加载元数据,根据 FE 角色的不同,在日志中会看到transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER
。最终会看到thrift server started
日志,并且可以通过 mysql 客户端连接到 FE,则表示 FE 启动成功。
也可以通过如下连接查看是否启动成功:
如果返回: {"status":"OK","msg":"Success"}
则表示启动成功,其余情况,则可能存在问题。
注:如果在 fe.log 中查看不到启动失败的信息,也许在 fe.out 中可以看到。
- 如何确定 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 中可以看到。
如果心跳正常,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 的连通性。
- Doris 各节点认证机制
除了 Master FE 以外,其余角色节点(Follower FE,Observer FE,Backend),都需要通过 ALTER SYSTEM ADD
语句先注册到集群,然后才能加入集群。
Master FE 在第一次启动时,会在 palo-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。
原文: