Apache Doris 0.11.x 版本升级
背景
项目计划基于 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 等计算,从而能够达到精确去重的功能。
导入优化
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 升级可以通过滚动升级的方式,平滑进行升级,这样可以保证不影响业务使用,进行安全升级。
下面详细列出升级的步骤,作为公司的测试、准生产和生产环境的唯一指导升级手册。
1. 下载指定分支的版本源代码
下载地址:
https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz
2. 下载 Docker 镜像
docker pull apachedoris/doris-dev:build-env-1.1
3. 运行镜像
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 源码:
wget https://github.com/baidu-doris/incubator-doris/archive/DORIS-0.11.14-release.tar.gz
5. 解压缩和编译 Doris
tar zxvf DORIS-0.11.14-release.tar.gz
cd incubator-doris-DORIS-0.11.14-release
sh build.sh
编译完成后,产出文件在 output/ 目录中。
[root@f9316c0821b6 incubator-doris-DORIS-0.11.14-release]# cd output/
[root@f9316c0821b6 output]# ll
total 12
drwxr-xr-x 5 root root 4096 Oct 29 05:33 be
drwxr-xr-x 6 root root 4096 Oct 29 05:33 fe
drwxr-xr-x 4 root root 4096 Oct 29 05:33 udf
6. 打包部署文件
# 把output打包
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. sh /usr/local/doris/be/be/bin/stop_be.sh
2. mv be be_0.10.x_backup
3. 部署新版本的be
4. sh /usr/local/doris/be/be/bin/start_be.sh --daemon
5. 检查启动日志,以及服务状态
2. 重启 BE 节点,通过 BE 日志 be.INFO,查看是否启动成功。
3. 如果启动失败,可以先排查原因。如果错误不可恢复,可以直接通过 DROP BACKEND 删除该 BE、清理数据后,使用上一个版本的 palo_be 重新启动 BE。然后重新 ADD BACKEND。(该方法会导致丢失一个数据副本,请务必确保3副本完整的情况下,执行这个操作)
7. 测试 FE 元数据兼容性
元数据兼容性异常很可能导致数据无法恢复。
单独使用新版本部署一个测试用的 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启动后,错误连接到线上环境中。
8. 更新最新版本的文件
在完成数据正确性验证后,将 BE 和 FE 新版本的二进制文件分发到各自目录下。
通常小版本升级,BE 只需升级 palo_be;而 FE 只需升级 palo-fe.jar。如果是大版本升级,则可能需要升级其他文件(包括但不限于 bin/ lib/ 等等)如果你不清楚是否需要替换其他文件,建议全部替换。
最佳实践:最好全部覆盖。
9. 滚动升级
确认新版本的文件部署完成后。逐台重启 FE 和 BE 实例即可。
建议逐台重启 BE 后,再逐台重启 FE。因为通常 Doris 保证 FE 到 BE 的向后兼容性,即老版本的 FE 可以访问新版本的 BE。但可能不支持老版本的 BE 访问新版本的 FE。
建议确认前一个实例启动成功后,在重启下一个实例。实例启动成功的标识,请参阅安装部署文档。
10. 开发自动滚动升级脚本(自动完成上面步骤8和9)
开发自动化滚动升级脚本,处理步骤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/be
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
#!/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=0
for 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 !!!"
fi
done
echo "############## 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 5
done
echo "############## 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=0
for 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 !!!"
fi
done
echo "############## 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 5
done
echo "############## Doris FEs Upgrade Successfully. ##############"
总结
Doris 升级完成后,服务状态都处于正常,业务在整个滚动升级过程中没有任何影响。后续会对新版本进行功能测试和性能压测。
脚本工作只是临时性的,后面会加入到大数据平台的自助化运维平台体系,实现自动升级、回滚,以及监控整个运维流程,以及对业务使用的追踪。
参考
Doris官方公众号文章《Apache Doris(incubating) 0.11.0版本正式发布》
Apache Doris 0.11.x 版本升级相关推荐
- Apache Doris 0.14.0部署HDFS Broker服务
目录 1. 编译 2. HDFS Broker的部署 1. 编译 官方提供Docker环境编译.Centos\Ubuntu环境编译.ARM64平台编译,我们这里采样Docker环境编译 下载Docke ...
- 【预留】Apache Doris 0.12 官方中文文档学习
https://www.bookstack.cn/read/ApacheDoris-0.12-zh/8376e91fcde1d3d6.md 预留:后续实际操作并记录
- 【kafka】Apache Kafka 0.11版本新功能简介
1.概述 转载:https://www.cnblogs.com/huxi2b/p/7098281.html
- Apache IoTDB源码解析(0.11.2版本):Session的源码解析
1. 声明 当前内容主要为解析Apache IoTDB 0.11.2版本的Session的源码解析 通过前面的Apache Thrift的Demo,可以发现iotdb中的server是使用了thrif ...
- 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 ...
- Apache Doris 单节点(可多节点)Docker集群制作教程
集群制作Author:苏奕嘉 脚本研发Author:种益 调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使 ...
- 博文推荐|Apache Doris 单节点 Docker 集群制作教程
前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...
- MXNet 0.11发布,加入动态图接口Gluon,还有两位CMU教授的亲笔教程
经过3个月的开发,MXNet 0.11版发布啦!0.11是MXNet正式加入Apache以后的第一个版本,官方网站搬到了Apache的服务器(注意:要在最上方Version处选择master才能看到包 ...
- 墨天轮访谈 | SelectDB 衣国垒:Apache Doris(incubating)1.0版本特性解析与未来规划
分享嘉宾:衣国垒 Apache Doris Committer.SelectDB 联合创始人&CTO 整理:墨天轮社区 导读 大家好,我是来自Apache Doris社区的衣国垒,也是Sele ...
最新文章
- 修改withdraw 方法
- Python在ubuntu中更改Python和pip指向
- [Treap]JZOJ 4737 金色丝线将瞬间一分为二
- [PHP] Laravel常见报错总结(持续更新)
- php中mysql,PHP中的mysql
- 漫画:三分钟了解敏捷开发
- c语言函数与指针,C语言指针与函数篇
- 仿QQ聊天室【方案】
- commit 规范性提交
- VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)
- 调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?...
- java多线程与并发之java并发编程实践
- C语言程序设计第五版第五章课后习题
- stm32低功耗解决方案-(外部时钟芯片RX8025T)
- Thingsboard数据处理学习记录
- 【SSM框架项目 客户关系管理系统CRM 学习开发 Day3】市场活动模块的数据导入与导出
- 轻松解决Tomcat启动慢的问题,只需一行代码
- Bzoj2037 [Sdoi2008]Sue的小球
- WORD文档无法编辑解决
- 按下组合键 可以迅速锁定计算机,电脑快速锁屏快捷键
热门文章
- 编程练习题4.21 ( 检查 SSN ) 编写一个程序, 提示用户输入一个社保号码, 它的格式是 DDD-DD-DDDD, 其中 D 是一个数字。 你的程序应该判断输入是否合法。
- ORACLE- check 检查约束
- 全国最强计算机的大学排名,全国高校计算机学科实力最新排名,这19所高校最受认可!...
- JZ2440恢复出产设置
- 夜暗心伤! 再见,妹子!
- [英语语法]词法之独立主格
- JNI和NKD入门系列三,在android studio上设置javah和ndk-build的快捷键
- 嵌入式核心板研发之路_启动迅为4412核心板_稳定运行_超强扩展能力
- PyCharm安装scrapy框架
- Codeforces--44A--Indian Summer