聊聊分布式 SQL 数据库Doris(六)

这篇具有很好参考价值的文章主要介绍了聊聊分布式 SQL 数据库Doris(六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

负载均衡

此处的负载均衡指的是FE层的负载均衡.

当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 的高可用。官方文档描述: 负载均衡 。

实现方式

实现方式有多种,如下列举。

开发者在应用层自己进行重试与负载均衡。

JDBC Connector

发现一个连接挂掉,就自动在其他连接上进行重试。应用层代码重试需要应用自己配置多个 doris 前端节点地址。

通过 JDBC Connector实现自动重试与均衡负载:

jdbc:mysql:loadbalance://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue
Proxy SQL

架设一层代理,通过ProxySQL代理层实现负载。

Nginx 反向代理

通过网关反向代理实现负载。

数据倾斜

由于数据在分区或分桶或者是源数据端的数据存储就不均匀,因此在导入到Doris中分布不均匀,导致Doris的性能和稳定性不好。

原因

Doris出现数据倾斜的原因有多种,其中一些常见的原因包括:

  • 数据分布不均匀:某些列的取值范围过大或过小,导致数据在分区或分桶时分布不均匀。这可能是由于业务逻辑、数据源分布或其他因素导致的。
  • 集群负载不均衡:如果Doris集群中的节点性能存在差异,可能会导致数据倾斜。例如,某些节点的计算能力或存储容量比其他节点低,这可能会导致数据集中到这些节点上。
  • 数据导入不均匀:在数据导入过程中,如果没有均衡地分配数据到各个实例或分区,可能会导致数据倾斜。例如,某些实例或分区导入的数据量比其他实例或分区多,这可能会导致数据集中到这些实例或分区上。
  • 热点数据访问:如果某些数据被频繁地访问或更新,可能会导致这些数据集中到某些节点上,从而引起数据倾斜。

解决

为了解决Doris的数据倾斜问题,可以尝试以下方法:

  • 合理设计表结构:在创建表时,应该尽量避免使用取值范围过大的列作为分区键或分桶列。如果必须使用这类列,可以考虑使用复合分区或哈希分布来均匀地分布数据。
  • 调整数据倾斜列的取值范围:如果某些列的取值范围过大或过小,可以考虑将它们的数据分布调整到更合理的范围内。这可以通过数据清洗、数据变换或数据分箱等方式实现。
  • 使用动态分区:Doris支持动态分区功能,可以根据需要自动调整分区数量和分桶数量。通过合理设置动态分区的参数,可以使得数据更加均匀地分布在各个分区中。
  • 使用虚拟列:Doris支持虚拟列功能,可以根据需要自动计算并存储一些列的值。通过合理设置虚拟列的表达式和存储方式,可以使得数据更加均匀地分布在各个分区中。
  • 调整Doris参数设置:Doris的一些参数设置可能会影响数据倾斜问题的处理效果。例如,可以通过调整副本数量、并发写入数量等参数来优化Doris的性能和稳定性。
  • 避免单个节点负载过高:在部署Doris集群时,应该避免将大量数据集中到单个节点上。可以通过调整副本数量、分区策略等方式来均衡地分布数据到各个节点上。
  • 使用负载均衡技术:可以使用负载均衡技术来将数据访问请求分布到各个节点上,从而避免单个节点负载过高的问题。这可以通过使用负载均衡器、DNS轮询等技术来实现。

高并发点查

点查: 是指通过等值条件(例如 WHERE 子句中的等值条件)来查询单个行或单个数据点的查询操作。点查询通常用于检索具有特定键值的行或数据,其特点是通过提供唯一的主键值或唯一索引值来定位并返回一行数据/单个数据点。

在高并发服务场景中,如果用户希望从系统中获取整行数据,对于列存格式引擎,在表宽时,列存格式将大大放大随机读取IO,这就会导致读取性能降低;其次,FE层是对外提供的是访问服务,同时会分析、解析SQL,也可能会导致高并发查询时的高CPU开销。为了解决性能问题,引入了行存、短查询路径、PreparedStatement解决。官方文档描述: 高并发点查 。

行存

仅仅支持在建表时开启行存模式,但需要额外的空间来存储行存数据。实现逻辑是将行存编码后存在单独的一列中,用于简化行存的实现。在create的property中指定属性:

"store_row_column = "true"

行存(Row Storage)

  • 存储方式:行存以行为单位存储数据,即将每一行的数据存储在一起。
  • 特点:每一行的所有列数据都存储在相邻的位置,形成一个数据块。这种存储方式对于整行的读写操作是高效的,适合于 OLTP(在线事务处理)场景,其中通常需要快速地执行对单个行的操作。
  • 适用场景:适用于需要频繁进行整行读写的场景,如交易处理系统等。

列存(Column Storage)

  • 存储方式:列存以列为单位存储数据,即将同一列的数据存储在一起。
  • 特点:每一列的所有行数据都存储在相邻的位置,形成一个数据块。这种存储方式对于聚合操作和分析查询是高效的,因为查询通常只涉及到部分列的数据。列存适用于 OLAP(在线分析处理)场景,其中通常需要执行复杂的分析查询。
  • 适用场景:适用于需要进行大规模数据分析和聚合查询的场景,如数据仓库和数据分析平台等。

由于列存储是按列存储的,获取整行数据需要从不同列的数据块中进行随机读取,增加了磁盘I/0操作的次数;如果列宽度较大,那么需要读取的数据块数量就会增加,导致随机读取的开销放大;同时较大的列宽导致单个记录的大小较大,需要传输更多的数据量到查询引擎。这会增加网络传输的开销,尤其是在分布式系统中,如果数据分布在多个节点上,点查询可能需要从多个节点传输数据。

Unique 模型下的点查优化

Unique模型支持写入时合并(Merge-On-Write)策略,当开启该策略结合行存时,对于主键的点查会走短路径对SQL执行优化,仅需执行一次RPC查询即可完成。如下示例:

CREATE TABLE `tbl_point_query` (
    `key` int(11) NULL,
    `v1` decimal(27, 9) NULL,
    `v2` varchar(30) NULL,
    `v3` varchar(30) NULL,
    `v4` date NULL,
    `v5` datetime NULL,
    `v6` float NULL,
    `v7` datev2 NULL
) ENGINE=OLAP
UNIQUE KEY(`key`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`key`) BUCKETS 1
PROPERTIES (
    "replication_allocation" = "tag.location.default: 1",
    "enable_unique_key_merge_on_write" = "true",
    "light_schema_change" = "true",
    "store_row_column" = "true"
);

注意:

  1. enable_unique_key_merge_on_write应该被开启, 存储引擎需要根据主键来快速点查
  2. 当条件只包含主键时,如select * from tbl_point_query where key = 123,类似的查询会走短路径来优化查询
  3. light_schema_change应该被开启, 因为主键点查的优化依赖了轻量级 Schema Change 中的column unique id来定位列
  4. 只支持单表key列等值查询不支持join、嵌套子查询, where条件里需要有且仅有key列的等值, 可以认为是一种key value查询

PreparedStatement

PreparedStatement: 即预处理语句;预处理语句可以减少查询的解析和编译时间。

Doris在FE层提供了与MySQL协议兼容的PreparedStatement特性(目前只支持主键点查)。当PreparedStatement开启时,SQL与其表达式将被提前计算并缓存到Session级别的内存缓存中,后续的查询直接使用缓存对象即可。

示例:

  1. 设置JDBC url并在Server端开启prepared statement
url = jdbc:mysql://127.0.0.1:9030/ycsb?useServerPrepStmts=true
  1. 使用 PreparedStatement
// use `?` for placement holders, readStatement should be reused
PreparedStatement readStatement = conn.prepareStatement("select * from tbl_point_query where key = ?");
...
readStatement.setInt(1234);
ResultSet resultSet = readStatement.executeQuery();
...
readStatement.setInt(1235);
resultSet = readStatement.executeQuery();
...

PreparedStatement 支持使用占位符参数(如?)来表示 SQL 语句中的变量部分。在执行语句之前,可以通过设置参数的方式为占位符提供实际的数值。这有助于防止 SQL 注入攻击,并提高安全性。

开启行缓存

对于前面提到的行存,一行里包括了多列数据,Doris默认支持的列缓存可能被大查询给刷掉,为了增加行缓存命中率,单独引入了行存缓存,行缓存复用了 Doris 中的 LRU Cache 机制来保障内存的使用,通过指定下面的的BE配置来开启文章来源地址https://www.toymoban.com/news/detail-747261.html

  1. disable_storage_row_cache是否开启行缓存, 默认不开启。
  2. row_cache_mem_limit指定 Row cache 占用内存的百分比, 默认 20% 内存。

到了这里,关于聊聊分布式 SQL 数据库Doris(六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聊聊分布式 SQL 数据库Doris(五)

    阅读 Doris SQL 原理解析,总结下Doris中SQL解析流程: 词法识别:解析原始SQL文本,拆分token 语法识别:将token转换成AST 单机逻辑查询计划:将AST经过一系列的优化(比如,谓词下推等)成查询计划,提高执行性能与效率。 分布式逻辑查询计划:根据分布式环境(数据分布信息

    2024年02月05日
    浏览(55)
  • 聊聊分布式 SQL 数据库Doris(八)

    密集索引:文件中的每个搜索码值都对应一个索引值,就是叶子节点保存了整行. 稀疏索引:文件只为索引码的某些值建立索引项. 稀疏索引的创建过程包括将集合中的元素分段,并给每个分段中的最小元素创建索引。在搜索时,先定位到第一个大于搜索值的索引的前一个索引

    2024年02月05日
    浏览(41)
  • 聊聊分布式 SQL 数据库Doris(九)

    优化器的作用是优化查询语句的执行效率,它通过评估不同的执行计划并选择最优的执行计划来实现这一目标。 CBO: 一种基于成本的优化器,它通过评估不同查询执行计划的成本来选择最优的执行计划。CBO会根据数据库系统定义的统计信息以及其他因素,对不同的执行计划进

    2024年02月05日
    浏览(51)
  • 聊聊分布式 SQL 数据库Doris(七)

    Doris的存储结构是类似LSM-Tree设计的,因此很多方面都是通用的,先阅读了解LSM相关的知识,再看Doris的底层存储与读取流程会清晰透彻很多,LSM基本知识如下: 原理:把各种数据先用log等形式组织在内存中(该数据结构称为MemTable,且有序);到达一定数据量后再批量merge写入磁

    2024年02月05日
    浏览(49)
  • 分布式数据库Apache Doris简易体验

    📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜😜😜 中国DBA联盟(ACDU)成员,目前服务于工业互联网 擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优

    2024年02月06日
    浏览(59)
  • 分布式数据库Apache Doris HA集群部署

    📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜😜😜 中国DBA联盟(ACDU)成员,目前服务于工业互联网 擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优

    2024年02月06日
    浏览(53)
  • RisingWave分布式SQL流处理数据库调研

    RisingWave是一款 分布式SQL流处理数据库 ,旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统,RisingWave为用户提供了与PostgreSQL类似的使用体验,官方宣称具备比Flink高出10倍的性能(指throughput)以及更低的成本。RisingWave开发只需要关注SQL开发

    2024年02月21日
    浏览(48)
  • 解释什么是分布式数据库,列举几种常见的分布式数据库系统

    敏感信息和隐私保护是指在收集、存储和使用个人数据时,需要采取一系列措施来保护这些数据的安全和机密性,防止数据被未经授权的第三方访问、使用或泄露。这些措施包括加密、访问控制、数据脱敏、数据加密、隐私政策等。 在隐私保护的技术手段方面,常用的技术包

    2024年02月08日
    浏览(57)
  • 分布式数据库架构

    对于mysql架构,一定会使用到读写分离,在此基础上有五种常见架构设计:一主一从或多从、主主复制、级联复制、主主与级联复制结合。 1.1、主从复制 这种架构设计是使用的最多的。在读写分离的基础上,会存在一台master作为写机,一个或多个slave作为读机。因为在实际的

    2024年02月10日
    浏览(50)
  • 分析型数据库:分布式分析型数据库

    分析型数据库的另外一个发展方向就是以分布式技术来代替MPP的并行计算,一方面分布式技术比MPP有更好的可扩展性,对底层的异构软硬件支持度更好,可以解决MPP数据库的几个关键架构问题。本文介绍分布式分析型数据库。 — 背景介绍— 目前在分布式分析型数据库领域,

    2023年04月14日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包