场景
Apache Doris是由百度贡献的开源MPP分析型数据库产品,亚秒级查询响应时间,支持实时数据分析;分布式架构简洁,易于运维,可以支持10PB以上的超大数据集;可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。
Doris更优的方面
使用更简单,如建表更简单,SQL标准支持更好, Join性能更好,导数功能更强大
运维更简单,如灵活的扩缩容能力,故障节点自动恢复,社区提供的支持更好
分布式更强,支持事务和幂等性导数,物化视图自动聚合,查询自动路由,全面元数据管理
架构
底层架构
Google Mesa(数据模型)
Mesa满足一系列复杂且具有挑战性的用户和系统需求,包括接近实时的数据提取和查询能力,以及针对大数据和查询量的高可用性,可靠性,容错性和可伸缩性。但是Mesa本身不提供SQL查询引擎所以借鉴了下面。
Apache Impala(MPP Query Engine)
Impala是一个非常好的MPP SQL查询引擎,做更多的查询优化,在速度上做到了很好。但是缺少比较完美的分布式存储引擎,所以需要集成下面。
MPP (Massively Parallel Processing),即大规模并行处理。简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)
注:MPPDB与Hadoop都是将运算分布到节点中独立运算后进行结果合并(分布式计算),但由于依据的理论和采用的技术路线不同而有各自的优缺点和适用范围。
我们现在大数据存储与处理趋势:MPPDB+Hadoop混搭使用,用MPP处理PB级别的、高质量的结构化数据,同时为应用提供丰富的SQL和事物支持能力;用Hadoop实现半结构化、非结构化数据处理。这样可以同时满足结构化、半结构化和非结构化数据的高效处理需求。
Apache ORCFile (存储格式,编码和压缩)
只访问查询涉及的列,能大量降低系统I/O;列数据相对来说比较类似,压缩比更高;每一列由一个线索来处理,更有利于查询的并发处理。
系统架构
Doris的系统架构组成主要有:
BackEnd(后端节点),简称BE。
FrontEnd(前端节点),简称FE。
bdbje(BerkekeyDB Java Edition),负责元数据操作日志的持久化、FE 高可用等功能。
FE
主要负责查询的编译,分发和元数据管理。
FE 包含的三种角色的理解
leader跟follower,主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
observer只是用来扩展查询节点,就是说如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加observer的节点。observer不参与任何的写入,只参与读取。
(1)管理元数据(库, 表, 分区, tablet副本等信息), 执行SQL语句命令。
(2)FE高可用部署, 使用复制协议选主和主从同步元数据, 所有的元数据修改操作, 由FE Leader节点完成, FE Follower节点可执行读操作。 元数据的读写满足顺序一致性。 FE的节点数目采用2n+1, 可容忍n个节点故障。当FE Leader故障时, 从现有的Follower节点重新选主, 完成故障切换。
Observer节点仅从 Leader节点进行元数据同步,不参与选举。能够横向扩展以提供元数据的读服务的扩展性。
(3)FE的SQL layer对用户提交的SQL进行解析, 分析, 语义分析和关系代数优化, 生产逻辑执行计划。
(4)FE的Planner负责把逻辑计划转化为可分布式执行的物理计划, 分发给一组BE。
(5)FE监督,管理BE的上下线, 根据BE的健康状态和存活数, 维持tablet副本的数量。
(6)FE协调数据导入, 保证数据导入的一致性。
BE
主要负责数据的存储、以及查询计划的执行
(1)BE管理tablet副本, tablet是table经过分区分桶形成的子表, 采用列式存储。
(2)BE受驱动FE, 创建或删除子表。
(3)BE接收FE分发的物理执行计划并指定BE coordinator节点, 在BE coordinator的调度下, 与其他BE worker共同协作完成执行。
(4)BE读取本地的列存储引擎获取数据,并通过索引和谓词下沉快速过滤数据。
(5)BE后台执行compact任务, 减少查询时的读放大。
(6)数据导入时, 由FE指定BE coordinator,将数据以fanout的形式写入到tablet多副本所在的BE上。
来源:
Apache Doris 为分析而生:Doris 架构_大数据左右手的博客-CSDN博客
Doris架构原理_959y的博客-CSDN博客
安装Docker环境
Docker 要求 CentOS 系统的内核版本高于3.10 ,首先查看系统内核版本是否满足
配置Docker Swarm
节点准备
准备搭建一个跨主机的集群
192.168.10.152 FE
192.168.10.150 BE
注意:
1.docker容器默认情况下,每次内网ip都有变动,但是fe节点如果启动以后ip发生变化,就会启动失败,fe.log中一直滚动 "wait catalog to be ready. FE type UNKNOWN"。BE注册给FE时候也需要固定ip注册,因此FE和BE启动时候回都要用--ip将ip固定住。
#上述解决办法是清理掉/opt/doris/fe/doris-meta中的内容,重启(初始化失败时候这样操作可以,如果是线上,还是应该尽量恢复原来的ip,不能轻易删除)
2.doker主机之间默认是无法跨主机通信的,可以选择Docker Swarm使docker可以跨主机通信。
配置Docker Swarm
Docker Swarm是 Docker Overlay 网络的一种简易实现方式,它是 Docker 开发的容器集群管理工具, 与 Docker API 兼容性很好。
并且 Linux 中安装了 Docker,也默认会安装 Swarm。因此,在这里,我们采用 Swarm 实现 集群间的网络通信。
机器配置如下
192.168.10.152 manager
192.168.10.150 worker
1、在 manager 节点创建 Swarm 集群
docker swarm init --advertise-addr=192.168.10.152
效果如下:
docker swarm init --advertise-addr=192.168.10.152
[root@localhost ~]# docker swarm init --advertise-addr=192.168.10.152
Swarm initialized: current node (maw28ll7mlxuwp47z5c5vo2v1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2bdwwlo8xvdskil05itg66l63dpi931oqnt5gvehlnf1it1auo-2uvypbiu0hpcn1e06hrhctbe8 192.168.10.152:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2、在 worker 节点上执行命令,将自己加入集群
docker swarm join --token SWMTKN-1-2bdwwlo8xvdskil05itg66l63dpi931oqnt5gvehlnf1it1auo-2uvypbiu0hpcn1e06hrhctbe8 10
3、在 manager 节点,查看当前网络集群的节点情况
docker node ls
4、在 manager 节点,创建 overlay 网络
docker network create -d overlay --attachable demo
说明:
--attachable 声明当前创建的网络为:其他节点可以访问的网络
5、在 worker 节点的网络列表,是否多了这个网络
docker network ls
6、启动容器,指定该 overlay 网络
--net=demo --privileged=true
大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。
来源:Docker篇(七): 如何实现 Docker 容器 的跨主机通讯?
拉取Doris编译镜像(本地)
# 拉取
docker pull apache/incubator-doris:build-env-ldb-toolchain-latest
探测Swarm集群的ip段
1.启动ip测试镜像
docker run -it --name=ip_test -d --net=demo apache/incubator-doris:build-env-ldb-toolchain-latest
2.查看容器ip
docker inspect ip_test
图示位置就是后续doris启动容器应该使用的ip段(FE和BE都需要固定ip,否则重启以后ip变化会出现故障)
启动FE-Docker(10.152本地)
docker run -it -p 8030:8030 -p 9030:9030 -d --name=doris-fe --net=demo --ip 10.0.1.99 --privileged=true -v /opt/docker/doris/fe:/opt/doris/fe -v /opt/docker/doris/doris-meta:/opt/doris/doris-meta apache/incubator-doris:build-env-ldb-toolchain-latest
1.进入FE-Docker(本地)以及安装组件(FE-Docker)
# 进入fe-docker
docker exec -ti doris-fe /bin/bash
# 在FE-Docker中安装net-tools用于查看IP,因为已经固定了ip,这一步可以略过
yum install net-tools -y
2.修改FE配置(FE-Docker)
# 查看fe-docker的IPv4地址
ifconfig
# 修改配置文件
vim /opt/doris/fe/conf/fe.conf
# 取消priority_networks的注解,并根据Docker的网段进行配置
priority_networks = 10.0.1.0/16 #这里要根据你Docker的IP确定
3.换Docker-JDK版本(FE-Docker)
# 切换Java版本为JDK1.8,该镜像默认为JDK11
alternatives --set java java-1.8.0-openjdk.x86_64
alternatives --set javac java-1.8.0-openjdk.x86_64
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
# 校验是否切换版本成功
java -version
4.配置FE-Docker的环境变量(FE-Docker)
# 配置环境变量
vim /etc/profile.d/doris.sh
export DORIS_HOME=/opt/doris/fe/
export PATH=$PATH:$DORIS_HOME/bin
# 保存并source
source /etc/profile.d/doris.sh
5.启动Doris-FE(FE-Docker)
start_fe.sh --daemon
6.检查FE是否启动成功
1.检查是否启动成功,JPS命令下有没有PaloFe进程
2.FE 进程启动后,会首先加载元数据,根据 FE 角色的不同,在日志中会看到 transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER。最终会看到 thrift server started 日志,并且可以通过 mysql 客户端连接到 FE,则表示 FE 启动成功。
3.也可以通过如下连接查看是否启动成功:
http://fe_host:fe_http_port/api/bootstrap
如果返回:
{"status":"OK","msg":"Success"}
则表示启动成功,其余情况,则可能存在问题。
4.外网环境访问http://fe_host:fe_http_port 查看是否可以访问WebUI界面,登录账号默认为root/admin,密码为空,第一次登录WebUI界面会有较长时间加载时间5.查看日志在/opt/doris/fe/log
6.ctrl + D 退出docker
注:如果在 fe.log 中查看不到启动失败的信息,也许在 fe.out 中可以看到。
7.安装MySQL客户端(本地)
wget -c http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-5.7/mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.37-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.37-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.37-1.el7.x86_64.rpm
8.连接FE并修改密码(本地)
mysql -h FE-Docer的IP -P 9030 -uroot
SET PASSWORD FOR 'root' = PASSWORD('your_password');
# 也可以创建新用户
CREATE USER 'test' IDENTIFIED BY 'test_passwd';
9.后续链接时需要使用如下格式(本地)
mysql -h FE_HOST -P9030 -uusername -ppassword
10.添加BE节点注册信息(本地)
ALTER SYSTEM ADD BACKEND "host:port";
# 其中 host 为 BE 所在节点 ip;port 为 be/conf/be.conf 中的 heartbeat_service_port,默认9050。
启动BE-Docker(10.150本地)
docker run -it -p 9063:9060 -d --name=doris-be --net=demo --ip 10.0.1.6 --privileged=true -v /opt/docker/doris/be-03:/opt/doris/be apache/incubator-doris:build-env-ldb-toolchain-latest
1.进入BE-Docker(本地)以及安装组件(BE-Docker)
# 进入be-docker,以01为例
docker exec -ti doris-be-01 /bin/bash
# 安装net-tools用于查看IP 因为已经固定了ip,这一步可以略过
yum install net-tools -y
2.修改BE配置(BE-Docker)
# 查看fe-docker的IPv4地址
ifconfig
# 修改配置文件
vim /opt/doris/be/conf/be.conf
# 取消priority_networks的注解,并根据Docker的网段进行配置
priority_networks = 10.0.1.0/16 #这里要根据你Docker的IP确定
3.配置BE-Docker的环境变量(BE-Docker)
# 配置环境变量
vim /etc/profile.d/doris.sh
export DORIS_HOME=/opt/doris/be/
export PATH=$PATH:$DORIS_HOME/bin
# 保存并source
source /etc/profile.d/doris.sh启动Doris-BE(BE-Docker)
start_be.sh --daemon
4.检查BE是否启动成功
1.BE 进程启动后,如果之前有数据,则可能有数分钟不等的数据索引加载时间。
2.如果是 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 的连通性。
3.如果 BE 已经被加入集群,日志中应该每隔 5 秒滚动来自 FE 的心跳日志:get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx,表示心跳正常。
4.其次,日志中应该每隔 10 秒滚动 finish report task success. return code: 0 的字样,表示 BE 向 FE 的通信正常。
5.同时,如果有数据查询,应该能看到不停滚动的日志,并且有 execute time is xxx 日志,表示 BE 启动成功,并且查询正常。
也可以通过如下连接查看是否启动成功:
6.http://be_host:be_http_port/api/health
如果返回:
{"status": "OK","msg": "To Be Added"}
则表示启动成功,其余情况,则可能存在问题。
注:如果在 be.INFO 中查看不到启动失败的信息,也许在 be.out 中可以看到。
5.测试连通性(本地)
# 登录FE-MySQL
mysql -h FE_HOST -P9030 -uusername -ppassword
# 执行命令查看BE运行情况。如一切正常,isAlive 列应为 true。
SHOW PROC '/backends';
若连通性测试成功,则循环完成其他BE节点的部署即可
来源:
Doris-Docker环境搭建_docker 安装doris_北栀一刺的博客-CSDN博客