本节使用的关键术语:

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. Linux字符界面字符颜色显示

    一.字符颜色 #!/bin/bash #字符颜色显示 #-e:允许echo使用转义 #\033[:开始位 #\033[0m:结束位 #\033等同于\e echo -e "\033[30m黑 ...

  2. [开发技巧]·pandas如何保存numpy元素

    [开发技巧]·pandas如何保存numpy元素 ​ 1.问题描述 在开发的过程中遇到一个问题,就是需要把numpy作为pandas的一个元素进行保存,注意不是作为一列元素.但是实践的过程中却不顺利, ...

  3. java中string , StringBuffer , StringBuilder 区别

    1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...

  4. mac os cmake安装

    1.下载安装程序,地址为 http://www.cmake.org/download/,下载 Unix/Linux Source (has \n line feeds) cmake-3.0.2.tar ...

  5. mysql的最左索引匹配原则

    最近复习数据库,主要看的是mysql.很多东西忘得一干二净.看到某乎上有个答案非常给力,就记录一下,以后方便查看. 链接:https://www.zhihu.com/question/36996520 ...

  6. Spring Security框架进阶、自定义登录

      1.Spring Security框架进阶 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安 ...

  7. 洛谷 P3388 割点(割顶) 题解

    题面:     割点性质:     节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边).     换句话说,如果对于一个点u,它的子节点是v,如果low[v] ...

  8. 洛谷 P1972 HH的项链 题解

    题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字: 3.对于每次查询的答案就是sum(r)-sum(l-1); 4. ...

  9. C++中的多重继承(一)

    1,C++ 中是否允许一个类继承自多个父类? 1,可以: 2,这种情况就是多重继承: 3,多重继承的表象就是一个类有多个父类: 4,这是 C++ 非常特别的一个特性,在其他的程序设计语言中比如 C#. ...

  10. yii框架RBAC權限管理

    基于角色的存取控制 (RBAC) 基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制. 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅 Wikipedia. ...