这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

K-safety 设计

Vertica 建议所有生产数据库都应至少将 K-safety 设置为 1 (K=1)。生产数据库的有效 K-safety 值为 1 和 2。非生产数据库不必为 K-safe,可将该值设置为 0。

K-safe 数据库必须至少包含三个节点,如下表所示:

1
3+
2
5+

仅当物理架构设计满足某些冗余要求时,才能将 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_TOLERANCECURRENT_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) 的有效数据库建立最低投影要求:

  1. 逻辑架构中的每个表至少定义一个 超投影

  2. 复制(定义一个完全相同的副本)每个 节点上的每个维度表超投影。

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 NODESCREATE 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)

有关投影名称约定的详细信息,请参阅投影命名