这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
K-safety 设计
Vertica 建议所有生产数据库都应至少将 K-safety 设置为 1 (K=1)。生产数据库的有效 K-safety 值为 1 和 2。非生产数据库不必为 K-safe,可将该值设置为 0。
K-safe 数据库必须至少包含三个节点,如下表所示:
- 1
- 3+
- 2
- 5+
注意
Vertica 仅支持 K-safety 级别 1 和 2。
仅当物理架构设计满足某些冗余要求时,才能将 K-safety 设置为 1 或 2。请参阅K-safe 物理架构设计的要求。
使用 Database Designer
要创建具有 K-safe 状态的设计,Vertica 建议您使用
Database Designer。使用 Database Designer 创建投影时,建议使用满足 K-safe 设计要求的投影定义并用 K-safety 级别加以标记。Database Designer 会创建一个脚本,该脚本使用
MARK_DESIGN_KSAFE
函数将物理架构的 K-safety 设置为 1。例如:
=> \i VMart_Schema_design_opt_1.sql
CREATE PROJECTION
CREATE PROJECTION
mark_design_ksafe
----------------------
Marked design 1-safe
(1 row)
默认情况下,当数据库的 K-safety 大于 0 时,Vertica 会创建 K-safe 超投影。
监控 K-safety
监控表可以通过编程方式访问,以启用外部操作,例如警报。通过查询
SYSTEM
表内 DESIGNED_FAULT_TOLERANCE
和 CURRENT_FAULT_TOLERANCE
列中的设置,可以监控 K-safety 级别。
K-safety 丢失
当群集中的 K 个节点出现故障时,数据库将继续运行,但性能会受到影响。如果故障节点的数据无法从群集中另一个正常工作的节点中获取,那么后续节点故障可能会导致数据库关闭。
另请参阅
企业模式数据库中的 K-safety
1 - K-safe 物理架构设计的要求
Database Designer 使用值为 1 的 K-safety 为至少包含三个节点的群集自动生成设计。(如果群集具有一个或两个节点,它将使用值为 0 的 K-safety 生成设计。)您可以修改为三节点(或更大)群集创建的设计,而且 K-safe 要求已设置完毕。
如果您创建自定义投影,物理架构设计必须满足以下要求才能在出现故障时成功恢复数据库:
可使用
MARK_DESIGN_KSAFE
函数确定您的架构设计是否满足 K-safety 的要求。
2 - 无 K-safety 的物理架构设计的要求
如果您使用 Database Designer 生成一个您可以修改的全面设计并且您不希望设计具有 K-safe,请将 K-safety 级别设置为 0(零)。
如果您想要从头开始,请执行以下操作为一个不具有 K-safety (K=0) 的有效数据库建立最低投影要求:
-
为
逻辑架构中的每个表至少定义一个
超投影。
-
复制(定义一个完全相同的副本)每个
节点上的每个维度表超投影。
3 - 为 K-safety 安全设计分段投影
投影必须符合数据库 K-safety 要求。通常,您必须为每个分段投影创建伙伴实例投影,其中伙伴实例投影的数量为 K+1。因此,如果系统 K-safety 设置为 1,则必须通过一个伙伴实例复制每个投影分段;如果 K-safety 设置为 2,则必须通过两个伙伴实例复制每个分段。
自动创建伙伴实例投影
通过包括 SEGMENTED BY ... ALL NODES
,可以使用
CREATE PROJECTION
自动创建满足 K-safety 所需的伙伴实例投影数量。如果 CREATE PROJECTION
指定 K-safety (
KSAFE=n)
,Vertica 将使用该设置;如果语句省略 KSAFE
,Vertica 将使用系统 K-safety。
在以下示例中,CREATE PROJECTION
为表 ttt
创建分段投影 ttt_p1
。由于系统 K‑safety 设置为 1,因此 Vertica 需要每个分段投影拥有一个伙伴实例投影。由于“CREATE PROJECTION”语句省略“KSAFE”,因此 Vertica 使用系统 K‑safety 并创建两个伙伴实例投影:“ttt_p1_b0”和“ttt_p1_b1”:
=> SELECT mark_design_ksafe(1);
mark_design_ksafe
----------------------
Marked design 1-safe
(1 row)
=> CREATE TABLE ttt (a int, b int);
WARNING 6978: Table "ttt" will include privileges from schema "public"
CREATE TABLE
=> CREATE PROJECTION ttt_p1 as SELECT * FROM ttt SEGMENTED BY HASH(a) ALL NODES;
CREATE PROJECTION
=> SELECT projection_name from projections WHERE anchor_table_name='ttt';
projection_name
-----------------
ttt_p1_b0
ttt_p1_b1
(2 rows)
通过将后缀
_bn
附加到投影基本名(例如 ttt_p1_b0
),Vertica 自动为伙伴实例投影命名。
手动创建伙伴实例投影
如果在单个节点上创建投影并且系统 K-safety 大于 0,则必须手动创建 K-safety 所需的伙伴实例数量。例如,可以在单个节点上为表 xxx
创建投影 xxx_p1
,如下所示:
=> CREATE TABLE xxx (a int, b int);
WARNING 6978: Table "xxx" will include privileges from schema "public"
CREATE TABLE
=> CREATE PROJECTION xxx_p1 AS SELECT * FROM xxx SEGMENTED BY HASH(a) NODES v_vmart_node0001;
CREATE PROJECTION
由于 K-safety 设置为 1,此投影的单个实例不是 K-safe。若尝试将数据插入到它的锚表 xxx
,则会返回如下错误:
=> INSERT INTO xxx VALUES (1, 2);
ERROR 3586: Insufficient projections to answer query
DETAIL: No projections that satisfy K-safety found for table xxx
HINT: Define buddy projections for table xxx
为了符合 K-safety,您必须为投影 xxx_p1
创建一个伙伴实例投影。例如:
=> CREATE PROJECTION xxx_p1_buddy AS SELECT * FROM xxx SEGMENTED BY HASH(a) NODES v_vmart_node0002;
CREATE PROJECTION
表 xxx
现在符合 K-safety 并接受 DML 语句(例如 INSERT
):
VMart=> INSERT INTO xxx VALUES (1, 2);
OUTPUT
--------
1
(1 row)
另请参阅
有关分段投影和伙伴实例的一般信息,请参阅分段投影。有关 K-safety 设计的信息,请参阅K-safety 设计和分段设计。
4 - 为 K‑Safety 设计未分段投影
在许多情况下,维度表相对较小,因此您无需将它们分段。相应地,您应该设计一个 K-safe 数据库,以便可以复制其维度表的投影并且无需在所有群集节点上进行分段。您可以使用包括关键字 UNSEGMENTED ALL NODES
的
CREATE PROJECTION
语句创建这些投影。这些关键字用于指定在所有群集节点上创建投影的相同实例。
以下示例展示了如何为表 store.store_dimension
创建未分段投影:
=> CREATE PROJECTION store.store_dimension_proj (storekey, name, city, state)
AS SELECT store_key, store_name, store_city, store_state
FROM store.store_dimension
UNSEGMENTED ALL NODES;
CREATE PROJECTION
Vertica 使用相同的名称来标识未分段投影的所有实例 — 在此示例中为 store.store_dimension_proj
。关键字 ALL NODES
指定在所有节点上复制投影:
=> \dj store.store_dimension_proj
List of projections
Schema | Name | Owner | Node | Comment
--------+----------------------+---------+------------------+---------
store | store_dimension_proj | dbadmin | v_vmart_node0001 |
store | store_dimension_proj | dbadmin | v_vmart_node0002 |
store | store_dimension_proj | dbadmin | v_vmart_node0003 |
(3 rows)
有关投影名称约定的详细信息,请参阅投影命名。