大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、金仓KCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看 Doris|SelectDB 单机安装初体验,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
Doris
Doris是百度开源的一款为数据分析而生的数据库。从 2008年诞生之日起,Doris的每一次进步都是为了解决切实的OLAP业务痛点,每一次转变都是在应对不同的业务挑战。Doris的发展历程大致如下图:
Doris 架构图如下:
在架构方面,Doris只有两类进程:一类是FE(FrontEnd),可以理解为Doris的管理节点,主要负责用户请求的接入、查询计划的解析、元数据的存储和集群管理相关工作;另一类是BE(BackEnd),主要负责数据存储、查询计划执行。这两类进程都可以横向扩展。除此之外,Doris不依赖任何第三方系统(如HDFS、ZooKeeper等)。
FE节点包含 Leader、Follower和 Observe r三种角色。默认一个集群只能有一个 Leader,可以有多个 Follower 和 Observer。其中,Leader 和 Follower 组成一个 Paxos 选择组,如果 Leader 宕机,剩下的 Follower 会自动选出新的 Leader,保证写入高可用。 Observer 同步 Leader 的数据,但是不参加选举。如果只部署一个 FE,FE 默认就是 Leader。
FE节点主要包含存储管理模块、状态管理模块、协调模块、元数据模块和元数据缓存模块。存储管理模块负责管理所有的元数据信息,包括表信息、Tablet信息、Tablet的副本信息等,还负责管理用户的权限信息(即用户的认证信息和授权信息)和数据的导入任务等。状态管理模块负责管理所有BE进程的存活状态、查询负载等非持久化信息,并提供发布订阅接口。协调模块负责接收用户发来的请求,然后进行语句解析、生成执行规划,根据当前集群的状态,对执行规划进行调度。元数据模块负责对元数据的读写,只有Leader角色拥有此权限。元数据缓存模块负责同步元数据,以供语句解析、生成执行规划,主要是Follower和Observer角色拥有此权限。
BE 节点可以无限扩展,并且所有BE节点的角色都是对等的。在集群足够大的情况下,部分BE节点下线不影响集群提供服务。BE节点主要由存储引擎和查询执行器组成。存储引擎负责管理节点本地的Tablet数据,发送或者接收数据并保存副本,定期合并、更新多个版本的数据,以减少存储占用。存储引擎还负责接收来自查询执行器的数据读取请求和批量数据导入请求。在MPP集群中执行查询时,会分解为一个树状的执行树,由 Coordinator 来协调执行,树的叶子节点也叫计划片断(PlanFragment),每个 PlanFragment 分配一个BE节点的查询执行器。
Doris 竞争对手
Greenplum(GP):Greenplum 数据库具有非常丰富的ETL功能,几乎完全兼容PostgreSQL数据库语法,不仅开发简单,入门门槛低,并且与外围的BI工具和ETL工具兼容得非常好。
Kylin: Kylin 是一个开源的、分布式的分析型数据仓库,提供基于Hadoop、Spark的SQL查询接口及多维分析(OLAP)能力,以支持对超大规模数据的查询。
ClickHouse:ClickHouse 作为一款开源的列存储数据库管理系统,支持线性扩展,具有安装简单、高可靠性、高性能等特点。
StarRocks:谈到 Doris,不得不谈StarRocks(早期叫作DorisDB),这块好像搞不懂,据说和 Doris 有一些爱恨情仇,下面是一个简单的介绍。
StarRocks
StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库, 在开源Doris的基础上进行了一系列优化,率先完成了向量化执行引擎的开发,StarRocks 的愿景是能够让用户的**数据分析变得更加简单和敏捷,**镜舟科技通过开源战略拓宽了StarRocks的应用场景。首次发布时间2021-01-01,官网:https://www.starrocks.io。开源地址:https://github.com/StarRocks/StarRocks 官方文档:https://docs.starrocks.io/zh/docs/introduction/Architecture/
今天主要介绍的是 Doris 的商业版本 SelectDB,来自飞轮科技。
SelectDB 简介
SelectDB 是北京飞轮科技有限公司基于 Apache Doris 项目开发的新一代实时数据仓库,具备实时性、云原生、开源等特点,主要产品包括 SelectDB Cloud 和 SelectDB Enterprise,能够差异化地满足来自云上和私有化部署用户的不同需求。首次发布时间2022-12-06,官网:https://www.selectdb.com/。这款就是 Doris 的商业化产品了。
Cluster Manager for Apache Doris(以下简称 Doris Manager 或者 Manager)是 SelectDB 推出的管理运维 Apache Doris、SelectDB Doris 集群的工具。今天我们仅是测试了解,故先不安装 Doris Manager 24.x直接下载安装 SelectDB Enterprise Core。
说明:我这里是去年底下载的 3.0 的版本,现在看好像官网没有了 3.0 的版本,只有 2024 年 11 月 12 日发布的 2.1.7 版本,不过也没关系,这是个人学习测试,版本区别不是很大,初次学习而已,都一样。
selectdb-doris-3.0.0-bin-x64.tar.gz https://qa-build.oss-cn-beijing.aliyuncs.com/enterprise-doris-release-output/selectdb-doris-3.0.0-bin-x64.tar.gz
安装 SelectDB
Apache Doris 能够运行在绝大多数主流的 Linux 服务器上。建议 Linux 选择较新的 CentOS 和 Ubuntu,然后 GCC 版本 4.8.2及以上。安装前,确保以下 Linux 系统相关设置。为了方便安装使用,包中内置了Java17,不需要单独安装Java。下载之后可以直接运行。然后我这里单独指定了安装用户和路径,官网好像也没有说明安装用户使用非 root 安装,这里尝试一下使用 doris 用户组安装吧。
创建用户
/usr/sbin/groupadd -g 1501 doris
/usr/sbin/useradd -u 1502 -g doris doris
echo 'DRin73_9' | passwd --stdin doris
mkdir -p /data/SelectDB
chown -R doris:doris /data/SelectDB
操作系统检查
当安装 Doris 时,建议选择支持 AVX2 指令集的机器,以利用 AVX2 的向量化能力实现查询向量化加速。
运行以下命令,有输出结果,及表示机器支持 AVX2 指令集。
cat /proc/cpuinfo | grep avx2
Doris 没有强制的内存限制。一般在生产环境中,可以根据以下建议选择内存大小:FE 节点建议至少 16GB以上,BE 节点建议至少是CPU核数的4倍,8倍性能更好。
Doris 推荐使用 EXT4 或 XFS 文件系统。EXT4 文件系统具有良好的稳定性、性能和较低的碎片化问题。XFS 文件系统在处理大规模数据和高并发写操作时表现优越,适合高吞吐量应用。然后推荐数据存放在 SSD 或 HDD 硬盘或者对象存储中。
https://doris.apache.org/zh-CN/docs/install/preparation/env-checking
操作系统设置
确保系统有足够大的虚拟内存区域
为了保证 Doris 有足够的内存映射区域来处理大量数据,需要修改 VMA(虚拟内存区域)。如果没有足够的内存映射区域,Doris 在启动或运行时可能会遇到 Too many open files 或类似的错误。
通过以下命令可以永久修改虚拟内存区域至少为 2000000,并立即生效:
cat >> /etc/sysctl.conf << EOF
vm.max_map_count = 2000000
EOF
# Take effect immediately
sysctl -p
确保系统有足够大的打开文件句柄数
Doris 由于依赖大量文件来管理表数据,所以需要将系统对程序打开文件数的限制调高。
通过以下命令可以调整最大文件句柄数。在调整后,需要重启会话以生效配置:
vi /etc/security/limits.conf
##################################
########For Doris Setting#########
doris soft nofile 1000000
doris hard nofile 1000000
确保系统关闭透明大页
在高负载低延迟的场景中,建议关闭操作系统透明大页(Transparent Huge Pages, THP),避免其带来的性能波动和内存碎片问题,确保 Doris 能够稳定高效地使用内存。
使用以下命令临时关闭透明大页:
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
--如果需要永久关闭透明大页,可以使用以下命令,在下一次宿主机重启后生效:
cat >> /etc/rc.d/rc.local << EOF
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local
确保 CPU 不使用省电模式
在部署 Doris 时检修关闭 CPU 的省电模式,以确保 Doris 在高负载时提供稳定的高性能,避免由于 CPU 频率降低导致的性能波动、响应延迟和系统瓶颈,提高 Doris 的可靠性和吞吐量。如果您的 CPU 不支持 Scaling Governor,可以跳过此项配置。
通过以下命令可以关闭 CPU 省电模式:
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
确保网络连接溢出时自动重置新连接
在部署 Doris 时,需要确保在 TCP 连接的发送缓冲区溢出时,连接会被立即中断,以防止 Doris 在高负载或高并发情况下出现缓冲区阻塞,避免连接被长时间挂起,从而提高系统的响应性和稳定性。
通过以下命令可以永久设置系统自动重置新链接,并立即生效:
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_abort_on_overflow=1
EOF
# Take effect immediately
sysctl -p
确保 Doris 相关端口畅通或关闭系统防火墙
如果发现端口不通,可以试着关闭防火墙,确认是否是本机防火墙造成。如果是防火墙造成,可以根据配置的 Doris 各组件端口打开相应的端口通信。
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
确定部署集群机器安装 NTP 服务
Doris 的元数据要求时间精度要小于 5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
通常情况下,可以通过配置 NTP 服务保证各节点时钟同步。
sudo systemctl start_ntpd.service
sudo systemctl enable_ntpd.service
关闭交换分区(swap)
Linux交换分区会给 Doris 带来很严重的性能问题,需要禁用交换分区,否则 BE 无法启动。
swap 分区是内核发现内存紧张时,会按照自己的策略将部分内存数据移动到配置的 swap 分区,由于内核策略不能充分了解应用的行为,会对 Doris 性能造成较大影响。所以建议关闭。
通过以下命令可以临时或者永久关闭。
临时关闭,下次机器启动时,swap 还会被打开。
swapoff -a
永久关闭,使用 Linux root 账户,注释掉 /etc/fstab 中的 swap 分区,重启即可彻底关闭 swap 分区。
[root@jiekexu log]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Jun 1 06:31:48 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rootvg-lvroot / xfs defaults 0 0
UUID=7c0d7acc-5935-4db0-9c31-467da362570e /boot xfs defaults 0 0
#/dev/mapper/rootvg-lvswap swap swap defaults 0 0
/dev/mapper/datavg01-lvdata01 /data xfs defaults 0 0
解压安装包
# tar zxf selectdb-doris-3.0.0-bin-x64.tar.gz
# cp -r /data/soft/selectdb-doris-3.0.0-bin-x64 /data/SelectDB/selectdb
# chown -R doris:doris selectdb
解压后的目录包含以下内容
selectdb_doris_x.x.x.x-x86_64
|-- apache_hdfs_broker ## FS_Broker
|-- be ## Doris be
|-- fe ## Doris FE
|-- java17 ## Doris FE/BE/Broker 运行所依赖的 Java 运行环境
|-- jdbc_drivers ## Doris FE/BE JDBC 外表及Muitl Catalog 运行所依赖的数据库驱动
部署 FE
如果只是单独部署 FE ,而不部署其他服务,可以只保留这个文件夹下的 fe、java17 及 jdbc_drivers,其他目录可以删除,这里单机都需要部署,不可删除。这里我们切换到 doris 用户来操作。
修改 doris 用户环境变量
vi .bash_profile
export DORIS_HOME=/data/SelectDB/selectdb
PATH=$PATH:$DORIS_HOME/bin
source .bash_profile
修改 FE 配置文件
配置文件为conf/fe.conf。其中注意:meta_dir是元数据存放位置。默认值为 ${DORIS_HOME}/doris-meta。需手动创建该目录。
注意:生产环境强烈建议单独指定目录不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好),测试开发环境可以使用默认配置
mkdir -p /data/SelectDB/selectdb/doris-meta
vim /data/SelectDB/selectdb/fe/conf/fe.conf
JAVA_OPTS_FOR_JDK_17="-Djavax.security.auth.useSubjectCredsOnly=false -Xmx4096m -Xms4096m
fe.conf 中 JAVA_OPTS 默认 java 最大堆内存为 8GB,建议根据机器内存大小做相应调整,我这里调整为 4GB 即可。
启动 FE
[doris@jiekexu fe]$ bin/start_fe.sh --daemon
/data/SelectDB/selectdb/java17
FE 进程启动进入后台执行。日志默认存放在 log/ 目录下。如启动失败,可以通过查看 log/fe.log 或者 log/fe.out 查看错误信息。
使用 curl 或者 jps 命令检查
curl [http://127.0.0.1:8030/api/bootstrap](http://127.0.0.1:8030/api/bootstrap)
/data/SelectDB/selectdb/java17/bin/jps -l
当然也可以通过 MySQL 客户端或者 Web UI 进行相关信息查看,下面是通过 Web UI 来查看状态的,并在 MySQL 库执行下面命令来查看 BE 的运行情况。
SHOW FRONTENDS;
Doris FE 内置 Web UI,用户无须安装 MySQL 客户端,即可通过内置的 Web UI 进行 SQL 查询和其它相关信息的查看。
在浏览器中输入 http://fe_ip:fe_port, 比如 http://192.168.217.173:8030,打开 Doris 内置的 Web 控制台。内置 Web 控制台,主要供集群 root 账户使用,默认安装后 root 账户密码为空。
Playground 中执行这种和具体数据库/表没有关系的语句,务必在左侧库栏里随意选择一个数据库,才能执行成功,这个限制,稍后会去掉。
当前内置的 Web 控制台,还不能执行 SET 类型的 SQL 语句,所以,在 Web 控制台,当前还不能通过执行 SET PASSWORD FOR ‘user’ = PASSWORD(‘user_password’) `类似语句。
部署BE
BE 进程应用于数据的计算与存储。如果只是单独部署 BE ,而不部署其他服务,可以只保留这个文件夹下的 be、java17 及 jdbc_drivers,其他目录可以删除,这里单机都需要部署,不可删除。这里我们也切换到 doris 用户来操作。
修改 BE 配置文件
修改 be/conf/be.conf。主要是配置 storage_root_path:数据存放目录。默认在be/storage下,需要手动创建该目录。多个路径之间使用英文状态的分号 ; 分隔(最后一个目录后不要加 ;)。
可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开。如果用户不是SSD和HDD磁盘混合使用的情况,不需要按照如下示例一和示例二的配置方法配置,只需指定存储目录即可。
示例一如下:
注意:如果是SSD磁盘要在目录后面加上.SSD,HDD磁盘在目录后面加.HDD
storage_root_path=/home/disk1/doris.HDD;/home/disk2/doris.SSD;/home/disk2/doris
说明
- /home/disk1/doris.HDD : 表示存储介质是HDD;
- /home/disk2/doris.SSD: 表示存储介质是SSD;
- /home/disk2/doris: 表示存储介质是HDD(默认)
示例二如下:
注意:不论HDD磁盘目录还是SSD磁盘目录,都无需添加后缀,storage_root_path参数里指定medium即可
storage_root_path=/home/disk1/doris,medium:hdd;/home/disk2/doris,medium:ssd
说明
- /home/disk1/doris,medium:hdd: 表示存储介质是HDD;
- /home/disk2/doris,medium:ssd: 表示存储介质是SSD;
本次安装为个人学习测试,磁盘目录可自定义,故我这里的目录为 /data/SelectDB/data,需要先创建好此目录。
mkdir -p /data/SelectDB/data
vim /data/SelectDB/selectdb/be/conf/be.conf
--打开下面此行的注释,并修改为此路径
storage_root_path = /data/SelectDB/data
如何查看是否SSD磁盘
cat /sys/block/sdb/queue/rotational
lsblk -d -o name,rota
在 FE 中添加 BE 节点
BE 节点需要先在 FE 中添加,才可加入集群。可以使用 mysql-client连接到 FE:
./mysql-client -h fe_host -P query_port -uroot
其中 fe_host 为 FE 所在节点 ip;query_port 在 fe/conf/fe.conf 中,默认为 9030;默认使用 root 账户,无密码登录。
登录后,执行以下命令来添加每一个 BE:
ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port"
其中 be_host 为 BE 所在节点 ip;heartbeat_service_port 在 be/conf/be.conf 中,默认为 9050。
在客户端或者 Web UI 执行此命令添加
ALTER SYSTEM ADD BACKEND "192.168.217.173:9050";
启动 BE
bin/start_be.sh --daemon
BE 进程将启动并进入后台执行。日志默认存放在 be/log/ 目录下。如启动失败,可以通过查看 be/log/be.log 或者 be/log/be.out 查看错误信息。
查看状态
mysql -uroot -P<fe_query_port> -h<fe_ip_address>
show backends; --Alive 为 true 表示节点存活
简单连接使用
Apache Doris 采用 MySQL 网络连接协议,兼容 MySQL 生态的命令行工具、JDBC/ODBC 和各种可视化工具。同时 Apache Doris 也内置了一个简单的 Web UI,方便使用。
通过 MySQL Client 登录 Doris 集群。
通过 show frontends 与 show backends 可以查看数据库各实例的信息。
修改 root 密码
在创建 Doris 集群时,系统会自动创建一个名为 root 的用户,并默认设置其密码为空。为了安全起见,建议在集群创建后立即为 root 用户设置一个新密码。
因为 Web UI 客户端不支持 SET 等命令,故须找一台安装 MySQL 客户端的主机远程登录。
mysql -uroot -p -P 9030 -h 192.168.217.173
SET PASSWORD = PASSWORD('Doris@root12');
创建用户和表
Doris 建表语句如下图所示:
创建用户和表
CREATE USER 'jiekexu' @'%' IDENTIFIED by 'Doris@root12';
grant all on *.* to 'jiekexu' @'%';
create database jiekexu;
show databases;
use jiekexu;
CREATE TABLE IF NOT EXISTS example_tbl_duplicate
(
log_time DATETIME NOT NULL,
log_type INT NOT NULL,
error_code INT,
error_msg VARCHAR(1024),
op_id BIGINT,
op_time DATETIME
)
DUPLICATE KEY(log_time, log_type, error_code)
DISTRIBUTED BY HASH(log_type) BUCKETS 10
Properties(“replication_num”=”1”);
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-02 00:00:00', 1, 2, 'success', 13, '2024-11-02 01:00:00'),
('2024-11-03 00:00:00', 2, 2, 'unknown', 13, '2024-11-03 01:00:00'),
('2024-11-04 00:00:00', 2, 2, 'unknown', 12, '2024-11-04 01:00:00');
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-01 00:00:00', 2, 2, 'unknown', 13, '2024-11-01 01:00:00');
如果报错:
ERROR 1105 (HY000): errCode = 2, detailMessage = errCode = 2, detailMessage = replication num should be less than the number of available backends. replication num is 3, available backend num is 1
需要修改建表的副本数, “replication_num”=“1” 这个参数,不然会报错无法创建表。
参考链接
https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris
https://doris.apache.org/zh-CN/docs/install/deploy-manually/storage-compute-coupled-deploy-manually
https://www.modb.pro/wiki/682
https://www.starrocks.io
https://www.modb.pro/wiki/3132
https://www.selectdb.com/
https://dev.mysql.com/doc/refman/5.7/en/grant.html
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————