第1章从研发背景、功能特点、应用场景以及竞品对比等多方面介绍了Doris,让读者对Doris有了一个基本了解。本章将正式带领读者安装和部署Doris,开始上手使用Doris。
Doris作为一款MPP架构的OLAP数据库,可以在绝大多数主流的商用服务器上运行。
一般推荐使用Linux系统,版本要求是CentOS 7.1及以上或者Ubuntu 16.04及以上,这也是目前服务器市场最主流的操作系统。
操作系统小知识
Linux系统主要分Debian系和Red Hat系,还有其他自由版本。Debian系主要有Debian、Ubuntu、Mint等及其衍生版本;Red Hat系主要有Red Hat、Fedora、CentOS等,其他自由版本有Slackware、Gentoo、Arch Linux、LFS、SUSE等。根据调查资料,2016年中国服务器操作系统市场中CentOS占28%,排名第一,Ubuntu占26%,Red Hat占19%,其余共占27%。其余版本中有部分是Debian系和Red Hat系,所以三类系统所占比例在75%以上。就目前来说,CentOS系统既免费,又稳定,也是云厂商推荐的服务器操作系统,因此首选CentOS 7.x版本。
虽然CentOS官方已经放弃8.0以后版本的升级维护,但是各软件、硬件厂商和云平台都会基于CentOS 7.x继续升级和提供相应的服务。
在操作系统配置方面除了关闭Swap以外没有其他要求。关闭Swap只是为了避免使用磁盘缓冲区影响性能,并非强制性要求。在这一点上,比其他数据库安装前进行一系列参数调整和系统配置要省事很多。
在Doris中,FE是基于Java语言开发的,BE是基于C++语言开发的,所以二者需要依赖对应语言的编译器。其中,Java运行环境要求JDK8及以上版本(从Doris 1.0版本开始强制要求JDK11及以上版本),C++运行环境要求GCC4.8.2及以上版本。
为了提高Doris数据库的性能,单台服务器也有硬件要求。Doris的开发测试环境和生产环境要求分别如表2-1和表2-2所示。
表2-1 开发测试环境要求
表2-2 生产环境要求
具体来说,FE的磁盘空间主要用于存储元数据,包括元数据变更日志和元数据镜像版本,大小通常在几百兆字节到几吉字节不等。BE的磁盘空间主要用于存储用户数据,总磁盘空间按用户总数据量×3(3副本)计算,然后额外预留40%用于存储后台合并数据以及一些中间数据。
一台机器上可以部署多个BE实例,但是只能部署一个FE实例。如果需要3副本数据,至少需要3台机器各部署1个BE实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5s的时钟偏差)。
在测试环境中,可以仅用1个BE实例进行测试,但是1个BE实例只能创建1个副本数据。实际生产环境中,BE实例数量直接决定了集群整体查询性能。
为了充分利用MPP架构的并发优势,以及Doris的高可用性,我们需要足够的服务器节点来支撑Doris的运行。Doris的性能与服务器数量及配置正相关。通常,建议部署10~100台服务器(其中3台部署FE,剩余的部署BE)。但在部署4台服务器(1台部署FE,3台部署BE,其中1台BE混部一个观察者角色的FE来提供元数据备份),以及服务器配置较低的情况下,Doris依然可以平稳运行。
如果FE和BE混部,我们需要注意资源竞争问题,并保证元数据目录和数据目录分属于不同磁盘。Broker是访问外部数据源(如HDFS)的进程。通常,每个FE节点上部署一个Broker实例即可。
关于FE节点的角色,我们需要注意以下几点。
❑FE角色分为Leader、Follower和Observer。Leader和Follower角色都是Follower组的成员,以下统称为Follower。Leader是Follower组中选举出来的主节点,有且仅有一个。Observer即观察者角色,仅能复制元数据,不能参与Follower组的选举。
❑FE节点数至少为1(1个Follower)。部署1个Follower和1个Observer可以实现读高可用,部署3个Follower可以实现读写高可用。
❑Follower的数量必须为奇数,Observer的数量随意。
❑根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署3个Follower和1~3个Observer。如果是离线业务,建议部署1个Follower和1~3个Observer。
假设使用3个FE、5个BE节点来搭建Doris集群,部署角色如表2-3所示。
表2-3 8节点高可用Doris集群配置
Doris的各个实例之间通过网络进行通信,表2-4展示了各服务组件的通信端口。
表2-4 Doris服务组件之间的通信端口
(续)
当部署多个FE实例时,要保证FE的http_port配置相同。部署前确保各个端口在应有方向上的访问权限:如果是局域网,建议直接关掉防火墙;如果是云平台,还需要开放客户端访问FE节点的8030端口和9030端口。
因为有多网卡情况,或安装过Docker等环境而存在虚拟网卡,同一个主机可能存在多个不同的IP。Doris启动时不能自动识别可用IP,因此当主机上存在多个IP时,必须通过priority_networks配置项强制指定正确的IP。
priority_networks是FE和BE都有的一个配置项,配置项需写在fe.conf和be.conf中。该配置项用于在FE或BE启动时,告诉进程应该绑定哪个IP,示例如下:
这是一种CIDR(Classless Inter-Domain Routing,无类别域间路由)表示方法。FE或BE会根据该配置项来寻找匹配的IP,并将其作为本地IP。
注意
配置priority_networks,只是保证了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将无法正常通信。这时,必须删掉添加错误的BE,重新使用正确的IP执行ADD BACKEND。FE配置也是一样的。
Broker则不需要配置priority_networks。Broker默认绑定在IP0.0.0.0上。在执行ADD BROKER语句时,只需要配置Broker可访问的IP即可。
为了避免源码编译过程中出现异常,Doris提供了用于源码编译的Docker镜像,所以,我们需要掌握一定的编程知识和Docker使用方法。
安装编译环境,包括Maven、Git和Docker,依次执行如下命令:
百度版本的Doris不再单独提供分支,可直接进入GitHub主页下载(地址为:https://github.com/apache/incubator-doris)。在GitHub主页的Releases页面,我们可以看到最近发布的Doris版本。图2-1是Doris1.0.0版本发布截图,发布时间为2022年4月2日。
图2-1 Doris 1.0.0版本发布截图
下载Doris源码并解压到指定目录,例如放到/root/doris目录。
如果云平台访问GitHub太慢,我们可以在本地下载压缩包然后解压。源码包解压后的截图如图2-2所示。
图2-2 Doris 1.0.0版本源码包解压后的截图
为了提高FE编译速度,我们需要将Central的地址换为阿里云的地址——https://maven.aliyun.com/repository/central,操作如下。
针对不同的Doris版本,我们需要下载对应版本的镜像。从Doris 0.15版本起,后续镜像的版本号将与Doris的版本号统一,比如可以使用镜像apache/incubator-doris:build-env-for-0.15.0来编译Doris 0.15.0版本。apache/incubator-doris:build-env-ldb-toolchain-latest用于编译最新主干版本代码,会随主干版本不断更新。这里,我们编译Doris 1.0.0版本,使用apache/incubator-doris:build-env-for-1.0.0镜像,操作过程截图如图2-3所示。
图2-3 Doris的Docker编译环境操作过程截图
根据最佳实践,我们以挂载本地Doris源码目录的方式运行镜像,这样编译产出的二进制文件会存储在宿主机中,不会因为镜像退出而消失。同时,建议将镜像中Maven的m2目录挂载到宿主机目录,以防每次启动镜像编译时,重复下载Maven的依赖库。
这里挂载源码目录以及m2目录的命令如下:
上述命令运行以后直接进入Docker,没有任何输出。
进入Docker,执行编译命令:
从编译过程可以看出,BE节点的C++代码编译比较费时,大约需要1h;FE节点的Java代码编译大约需要25min。sh build.sh命令是依次编译BE和FE组件的,待编译完成后,我们可以看到图2-4所示的界面,这就说明编译成功了。
图2-4 FE源码编译成功界面
编译好的安装包在源码根目录的output路径下,将文件夹复制到集群节点就可以使用了。编译产出文件截图如图2-5所示。
图2-5 编译产出文件截图
Doris 1.0以后的版本会自动编译Broker,如果没有自动编译,则需要执行以下命令:
待编译完成后,可以在output目录下看到编译好的apache_hdfs_broker文件(见图2-6),复制文件夹到对应的FE节点即可。
图2-6 编译产出截图
除了以上Doris组件,我们还可以编译其他Doris扩展包。Doris扩展包可以参照官网扩展功能说明进行编译及使用,这里不做介绍。
有Java开发经验的读者可以按照2.2节的操作进行源码编译,如果不想编译直接使用,则可以到Palo官网进行下载。作为Apache Doris社区的主要维护团队,百度Doris团队同时维护了完全兼容Apache Doris的发行版本Palo。百度发行版本Palo具有Bug修复和新功能更新功能。百度开源版本不是Apache Release版本,但具有全部Apache Doris功能,并与Apache社区版本兼容。百度发行版本Palo在百度内部做过测试,推荐使用,而且用户可以免费下载,安装和部署方式同Apache Doris。
百度发行版本Palo下载地址为:http://palo.baidu.com/docs/下载专区/预编译版本下载/。下载页面截图如图2-7所示。
百度提供的预编译二进制文件仅可在CentOS 7.3、Intel(R)Xeon(R)Gold 6148 CPU@2.40GHz上执行通过,在其他系统或CPU型号下可能会因为Glibc版本或者CPU支持的指令集不同而无法运行。Palo 0.14.13.1及之后的版本需要运行环境下的CPU支持avx2指令。用户可以通过cat/proc/cpuinfo查看CPU是否支持该指令,如果不支持,请使用带no-avx2后缀的版本。avx2指令会显著提升Bloom Filter等的计算效率,从而提升索引效率。ARM版本为实验性质版本,以在ARM环境下运行Palo。另外,预编译二进制文件的FE部分使用Oracle JDK 1.8编译,请确保运行时环境为Oracle JDK 1.8。
百度提供的预编译环境中包含如下组件:
❑Frontend;
❑Backend;
❑Broker;
❑Frontend plugins jars;
❑Spark-Doris-Connector jars;
❑Flink-Doris-Connector jars(0.14.12+版本)。
图2-7 百度发行版本Palo下载页面截图
2022年6月中旬,Apache Doris官网全新升级,也提供了二进制安装包(下载链接为https://doris.apache.org/zh-CN/download)。
目前,主流的大数据平台都是基于云主机或者虚拟主机安装和部署的,且一般采用64位的Linux操作系统,所以本书对天翼云平台弹性云主机CentOS 7.7进行安装和部署。
在CentOS系统中通过wget命令下载百度Palo预编译版本,如图2-8所示。
图2-8 通过wget命令下载百度Palo预编译版本
下载完成后解压文件包并重命名。正式部署版本建议文件夹名中去掉版本名或者通过Link文件生成虚拟文件夹,便于后续升级。百度Palo预编译版本文件解压后截图如图2-9所示。
图2-9 百度Palo预编译版本文件解压后截图
如果是集群部署,我们可将对应的BE和FE分布到需要安装的服务器。本次部署服务器资源有限,仅单机部署,集群部署操作过程也是一样的。
由于FE是基于Java语言开发的,因此部署FE之前需要先安装JDK。正常情况下,安装Oracle JDK和Open JDK都可以,但是预编译版本文件是采用Oracle JDK编译的,所以我们依然采用Oracle JDK版本。Doris 1.0以前的版本只需安装JDK8版本即可,Doris 1.0及以后版本要求必须安装JDK11版本。
到Oracle官网下载JDK需要注册账号,并且登录速度比较慢,这里推荐到华为云下载。下载完成后解压,并将解压文件移到指定目录,配置环境变量。
FE组件的安装非常简单,最新Doris版本的安装包自动创建了doris-meta目录,我们可以直接到bin目录下执行命令sh start_fe.sh --daemon来启动FE。执行该命令后如果没有任何输出,FE启动成功。我们也可以通过jps命令验证FE是否启动成功,有PaloFe进程表示启动成功。FE节点启动及验证过程如图2-10所示。
图2-10 FE节点启动及验证过程
在正式环境中安装FE节点有以下注意事项:
❑FE节点的配置文件为fe/conf/fe.conf。
❑FE作为管理节点存放数据库的元数据,默认保存在fe/doris-meta/路径下。我们也可以通过调整fe.conf中的meta_dir切换到独立的目录。生产环境中强烈建议单独指定目录,不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好)。
❑fe.conf中JAVA_OPTS默认Java最大堆内存为4GB,生产环境中建议调整至8GB以上。
❑priority_networks配置可以具体参考2.1.5节内容。
❑默认第一个启动的是Leader角色,也就是Follower组中的主节点。
fe.conf重要参数说明
lower_case_table_names参数用于配置用户表表名大小写是否敏感,默认为0,表示表名大小写敏感。该参数需在集群初始化时进行配置。集群初始化完成后无法通过set语句修改该参数,也无法通过重启、升级修改该参数。该参数还可以设置为1或者2,都表示表名大小写不敏感,区别是值为1时,任何场景下表名无论大小写都表示同一张表,而值为2时,同一语句中表名要么大写,要么小写。
FE节点的服务进程启动后进入后台执行,日志默认存放在fe/log/目录下。如果服务进程启动失败,我们可以通过日志文件fe/log/fe.log或者fe/log/fe.out查看错误信息。
安装完FE节点后,我们有两种方式进行访问。
第一种是在网络无限制的情况下,直接打开网址http://fe_ip:8030,进入管理页面,如图2-11所示。
图2-11 Doris管理系统登录页面
用户名是admin,默认密码为空。登录后的界面如图2-12所示。
第二种方式是通过MySQL客户端访问。这里我们既可以直接在服务器上通过MySQL命令访问FE,也可以通过客户端软件配置JDBC访问,默认root密码为空。数据库安装人员必须要掌握命令行模式,因此这里需要先安装MySQL客户端,具体如下。
实际在安装时,执行yum install mysql-community-client.x86_64-y命令可能会遇到图2-13所示的错误。
图2-12 Doris管理系统主页
图2-13 MySQL客户端安装报错截图
报错显示软件签名验证不通过。解决方法是忽略签名验证:
安装成功后的结果如图2-14所示。
然后通过命令mysql -h host -P port -uroot即可连接FE节点,其中:IP地址为FE节点的IP;端口号默认为9030,对应fe.conf文件中的query_port;默认使用root账户,无密码登录。登录过程截图如图2-15所示。
图2-14 MySQL客户端安装成功截图
图2-15 MySQL客户端连接FE
BE是由C++语言开发的,所以不需要安装其他依赖软件。BE安装过程和FE一样,也非常简单,直接进入bin目录执行sh start_be.sh --daemon命令即可。启动及验证过程截图如图2-16所示。
图2-16 BE启动及验证过程
在正式环境中安装BE节点,也有以下注意事项:
❑BE节点的配置文件为be/conf/be.conf。
❑BE作为数据的实际存储节点,需要大量存储空间,建议用可扩容的外挂磁盘。数据磁盘主要通过be.conf文件中的storage_root_path参数来配置。数据文件存储目录需要提前创建好,多个目录通过“;”来分隔。(注意:最后一个路径后面不需要分号。)
❑存储介质可以是HDD或SSD,并且可以限制每个目录的最大使用空间。
存储路径的配置有两种格式,具体如下。
方式一:通过在目录后面增加“.”和“,”分步追加磁盘类型和限制存储容量(默认单位是GB),例如:“storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk3/doris”表示有3个盘,磁盘一/home/disk1/doris.HDD,50表示存储限制为50GB的HDD;磁盘二/home/disk2/doris.SSD 10表示存储限制为10GB的SSD;磁盘三/home/disk3/doris表示存储限制为磁盘最大容量,默认为HDD。
方式二:在目录后面通过键值对区分存储类型和存储空间(默认单位也是GB),例如:storage_root_path=/home/disk1/doris,medium:hdd,capacity:50;/home/disk2/doris,medium:ssd,capacity:10;/home/disk3/doris,medium:hdd”表示的结果和方式一致。
❑priority_networks参数的配置同FE节点,可以参考2.1.5节。
❑BE节点之间是平等关系,无主从、主备关系,系统会自动均衡地分布数据。
BE节点的日志默认存放在be/log/目录下,如启动失败,可以通过日志文件be/log/be.log或者be/log/be.out查看错误信息。
BE节点启动后,需要向FE节点注册信息才可加入集群,具体如下(这里要用到前面安装的MySQL客户端):
其中,IP为配置文件中priority_networks参数对应的IP,端口为heartbeat_service_port参数对应的值。
配置过程截图如图2-17所示。
图2-17 BE节点配置过程截图
如存在多个BE节点,需要依次添加。BE节点运作状态可以通过SHOW PROC‘/backends’;命令查看,如节点服务正常,isAlive列应为true。
Broker是访问外部数据源(如HDFS)的进程。通常,我们只在FE节点上部署Broker实例。Broker以插件的形式独立于Doris部署。如果从第三方存储系统导入数据,我们需要部署相应的Broker组件。Doris默认提供了读取HDFS和BOS源码的fs_broker。fs_broker是无状态的,建议每一个FE和BE节点都部署。
Broker安装过程如下。
1)修改相应Broker配置。在broker/conf/目录下对应的配置文件中可以修改相应配置。
2)启动Broker。用sh bin/start_broker.sh--daemon命令启动Broker。
3)添加Broker。要想让Doris的FE和BE知道Broker在哪些节点上,通过SQL命令添加Broker节点列表。使用mysql-client连接已启动的FE节点,命令如下:
其中,host为Broker节点对应的IP;port为Broker配置文件中broker_ipc_port对应的值。
使用mysql-client连接已启动的FE节点,执行SHOW PROC“/brokers”命令查看Broker状态。操作示例如下:
作为Doris集群的安装者和使用者,我们不可能避免地需要用到一些管理命令来查看和修改Doris服务或者管理Doris用户密码。这里介绍一下常用命令。
访问Doris数据库,首先必须掌握通过MySQL客户端连接的方式。选择MySQL客户端版本时建议采用5.1之后的版本,因为5.1之前的版本不支持长度超过16字符的用户名。这里推荐使用5.7版本的MySQL客户端,安装过程见2.3.2节。
安装完成以后,我们可以通过MySQL命令连接Doris数据库,操作如下:
“工欲善其事,必先利其器”,除了在服务器上通过MySQL命令直接连接FE以外,我们还需要通过客户端软件连接Doris进行日常数据查询和数据库对象创建。这里推荐Navicat和DBeaver。
Navicat是一款可以连接多个关系型数据库的商业软件,优点是可以简单、快速地连接MySQL、Oracle、PostgreSQL、SQL Server等常用数据库;缺点是对Doris视图和表结构支持不友好。Navicat无须任何配置,用户直接填数据库连接信息即可访问Doris,操作过程和连接MySQL一样。Navicat连接Doris的操作截图如图2-18所示。
图2-18 Navicat连接Doris的操作截图
DBeaver是一款专门为开发人员和数据库管理员开发的通用数据库工具,具有操作简单、免费开源、跨平台等优点。DBeaver支持任何一个具有JDBC驱动程序的数据库,因此支持的数据库范围非常广泛。DBeaver不仅可以很好地支持各种查询操作,还支持查看视图和建表语句等操作,是数据库开发者的好助手。DBeaver连接Doris的操作截图如图2-19所示。
图2-19 DBeaver连接Doris的操作截图
使用Java语言开发时,我们也可以直接通过配置JDBC驱动连接数据库。
在某些场景下,例如Tableau服务端连接Doris时,我们还需要安装ODBC驱动,以CentOS 7为例,操作如下。
第一步,安装相关驱动软件。
安装成功后,验证结果如图2-20所示。
图2-20 ODBC驱动验证成功截图
第二步,配置ODBC驱动。
默认libmyodbc5.so只支持ANSI字符集,如果想支持中文字符,需要使用libmyodbc5w.so。
配置完成后,通过odbcinst-q-d查看已安装的驱动,如图2-21所示。
图2-21 已安装的驱动
第三步,添加MySQL的ODBC连接信息。
保存配置以后,通过isql -v my_doris验证Doris数据源连接是否成功。连接成功的返回结果如图2-22所示。
图2-22 ODBC驱动连接Doris数据源成功
为了更好地使用Doris,我们还需要掌握一些常用命令。
1)查看前端节点命令如下:
2)查看后端节点命令如下:
3)查看本地数据的label任务执行情况命令如下:
4)重命名表命令如下:
5)查询表结构命令如下:
6)查看分区信息命令如下:
7)查看某一个数据库下所有表的动态分区信息命令如下:
8)查看表的数据量命令如下:
注:表的数据量可以通过SHOW DATA命令查看到的汇总数据量除以副本数获得。
1.创建用户和数据库
用户在创建Doris集群时设置的密码为Doris的admin用户的密码。Doris集群初始默认包含一个admin用户,用户可以通过admin用户和Doris进行初次连接:
如果使用的是8.0以上版本的MySQL客户端,请添加参数:
这里的host和port是Doris控制台给出的MySQL连接目标,如果绑定了EIP,则替换为EIP即可。
admin用户拥有集群的全部操作权限。管理员可以通过admin用户创建普通用户并授予相应的权限。
通过以下命令创建普通用户:
新创建的普通用户默认没有任何权限,接下来可以创建数据库并授权给用户jack:
之后,用户jack可以登录并查看数据库:
2.修改用户密码
Doris内置root用户和admin用户,密码默认都为空。启动Doris后,可以通过root用户或admin用户连接到集群。通过以下命令可登录Doris:
其中,FE_HOST是任一FE节点的IP地址,9030是fe.conf文件中的query_port配置。
登录后,可以通过以下命令修改root密码: