背景

项目计划基于 Apache Doris 构建在线实时数据查询平台,目前准生产环境部署的版本为 0.10.13-release ,来自百度内部发布的分支版本,和 Apache 开源社区版本兼容,百度内部分支发布的版本可以尽快修复一些 Bug。最近 Apache Doris 开源社区也发布了 0.11 版本。

最新 Doris 0.11.x 版本介绍

  • 存储引擎重构

    本次版本最大的改进就是重构了存储引擎,使代码的可读性、扩展性都得到了极大的提升。基于此次存储引擎的重构,优化了存储结构,预计在 0.12 版本中,Doris 能够支持字符串字典压缩,压缩比比目前版本提升1倍左右,以及在未来的版本中增加倒排索引等工作。

  • Bitmap类型支持

    在这个版本中,Doris 支持了 Bitmap 类型。用户如果有精确去重的需求,可以通过使用这种类型来实现。用户可以在聚合模型下创建 Bitmap 类型的 value 列,然后向这个字段导入数据时,Doris 内部会将所有导入的数据求并呈现为一个Bitmap。当用户进行查询的时候能够对这个字段进行 union、count 等计算,从而能够达到精确去重的功能。

  • 导入优化

  1. Doris现在支持直接导入 Parquet 格式的数据内容。

  2. 识别分区列,能够从导入文件路径中获得对应的列信息

  3. 指定过滤条件,用户可以在导入的时候指定过滤条件

  • 时区支持,用户无论导入、查询都能够设定时区来完成时间数据的相关转化。

  • 修复众多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 升级可以通过滚动升级的方式,平滑进行升级,这样可以保证不影响业务使用,进行安全升级。

下面详细列出升级的步骤,作为公司的测试、准生产和生产环境的唯一指导升级手册。

1. 下载指定分支的版本源代码

下载地址:

  1. https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz

2. 下载 Docker 镜像

  1. docker pull apachedoris/doris-dev:build-env-1.1

3. 运行镜像

  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/ 为本地磁盘

4. 下载指定升级版本的源码(DORIS-0.11.14)

启动镜像后,登录容器中,通过以下命令下载 Doris 源码:

  1. wget https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz

5. 解压缩和编译 Doris

  1. tar zxvf DORIS-0.11.14-release.tar.gz

  2. cd incubator-doris-DORIS-0.11.14-release

  3. sh build.sh

编译完成后,产出文件在 output/ 目录中。

  1. [root@f9316c0821b6 incubator-doris-DORIS-0.11.14-release]# cd output/

  2. [root@f9316c0821b6 output]# ll

  3. total 12

  4. drwxr-xr-x 5 root root 4096 Oct 29 05:33 be

  5. drwxr-xr-x 6 root root 4096 Oct 29 05:33 fe

  6. drwxr-xr-x 4 root root 4096 Oct 29 05:33 udf

6. 打包部署文件

  1. # 把output打包

  2. tar czvf incubator-doris-0.11.14-release.tar.gz be fe udf

6. 测试 BE 升级正确性

  • 1. 任意选择一个 BE 节点,部署最新的 palo_be 二进制文件。选择 BE 192.168.1.12 节点:

  1. 1. sh /usr/local/doris/be/be/bin/stop_be.sh

  2. 2. mv be be_0.10.x_backup

  3. 3. 部署新版本的be

  4. 4. sh /usr/local/doris/be/be/bin/start_be.sh --daemon

  5. 5. 检查启动日志,以及服务状态

  • 2. 重启 BE 节点,通过 BE 日志 be.INFO,查看是否启动成功。

  • 3. 如果启动失败,可以先排查原因。如果错误不可恢复,可以直接通过 DROP BACKEND 删除该 BE、清理数据后,使用上一个版本的 palo_be 重新启动 BE。然后重新 ADD BACKEND。(该方法会导致丢失一个数据副本,请务必确保3副本完整的情况下,执行这个操作)

7. 测试 FE 元数据兼容性

  1. 元数据兼容性异常很可能导致数据无法恢复。

  2. 单独使用新版本部署一个测试用的 FE 进程(比如自己本地的开发机)。

  3. 修改测试用的 FE 的配置文件 fe.conf,将所有端口设置为与线上不同。

  4. 在 fe.conf 添加配置:cluster_id=123456

  5. 在 fe.conf 添加配置:metadatafailurerecovery=true

  6. 拷贝线上环境 Master FE 的元数据目录 palo-meta 到测试环境

  7. 将拷贝到测试环境中的 palo-meta/image/VERSION 文件中的 cluster_id 修改为 123456(即与第3步中相同)

  8. 在测试环境中,运行 sh bin/start_fe.sh 启动 FE

  9. 通过 FE 日志 fe.log 观察是否启动成功。

  10. 如果启动成功,运行 sh bin/stop_fe.sh 停止测试环境的 FE 进程。

  11. 以上 2-6 步的目的是防止测试环境的FE启动后,错误连接到线上环境中。

8. 更新最新版本的文件

  1. 在完成数据正确性验证后,将 BE 和 FE 新版本的二进制文件分发到各自目录下。

  2. 通常小版本升级,BE 只需升级 palo_be;而 FE 只需升级 palo-fe.jar。如果是大版本升级,则可能需要升级其他文件(包括但不限于 bin/ lib/ 等等)如果你不清楚是否需要替换其他文件,建议全部替换。

最佳实践:最好全部覆盖。

9. 滚动升级

  1. 确认新版本的文件部署完成后。逐台重启 FE 和 BE 实例即可。

  2. 建议逐台重启 BE 后,再逐台重启 FE。因为通常 Doris 保证 FE 到 BE 的向后兼容性,即老版本的 FE 可以访问新版本的 BE。但可能不支持老版本的 BE 访问新版本的 FE。

  3. 建议确认前一个实例启动成功后,在重启下一个实例。实例启动成功的标识,请参阅安装部署文档。

10. 开发自动滚动升级脚本(自动完成上面步骤8和9)

开发自动化滚动升级脚本,处理步骤8和9的工作。

开发自动化滚动升级脚本,处理步骤8和9的工作。 运行脚本之前,根据实际环境,完成如下几个事情:

  • 修改脚本中的参数:

  1. (1)BE_HOSTS BE节点的主机列表,空格分隔

  2. (2)BE_HTTP_PORT BE节点 be_webport 端口

  3. (3)FE_HOSTS FE节点的主机列表,空格分隔

  4. (4)FE_HTTP_PORT FE 节点fe_http_port端口

  5. (5)BE和FE部署的家目录,脚本未抽取为参数,可以直接替换。

  6. BE家目录: /usr/local/doris/be/be

  7. FE家目录: /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

  1. #!/bin/bash

  2. ############################################################################################################

  3. # Doris BE 升级

  4. ############################################################################################################

  5. # 定义 BE 节点

  6. 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"

  7. BE_HTTP_PORT=18040

  8. # 1. 检验 Doris BE 节点升级前是否运行正常

  9. i=0

  10. for be_host in ${BE_HOSTS}

  11. do

  12. be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1`

  13. ok=`echo ${be_status} | egrep "OK|To Be Added"`

  14. if [[ ! -z ${ok} ]]

  15. then

  16. ((i=${i}+1))

  17. echo ">>>>>> BE_NODE ${be_host} is ok."

  18. else

  19. echo ">>>>>> BE_NODE ${be_host} is failed !!!"

  20. fi

  21. done

  22. echo "############## BE_HOSTS Successful Nodes: $i ##############"

  23. # 2. 先升级 BE 节点,滚动升级方案,逐个节点升级

  24. # 记录升级成功的节点

  25. BE_UPGRADE_HOSTS=""

  26. for be_host in ${BE_HOSTS}

  27. do

  28. # 脚本支持重复执行

  29. # BE 部署的家目录: /usr/local/doris/be/be

  30. if_file_exist=`ssh root@${be_host} "file /usr/local/doris/be/be/upgrade_0.11.14_success"`

  31. failed=`echo $if_file_exist | egrep "cannot open|No such file or directory"`

  32. if [[ ! -z ${failed} ]]

  33. then

  34. echo ">>>>>> BE_NODE ${be_host} is not upgraded."

  35. else

  36. echo ">>>>>> BE_NODE ${be_host} is upgraded successfully. Skip!!!"

  37. continue

  38. fi

  39. # BE 节点停止服务

  40. be_host_stop=`ssh root@${be_host} "sh /usr/local/doris/be/be/bin/stop_be.sh"`

  41. # 检查是否停止

  42. be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1`

  43. ok=`echo ${be_status} | egrep "OK|To Be Added"`

  44. if [[ -z ${ok} ]]

  45. then

  46. echo ">>>>>> BE_NODE ${be_host} is stopped successfully."

  47. else

  48. echo ">>>>>> BE_NODE ${be_host} is not stopped. Failed!!!"

  49. exit 1

  50. fi

  51. # 拷贝升级文件

  52. # 拷贝升级文件之前,需要把 BE 集群的配置文件拷贝到新版本的配置目录下,方便统一覆盖

  53. echo ">>>>>> [BE_NODE ${be_host} Copy Upgrade Files] begin ..."

  54. scp -r /home/shouzhuangjiang/doris-0.11.14-be/be/* root@${be_host}:/usr/local/doris/be/be/

  55. echo ">>>>>> [BE_NODE ${be_host} Copy Upgrade Files] finish."

  56. # BE 启动

  57. be_host_start=`ssh root@${be_host} "sh /usr/local/doris/be/be/bin/start_be.sh --daemon"`

  58. # sleep 10s

  59. sleep 10

  60. # 检查启动后状态是否正常

  61. be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1`

  62. ok=`echo ${be_status} | egrep "OK|To Be Added"`

  63. if [[ ! -z ${ok} ]]

  64. then

  65. # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件

  66. ssh root@${be_host} "touch /usr/local/doris/be/be/upgrade_0.11.14_success"

  67. echo ">>>>>> BE_NODE ${be_host} is ok."

  68. else

  69. # 失败后检查几次 1s 3s 5s

  70. # 实际升级过程中,BE 检查需要会失败,重试几次

  71. for t_sec_time in 5 3 1

  72. do

  73. sleep $t_sec_time

  74. # 检查启动后状态是否正常

  75. be_status=`curl http://${be_host}:${BE_HTTP_PORT}/api/health 2>1`

  76. ok=`echo ${be_status} | egrep "OK|To Be Added"`

  77. if [[ ! -z ${ok} ]]

  78. then

  79. # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件

  80. ssh root@${be_host} "touch /usr/local/doris/be/be/upgrade_0.11.14_success"

  81. echo ">>>>>> BE_NODE ${be_host} is ok."

  82. break

  83. else

  84. echo ">>>>>> BE_NODE ${be_host} is failed !!!"

  85. echo ">>>>>> BE 升级成功的节点: ${BE_UPGRADE_HOSTS}"

  86. continue

  87. fi

  88. echo ">>>>>> BE_NODE ${be_host} is failed !!!"

  89. echo ">>>>>> BE 升级成功的节点: ${BE_UPGRADE_HOSTS}"

  90. exit 1

  91. done

  92. fi

  93. # 升级成功后,加入升级成功的列表中

  94. BE_UPGRADE_HOSTS="${be_host} ${BE_UPGRADE_HOSTS}"

  95. # 再 sleep 5s

  96. sleep 5

  97. done

  98. echo "############## Doris BEs Upgrade Successfully. ##############"

  99. ############################################################################################################

  100. # Doris FE 升级

  101. ############################################################################################################

  102. # 4. 定义 FE 节点

  103. FE_HOSTS="192.168.1.51 192.168.1.52 192.168.1.53"

  104. FE_HTTP_PORT=18030

  105. # 5. 检验 Doris FE 节点升级前是否运行正常

  106. j=0

  107. for fe_host in ${FE_HOSTS}

  108. do

  109. fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1`

  110. ok=`echo ${fe_status} | egrep "OK|Success"`

  111. if [[ ! -z ${ok} ]]

  112. then

  113. ((j=${j}+1))

  114. echo ">>>>>> FE_NODE ${fe_host} is oK."

  115. else

  116. echo ">>>>>> FE_NODE ${fe_host} is failed !!!"

  117. fi

  118. done

  119. echo "############## FE_HOSTS Successful Nodes: ${j} ##############"

  120. # 6. 升级 FE 节点,滚动升级方案,逐个节点升级

  121. # 记录升级成功的节点

  122. FE_UPGRADE_HOSTS=""

  123. for fe_host in ${FE_HOSTS}

  124. do

  125. # 脚本支持重复执行

  126. # FE 家目录: /usr/local/doris/fe/fe

  127. if_file_exist=`ssh root@${fe_host} "file /usr/local/doris/fe/fe/upgrade_0.11.14_success"`

  128. failed=`echo $if_file_exist | egrep "cannot open|No such file or directory"`

  129. if [[ ! -z ${failed} ]]

  130. then

  131. echo ">>>>>> FE_NODE ${fe_host} is not upgraded."

  132. else

  133. echo ">>>>>> FE_NODE ${fe_host} is upgraded Successfully. Skip!!!"

  134. continue

  135. fi

  136. # 停节点

  137. fe_host_stop=`ssh root@${fe_host} "sh /usr/local/doris/fe/fe/bin/stop_fe.sh"`

  138. # 检查是否停止

  139. fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1`

  140. ok=`echo ${fe_status} | egrep "OK|Success"`

  141. if [[ -z ${ok} ]]

  142. then

  143. echo ">>>>>> FE_NODE ${fe_host} is stopped Successfully!"

  144. else

  145. echo ">>>>>> FE_NODE ${fe_host} is stopped. Failed!!!"

  146. exit 1

  147. fi

  148. # 拷贝升级文件

  149. # 拷贝升级文件之前,需要把 FE 集群的配置文件拷贝到新版本的配置目录下,方便统一覆盖

  150. echo ">>>>>> [FE_NODE ${fe_host} Copy Upgrade Files] begin ..."

  151. scp -r /home/shouzhuangjiang/doris-0.11.14-fe/fe/* root@${fe_host}:/usr/local/doris/fe/fe/

  152. echo ">>>>>> [FE_NODE ${fe_host} Copy Upgrade Files] finish."

  153. # 启动

  154. fe_host_start=`ssh root@${fe_host} "sh /usr/local/doris/fe/fe/bin/start_fe.sh --daemon"`

  155. # sleep 10s

  156. sleep 10

  157. # 检查启动后状态是否正常

  158. fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1`

  159. ok=`echo ${fe_status} | egrep "OK|Success"`

  160. if [[ ! -z ${ok} ]]

  161. then

  162. # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件

  163. ssh root@${fe_host} "touch /usr/local/doris/fe/fe/upgrade_0.11.14_success"

  164. echo ">>>>>> FE_NODE ${fe_host} is ok."

  165. else

  166. # 失败后检查几次 1s 3s 5s

  167. for t_sec_time in 5 3 1

  168. do

  169. sleep $t_sec_time

  170. # 检查启动后状态是否正常

  171. fe_status=`curl http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap 2>1`

  172. ok=`echo ${fe_status} | egrep "OK|Success"`

  173. if [[ ! -z ${ok} ]]

  174. then

  175. # 支持脚本重复执行,升级成功后,加入本次升级成功的标记文件

  176. ssh root@${fe_host} "touch /usr/local/doris/fe/fe/upgrade_0.11.14_success"

  177. echo ">>>>>> FE_NODE ${fe_host} is ok."

  178. break

  179. else

  180. echo ">>>>>> FE_NODE ${fe_host} is failed !!!!"

  181. echo ">>>>>> FE 升级成功的节点: ${FE_UPGRADE_HOSTS}"

  182. continue

  183. fi

  184. echo ">>>>>> FE_NODE ${fe_host} is failed !!!"

  185. echo ">>>>>> FE 升级成功的节点: ${FE_UPGRADE_HOSTS}"

  186. exit 1

  187. done

  188. fi

  189. # 升级成功后,加入升级成功的列表中

  190. FE_UPGRADE_HOSTS="${fe_host} ${FE_UPGRADE_HOSTS}"

  191. # 再 sleep 5s

  192. sleep 5

  193. done

  194. echo "############## Doris FEs Upgrade Successfully. ##############"

总结

Doris 升级完成后,服务状态都处于正常,业务在整个滚动升级过程中没有任何影响。后续会对新版本进行功能测试和性能压测。

脚本工作只是临时性的,后面会加入到大数据平台的自助化运维平台体系,实现自动升级、回滚,以及监控整个运维流程,以及对业务使用的追踪。

参考

Doris官方公众号文章《Apache Doris(incubating) 0.11.0版本正式发布》

Apache Doris 0.11.x 版本升级相关推荐

  1. Apache Doris 0.14.0部署HDFS Broker服务

    目录 1. 编译 2. HDFS Broker的部署 1. 编译 官方提供Docker环境编译.Centos\Ubuntu环境编译.ARM64平台编译,我们这里采样Docker环境编译 下载Docke ...

  2. 【预留】Apache Doris 0.12 官方中文文档学习

    https://www.bookstack.cn/read/ApacheDoris-0.12-zh/8376e91fcde1d3d6.md 预留:后续实际操作并记录

  3. 【kafka】Apache Kafka 0.11版本新功能简介

    1.概述 转载:https://www.cnblogs.com/huxi2b/p/7098281.html

  4. Apache IoTDB源码解析(0.11.2版本):Session的源码解析

    1. 声明 当前内容主要为解析Apache IoTDB 0.11.2版本的Session的源码解析 通过前面的Apache Thrift的Demo,可以发现iotdb中的server是使用了thrif ...

  5. Apache Kylin VS Apache Doris

    作者: 康凯森 日期: 2018-04-17 分类: OLAP 1 系统架构 1.1 What is Kylin 1.2 What is Doris 2 数据模型 2.1 Kylin的聚合模型 2.2 ...

  6. Apache Doris 单节点(可多节点)Docker集群制作教程

    集群制作Author:苏奕嘉 脚本研发Author:种益 调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使 ...

  7. 博文推荐|Apache Doris 单节点 Docker 集群制作教程

    前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...

  8. MXNet 0.11发布,加入动态图接口Gluon,还有两位CMU教授的亲笔教程

    经过3个月的开发,MXNet 0.11版发布啦!0.11是MXNet正式加入Apache以后的第一个版本,官方网站搬到了Apache的服务器(注意:要在最上方Version处选择master才能看到包 ...

  9. 墨天轮访谈 | SelectDB 衣国垒:Apache Doris(incubating)1.0版本特性解析与未来规划

    分享嘉宾:衣国垒 Apache Doris Committer.SelectDB 联合创始人&CTO 整理:墨天轮社区 导读 大家好,我是来自Apache Doris社区的衣国垒,也是Sele ...

最新文章

  1. 修改withdraw 方法
  2. Python在ubuntu中更改Python和pip指向
  3. [Treap]JZOJ 4737 金色丝线将瞬间一分为二
  4. [PHP] Laravel常见报错总结(持续更新)
  5. php中mysql,PHP中的mysql
  6. 漫画:三分钟了解敏捷开发
  7. c语言函数与指针,C语言指针与函数篇
  8. 仿QQ聊天室【方案】
  9. commit 规范性提交
  10. VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)
  11. 调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?...
  12. java多线程与并发之java并发编程实践
  13. C语言程序设计第五版第五章课后习题
  14. stm32低功耗解决方案-(外部时钟芯片RX8025T)
  15. Thingsboard数据处理学习记录
  16. 【SSM框架项目 客户关系管理系统CRM 学习开发 Day3】市场活动模块的数据导入与导出
  17. 轻松解决Tomcat启动慢的问题,只需一行代码
  18. Bzoj2037 [Sdoi2008]Sue的小球
  19. WORD文档无法编辑解决
  20. 按下组合键 可以迅速锁定计算机,电脑快速锁屏快捷键

热门文章

  1. 编程练习题4.21 ( 检查 SSN ) 编写一个程序, 提示用户输入一个社保号码, 它的格式是 DDD-DD-DDDD, 其中 D 是一个数字。 你的程序应该判断输入是否合法。
  2. ORACLE- check 检查约束
  3. 全国最强计算机的大学排名,全国高校计算机学科实力最新排名,这19所高校最受认可!...
  4. JZ2440恢复出产设置
  5. 夜暗心伤! 再见,妹子!
  6. [英语语法]词法之独立主格
  7. JNI和NKD入门系列三,在android studio上设置javah和ndk-build的快捷键
  8. 嵌入式核心板研发之路_启动迅为4412核心板_稳定运行_超强扩展能力
  9. PyCharm安装scrapy框架
  10. Codeforces--44A--Indian Summer