本节使用的关键术语:

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. 关于Docx动态控制word模板文件的数据

    博客:https://www.cnblogs.com/24klr/ github: https://github.com/luoruiemail/Dynamic_Word_Web 参考资料:https ...

  2. poj1284(欧拉函数+原根)

    题目链接:https://vjudge.net/problem/POJ-1284 题意:给定奇素数p,求x的个数,x为满足{(xi mod p)|1<=i<=p-1}={1,2,...,p ...

  3. React进阶篇学习

    继续上一次基础篇, 分享一些关于React的进阶技术 React 进阶部分 ** context ** ** setState vs forceUpdate ** ** Mixins ** ** HO ...

  4. Python中.format()常见的用法

    format()格式化输出 format():把传统的%替换为{}来实现格式化输出 format()常见的用法: ') >>>' 其实就是format()后面的内容,填入大括号中 ' ...

  5. python-day1(学前了解)

    Markdown基本语法 各级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 加粗 **加粗文本** 斜体 *我斜了* 高亮 ==我高亮了== 上标 2 ...

  6. sqlalchemy query函数可用参数有哪些?

    一.模型名 二.模型对象属性 三.聚合函数 下面就分别为大家讲讲query函数这三种参数的用法. 在讲之前,我已经把数据库连接配置.模型,以及添加数据写好了,代码如下: from sqlalchemy ...

  7. vim学习(三)之命令

    参考 Linux vi/vim vim常用命令总结

  8. vue-awesome-swiper轮播插件

    1. github上搜索vue-awesome-swiper 2. readme中有安装方法,建议在插件名后@版本号,使用稳定的老版本 npm install vue-awesome-swiper@x ...

  9. vue学习【三】vue-router路由显示多页面

    大家好,我是一叶,今天是七夕,单身狗的我还在这里写踩坑文.在这里还是要祝大家早日脱单(能不能脱单自己心里没个数吗).本篇继续踩坑,在单页面上展示多页的内容,大家的想法是什么,估计大家第一印象会是ifr ...

  10. Android判断是debug还是release模式

    1.当有些功能不希望在release模式实现时,但是debug模式又需要的时候,就可以对当前版本模式进行判断.如是debug模式则日志输出级别设置为Level.DEBUG,release模式设置为Le ...