PostgreSQL Replication之第七章 理解Linux高可用(6)
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)的更多相关文章
- PostgreSQL Replication之第七章 理解Linux高可用(1)
高可用(HA)是工业长期持续的,不间断的服务.在本章,您将了解高可用软件的历史,概念和实现与PostgreSQL复制和高可用之间的关系. 本章将详细地讲述如下主题: •理解高可用性的目的 •衡量可用性 ...
- PostgreSQL Replication之第七章 理解Linux高可用(3)
7.3 高可用软件的历史 有大量的专有的和开源的高可用性软件.专有的例子有:Solaris Cluster (有时称为Sun 集群 or SunCluster), SteelEye LifeKeepe ...
- PostgreSQL Replication之第七章 理解Linux高可用(2)
7.2 衡量可用性 可用性是提供商试图保证一定的可用性级别和客户可以期望的可用性或更多.在某些情况下(取决于服务合同) 收取罚款或减少申购费用是意外停机的原因. 可用性的质量使用百分数来衡量:例如,9 ...
- PostgreSQL Replication之第七章 理解Linux高可用(5)
7.5 高可用性是所有冗余 让我们从一个不同的角度看一下前面的混合超市的例子.为了处理大量顾客无需长排队,无需关闭超市,混合超市雇用更多的出纳员以及安装许多(甚至更多)的收银机. 这样,如果一个收银机 ...
- PostgreSQL Replication之第七章 理解Linux高可用(4)
7.4 术语与概念 一组计算机被称为集群.集群内的一台计算机被称为一个节点. 当集群内的节点数量是 N (2,,3,等.) ,那么我们讨论一个N节点的集群. 高可用性软件,传输层和集群管理层都运行于每 ...
- PostgreSQL Replication之第三章 理解即时恢复(4)
3.4 重放事务日志 一旦我们创建了一个我们自己的初始基础备份,我们可以收集数据库创建的XLOG.当时间到时,我们可以使用所有这些XLOG 文件并执行我们所期望的恢复进程.这就像本节描述的一样工作. ...
- PostgreSQL Replication之第三章 理解即时恢复(1)
到现在为止,您已经掌握了一定的理论.因为生活不仅由理论组成(它可能同样重要),是时候深入实际的工作了. 本章的目标是让您明白如何恢复数据到一个给定的时间点.当您的系统崩溃或者有人意外地删除了一个表,不 ...
- 《Linux命令行与shell脚本编程大全》 第七章理解Linux文件权限
Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件. 用户权限通过创建用户时分配的用户ID(UID)来跟踪的.每个用户有唯一的ID,但是登录时用的不是UID, ...
- PostgreSQL Replication之第三章 理解即时恢复(3)
3.3 做基础备份 在上一节中,您已经看到,启用归档只需要几行命令,并提供了极大的灵活性.在本节,我们将看到如何创建一个所谓的基础备份,稍后这可以使用XLOG.一个基本备份是一个最初的数据的拷贝. [ ...
随机推荐
- D3D 线列 小样例
画两条线 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib" ...
- UBUNTU 16.04 下安装动态链接库方法(使用ln命令可以随意映射动态库,ldd查看缺少的动态库)
一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...
- php利用msqli访问数据库并实现分页,
<?php require_once 'login.php'; $num_rec_per_page=2; // 每页显示数量 //mysql_connect('localhost','jim', ...
- mount ntfs 失败解决办法
在双系统中,ntfs可能会应为windows的缓存而挂载失败.可用下面命令修复. Use ntfsfix in the terminal, even if you can't access Windo ...
- Win7 如何禁用“切换用户”功能
1.按win+r,输入gpedit.msc,点击确定: 2.依次点击计算机配置--管理模块--系统--登录,右侧列表中找到“隐藏“快速用户切换”的入口点”: 3.双击隐藏“快速用户切换”的入口点,点击 ...
- 微信重排版 URL
http://qbview.url.cn/getResourceInfo?appid=62&url=https%3A%2F%2Fcodepen.io%2Fbenjamminf%2Ffull%2 ...
- 利用@keyframe及animation做一个页面Loading时的小动画
前言 利用@keyframe规则和animation常用属性做一个页面Loading时的小动画. 1 @keyframe规则简介 @keyframes定义关键帧,即动画每一帧执行什么. 要使用关键帧 ...
- Mysql语法:navicat for mysql 添加注释
在 navicat 中有三种注释的书写方式: 以 # 开头的字符串,可以多个 # 连续以 – 开头的字符串,注意:只能是 – ,而且 – 后面需要加一个半角空格以 /* */ 包围的字符串,类似于 J ...
- tp框架--------where("1")
今天看代码的时候看到一个令我难以理解的sql查询语句,这是tp框架里的 return $this->where("1")->order('ar_id desc')-&g ...
- swift语言点评八-枚举
总结:swift中的枚举可以看作变量可以作为case匹配参数的类 Enumerations 枚举的作用:状态列举与匹配 枚举值与类型 If a value (known as a “raw” valu ...