本节使用的关键术语:

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 = 子句覆盖单个列的默认值,并定义要散列的索引。

  • 使用默认分配
  1. 展开分布键以包含索引的更多列
  2. 展开分布键以包含主键的列
  • 修改分布
  1. 修改分布-主键
  2. 修改分布-备用键

使用默认分配

在本例中,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 管理数据分布的更多相关文章

  1. 11. ClustrixDB 管理文件空间和数据库容量

    ClustrixDB监视集群中可用的空间量,并主动警告潜在的容量问题.确定集群容量的阈值是可配置的,如下所述. 存储类型 要了解如何管理设备和数据库的利用率,必须首先了解ClustrixDB如何分配磁 ...

  2. Linux实战教学笔记15:用户管理初级(下)

    第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...

  3. 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 ...

  4. 18. ClustrixDB 管理CPU资源

    作为一个分布式MPP数据库,ClustrixDB能够利用多个节点和核心来比单节点数据库更快地处理查询.有两个可调进程可以促进这一点. Clustrix选择了一组默认参数来控制那些提供最常见工作负载的进 ...

  5. python+pytest接口自动化(15)-日志管理模块loguru简介

    python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理, ...

  6. 21. ClustrixDB 识别平台限制

    本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...

  7. 26. ClustrixDB 分布式架构/数据分片

    数据分片 介绍 共享磁盘vs.无共享 分布式数据库系统可分为两大类数据存储架构:(1)共享磁盘和(2)无共享. Shared Disk Architecture Shared Nothing Arch ...

  8. ClustrixDB安装配置

    前提条件 在安装ClustrixDB之前,需要: ClustrixDB安装程序和许可证密钥. 运行CentOS或RHEL 7.4的服务器(本地或云中). 具有root或sudo特权来安装Clustri ...

  9. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

随机推荐

  1. JsonProperty 使用

    引入 依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId> ...

  2. 在windows上远程访问服务器jupyter notebook

    需求: 之前在服务器上只能运行完整的python文件,而不能实现jupyter notebook的交互模式,通过在本地浏览器上远程访问服务器上的jupyter notebook,这样不就能有一个很棒的 ...

  3. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

  4. python 有参数的装饰器

    怎么样为装饰器加参数 import time current_user = {'user':None} def auth(engine = "file") def deco(fun ...

  5. ElasticSearch 7.3.0 查询、修改、删除 文档操作

    PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...

  6. chrome插件--安装以及问题记录

    vue-devtools 插件网址下载 问题1 Vue.js is detected on this page. Devtools inspection is not available becaus ...

  7. 【6.28校内test】T3 【音乐会】道路千万条

    [音乐会]道路千万条[题目链接] 首先,你可以忽略上面的一大坨题面,只需要看说明的那一小部分就好啦. 然后理解题意: 就是说我们要给这n-1个运算符指定一个顺序,统计所有值为true的方案数pt,统计 ...

  8. 第一次参赛经历:ecfinal总结

    刚接到要去参加ec的消息时,还是非常激动的,毕竟第一次参赛就参加如此高水平的编程竞赛(更高水平的比赛就是wf). 教练临时组队,把三个从没在一起打过比赛的三个人组成一队,当时有点担心默契和配合上的问题 ...

  9. python-day11(正式学习)

    目录 文件高级应用 多重操作 r+t:可读,可写(文件名为a) w+t:可写可读 a+t:可追加可读 文件内指针移动及一些操作 指针移动seek(offset,whence) 寻找指针位置tell() ...

  10. shell with hadoop

    shell 命令操作 hadoop 之前多少提及过,这里做个总结. shell with hdfs 基本命令 bin/hadoop fs 大于下面的命令 bin/hdfs dfs dfs 是 fs 的 ...