SQL Server 对等事务复制---读写分离

skyandcode 2014-08-13 10:21:09
最近想实现数据库的读写分离,因为要求数据同步尽可能快,所以选择了事务复制。
问题是,如何知道数据已经同步到读数据库了?请教...
例如,用户向 A 数据库 insert 了一条数据,我需要知道这条数据什么时候同步到 B 数据库,如果还没同步,则读取还是到 A 数据库读取,如果成功了就到 B 数据库读取。
我知道事务复制分为:普通事务复制、双向事务复制和对等事务复制。
普通事务复制是单向的,应该没法实现吧。
双向事务复制可以实现,但 sql server 会自动增加一个 uniqueidentifier 字段,占了 16 个字节。
现在想用双向事务复制,在表中加一个字段,如 UpdateMark ,然后在 B 数据库加一个 insert 触发器,当 B 中 insert 时,就触发更新这个字段。在 A insert 后, B 触发 insert 触发器更新这个字段后,却不会同步到 A 。请问,在对等事务复制里,怎么实现 insert 后更新其它数据库的数据?
谢谢...
...全文
749 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
俺是大菠萝 2014-09-03
  • 打赏
  • 举报
回复
引用 16 楼 x_wy46 的回复:
[quote=引用 15 楼 u013226693 的回复:] 采用什么样的技术,要看你有什么样的需求,如果正常状态下可以允许10秒~分钟级的延迟,那可以使用事务复制; 而单向复制还是合并复制,也是看你的需求。建议在你的程序中进行判断,如果订阅读不到,就读发布,这样就没必要做合并复制了; 另外,回复一下上面建议用alwayson的童鞋, 2012的alwayson尽管可以支持同步的只读副本,但在读取数据上,仍会有毫秒级的延迟,这是alwayson的原理决定的;
菠萝大神,京东购物车信息跟浏览的商品信息库之间是不是做了复制? 谢谢![/quote] 没有。这个在应用端查询就可以了,没必要再复制一份
专注or全面 2014-08-29
  • 打赏
  • 举报
回复
引用 15 楼 u013226693 的回复:
采用什么样的技术,要看你有什么样的需求,如果正常状态下可以允许10秒~分钟级的延迟,那可以使用事务复制; 而单向复制还是合并复制,也是看你的需求。建议在你的程序中进行判断,如果订阅读不到,就读发布,这样就没必要做合并复制了; 另外,回复一下上面建议用alwayson的童鞋, 2012的alwayson尽管可以支持同步的只读副本,但在读取数据上,仍会有毫秒级的延迟,这是alwayson的原理决定的;
菠萝大神,京东购物车信息跟浏览的商品信息库之间是不是做了复制? 谢谢!
skyandcode 2014-08-29
  • 打赏
  • 举报
回复
引用 15 楼 u013226693 的回复:
采用什么样的技术,要看你有什么样的需求,如果正常状态下可以允许10秒~分钟级的延迟,那可以使用事务复制; 而单向复制还是合并复制,也是看你的需求。建议在你的程序中进行判断,如果订阅读不到,就读发布,这样就没必要做合并复制了; 另外,回复一下上面建议用alwayson的童鞋, 2012的alwayson尽管可以支持同步的只读副本,但在读取数据上,仍会有毫秒级的延迟,这是alwayson的原理决定的;
感谢。 在程序里判断,如果订阅读不到,就读发布。这也许是最好的处理方式了。
skyandcode 2014-08-29
  • 打赏
  • 举报
回复
引用 13 楼 x_wy46 的回复:
解决延迟,很多时候是在设计层面处理的,如果说复制有延迟,你死磕延迟恐怕是不行的, 复制总是有延迟的 其实想办法绕过去也是不错的,比如京东的结算功能,你把东西加入购物车之后,结算的时候, 我怀疑用的就是复制技术,应该是分库了 如果把商品加入购物车之后又浏览其他的东西,过一会再结算,也算是绕过这个时间了 如果你点击完加入购物车之后,立马结算,或者点击,他那个页面很多时候是会延迟一会的, 提示你什么正在加载,如果长时间没有加载,请点击刷新什么的 这不也是绕过复制延迟的着几秒钟了
嗯。读写分离肯定会有延时的。 之前想的一个办法,用户插入一条数据后,写入一个时间值到 cookie,比如 10 秒内,就让用户访问写数据库, 10秒后才访问读数据库。以此保证用户能读取到正确的数据。 但这样做的缺点是,如果这条数据同步失败,用户可能开始读到正确的,但后来就读不到数据了。 所以才想有没有一个办法知道数据已经同步成功了。
俺是大菠萝 2014-08-29
  • 打赏
  • 举报
回复
采用什么样的技术,要看你有什么样的需求,如果正常状态下可以允许10秒~分钟级的延迟,那可以使用事务复制; 而单向复制还是合并复制,也是看你的需求。建议在你的程序中进行判断,如果订阅读不到,就读发布,这样就没必要做合并复制了; 另外,回复一下上面建议用alwayson的童鞋, 2012的alwayson尽管可以支持同步的只读副本,但在读取数据上,仍会有毫秒级的延迟,这是alwayson的原理决定的;
专注or全面 2014-08-29
  • 打赏
  • 举报
回复
京东这么大个网站,没有见哪里提示正在加载,让等待什么的 只有结算时候的那个查询,应该不是花费在真正的查询上,我估计是就是复制延迟,那个就是在等待复制延迟
专注or全面 2014-08-29
  • 打赏
  • 举报
回复
解决延迟,很多时候是在设计层面处理的,如果说复制有延迟,你死磕延迟恐怕是不行的, 复制总是有延迟的 其实想办法绕过去也是不错的,比如京东的结算功能,你把东西加入购物车之后,结算的时候, 我怀疑用的就是复制技术,应该是分库了 如果把商品加入购物车之后又浏览其他的东西,过一会再结算,也算是绕过这个时间了 如果你点击完加入购物车之后,立马结算,或者点击,他那个页面很多时候是会延迟一会的, 提示你什么正在加载,如果长时间没有加载,请点击刷新什么的 这不也是绕过复制延迟的着几秒钟了
skyandcode 2014-08-28
  • 打赏
  • 举报
回复
引用 11 楼 jack11430 的回复:
[quote=引用 10 楼 skyandcode 的回复:] [quote=引用 9 楼 jack11430 的回复:] 这个就搞不定了,没有人知道数据什么时候同步。 如果你需要知道同步时间,那得查系统的日志,有两个表: [distribution].[dbo].[MSrepl_transactions], [distribution].[dbo].[MSrepl_commands] 这两个表就有同步记录,但是你还是得查,得不偿失的做法。 建议直接用SQL2012的always on line
嗯。谢谢提供思路。 公司用的 2005 啊。 请问,a 插入一条数据,然后我在 b 写一个触发器,当数据同步到 b 后,就触发,更改一个字段,然后在 a 判断这个值。 这种做法行得通吗? [/quote] 你要做同步,主要是读写分离,延时是不可避免,不要为了同步而同步,写触发器对插入和更新,删除数据有很大的性能影响。[/quote] 嗯。谢谢。我知道读写分离肯定会有延时,像你说的,写个触发器,可能反而影响性能。 但是,有有没有办法做的像我说的那样呢?
最爱午夜 2014-08-26
  • 打赏
  • 举报
回复
引用 10 楼 skyandcode 的回复:
[quote=引用 9 楼 jack11430 的回复:] 这个就搞不定了,没有人知道数据什么时候同步。 如果你需要知道同步时间,那得查系统的日志,有两个表: [distribution].[dbo].[MSrepl_transactions], [distribution].[dbo].[MSrepl_commands] 这两个表就有同步记录,但是你还是得查,得不偿失的做法。 建议直接用SQL2012的always on line
嗯。谢谢提供思路。 公司用的 2005 啊。 请问,a 插入一条数据,然后我在 b 写一个触发器,当数据同步到 b 后,就触发,更改一个字段,然后在 a 判断这个值。 这种做法行得通吗? [/quote] 你要做同步,主要是读写分离,延时是不可避免,不要为了同步而同步,写触发器对插入和更新,删除数据有很大的性能影响。
最爱午夜 2014-08-25
  • 打赏
  • 举报
回复
这个就搞不定了,没有人知道数据什么时候同步。 如果你需要知道同步时间,那得查系统的日志,有两个表: [distribution].[dbo].[MSrepl_transactions], [distribution].[dbo].[MSrepl_commands] 这两个表就有同步记录,但是你还是得查,得不偿失的做法。 建议直接用SQL2012的always on line
skyandcode 2014-08-25
  • 打赏
  • 举报
回复
引用 9 楼 jack11430 的回复:
这个就搞不定了,没有人知道数据什么时候同步。 如果你需要知道同步时间,那得查系统的日志,有两个表: [distribution].[dbo].[MSrepl_transactions], [distribution].[dbo].[MSrepl_commands] 这两个表就有同步记录,但是你还是得查,得不偿失的做法。 建议直接用SQL2012的always on line
嗯。谢谢提供思路。 公司用的 2005 啊。 请问,a 插入一条数据,然后我在 b 写一个触发器,当数据同步到 b 后,就触发,更改一个字段,然后在 a 判断这个值。 这种做法行得通吗?
最爱午夜 2014-08-22
  • 打赏
  • 举报
回复
对等复制,需要处理很多的问题,例如:自增列的奇偶配置, 事务复制虽说是秒级,但是你能接收这个延时吗? 插入数据,不可能立即更新到另一台服务器,这个肯定有延时,一般在2-5秒。
skyandcode 2014-08-22
  • 打赏
  • 举报
回复
引用 7 楼 jack11430 的回复:
对等复制,需要处理很多的问题,例如:自增列的奇偶配置, 事务复制虽说是秒级,但是你能接收这个延时吗? 插入数据,不可能立即更新到另一台服务器,这个肯定有延时,一般在2-5秒。
你好。 我知道有延时,我就是想想办法解决这个问题。 我想知道什么时候这条数据已经同步了,例如,往 a 插入一条数据,如果没有同步好,我就到 a 查询,如果同步好了,就到 b 里查询。 所以,现在的核心问题是,如何知道什么时候同步成功。
skyandcode 2014-08-18
  • 打赏
  • 举报
回复
引用 5 楼 ap0405140 的回复:
[quote=引用 2 楼 skyandcode 的回复:] 判断连接到哪个数据库可以在程序里判断。 现在问题是,插入一条数据,然后同步,我怎么知道这条数据已经同步成功了?
须看实现数据同步的工具是什么? 不同工具有不同的确认方法.[/quote] 版主,同步就是用 sql server2005 里的事务复制。 请问有办法可以确定什么时候同步成功吗?
唐诗三百首 2014-08-17
  • 打赏
  • 举报
回复
引用 2 楼 skyandcode 的回复:
判断连接到哪个数据库可以在程序里判断。 现在问题是,插入一条数据,然后同步,我怎么知道这条数据已经同步成功了?
须看实现数据同步的工具是什么? 不同工具有不同的确认方法.
發糞塗牆 2014-08-14
  • 打赏
  • 举报
回复
我找个复制专家来帮你解答一下,不过不保证他现在有时间
skyandcode 2014-08-14
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
读写分离应该是允许有数据同步时间差的, 否则每读取一次都需要先判断是否已同步完成,然后选择服务器,连接服务器,后再读取,这样的总体执行成本应该是更高的. 如果系统对数据同步的实时要求高,可以考虑用实时事务复制同步或service broker实现.
判断连接到哪个数据库可以在程序里判断。 现在问题是,插入一条数据,然后同步,我怎么知道这条数据已经同步成功了?
skyandcode 2014-08-14
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
我找个复制专家来帮你解答一下,不过不保证他现在有时间
好吧。等...
唐诗三百首 2014-08-13
  • 打赏
  • 举报
回复
读写分离应该是允许有数据同步时间差的, 否则每读取一次都需要先判断是否已同步完成,然后选择服务器,连接服务器,后再读取,这样的总体执行成本应该是更高的. 如果系统对数据同步的实时要求高,可以考虑用实时事务复制同步或service broker实现.

34,836

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧