当前位置: 首页 > news >正文

PostgreSQL 9.6 攻克金融级多副本可靠性问题

PostgreSQL 9.6 在可靠性方面再出杀手锏。
通过流复制功能增强,提供多种可靠性模式可供用户根据需求进行选择,在可靠性和性能方面用户可以自由发挥。
最强模式满足金融级的可靠性要求。
如何做到的呢?
PG允许多个同步流复制standby节点,用户在事务提交时,需要等待多个同步的standby apply xlog,从而保证数据的多副本一致性。


具体的增强如下
.1. 事务提交保护级别增强如下
支持5个事务提交保护级别,确保事务提交时,XLOG的几种状态。
synchronous_commit =
on, remote_apply, remote_write, local, off
on 表示本地事务产生的xlog已flush到磁盘,同时sync standby(s)的xlog也已flush到磁盘。
remote_apply, 表示本地事务产生的xlog已flush到磁盘,同时sync standby(s)的xlog已回放。
remote_write, 表示本地事务产生的xlog已flush到磁盘,同时sync standby(s)的xlog 已write到OS dirty page。
local, 表示本地事务产生的xlog已flush到磁盘。
off, 表示


.2. 同步流复制保护级别增强
支持设置同步节点数,例如用户有4个standby,包含主节点共5个副本。
用户要求3副本一致,则num_sync设置为2即可,确保至少有2个standby与主节点一致。

synchronous_standby_names参数配置的两种写法:
num_sync为同步standby节点数, 以及standby name.
num_sync ( standby_name [, ...] )
未设置保护的standby节点数, 则默认为1个同步standby.
standby_name [, ...]


http://www.postgresql.org/docs/9.6/static/runtime-config-replication.html#GUC-SYNCHRONOUS-STANDBY-NAMES

synchronous_standby_names (string)
Specifies a list of standby servers that can support synchronous replication, as described in Section 25.2.8. There will be one or more active synchronous standbys; transactions waiting for commit will be allowed to proceed after these standby servers confirm receipt of their data. The synchronous standbys will be those whose names appear earlier in this list, and that are both currently connected and streaming data in real-time (as shown by a state of streaming in the pg_stat_replication view). Other standby servers appearing later in this list represent potential synchronous standbys. If any of the current synchronous standbys disconnects for whatever reason, it will be replaced immediately with the next-highest-priority standby. Specifying more than one standby name can allow very high availability.

This parameter specifies a list of standby servers using either of the following syntaxes:

num_sync ( standby_name [, ...] )
standby_name [, ...]
where num_sync is the number of synchronous standbys that transactions need to wait for replies from, and standby_name is the name of a standby server. For example, a setting of 3 (s1, s2, s3, s4) makes transaction commits wait until their WAL records are received by three higher-priority standbys chosen from standby servers s1, s2, s3 and s4.

The second syntax was used before PostgreSQL version 9.6 and is still supported. It's the same as the first syntax with num_sync equal to 1. For example, 1 (s1, s2) and s1, s2 have the same meaning: either s1 or s2 is chosen as a synchronous standby.

The name of a standby server for this purpose is the application_name setting of the standby, as set in the primary_conninfo of the standby's WAL receiver. There is no mechanism to enforce uniqueness. In case of duplicates one of the matching standbys will be considered as higher priority, though exactly which one is indeterminate. The special entry * matches any application_name, including the default application name of walreceiver.

Note: Each standby_name should have the form of a valid SQL identifier, unless it is *. You can use double-quoting if necessary. But note that standby_names are compared to standby application names case-insensitively, whether double-quoted or not.
If no synchronous standby names are specified here, then synchronous replication is not enabled and transaction commits will not wait for replication. This is the default configuration. Even when synchronous replication is enabled, individual transactions can be configured not to wait for replication by setting the synchronous_commit parameter to local or off.

This parameter can only be set in the postgresql.conf file or on the server command line.


http://www.postgresql.org/docs/9.6/static/runtime-config-wal.html#GUC-WAL-LEVEL

synchronous_commit (enum)
Specifies whether transaction commit will wait for WAL records to be written to disk before the command returns a "success" indication to the client. Valid values are on, remote_apply, remote_write, local, and off. The default, and safe, setting is on. When off, there can be a delay between when success is reported to the client and when the transaction is really guaranteed to be safe against a server crash. (The maximum delay is three times wal_writer_delay.) Unlike fsync, setting this parameter to off does not create any risk of database inconsistency: an operating system or database crash might result in some recent allegedly-committed transactions being lost, but the database state will be just the same as if those transactions had been aborted cleanly. So, turning synchronous_commit off can be a useful alternative when performance is more important than exact certainty about the durability of a transaction. For more discussion see Section 29.3.

If synchronous_standby_names is non-empty, this parameter also controls whether or not transaction commits will wait for their WAL records to be replicated to the standby server(s). When set to on, commits will wait until replies from the current synchronous standby(s) indicate they have received the commit record of the transaction and flushed it to disk. This ensures the transaction will not be lost unless both the primary and all synchronous standbys suffer corruption of their database storage. When set to remote_apply, commits will wait until replies from the current synchronous standby(s) indicate they have received the commit record of the transaction and applied it, so that it has become visible to queries on the standby(s). When set to remote_write, commits will wait until replies from the current synchronous standby(s) indicate they have received the commit record of the transaction and written it out to their operating system. This setting is sufficient to ensure data preservation even if a standby instance of PostgreSQL were to crash, but not if the standby suffers an operating-system-level crash, since the data has not necessarily reached stable storage on the standby. Finally, the setting local causes commits to wait for local flush to disk, but not for replication. This is not usually desirable when synchronous replication is in use, but is provided for completeness.

If synchronous_standby_names is empty, the settings on, remote_apply, remote_write and local all provide the same synchronization level: transaction commits only wait for local flush to disk.

This parameter can be changed at any time; the behavior for any one transaction is determined by the setting in effect when it commits. It is therefore possible, and useful, to have some transactions commit synchronously and others asynchronously. For example, to make a single multistatement transaction commit asynchronously when the default is the opposite, issue SET LOCAL synchronous_commit TO OFF within the transaction.

相关文章:

  • 1.3 中国云创行业地图
  • cacti系列之安装篇 LNMP+cacti+spine (一)
  • 华为S5700实现两个VLAN间不通信的ACL策略
  • Appstore热搜的五款外包应用!
  • Ubuntu安装配置串口通讯工具minicomcutecom
  • 关于前端复用的实践
  • 51nod 1043 幸运号码
  • 创业公司如何实施敏捷开发
  • As3 使用总结 【转】
  • JS及JQuery对Html内容编码,Html转义
  • 0520三级联动
  • 类的继承
  • 【译】Activitys, Threads和 内存泄露
  • Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams
  • [Angularjs]ng-select和ng-options
  • CentOS6 编译安装 redis-3.2.3
  • eclipse的离线汉化
  • ES6语法详解(一)
  • Facebook AccountKit 接入的坑点
  • PHP 7 修改了什么呢 -- 2
  • Python学习之路13-记分
  • Spring框架之我见(三)——IOC、AOP
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于游标的分页接口实现
  • 解决iview多表头动态更改列元素发生的错误
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 设计模式 开闭原则
  • 听说你叫Java(二)–Servlet请求
  • 小程序 setData 学问多
  • 正则学习笔记
  • #{}和${}的区别?
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)虚拟机的安装与使用,linux系统安装
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2022 CVPR) Unbiased Teacher v2
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (搬运以学习)flask 上下文的实现
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十六)Flask之蓝图
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • ./configure、make、make install 命令
  • .htaccess配置常用技巧
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET NPOI导出Excel详解
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 使用ajax控件后如何调用前端脚本
  • @Service注解让spring找到你的Service bean
  • [ C++ ] STL---stack与queue
  • []使用 Tortoise SVN 创建 Externals 外部引用目录