概念
Doris: MPP架构的数据库,兼容大部分mysql语法,通过向量化技术和内部特殊的表结构可以实现海量数据的分析,查询。
向量化:也叫做SIMD,通过单指令多数据实现并行任务处理。
Fe|Frontend:是doris的管理节点,用户请求的接入、查询解析规划、元数据的管理、节点管理。角色分为Follower和Master和Observer。其中Observer只负责元数据的同步没有选举功能相当于SecondeNameNode。
Be|Backend:要负责数据存储、查询计划的执行
Broker:数据的导入
规划
集群规划
- 通过上面的介绍可以知道集群的性能与 BE 节点的资源有关,BE 节点越多,Doris 性能越好。doris的节点数>=doris副本数+1(也就是如果设置3副本至少部署4be)
- fe主要负责sql的解析,执行计划分发,元数据管理(Master独有)。fe的角色分为Follower和Observer。如果部署1Follower+2Observer=>读高可用。如果配置读写高可用3Follower节点。
- fe的follower和observer如何选择?fe内部使用了bdbje的选举方式类似Paxos。因此必须保证半数以上写入成功,如果不成功该fe节点直接退出,来保证数据的准确性。事实如果Master的fe配置合理很难挂掉,即使Fe的Master磁盘故障仍然可以通过observer的元数据故障恢复。而如果对于Follower的元数据结构不是特别了解,不建议部署多台follower因为这样增加了运维的难度。相反部署多台observer运维成本更低。
- 关于混布。生产环境不建议混布(fe+be),但是可能资源有限,如果部署读写高可用必须保证2fe独立部署。内存10G+,硬盘保证10G空间(元数据一般不会超过2G);be不能混部。
- 关于硬件资源。be节点对于内存使用较多,生产建议内存是 CPU 核数的 4 倍-8倍。fe节点如果节点数少建议16G-32G,如果节点数多可以适当调整内存10G+。
- Ssd 和hdd应该怎么设置?对于fe来说,ssd可以通过配置meta_data存放元数据,加速大数据情况下的高并发点查和高频更新的能力。如果该节点是be,在多种存储介质存在时可以通过配置后缀设置冷热数据(该场景使用较少)。
端口规划
实例名称 | 端口名称 | 默认端口 | 通信方向 | 说明 |
---|---|---|---|---|
BE | be_port | 9060 | FE --> BE | BE 上 thrift server 的端口,用于接收来自 FE 的请求 |
BE | webserver_port | 8040 | BE <–> BE | BE 上的 http server 的端口 |
BE | heartbeat_service_port | 9050 | FE --> BE | BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳 |
BE | brpc_port | 8060 | FE <–> BEBE <–> BE | BE 上的 brpc 端口,用于 BE 之间通讯 |
FE | http_port | 8030 | FE <–> FEClient <–> FE | FE 上的 http server 端口 |
FE | rpc_port | 9020 | BE --> FEFE <–> FE | FE 上的 thrift server 端口,每个 fe 的配置需要保持一致 |
FE | query_port | 9030 | Client <–> FE | FE 上的 MySQL server 端口 |
FE | edit_log_port | 9010 | FE <–> FE | FE 上的 bdbje 之间通信用的端口 |
Broker | broker_ipc_port | 8000 | FE --> Broker BE --> Broker | Broker 上的 thrift server,用于接收请求 |
前置操作
1.检查支持AVX2 指令集(be节点)
cat /proc/cpuinfo | grep avx2
2.存储检查,必须ext4 和 xfs 文件系统均支持。
3.网卡配置检查,万兆带宽(如果只有千兆带宽影响性能),值得时priority_networks的网卡
4.关闭swap 分区
5.关闭防火墙
6.配置NTP服务
7.修改虚拟内存区域至少 2000000
sysctl -w vm.max_map_count=2000000
8.关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
9.修改最大文件句柄数
vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
相关配置
- priority_networks(包含:fe+be) 配置ip,多网卡必须配置。并且启动后不能修改此配置,否则对应节点可能无法恢复。为了部署和后期维护的方便建议配置文件保持一致,因此可以通过配置网段让doris自定选择合理的ip例如该节点ip为192.168.0.1可以设置成priority_networks=192.168.0.0/24。只有匹配上 192.168.0.0/24 这个网段的才会去作为服务监听地址。
- Fe的节点数(Follower不包含observer)必须是奇数个。
- 如果fe节点数多个并且集群内存有限,可以使用默认8G内存。配置参数
JAVA_OPTS="-Xmx16384m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE"
- meta_dir在fe中配置如果有ssd尽量配置ssd的目录
- storage_root_path是be的数据存储路径。另外如果如果配置的目录有ssd和hdd的情况需要指定类型。否则可以不用制定类型,可以添加相关资源限制条件。多块磁盘配置多个路径,提高性能
lower_case_table_names
(fe) 默认0,区分大小写。1不区分(自动转成小写)2.不区分(保持sql的表名,以小写查询还有区别见官网)。需要注意此配置修改后只能通过重建元数据相当于重建集群。
部署
建议使用doris用户完成下面的操作。
1.Fe 节点部署
#修改fe.conf配置文件
## 选择独立于 BE 数据的硬盘,创建 FE 的元数据目录
mkdir -p <doris_meta_created>
#启动fe节点(非master节点需要使用helper方式启动)
bin/start_fe.sh --daemon
#非master第一次启动需要使用helper方式启动,后续使用start_fe.sh --daemon即可
#helper_fe_ip为任意一正常的fe节点一般用fe-master
#fe_edit_log_port默认9010
bin/start_fe.sh --helper <helper_fe_ip>:<fe_edit_log_port> --daemon
2.be节点部署
#修改be.conf配置文件
## 修改 be/be.conf 的 Java 环境变量
JAVA_HOME = <your-java-home-path>
#启动be节点
bin/start_be.sh --daemon
3.加入节点
mysql -uroot -P<fe_query_port> -h<fe_ip_address>
ALTER SYSTEM ADD BACKEND "<be_ip_address>:<be_heartbeat_service_port>"
ALTER SYSTEM ADD FOLLOWER "<fe_ip_address>:<fe_edit_log_port>"
ALTER SYSTEM ADD OBSERVER "<fe_ip_address>:<fe_edit_log_port>"
## 查看 FE 各实例的版本,在 MySQL Client 中执行 show 命令
show frontends \G
## 查看 BE 各实例的版本,在 MySQL Client 中执行 show 命令
show backends \G
4.验证
## 创建测试数据库,在 MySQL Client 中执行 create database 语句
create database testdb;
## 创建测试表,在 MySQL Client 中执行 create table 语句
CREATE TABLE testdb.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
k3 VARCHAR(10) COMMENT "string column",
k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 32;
## 插入部分测试数据,在 MySQL Client 中执行 insert into 语句
INSERT INTO testdb.table_hash VALUES
(1, 10.1, 'AAA', 10),
(2, 10.2, 'BBB', 20),
(3, 10.3, 'CCC', 30),
(4, 10.4, 'DDD', 40),
(5, 10.5, 'EEE', 50);