文档章节

PG库实现 t+1 同步

易野
 易野
发布于 07/08 09:27
字数 1476
阅读 59
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

需求:业务场景中有很多需要查询t+1的数据,但又不想影响生产实时的业务,是否可以搭建一个延时的灾备库就可以解决这个问题呢。

问题:如何实现延时? 

解决方向:recovery_min_apply_delay (integer)   
这个参数可以实现从库的延时同步。

测试过程:
配置在备库recovery.conf中
recovery_min_apply_delay = 5min

主库插入一条数据,5分钟后从库可以查到该数据,在此期间,不影响从库的使用。

需要注意的是,如果从库配置了synchronous_commit 这个参数,一定要配为on,配为remote_apply时,在主库上插入一条数据,主库会hang住等待5min(等待从库完成apply操作)后,然后才能返回执行成功or失败的结果。

9.4版本之前存在bug,配置好这个参数后,马上重启standby库,连接数据库会报错如下:psql: FATAL:  the database system is starting up,这时候需要等待配置时间,然后连接才可以正常使用数据库,但是目前这个bug已经修复了。高版本不存在这个问题。

从库放开给用户使用,带来的问题:
在进行主从复制的时候,如果从库放开给用户使用,很容易产生冲突。举个例子,从库有一个长事务或者长查询正在执行,此时,主库执行 UPDATE 并 VACUUM,由于主库上已经不存在使用被更新元组的事务,VACUUM 会将这些元组清理掉,当从库回放到 VACUUM 对应的日志时,检测到当前 VACUUM 清理的元组仍然有事务在使用,则认为有冲突,在等待 max_standby_streaming_delay(默认30s) 后,若事务仍然没有执行完,则中断 SLAVE 上的连接,这时候就产生了冲突。

解决方向:hot_standby_feedback (boolean)
通过设置 HOT_STANDBY_FEEDBACK 解决因 MASTER 执行 VACUUM 引起的复制冲突。
测试过程:
配置在主库postgresql.conf中
hot_standby_feedback = on   --如果有错误的数据复制,向主库进行反馈
HOT_STANDBY_FEEDBACK 的原理很简单,就是将从库的最小活跃事务ID定期告知主库,使得主库在执行 VACUUM 时对这些事务还需要的数据手下留情。

设置 HOT_STANDBY_FEEDBACK 的好处是可以减少从库执行查询时复制冲突的可能,但也有其弊端,即会使主库延迟回收,从而导致数据膨胀;极端情况下,如果从库有一个很长的事务,且涉及的表上DML操作又很频繁,则表的膨胀是不容小觑的,表膨胀,进而使得主库出现IO抖动。
解决冲突问题:
max_standby_streaming_delay(默认30s):
从库因为接收wal流日志产生查询冲突而取消查询之前的等待时间,设置该参数会在发生冲突时,备库查询不会立即取消,而是等待一个时间后如果还没结束再抛出报错。这个值的大小可以参考从库可能产生的长事务运行时间。

测试过程:
配置在主库postgresql.conf中
max_standby_streaming_delay = 30s  --数据流备份的最大延迟时间

max_standby_archive_delay:
备机因为处理归档的wal日志产生查询冲突而取消查询之前的等待时间,和上面的参数类似。

测试过程:
配置在主库postgresql.conf中
max_standby_archive_delay = 30s  --数据流备份的最大延迟时间

注意这两个参数不要配置为-1,如果配置为-1, 那么在从库上可以无限时常的执行sql。后果是从库只接收但是不归档 xlog. 造成从库 xlog文件越来越多, 甚至撑爆磁盘分区。

vacuum_defer_cleanup_age:
指定vacuum延迟清理死亡元组的事务数,vacuum会延迟清除无效的记录,延迟的事务个数通过vacuum_defer_cleanup_age进行设置。即vacuum和vacuum full操作不会立即清理刚刚被删除元组。

生产环境里可以根据pg_stat_database和pg_stat_database_confliects视图查看冲突发生的情况,以此来进行如上参数的调整。

Oracle:
方法1: 在备库指定delay属性
alter database recover managed standby database delay 10 disconnect from session; 
--备库延迟10分钟应用主库日志

方法2: log_ archive_dest_n参数中指定了delay属性
alter system set log_archive_dest_3='service=goolen lgwr async delay=10 valid_for=(all_logfiles,all_roles)  db_unique_name=goolen';
注意:delay属性并不是说延迟发送主库日志到备库,而是指日志到备库后,延迟多长时间应用主库日志。如果在备库应用主库日志的语句中指定了实时应用,也就是使用了using current logfile,如alter database recover managed standby database using current logfile disconnect from session;那么,即使在log_ archive_dest_n参数中指定了delay属性,备库也会忽略delay属性。

方法3:alter system set log_archive_dest_state_2=defer; 

MYSQL:
使用MASTER_DELAY选项CHANGE MASTER TO将延迟设置为N秒:
CHANGE MASTER TO MASTER_DELAY = N;

在修改延迟从库的master_delay数值的时候,设置新的master_delay之后,MySQL自动将从库的所有relay log清空,并重新生成,序号从000001开始,清掉relay log以后,MySQL会重新拉取还没应用过的binlog,避免数据丢失。
每次修改延迟数据,都要清掉relay log,再重新拉取binlog,造成主库和从库之间重复的数据流量,消耗了不必要的资源。
修改master_delay,根本不需要stop slave将整个从库停止,而只需要stop slave sql_thread即可, MySQL就不会清除并重新生成relay log了。

易野
粉丝 6
博文 214
码字总数 174949
作品 0
深圳
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.7K
0
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
首列固定的列表

实现特殊的表格(UITableView)效果:即表格中的首列固定不动,而每一行除了首列均可左右拖动,以展现每一行更多内容。 作者谭林江(@无法越狱的痛)说:去益盟面试回来,感觉聊得有点郁闷,...

匿名
2013/01/24
1.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

创建具有列表理解的字典 - Create a dictionary with list comprehension

问题: I like the Python list comprehension syntax. 我喜欢Python列表理解语法。 Can it be used to create dictionaries too? 它也可以用来创建字典吗? For example, by iterating over......

技术盛宴
今天
15
0
从JS数组中删除重复的值[duplicate] - Remove duplicate values from JS array [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : Get all unique values in a JavaScript array (remove duplicates) (79 answers) 获取JavaScript数组中的......

法国红酒甜
今天
11
0
如何使用AngularJS在浏览器的控制台中访问$ scope变量?

问题: I would like to access my $scope variable in Chrome's JavaScript console. 我想在Chrome的JavaScript控制台中访问$scope变量。 How do I do that? 我怎么做? I can neither see ......

fyin1314
今天
18
0
ImageMagick - 添加水印

背景 最近制作思维导图想添加自己的水印,网上很多例子都是使用ImageMagick来完成。但是不少代码在本地并不可行。经过一番试验,找到两个方法。 方法一 代码 stackoverflow方法改良: conver...

wffger
今天
11
0
OSChina 周四乱弹 —— 到底是怎样的饕餮盛宴在等待着我!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐 :《你 能 來 保 護 我 的 世 界 嘛》- 歪门 《你 能 來 保 護 我 的 世 界 嘛》- 歪门 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
77
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部