复制坐在数据库高可用性(HA)的核心。虽然磁盘上的数据可以通过各种方法来复制,无论是硬件还是软件,磁盘、文件,或基于块的解决方案,没有一个在线数据库的副本,HA设置无法实现。
这个博客更详细深入的挑战/冲突影响PostgreSQL复制,但是在这样做之前,让我们了解一些关键概念和复制在PostgreSQL的进化。
复制在PostgreSQL的进化
这一点也不奇怪,PostgreSQL社区多年来投资建设坚实的复制功能,帮助实现HA和下面的时间表博士多年来复制的核心是如何进化的开始写前日志记录(细胞膜)最后讨论同步流复制。
写前日志记录(细胞膜)
写前日志记录(细胞膜)在2001年被添加到PostgreSQL 7.1发行版的一部分。在确保耐久性的重要一步,因为它确保了“D”酸合规。除了耐用性,这也改善了性能和事务响应时间通过减少多次需要编写相同的页面。
复制功能
很几年后引入WAL第一主要复制特性,warm备用,在PostgreSQL中实现。
Warm备用或暖备份日志传送
温暖的备用功能在2006年8.2版本中引入的。这个特性带来了不断归档和持续复苏的概念。
待命,服务器将持续复苏。这意味着尽管服务器在线,因此它将无法接受任何连接。它所做的过程中细胞膜文件片段不断从主服务器接收到的归档流程。
这是异步复制。多个记录被打包成一个文件和备用运出。数据丢失可能在主服务器崩溃的情况下,一些WAL记录可能没有被运送。
这是PostgreSQL HA解决方案的第一步!
温暖的热:流复制
2010年9.0版本,流复制和热备用。添加了两个新的邮政局长流程;walsender walreceiver。这是基本相同的概念不断归档和持续复苏,但通过后台进程实现。然而,这使备用现在荣誉传入的连接和运行只读查询。
这些后台进程也负责冲洗细胞膜主服务器和备用服务器上的文件到磁盘。
添加两个函数用于监视复制这个版本的一raybet雷竞技竞猜在线官网部分;pg_last_xlog_receive_location pg_last_xlog_replay_location。
然而,保持异步复制和数据丢失可能对于主服务器崩溃。
流媒体同步复制
潜在的数据丢失问题与9.1版本在2011年消除同步流复制。这确保严格的数据完整性保证适用于HA系统。的同步机制可以异步事务块通过发行“使当地synchronous_replication”。
另外,这个版本引入了群体的概念,重点,连接,和活跃的备用。
设置流复制
设置流复制实际上是相当简单的。这是一个简单的五步的过程:
- 创建一个用户的复制。我们将使用rep_user对于这个示例。
|
1
2
|
——让我们创建rep_user在主数据库复制的作用。
创建
用户
rep_user复制;
|
- pg_hba添加复制用户。conf在主服务器上。
|
1
2
|
#
类型
数据库
用户
地址方法
主机
复制rep_user
<知识产权地址
范围
>
<auth_method>
|
- 重新加载pg_hba。配置在主服务器上通过“pg_ctl重载”,SQL函数pg_reload_conf(),或通过“杀死玫瑰”。
- 进行备份的主数据库使用“- r”选项的pg_basebackup写新数据目录中复制信息。
- 启动备用服务器。
中提琴,流复制启用。的PostgreSQL官方文档详细解释了流复制配置。
复制视图和配置
配置复制而言,这个过程变得有些复杂,必须配置主,发送,和备用服务器优化,以满足性能和正常运行时间的要求。
发送服务器是任何PostgreSQL服务器的复制设置航运WAL段备用服务器。这可能是主服务器或一个中间备用服务器级联复制配置。
配置
大约有20个不同的配置选项为初级,发送,和备用服务器。这些配置是细胞膜、真空、连接、推广、复制延迟,和复制的反馈。
的观点
pg_stat_replication和pg_stat_wal_receiver视图提供的信息分别在主服务器和备用服务器上复制。
在主服务器上,pg_stat_replication包含一行每walsender进程连接到备用。每个给定备用也显示了应用程序和客户端连接信息复制的状态,写,冲洗,重播lsn,间隔。对于主服务器,它显示了发送LSN。
在备用服务器上,pg_stat_replication公开信息作为连接和lsn pg_stat_replication非常相似,但另外还显示复制槽。它只有一行的walreceiver过程。
复制冲突
只复制冲突发生在备用服务器上。在主服务器上没有冲突。冲突发生在备用walreceiver流程发起WAL重做操作。WAL重做操作需要专用锁,这可能是由长时间运行的查询或事务。重做操作等待超时,之后,任何持有锁的后端,防止细胞膜处理终止。这些终端分为复制冲突。这些冲突的性质可以是非常不同的。
PostgreSQL pg_stat_database_conflicts视图,告诉我们发生了什么类型的冲突和多少。
我们可以方便地忽略了pg_stat_database认为它只有一个长整型数字字段维护冲突数。它并不提供任何见解这些冲突的本质。
pg_stat_database_conflicts
在备用服务器上,pg_stat_database_conflicts一行显示对每个数据库查询取消数据由于复苏。这是一个相当简单的视图与datid, datname,和五个长整型数字计算不同类型的冲突:
- 表空间,
- 锁,
- 快照,
- Bufferpin,
- 死锁。
表空间冲突
表空间冲突可能发生如果预期temp_tablespaces下降。temp_tablespaces用于临时表、索引和排序操作。
这些类型的冲突有些不寻常的这些操作远,屈指可数。
锁冲突
锁冲突可能发生当你查询一个表备用和表上的内容是在主节点上远程修改。
这将导致锁争用的walreceiver过程想改变通过收购一个访问互斥型锁在索引/关系。然而,另一个查询是持有共享锁的访问。
快照冲突
Snapshop冲突产生,当后台进程试图访问行在备用服务器上,在主节点上用吸尘器清扫了。
Bufferpin冲突
这些大多是由热链修剪或者版本的btree索引复制生产14因为它需要页面上的独占锁。
这些类型的冲突并不常见。
死锁冲突
这些冲突是由于查询取消发生死锁待命。
其他的冲突
可能会有其他类型的冲突,但这些并不是被pg_stat_database_conflicts视图。例如,冲突可能会经历一个数据库,一个数据库被删除活动连接在主但备用可能使用它。
调查:面对PostgreSQL复制问题
根据一项调查周围的朋友和同事,我看到,超过50%的受访者经历PostgreSQL复制问题。
问题和冲突的类型有经验也为我们提供了一个了解关注而配置复制。
如果你想分享你的经验与PostgreSQL复制我,那么你可以这样做这个谷歌形式。
结论
博客将会有更多来自我将讨论这些复制冲突如何发生,以及备用服务器内部的反应。关键是要得到更好的底层的角度来看,这样我们可以提高复制配置,以避免这种冲突导致改进的性能,更好的正常运行时间,简单的调试。





