zoukankan      html  css  js  c++  java
  • PostgreSQL Replication之第十二章 与Postgres-XC一起工作(7)

    12.7 处理故障转移和删除节点

    在本节中,我们将看看故障切换如何处理。我们还将看看如何使用安全可靠的方法添加节点到Postgres-XC设置以及如何从Postgres-XC设置删除节点。

    12.7.1 处理节点故障转移

    如果您在Postgres-XC中执行一个查询,它可能会诶分派到集群内许多不同的节点。例如,在高度分区表执行一个顺序扫描将涉及到许多不同的节点。现在的问题是:如果一个或者一些数据节点停机会发生什么?

    答案很简单:Postgres-XC将无法利用发生故障的节点执行请求。这会导致一个读取和写入的问题。尝试从故障节点获取的查询将返回一个表示连接不可用的错误。

    因为您作为一个用户,这意味着如果您正在运行Postgres—XC,您一定要为您的系统拿出一个合适的故障转移以及高可用性(HA)策略。我们建议创建所有节点的副本以确保,在primary数据节点出现故障时,控制器总是可以到达一个可替代的节点。Linux HA 是一个使各节点故障安全和实现快速故障转移的不错的选择。

    目前,仅仅靠Postgres-XC来创建一个HA策略是不可能的。

    12.7.2 更换节点

    在一段时间以后,您可能要删除一个节点。要做到这一点,您只需从您的psql脚本简单地调用DROP NODE

    test=# h DROP NODE

    Command: DROP NODE

    Description: drop a cluster node

    Syntax:

    DROP NODE nodename

    如果您要执行这样的操作,您要确保您是一个超级用户。普通用户 是不允许从集群中删除节点的。

    当您删除一个节点时,确保对您来说它没有对您有用的数据。删除一个节点仅仅是Postgres-XC内部元数据的变化,所以,那个操作会很快,数据也会被从您的数据视图中删除。

    一个问题是:您怎么能真正找出数据的位置?Postgres-XC 有一组系统表,它允许您检索有关节点的信息,数据分布等等。下面的例子显示了如何创建一个表以及我们如何才能弄明白它在哪里:

    test=# CREATE TABLE t_location (id int4)

    DISTRIBUTE BY REPLICATION;

    CREATE TABLE

    test=# SELECT node_name, pcrelid, relname

    FROM pgxc_class AS a, pgxc_node AS b,

    pg_class AS c

    WHERE a.pcrelid = c.oid

    AND b.oid = ANY (a.nodeoids);

    node_name | pcrelid | relname

    -----------+---------+------------

    node2 | 16406 | t_location

    node3 | 16406 | t_location

    node4 | 16406 | t_location

    (3 rows)

    在我们的例子中,该表已经被复制到所有节点了。

    当删除节点时,有一件麻烦的事情您要记住:如果您删除一个名称,使用相同的名称和连接参数重新创建它,它将会是不一样的东西。当创建一个新的节点,它会得到一个新的对象ID。在PostgreSQL中,一个名称和一个对象ID是不相关的。这意味着,如果您意外删除了一个节点,并使用相同的名称重新创建它,您将仍然面临问题。当然,您总是可以神奇地通过手动调整系统表来解决它,但是,这不是您应该做的。

    因此,我们强烈建议,当从生产系统删除节点时,必须谨慎。

    12.7.3 运行 GTM standby

    在出现故障的情况下,数据节点不是唯一能够导致停机的因素。全局事务管理也应该故障安全,以确保在发生灾难的情况下,没有任何事情会出错。如果事务管理器丢失,就不能使用您的Postgres-XC集群了。

    要确保GTM不会出现单点故障,您可以使用一个GTM standby。配置一个GTM standby 并不难做到。所有您需要做的是在一个备用节点上创建一个GTM配置文件并在gtm.conf设置一些参数。

    startup = STANDBY

    active_host = 'somehost.somedomain.com'

    active_port = '6666'

    synchronous_backup = off

    首先,我们要设置启动参数为STANDBY。这会告诉GTM作为以slave解决。然后,我们要告诉 standby在哪里可以找到主要的生产GTM。我们可以通过添加一个主机名和端口来实现。

    最后,我们可以决定GTM应该同步复制或者异步复制。

    要启动standby,我们再次可以使用gtm_ctl。这一次,我们使用 –Z  gtm_standby 来标记节点为standby。

    12.8 总结

    在本章中,我们讲解了Postgres-XC,一个能够水平分区和查询分布的分布式版本的PostgreSQL。该Postgres-XC项目的目标是提供一个能够透明地向外写入扩展的数据库解决方案。它提供了一个一致性的数据视图,并提供了各种选项来在集群内部分发数据。

    知道Postgres-XC不仅仅是一个简单地附加到PostgreSQL,而是一个完全兼容的代码分支是很重要的。

    下一章将包括PL/Proxy,一个分片PostgreSQL数据库系统的工具。我们将学习如何分发数据到各个节点和碎片数据到处理大规模的设置。

  • 相关阅读:
    EF Code First一对一、一对多、多对多关联关系配置
    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
    ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
    ASP.NET Core 1.0 入门——Application Startup¶
    ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求
    EF Code First 学习笔记:约定配置
    ASPNET CORE初探
    EntityFramework 7.0之初探【基于VS 2015】(
    ASP.NET Core 开发
    sqlite3 外键作用原理和使用方法
  • 原文地址:https://www.cnblogs.com/songyuejie/p/4752144.html
Copyright © 2011-2022 走看看