赞
踩
项目计划基于 Apache Doris 构建在线实时数据查询平台,目前准生产环境部署的版本为 0.10.13-release ,来自百度内部发布的分支版本,和 Apache 开源社区版本兼容,百度内部分支发布的版本可以尽快修复一些 Bug。最近 Apache Doris 开源社区也发布了 0.11 版本。
存储引擎重构
本次版本最大的改进就是重构了存储引擎,使代码的可读性、扩展性都得到了极大的提升。基于此次存储引擎的重构,优化了存储结构,预计在 0.12 版本中,Doris 能够支持字符串字典压缩,压缩比比目前版本提升1倍左右,以及在未来的版本中增加倒排索引等工作。
Bitmap类型支持
在这个版本中,Doris 支持了 Bitmap 类型。用户如果有精确去重的需求,可以通过使用这种类型来实现。用户可以在聚合模型下创建 Bitmap 类型的 value 列,然后向这个字段导入数据时,Doris 内部会将所有导入的数据求并呈现为一个Bitmap。当用户进行查询的时候能够对这个字段进行 union、count 等计算,从而能够达到精确去重的功能。
导入优化
Doris现在支持直接导入 Parquet 格式的数据内容。
识别分区列,能够从导入文件路径中获得对应的列信息
指定过滤条件,用户可以在导入的时候指定过滤条件
时区支持,用户无论导入、查询都能够设定时区来完成时间数据的相关转化。
修复众多bug
在本地和测试环境验证充分,版本兼容,不会对现有业务环境造成影响。
但是需要注意的是:目前由于准生产环境部署的 Doris 版本为 0.10.x 系列版本,而本次升级到 0.11.14 版本时,Doris 会将数据全部文件重命名,如果单机分片数目比较久的话,重启时间会比较长。一些经验值:单盘1分钟1万个分片。
如何查看 Backend 节点的分片数量?
通过 http://192.168.1.51:18030/system?path=//backends 查看 TabletNum 数量,由于目前使用规模比较小,单个 Backend 节点都不超过50个分片。
因为笔者构建的 Doris 集群是高可用方案,即数据为3副本,FE 为3节点高可用,所以本次 Doris 升级可以通过滚动升级的方式,平滑进行升级,这样可以保证不影响业务使用,进行安全升级。
下面详细列出升级的步骤,作为公司的测试、准生产和生产环境的唯一指导升级手册。
下载地址:
-
-
- https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz
-
-
- docker pull apachedoris/doris-dev:build-env-1.1
-
-
- docker run -itd -v /Volumes/D3/Doris/doris_docker_image/:/root/incubator-doris-DORIS-release apachedoris/doris-dev:build-env-1.1
注:/Volumes/D3/Doris/doris_docker_image/ 为本地磁盘
启动镜像后,登录容器中,通过以下命令下载 Doris 源码:
-
-
- wget https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz
-
-
- tar zxvf DORIS-0.11.14-release.tar.gzcd incubator-doris-DORIS-0.11.14-releasesh build.sh
编译完成后,产出文件在 output/ 目录中。
-
-
- [root@f9316c0821b6 incubator-doris-DORIS-0.11.14-release]# cd output/[root@f9316c0821b6 output]# lltotal 12drwxr-xr-x 5 root root 4096 Oct 29 05:33 bedrwxr-xr-x 6 root root 4096 Oct 29 05:33 fedrwxr-xr-x 4 root root 4096 Oct 29 05:33 udf
-
-
- # 把output打包tar czvf incubator-doris-0.11.14-release.tar.gz be fe udf
1. 任意选择一个 BE 节点,部署最新的 palo_be 二进制文件。选择 BE 192.168.1.12 节点:
-
-
- 1. sh /usr/local/doris/be/be/bin/stop_be.sh2. mv be be_0.10.x_backup3. 部署新版本的be4. sh /usr/local/doris/be/be/bin/start_be.sh --daemon5. 检查启动日志,以及服务状态
2. 重启 BE 节点,通过 BE 日志 be.INFO,查看是否启动成功。
3. 如果启动失败,可以先排查原因。如果错误不可恢复,可以直接通过 DROP BACKEND 删除该 BE、清理数据后,使用上一个版本的 palo_be 重新启动 BE。然后重新 ADD BACKEND。(该方法会导致丢失一个数据副本,请务必确保3副本完整的情况下,执行这个操作)
元数据兼容性异常很可能导致数据无法恢复。
单独使用新版本部署一个测试用的 FE 进程(比如自己本地的开发机)。
修改测试用的 FE 的配置文件 fe.conf,将所有端口设置为与线上不同。
在 fe.conf 添加配置:cluster_id=123456
在 fe.conf 添加配置:metadatafailurerecovery=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 实例即可。
建议逐台重启 BE 后,再逐台重启 FE。因为通常 Doris 保证 FE 到 BE 的向后兼容性,即老版本的 FE 可以访问新版本的 BE。但可能不支持老版本的 BE 访问新版本的 FE。
建议确认前一个实例启动成功后,在重启下一个实例。实例启动成功的标识,请参阅安装部署文档。
开发自动化滚动升级脚本,处理步骤8和9的工作。
开发自动化滚动升级脚本,处理步骤8和9的工作。 运行脚本之前,根据实际环境,完成如下几个事情:
修改脚本中的参数:
-
-
- (1)BE_HOSTS BE节点的主机列表,空格分隔(2)BE_HTTP_PORT BE节点 be_webport 端口(3)FE_HOSTS FE节点的主机列表,空格分隔(4)FE_HTTP_PORT FE 节点fe_http_port端口(5)BE和FE部署的家目录,脚本未抽取为参数,可以直接替换。BE家目录: /usr/local/doris/be/beFE家目录: /usr/local/doris/fe/fe
FE 集群节点的配置一致,BE 集群节点配置也保持一致。
执行该脚本的节点和 Doris(BE+FE)集群免密登录
脚本支持重复执行,已经升级过的节点,直接跳过
脚本升级之前,保证 Doris 集群正常
脚本未加入回滚机制,直接覆盖Doris安装软件的文件,如果需要备份老的版本安装包,请提前备份或修改脚本。因为笔者已经在测试环境进行充分验证可靠性。
修改完成后,直接执行脚本即可:
bash Doris_Auto_Upgrade_In_Production.sh
脚本如下:Doris_Auto_Upgrade_In_Production.sh
-
-
- #!/bin/bash############################################################################################################# Doris BE 升级############################################################################################################# 定义 BE 节点BE_HOSTS="192.168.1.12 192.168.1.13 192.168.1.14 192.168.1.15 192.168.1.16 192.168.1.17 192.168.1.18 192.168.1.19 192.168.1.20"BE_HTTP_PORT=18040# 1. 检验 Doris BE 节点升级前是否运行正常i=0for be_host in ${BE_HOSTS}do be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1` ok=`echo ${be_status} | egrep "OK|To Be Added"` if [[ ! -z ${ok} ]] then ((i=${i}+1)) echo ">>>>>> BE_NODE ${be_host} is ok." else echo ">>>>>> BE_NODE ${be_host} is failed !!!" fidoneecho "############## BE_HOSTS Successful Nodes: $i ##############"# 2. 先升级 BE 节点,滚动升级方案,逐个节点升级# 记录升级成功的节点BE_UPGRADE_HOSTS=""for be_host in ${BE_HOSTS}do # 脚本支持重复执行 # BE 部署的家目录: /usr/local/doris/be/be if_file_exist=`ssh root@${be_host} "file /usr/local/doris/be/be/upgrade_0.11.14_success"` failed=`echo $if_file_exist | egrep "cannot open|No such file or directory"` if [[ ! -z ${failed} ]] then echo ">>>>>> BE_NODE ${be_host} is not upgraded." else echo ">>>>>> BE_NODE ${be_host} is upgraded successfully. Skip!!!" continue fi # BE 节点停止服务 be_host_stop=`ssh root@${be_host} "sh /usr/local/doris/be/be/bin/stop_be.sh"` # 检查是否停止 be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1` ok=`echo ${be_status} | egrep "OK|To Be Added"` if [[ -z ${ok} ]] then echo ">>>>>> BE_NODE ${be_host} is stopped successfully." else echo ">>>>>> BE_NODE ${be_host} is not stopped. Failed!!!" exit 1 fi # 拷贝升级文件 # 拷贝升级文件之前,需要把 BE 集群的配置文件拷贝到新版本的配置目录下,方便统一覆盖 echo ">>>>>> [BE_NODE ${be_host} Copy Upgrade Files] begin ..." scp -r /home/shouzhuangjiang/doris-0.11.14-be/be/* root@${be_host}:/usr/local/doris/be/be/ echo ">>>>>> [BE_NODE ${be_host} Copy Upgrade Files] finish." # BE 启动 be_host_start=`ssh root@${be_host} "sh /usr/local/doris/be/be/bin/start_be.sh --daemon"` # sleep 10s sleep 10 # 检查启动后状态是否正常 be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1` ok=`echo ${be_status} | egrep "OK|To Be Added"` if [[ ! -z ${ok} ]] then # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件 ssh root@${be_host} "touch /usr/local/doris/be/be/upgrade_0.11.14_success" echo ">>>>>> BE_NODE ${be_host} is ok." else # 失败后检查几次 1s 3s 5s # 实际升级过程中,BE 检查需要会失败,重试几次 for t_sec_time in 5 3 1 do sleep $t_sec_time # 检查启动后状态是否正常 be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1` ok=`echo ${be_status} | egrep "OK|To Be Added"` if [[ ! -z ${ok} ]] then # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件 ssh root@${be_host} "touch /usr/local/doris/be/be/upgrade_0.11.14_success" echo ">>>>>> BE_NODE ${be_host} is ok." break else echo ">>>>>> BE_NODE ${be_host} is failed !!!" echo ">>>>>> BE 升级成功的节点: ${BE_UPGRADE_HOSTS}" continue fi echo ">>>>>> BE_NODE ${be_host} is failed !!!" echo ">>>>>> BE 升级成功的节点: ${BE_UPGRADE_HOSTS}" exit 1 done fi # 升级成功后,加入升级成功的列表中 BE_UPGRADE_HOSTS="${be_host} ${BE_UPGRADE_HOSTS}" # 再 sleep 5s sleep 5doneecho "############## Doris BEs Upgrade Successfully. ##############"############################################################################################################# Doris FE 升级############################################################################################################# 4. 定义 FE 节点FE_HOSTS="192.168.1.51 192.168.1.52 192.168.1.53"FE_HTTP_PORT=18030# 5. 检验 Doris FE 节点升级前是否运行正常j=0for fe_host in ${FE_HOSTS}do fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1` ok=`echo ${fe_status} | egrep "OK|Success"` if [[ ! -z ${ok} ]] then ((j=${j}+1)) echo ">>>>>> FE_NODE ${fe_host} is oK." else echo ">>>>>> FE_NODE ${fe_host} is failed !!!" fidoneecho "############## FE_HOSTS Successful Nodes: ${j} ##############"# 6. 升级 FE 节点,滚动升级方案,逐个节点升级# 记录升级成功的节点FE_UPGRADE_HOSTS=""for fe_host in ${FE_HOSTS}do # 脚本支持重复执行 # FE 家目录: /usr/local/doris/fe/fe if_file_exist=`ssh root@${fe_host} "file /usr/local/doris/fe/fe/upgrade_0.11.14_success"` failed=`echo $if_file_exist | egrep "cannot open|No such file or directory"` if [[ ! -z ${failed} ]] then echo ">>>>>> FE_NODE ${fe_host} is not upgraded." else echo ">>>>>> FE_NODE ${fe_host} is upgraded Successfully. Skip!!!" continue fi # 停节点 fe_host_stop=`ssh root@${fe_host} "sh /usr/local/doris/fe/fe/bin/stop_fe.sh"` # 检查是否停止 fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1` ok=`echo ${fe_status} | egrep "OK|Success"` if [[ -z ${ok} ]] then echo ">>>>>> FE_NODE ${fe_host} is stopped Successfully!" else echo ">>>>>> FE_NODE ${fe_host} is stopped. Failed!!!" exit 1 fi # 拷贝升级文件 # 拷贝升级文件之前,需要把 FE 集群的配置文件拷贝到新版本的配置目录下,方便统一覆盖 echo ">>>>>> [FE_NODE ${fe_host} Copy Upgrade Files] begin ..." scp -r /home/shouzhuangjiang/doris-0.11.14-fe/fe/* root@${fe_host}:/usr/local/doris/fe/fe/ echo ">>>>>> [FE_NODE ${fe_host} Copy Upgrade Files] finish." # 启动 fe_host_start=`ssh root@${fe_host} "sh /usr/local/doris/fe/fe/bin/start_fe.sh --daemon"` # sleep 10s sleep 10 # 检查启动后状态是否正常 fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1` ok=`echo ${fe_status} | egrep "OK|Success"` if [[ ! -z ${ok} ]] then # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件 ssh root@${fe_host} "touch /usr/local/doris/fe/fe/upgrade_0.11.14_success" echo ">>>>>> FE_NODE ${fe_host} is ok." else # 失败后检查几次 1s 3s 5s for t_sec_time in 5 3 1 do sleep $t_sec_time # 检查启动后状态是否正常 fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1` ok=`echo ${fe_status} | egrep "OK|Success"` if [[ ! -z ${ok} ]] then # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件 ssh root@${fe_host} "touch /usr/local/doris/fe/fe/upgrade_0.11.14_success" echo ">>>>>> FE_NODE ${fe_host} is ok." break else echo ">>>>>> FE_NODE ${fe_host} is failed !!!!" echo ">>>>>> FE 升级成功的节点: ${FE_UPGRADE_HOSTS}" continue fi echo ">>>>>> FE_NODE ${fe_host} is failed !!!" echo ">>>>>> FE 升级成功的节点: ${FE_UPGRADE_HOSTS}" exit 1 done fi # 升级成功后,加入升级成功的列表中 FE_UPGRADE_HOSTS="${fe_host} ${FE_UPGRADE_HOSTS}" # 再 sleep 5s sleep 5doneecho "############## Doris FEs Upgrade Successfully. ##############"
Doris 升级完成后,服务状态都处于正常,业务在整个滚动升级过程中没有任何影响。后续会对新版本进行功能测试和性能压测。
脚本工作只是临时性的,后面会加入到大数据平台的自助化运维平台体系,实现自动升级、回滚,以及监控整个运维流程,以及对业务使用的追踪。
Doris官方公众号文章《Apache Doris(incubating) 0.11.0版本正式发布》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。