7.6 PostgreSQL和高可用性

数据库是我们日常数字生活的一部分,并期望它们快速工作。

您浏览网上论坛吗?那个帖子在数据库中。您看医生吗?您的医疗记录在数据库中。您在网上购物吗?那个货物,您的数据和以前购买的东西都在数据库中。

希望所有这些数据在几秒钟内出现。这不仅是您的期望。一个小网店可能同时有成百上千的访客,每个访客都希望网站快速展现。较大的网站可以同时处理几万或者几十万的访问。

这意味着该服务背后的数据库必须一直可用。当我们考虑这样的网站服务于全球的用户时,问题的范围变得很明显。总是有有光线的地方,因此没有夜晚可以隐藏停机时间。对于个别的机器来说,停机时间是绝对必要的,因为需要定期维护,像软件升级和清洁,更不用提当一些实际的硬件出问题的时候了。

数据库的客户端程序,诸如web服务器或计费软件,希望数据库不在一个特定的计算机上(具有给定的序列号)但在一个特定的网络上。计算机可以按需获取和释放网络地址。(在有限的条件下,TCP网络是另一个大的课题。)这使得特定的计算机可以停机,另一台计算机获取相同的地址。客户端程序会注意到最初的数据库无响应并尝试重新连接,现在连接到另外一台计算机。在一个集群中的两个节点之间漂移的地址称为漂移地址或虚拟IP地址(virtual IP address)。

集群的管理员可以发出命令,使一台机器离线,换句话说,停止对 数据库客户端服务,另外一台机器自动接管服务。

既然已经讨论过了高可用集群的概念,现在是时候看两个不的,小数据库集群的详细例子了。

7.6.1 高可用性与仲裁

在本节中,我们看一个小集群,其中防护是通过集群中的节点自愿完成。

仲裁意味着多数,它可以由具有奇数个节点的集群保证。

如果两个节点之间的网络通信被切断,就形成了独立的“孤岛”节点。至少会有两个这样的岛,没有岛的大小是和另外一个岛的大小是一样的,因为节点的总数是奇数。

所有这些岛通过计算岛内活着的节点并和整个集群中节点的总数比较来“知道”它们是否有多数或少数。

有了适当的限制,处于少数的岛提供的服务会自动放弃,并被另一个处于多数的岛接管。如果网络断开如此严重以至于没有岛比总节点数的一半大,则每个岛将放弃服务。这是一件好事,因为它可以防止脑裂情形并且为处于不同岛的不同的客户提供相同的服务。当一个复制的数据库进入这样的状况意味着麻烦:两个(或更多)master数据库开始服务于不同的客户。给处于不同数据库中的数据分配相同的数字标识会发生主键冲突。当尝试合并数据库时,这也会导致外键冲突。清理起来可能需要大量的手工劳动。

在这个高级的视图中,我们有一个三节点的集群。请记住,所有的连接都是冗余的,如前所述。

只有两个节点装有数据库,第三个节点是所谓的法定服务器(仲裁服务器)。

所有的节点都连接的两个网络:公共网络范围为192.168.0.x(客户也通过这个网络连接到数据库),私有网络范围为:192.168.1.x 。

这是因为两天服务器被连接作为作为一个复制集群和一个高流量的数据库,复制流本身也会造成一个高流量。为了允许从客户端到数据库的流量最高,复制走私有网络。

高可用性软件(前面提到的带有Heartbeat或Corosync传输的Pacemaker)也需要通信。通常只使用私有网络是足够的。但是,因为它只需要很少的带宽,为了提供更多的冗余,传输层可以被设置为同时使用公共网络和私有网络。

仲裁服务器提供了决胜投票,以防两个数据库服务器之间的通信出现故障。这可由网络问题引起。在这种情况下,两个数据库服务器都活着并且每个数据库都尝试去做它需要做的事情:master节点为客户提供服务,slave复制master。脑裂情形有三个例子:

• master 服务器故障或成为独立模式

• slave 服务器故障或成为独立模式

• 仲裁服务器故障或成为独立模式

请记住,所有节点运行在高可用性集群软件的集群管理层。

在第一种情况下,其它两个节点不能与master节点进行通信。因而,会发生两件事情。slave节点和仲裁服务器代表多数,因此slave节点接管服务,它提升复制数据库为master实例并拉起虚拟IP。以前的master节点可能已经崩溃,因此它不再工作,或者它和其他两个节点之间的网络可能已经出错。如果该节点自己不工作,它需要进行维修或至少重新启动。如果它仍然工作,它知道它自己在少数中,因此,它自愿放弃服务。它停止数据库并丢弃虚拟IP。

当之前的master节点或网络连接被修好时,它启动它的高可用性软件实例,因为master 的数据库副本已经在别处运行了,它也不会启动。但是,资源可以作为slave启动,因为这是Pacemaker下master-slave资源的工作方式。但是,正确的资源代理的实施可以防止这种情况发生,因为当前的master节点(我们之前的 slave 数据库)和最初的master已经分开了,复制不能自动在这一点建立。需要从当前的master做一个新的基础备份,故障节点恢复后,复制和slave的数据库实例可以在 高可用性管理层启动。

在第二种情况下,当slave服务器出项故障或成为单机模式,这种情况是比较好的。master 数据库实例仍然工作并对客户提供服务,但是复制停止了。取决于slave节点的的停机时间的长短和master数据库的配置,slave不会自动赶上复制,或者在复制再次建立之前需要一个新的基础备份。

在第三种情况下,什么都不需要担心。只有仲裁服务器出现故障或进入独立模式。但是,master和slave节点仍然工作并可以相互通信,它们代表集群中的多数。这意味着服务不受影响,复制也在继续。

7.6.2 高可用性与STONTH

我们来看一个防护是由远程管理设备强制执行的集群。和节点数量必须是奇数的集群中的自愿防护相反,强制防护不是必须的。

在这个设置中,没有第三个节点提供打破平局的投票。如果任何一个节点出现故障或者切断网络,它会被外部强制防护。这就是所谓的STONITH设备(IPMI, iLO, DRAC,等等)所要做的。由集群进行的 STONITH 操作可以关闭节点或重新启动节点。

当其中一个节点出现故障或者离线,另外一个节点可以通过实际将其关闭并要求将它手动启动来确保它保持离线。另外一个解决办法是重新启动它以便它无服务在线,它处于一个已知的较好的节点状态。然后,它可以从这个状态适应集群中其它节点的新状态。

在这种情况下,网络冗余和高可用性的通信尤其重要。当两个节点之间的私有网络只有一条电缆和一台交换机时,考虑一下这种情况和只走私有网络的高可用性。例如,当两个节点之间的交换机出现故障,每个节点理所当然地表现为它是集群中唯一活着的节点并在其它节点上执行 STONITH 动作。这导致两个节点要么被关机要么被重新启动,这(取决于硬件)需要一段时间,会使可用性的数字受到损失。

7.7 总结

在本章,我们介绍了通用体系结构和高可用性集群软件的术语,两个开源集群栈和两种从架构的角度详细设置高可用性集群的方法。

在下一章,将讲述一个连接池软件包,pgbouncer。

PostgreSQL Replication之第七章 理解Linux高可用(6)的更多相关文章

  1. PostgreSQL Replication之第七章 理解Linux高可用(1)

    高可用(HA)是工业长期持续的,不间断的服务.在本章,您将了解高可用软件的历史,概念和实现与PostgreSQL复制和高可用之间的关系. 本章将详细地讲述如下主题: •理解高可用性的目的 •衡量可用性 ...

  2. PostgreSQL Replication之第七章 理解Linux高可用(3)

    7.3 高可用软件的历史 有大量的专有的和开源的高可用性软件.专有的例子有:Solaris Cluster (有时称为Sun 集群 or SunCluster), SteelEye LifeKeepe ...

  3. PostgreSQL Replication之第七章 理解Linux高可用(2)

    7.2 衡量可用性 可用性是提供商试图保证一定的可用性级别和客户可以期望的可用性或更多.在某些情况下(取决于服务合同) 收取罚款或减少申购费用是意外停机的原因. 可用性的质量使用百分数来衡量:例如,9 ...

  4. PostgreSQL Replication之第七章 理解Linux高可用(5)

    7.5 高可用性是所有冗余 让我们从一个不同的角度看一下前面的混合超市的例子.为了处理大量顾客无需长排队,无需关闭超市,混合超市雇用更多的出纳员以及安装许多(甚至更多)的收银机. 这样,如果一个收银机 ...

  5. PostgreSQL Replication之第七章 理解Linux高可用(4)

    7.4 术语与概念 一组计算机被称为集群.集群内的一台计算机被称为一个节点. 当集群内的节点数量是 N (2,,3,等.) ,那么我们讨论一个N节点的集群. 高可用性软件,传输层和集群管理层都运行于每 ...

  6. PostgreSQL Replication之第三章 理解即时恢复(4)

    3.4 重放事务日志 一旦我们创建了一个我们自己的初始基础备份,我们可以收集数据库创建的XLOG.当时间到时,我们可以使用所有这些XLOG 文件并执行我们所期望的恢复进程.这就像本节描述的一样工作. ...

  7. PostgreSQL Replication之第三章 理解即时恢复(1)

    到现在为止,您已经掌握了一定的理论.因为生活不仅由理论组成(它可能同样重要),是时候深入实际的工作了. 本章的目标是让您明白如何恢复数据到一个给定的时间点.当您的系统崩溃或者有人意外地删除了一个表,不 ...

  8. 《Linux命令行与shell脚本编程大全》 第七章理解Linux文件权限

    Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件. 用户权限通过创建用户时分配的用户ID(UID)来跟踪的.每个用户有唯一的ID,但是登录时用的不是UID, ...

  9. PostgreSQL Replication之第三章 理解即时恢复(3)

    3.3 做基础备份 在上一节中,您已经看到,启用归档只需要几行命令,并提供了极大的灵活性.在本节,我们将看到如何创建一个所谓的基础备份,稍后这可以使用XLOG.一个基本备份是一个最初的数据的拷贝. [ ...

随机推荐

  1. m_Orchestrate learning system---十八、mo项目的启示是什么

    m_Orchestrate learning system---十八.mo项目的启示是什么 一.总结 一句话总结:多看教程,体统看教程的学, 完全不懂的话百度的作用也不大 多学点,可以节约后面的超多时 ...

  2. Linux就该这么学 20181004(第六章磁盘管理)

    参考链接https://www.linuxprobe.com/ /boot 开机锁需要文件-内核.开机菜单以及所需配置文件 /dev 以文件形式存放的任何设备与接口 /etc 配置文件 /home 用 ...

  3. solarwind之安装

      1.  安装组件   2.  安装组件sql   3.  安装   4.  接受协议   5.  安装路径   6.  安装状态   7.  继续   8.  激活     9.  完成安装

  4. pic减法进位问题

    1.pic指令中subwf是 F - Wreg,且如果F>=Wreg,则C=1:如果F<Wreg,则C=0:这是由于pic的减法是加上减数的补码实现的.例如3-2,其实是3+FE=01,进 ...

  5. 关于exsi的虚拟网络

    相关术语: VM Network 默认的网络 VSwitch   (默认)标准交换机 (exsi的内核中) Port groups  (用来定义各个不同vlan) DVSwitch分布式交换机(exs ...

  6. 《Unix环境高级编程》读书笔记 第8章-进程控制

    1. 进程标识 进程ID标识符是唯一.可复用的.大多数Unix系统实现延迟复用算法,使得赋予新建进程的ID不同于最近终止所使用的ID ID为0的进程通常是调度进程,也常被称为交换进程.它是内核的一部分 ...

  7. 路飞学城Python-Day4(practise)

    #1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li = ['alex','eric','rain']# li = ['alex','eric','rain']# print('_'.j ...

  8. JAVA调用接口

    HttpUrlconnection部分 //发送JSON字符串 如果成功则返回成功标识. public static String doJsonPost(String urlPath, String ...

  9. 基于 Token 的身份验证:JSON Web Token

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  10. luogu P3604 美好的每一天(莫队+二进制)

    这个题还是可以的. 但是卡常卡得我心力憔悴.还是太菜了 我们把一个区间当做一个26位二进制数,每一位代表一个英文,二进制数的每一个位0代表这一位对应的字母出现了偶数次,否则出现了奇数次. 那么一个区间 ...