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/ ...
随机推荐
- Linux字符界面字符颜色显示
一.字符颜色 #!/bin/bash #字符颜色显示 #-e:允许echo使用转义 #\033[:开始位 #\033[0m:结束位 #\033等同于\e echo -e "\033[30m黑 ...
- [开发技巧]·pandas如何保存numpy元素
[开发技巧]·pandas如何保存numpy元素 1.问题描述 在开发的过程中遇到一个问题,就是需要把numpy作为pandas的一个元素进行保存,注意不是作为一列元素.但是实践的过程中却不顺利, ...
- java中string , StringBuffer , StringBuilder 区别
1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...
- mac os cmake安装
1.下载安装程序,地址为 http://www.cmake.org/download/,下载 Unix/Linux Source (has \n line feeds) cmake-3.0.2.tar ...
- mysql的最左索引匹配原则
最近复习数据库,主要看的是mysql.很多东西忘得一干二净.看到某乎上有个答案非常给力,就记录一下,以后方便查看. 链接:https://www.zhihu.com/question/36996520 ...
- Spring Security框架进阶、自定义登录
1.Spring Security框架进阶 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安 ...
- 洛谷 P3388 割点(割顶) 题解
题面: 割点性质: 节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边). 换句话说,如果对于一个点u,它的子节点是v,如果low[v] ...
- 洛谷 P1972 HH的项链 题解
题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字: 3.对于每次查询的答案就是sum(r)-sum(l-1); 4. ...
- C++中的多重继承(一)
1,C++ 中是否允许一个类继承自多个父类? 1,可以: 2,这种情况就是多重继承: 3,多重继承的表象就是一个类有多个父类: 4,这是 C++ 非常特别的一个特性,在其他的程序设计语言中比如 C#. ...
- yii框架RBAC權限管理
基于角色的存取控制 (RBAC) 基于角色的存取控制 (RBAC) 提供了一个简单而强大的集中式存取控制机制. 详细的关于 RBAC 和诸多传统的存取控制方案对比的详情,请参阅 Wikipedia. ...