15. ClustrixDB 管理数据分布
本节使用的关键术语:
Relation — ClustrixDB中的每个表都被称为“关系”。
Representation — 在ClustrixDB中,每个索引都称为一个“Representation”。表数据存储在“Base Representation”中,这种关系表示由一个覆盖基本表所有列的内部键索引。对于由主键键控的表,“Base Representation”的数据用主键存储。
Distribution Key — 每个Representation都使用一致的哈希算法对其全部或部分索引进行哈希。“分布键”定义索引的哪些列用于构造散列。索引的默认分布是1,这意味着representation (索引)的第一列将被散列化,并成为该Representation的分布键。
Slices — ClustrixDB将每个Representation分解为更小、更易于管理的称为“slices”的段。然后将片分布在整个集群中,以促进均匀分布的查询处理。
Replicas — ClustrixDB维护每个数据片的多个副本,以提供容错和高可用性。副本分布在整个集群中,以优化性能并确保在节点发生故障时保护所有数据。
DISTRIBUTE
ClustrixDB使用散列来确定给定的数据行或表的索引(Representation)应该位于集群中的何处。用于哈希的列被称为该representation的“分布键”。每个索引都需要关于哪些列应该包含分布键的指导。
默认情况下,分布键使用索引的第一列,而不管索引由多少列组成。这适用于包括主键在内的所有索引。
可以使用DISTRIBUTE = 子句覆盖单个列的默认值,并定义要散列的索引。
- 使用默认分配
- 展开分布键以包含索引的更多列
- 展开分布键以包含主键的列
- 修改分布
- 修改分布-主键
- 修改分布-备用键
使用默认分配
在本例中,post_id的主键被散列,表的数据使用该值进行分布,默认的分布设置为DISTRIBUTE = 1。
sql> CREATE TABLE user_posts (
post_id int AUTO_INCREMENT,
user_id int,
posted_on timestamp,
data blob,
PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */,
KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=1 */
);
在某些情况下,基于单个列的数据和索引分布可能导致较差或“块状”分布。为了解决这个问题,我们建议将最独特的(选择性的)列放到composite index的第一列中,或者将分布键从单个列扩展到多个列。有两种方法可以做到这一点。
1. 展开分布键以包含索引的更多列
下面的示例显示了多列备用键user_id_posted_on_idx,它使用索引中的两个列而不是第一个列进行分布。
sql> CREATE TABLE user_posts (
post_id int AUTO_INCREMENT,
user_id int,
posted_on timestamp,
data blob,
PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */,
KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=2 */
);
2. 展开分布键以包含主键的列
下面的示例显示了另一个密钥user_id_posted_on_idx,它的分布为3。这意味着索引将分布在它的两个列(user_id、posted_on)和主键(post_id)上。如果主键是复合键,则可以进一步扩展分布,以包含主键的其他列。
sql> CREATE TABLE user_posts (
post_id int AUTO_INCREMENT,
user_id int,
posted_on timestamp,
data blob,
PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */,
KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=3 */
);
修改分布
修改分布-主键
要在创建表之后修改组合主键的分布,请遵循以下ALTER table语法:
ALTER TABLE tbl_name PRIMARY KEY [DISTRIBUTE = n]
主键的分布计数不能超过主键中的列数。
修改分布-备用键
要在创建表之后修改其他索引(非主键)的分布,请按照以下语法在ALTER表中指定index_name:
ALTER TABLE tbl_name [ ,INDEX index_name [DISTRIBUTE = n]] [ ,INDEX index_name [DISTRIBUTE = n ]]
非主键的最大分布值是备用键和主键的列数的组合。
SLICES
ClustrixDB将每个representation (主键+表或其他索引)拆分成更小的、更易于管理的段,称为“片”,每个片被分配到表示行的一部分。每个片都有多个副本,称为副本。
- 片分布在整个集群中,以促进均匀分布的查询处理。
- 为表本身指定的片数适用于表的数据及其主键。
- 可以为每个representation 指定不同数量的片。
- 对于给定的表示,片的数量不应该少于集群中的节点数量。(分布到ALLNODES的表是一个例外。)
- 当一个片变得太大并超过rebalancer_split_threshold old_kb时,Rebalancer将把这个片分割成新的片,并将原始片的行分布到其中。切片变得越大,在系统中移动或复制它的成本就越高。
- 以通过在表示的DDL中包含split_threshold_kb来指定单个表或索引的最大片大小。
- 一个片必须在物理上完全适合它被分配到的存储设备。一个片不能跨多个设备。
要修改现有表或索引的片数,请遵循以下语法:
ALTER TABLE tbl_name [SLICES = n] [ , INDEX index_name [SLICES = n] [split_threshold_kb = n]]
全局参数定义
以下全局变量影响ClustrixDB切片。
|
Default Value
|
Session Variable
|
|
---|---|---|---|
Name
|
Description
|
Default Value
|
Session Variable
|
hash_dist_min_slices | 控制如何分割数据。如果设置为0(默认值),ClustrixDB将创建新的表示,其片的数量等于集群中当前节点的数量。每个节点上至少放置一个表或索引片。如果设置为特定的整数,则将为每个新表和索引创建该数量的片。 | 0 |
|
rebalancer_split_threshold_kb | rebalancer分割片的默认大小。 |
8388608 |
|
task_rebalancer_reprotect_interval_ms | 定义如果需要额外的片,Rebalancer将评估的频率。指定0来禁用片分割。 | 15000 |
最佳实践
对于大多数用例,默认片大小为8GB是最优的。如果一个非常大的表导致了比可用内核更多的片,那么可能会影响性能,建议增加最大片大小。
表和索引的最小片数应该等于节点数,ALLNODES表是一个例外。使用以下查询来标识包含比当前节点数量少的片的表:
片数少于节点总数的表:
sql> SELECT fd.name `Database`,
f.name `Table`,
Count(*) Slices
FROM system.slices
JOIN system.representations fp USING (representation)
JOIN system.relations f
ON ( relation = `table` )
JOIN system.DATABASES fd USING (db)
GROUP BY `Database`,
`Table`,
fp.name
HAVING fd.name NOT IN ( 'system', 'clustrix_statd','clustrix_ui','_replication' )
AND slices < (SELECT Count(*)
FROM system.membership
WHERE status = 'quorum')
AND (fp.name LIKE '%__PRIMARY%' OR fp.name LIKE '__base%')
ORDER BY `Database`, `Table`, Slices;
Pre-slicing表
在正常的操作过程中,关系会根据需要进行重新处理,但是,对预期会出现大量数据增长的表进行预切片是有利的。创建或修改一个表示,使其具有与预期大小相称的片数,这将允许集群以最快的速度向表示添加数据,因为没有必要进行片分割。有关其他信息,请参见将数据加载到ClustrixDB。
使用以下公式来确定表的最佳片数:(expected table size + 10%) / rebalancer_split_threshold_kb)
管理部分分裂
当达到全局rebalancer_split_threshold_kb设置的阈值时,Rebalancer将自动分割表片或索引片。然而,一些表可能会受益于更多的片(以增加并行度)或更少的片(以减少系统上的片的开销)。
REPLICA
逻辑片至少有两个物理副本,存储在不同的节点(或区域)上。写操作同时应用于所有的副本,但是一个副本被指定为“有等级的副本”,用于读操作。这有助于在集群中保持读操作的分布。rebalancer rerank进程不断地评估读取的集群负载平衡,并在必要时可以重新指定给定片的排序副本以保持负载均衡。
下面的规则决定了副本在集群中的位置:
- 默认情况下,每个片有两个副本(REPLICA= 2)
- 为了冗余和平衡读、写和磁盘使用,副本分布在整个集群中。
- 同一片的两个副本不会存在于同一节点或同一区域。
- ClustrixDB将在数据库保持在线的情况下创建新的副本,而不会挂起或阻塞对片的写操作。
指定副本的数量
在创建表时,默认情况下创建的副本数量基于全局变量max_failure。默认的max_failure = 1导致REPLICAS = 2。
创建表之后,可以使用ALTER语句修改副本的数量:
ALTER TABLE tbl_name [REPLICAS = n]
max_failure指定的缺省副本数量适合于大多数用例。副本的数量也可以通过表示进行配置。例如,一个用户可能需要三个副本作为表的基本表示,而只需要两个副本作为表的其他表示。
对于大多数工作负载,默认的2个副本是平衡容错和性能的最佳选择。将REPLICAS设置为1将删除容错,不建议这样做
要在表创建时为特定表示配置副本的数量:
CREATE TABLE tbl_name col_names [REPLICAS = n]
这将自动将切片数据复制到多个节点,直到创建所需数量的副本。配置额外的副本不足以确保在面对多个故障时的容错能力。有关为多节点故障配置集群的更多信息,请参见max_failure。
ALLNODES
REPLICAS = ALLNODES指定在每个节点上维护表的完整副本。当使用ALLNODES时,ClustrixDB能够利用表的本地副本来更有效地执行查询。当小表(ALLNODES)与大表连接时尤其适用。但是,维护这些副本对编写性能有很大的开销。
ALLNODES最适合用于满足以下条件的表:
- 相对较小(表大小< 10MiB)
- 写入不频繁(写入频率< 1K)
- 读频繁(读取频率> 1M)
- 经常用于连接到其他更大的表(如元数据、查找表)
ALLNODES不应用于:
- 需要频繁写操作的表
- 分区表
REPLICAS = ALLNODES 语法
CREATE TABLE tbl_name (col_names) [REPLICAS = ALLNODES]
ALTER TABLE tbl_name [REPLICAS = ALLNODES]
15. ClustrixDB 管理数据分布的更多相关文章
- 11. ClustrixDB 管理文件空间和数据库容量
ClustrixDB监视集群中可用的空间量,并主动警告潜在的容量问题.确定集群容量的阈值是可配置的,如下所述. 存储类型 要了解如何管理设备和数据库的利用率,必须首先了解ClustrixDB如何分配磁 ...
- Linux实战教学笔记15:用户管理初级(下)
第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 15. 用户管理
源码的github的地址 https://github.com/solenovex/ASP.NET-Core-MVC-Tutorial-Code 语雀上的人的地址: https://github.co ...
- 18. ClustrixDB 管理CPU资源
作为一个分布式MPP数据库,ClustrixDB能够利用多个节点和核心来比单节点数据库更快地处理查询.有两个可调进程可以促进这一点. Clustrix选择了一组默认参数来控制那些提供最常见工作负载的进 ...
- python+pytest接口自动化(15)-日志管理模块loguru简介
python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...
- 21. ClustrixDB 识别平台限制
本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...
- 26. ClustrixDB 分布式架构/数据分片
数据分片 介绍 共享磁盘vs.无共享 分布式数据库系统可分为两大类数据存储架构:(1)共享磁盘和(2)无共享. Shared Disk Architecture Shared Nothing Arch ...
- ClustrixDB安装配置
前提条件 在安装ClustrixDB之前,需要: ClustrixDB安装程序和许可证密钥. 运行CentOS或RHEL 7.4的服务器(本地或云中). 具有root或sudo特权来安装Clustri ...
- (5.6)mysql高可用系列——MySQL Utilities 管理工具
关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...
随机推荐
- JsonProperty 使用
引入 依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId> ...
- 在windows上远程访问服务器jupyter notebook
需求: 之前在服务器上只能运行完整的python文件,而不能实现jupyter notebook的交互模式,通过在本地浏览器上远程访问服务器上的jupyter notebook,这样不就能有一个很棒的 ...
- 深度学习入门者的Python快速教程 - 基础篇
5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...
- python 有参数的装饰器
怎么样为装饰器加参数 import time current_user = {'user':None} def auth(engine = "file") def deco(fun ...
- ElasticSearch 7.3.0 查询、修改、删除 文档操作
PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...
- chrome插件--安装以及问题记录
vue-devtools 插件网址下载 问题1 Vue.js is detected on this page. Devtools inspection is not available becaus ...
- 【6.28校内test】T3 【音乐会】道路千万条
[音乐会]道路千万条[题目链接] 首先,你可以忽略上面的一大坨题面,只需要看说明的那一小部分就好啦. 然后理解题意: 就是说我们要给这n-1个运算符指定一个顺序,统计所有值为true的方案数pt,统计 ...
- 第一次参赛经历:ecfinal总结
刚接到要去参加ec的消息时,还是非常激动的,毕竟第一次参赛就参加如此高水平的编程竞赛(更高水平的比赛就是wf). 教练临时组队,把三个从没在一起打过比赛的三个人组成一队,当时有点担心默契和配合上的问题 ...
- python-day11(正式学习)
目录 文件高级应用 多重操作 r+t:可读,可写(文件名为a) w+t:可写可读 a+t:可追加可读 文件内指针移动及一些操作 指针移动seek(offset,whence) 寻找指针位置tell() ...
- shell with hadoop
shell 命令操作 hadoop 之前多少提及过,这里做个总结. shell with hdfs 基本命令 bin/hadoop fs 大于下面的命令 bin/hdfs dfs dfs 是 fs 的 ...