聊聊分布式 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"
);
注意:
- enable_unique_key_merge_on_write应该被开启, 存储引擎需要根据主键来快速点查
- 当条件只包含主键时,如select * from tbl_point_query where key = 123,类似的查询会走短路径来优化查询
- light_schema_change应该被开启, 因为主键点查的优化依赖了轻量级 Schema Change 中的column unique id来定位列
- 只支持单表key列等值查询不支持join、嵌套子查询, where条件里需要有且仅有key列的等值, 可以认为是一种key value查询
PreparedStatement
Doris在FE层提供了与MySQL协议兼容的PreparedStatement特性(目前只支持主键点查)。当PreparedStatement开启时,SQL与其表达式将被提前计算并缓存到Session级别的内存缓存中,后续的查询直接使用缓存对象即可。
示例:
- 设置JDBC url并在Server端开启prepared statement
url = jdbc:mysql://127.0.0.1:9030/ycsb?useServerPrepStmts=true
- 使用
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配置来开启
disable_storage_row_cache是否开启行缓存, 默认不开启。row_cache_mem_limit指定 Row cache 占用内存的百分比, 默认 20% 内存。
聊聊分布式 SQL 数据库Doris(六)的更多相关文章
- 分布式SQL数据库中部分索引的好处
在优锐课的java学习分享中,探讨了分布式SQL数据库中部分索引的优势,并探讨了性能测试,结果等. 如果使用局部索引而不是常规索引,则在可为空的列上(其中只有一小部分行的该列不具有空值),然后可以大大 ...
- 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!
作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...
- CockroachDB学习笔记——[译]The New Stack:遇见CockroachDB,一个弹性SQL数据库
原文链接:https://www.cockroachlabs.com/blog/the-new-stack-meet-cockroachdb-the-resilient-sql-database/ 原 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config
目录 Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config Spring Cloud Config(二):基于Git搭建配置中心 Spring Cl ...
- KTV项目 SQL数据库的应用 结合C#应用窗体
五道口北大青鸟校区 KTV项目 指导老师:袁玉明 歌曲播放原理 SQL数据库关系图 C#解决方案类图 第一步:创建数据库连接方法和打开方法和关闭方法! public class DBHelper { ...
- SQL总结(六)触发器
SQL总结(六)触发器 概念 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行. 触发器可以查询其他表,而且可以包含复杂的 S ...
- Google的分布式关系型数据库F1和Spanner
F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...
- 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法
关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Serv ...
- Windows下Postgre SQL数据库通过Slony-I 实现数据库双机同步备份
一. 我们要实现的环境是windows xp.windows2003上安装Postgre SQL数据库,实现目的是两台数据库服务器进行数据库同步,即数据库同步更新.删除.插入等对数据库的操作. 二. ...
随机推荐
- Unity的IPostprocessBuild:深入解析与实用案例
Unity IPostprocessBuild技术文章 Unity IPostprocessBuild是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自动执行一些操作.这个功能可以帮 ...
- [USACO22DEC] Cow College B 题解
洛谷 P8897 AcWing 4821 题目描述 有\(n\)头奶牛,每头奶牛愿意交的最大学费为\(c_i\),问如何设置学费,可以使赚到的钱最多. \(1\le n\le 10^5,1\le c_ ...
- [windows]远程桌面失败提示CredSSP加密修正
前言 windows远程桌面失败,提示"CredSSP加密--" 远程桌面服务器的系统版本:Windows Server 2016 本地电脑的系统版本:Windows 10 方式1 ...
- [prometheus]基于influxdb2实现远端存储
前言 Prometheus自带的时序数据库胜在使用方便,缺点在于难以维护,如果数据有问题,可能需要删除存储目录.重建目录再重启Prometheus,才能恢复正常.而且Prometheus自带的时序数据 ...
- C#的重载决策
重载是许多编程语言支持的特性.所谓重载,就是指可以定义多个名称相同但参数(个数.类型和顺序)不同的方法(函数).先来看一个例子: void Main() { char cvalue = 'a'; ma ...
- 【技术积累】Linux中的命令行【理论篇】【七】
atrm命令 命令介绍 atrm命令是Linux系统中的一个命令行工具,用于取消或删除已经安排的at命令.at命令是一种用于在指定时间执行一次性任务的工具. 命令说明 atrm命令的语法如下: atr ...
- 2023-08-14:用go语言写算法。给出两个长度相同的字符串 str1 和 str2 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2 每一次转化时,你可以将
2023-08-14:用go语言写算法.给出两个长度相同的字符串 str1 和 str2, 请你帮忙判断字符串 str1 能不能在 零次 或 多次 转化 后变成字符串 str2, 每一次转化时,你可以 ...
- 使用Skonsole自动生成Git提交信息
使用Skonsole自动生成Git提交信息 随着LLM应用的普及,日常工作中的很多使用都可以使用LLM来完成,比如Git提交信息的生成. Skonsole是一个基于Semantic Kernel的命令 ...
- 淘宝详情api接口的应用
淘宝详情API接口是一个基于HTTP协议的接口服务,可用于获取淘宝商品的具体信息.下面将介绍如何调用淘宝详情API接口获取淘宝商品数据的步骤. 1.注册账号并创建应用 首先,我们需要进行账号注册.实名 ...
- Redis沙盒逃逸(CVE-2022-0543)漏洞复现
0x01 概述 Redis 是著名的开源 Key-Value 数据库,其具备在沙箱中执行 Lua 脚本的能力.Debian 以及 Ubuntu 发行版的源在打包 Redis 时,在 Lua 沙箱中遗留 ...