AlwaysOn 同步提交模式是否会丢失数据?

最近朋友去恒大面试,考官给出这样一个观点:

同步情况下丢失数据有两种情况:一种是阻塞丢失,一种是同步失败。

给出的处理办法:阻塞丢失的话干掉阻塞进程,或者重启实例都能解决;同步失败就只能重做节点。

让我们一起来理解下,微软官方对于AlwaysOn同步提交模式的理解,当然直接看英文原文理解更精准:

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/availability-modes-always-on-availability-groups?view=sql-server-2017#SyncCommitAvMode

In Always On availability groups, the availability mode is a replica property that determines whether a given availability replica can run in synchronous-commit mode. For each availability replica, the availability mode must be configured for either synchronous-commit mode, asynchronous-commit, or configuration only mode. If the primary replica is configured for asynchronous-commit mode, it does not wait for any secondary replica to write incoming transaction log records to disk (to harden the log). If a given secondary replica is configured for asynchronous-commit mode, the primary replica does not wait for that secondary replica to harden the log. If both the primary replica and a given secondary replica are both configured for synchronous-commit mode, the primary replica waits for the secondary replica to confirm that it has hardened the log (unless the secondary replica fails to ping the primary replica within the primary's session-timeout period).

Note:
If primary's session-timeout period is exceeded by a secondary replica, the primary replica temporarily shifts into asynchronous-commit mode for that secondary replica. When the secondary replica reconnects with the primary replica, they resume synchronous-commit mode.

How Synchronization Works on a Secondary Replica

Under the synchronous-commit mode, after a secondary replica joins the availability group and establishes a session with the primary replica, the secondary replica writes incoming log records to disk (hardens the log) and sends a confirmation message to the primary replica. Once the hardened log on the secondary database has caught up the end of log on the primary database, the state of the secondary database is set to SYNCHRONIZED. The time required for synchronization depends essentially on how far the secondary database was behind the primary database at the start of the session (measured by the number of log records initially received from the primary replica), the work load on the primary database, and the speed of the computer of the server instance that hosts the secondary replica.

Synchronous operation is maintained in the following manner:

1.On receiving a transaction from a client, the primary replica writes the log for the transaction to the transaction log and concurrently sends the log record to the secondary replicas.

2.Once a log record is written to the transaction log of the primary database, the transaction can be undone only if there is a failover at this point to a secondary that did not receive the log. The primary replica waits for confirmation from the synchronous-commit secondary replica.

3.The secondary replica hardens the log and returns an acknowledgement to the primary replica.

4.On receiving the confirmation from the secondary replica, the primary replica finishes the commit processing and sends a confirmation message to the client.

Note:
    If a synchronous-commit secondary replica times out without confirming that it has hardened the log, the primary marks that secondary replica as failed. The connected state of the secondary replica changes to DISCONNECTED, and the primary replica stops waiting for confirmation from the secondary replica. This behavior ensures that a failed synchronous-commit secondary replica does not prevent hardening of the transaction log on the primary replica.

Synchronous-commit mode protects your data by requiring the data to be synchronized between two places, at the cost of somewhat increasing the latency of the transaction.

我想了又想,当开启了延迟事物持久化、内存优化表这种场景下,主挂了,切到备,会有丢失;在主库有物理坏块,有数据丢失。在不切备库的时候,只能理解为备库的延时。延时这东西,跟你规范化操作有关,就算镜像也会造成延时,比如对大表做在线重建索引的时候,一般我都不会去这么做而是去做反复的维护索引。

他说的同步丢失,可能是从应用程序端来理解的。当主备之间有网络问题,或者备库有异常的时候。应用程序端超时,返回错误,写入失败而已。这不算丢失。这个不能算数据库侧的丢失。

他说的阻塞和同步,都是指LAG导致握手超时,应用返回失败。我只能说他应用侧事务控制不严谨。没有把逻辑放到一个事务提交。

我以前写游戏的时候,SP里好多都没有写事务。

比如,SP里先游戏角色数据、再添加装备、再写日志。
而这三个逻辑没有放到事务里。
那刚好出故障的时候,提交了前两个语句,而日志没有写。
这种情况,我们是有遇到的。

也就是有两种情况,一个是他应用侧的,一个是数据库侧的。我觉得他遇到这种丢数据的情况,是不是这两种之一。

原文地址:http://blog.51cto.com/ultrasql/2129335

时间: 2024-10-09 19:25:27

AlwaysOn 同步提交模式是否会丢失数据?的相关文章

AlwaysON同步的原理及可用模式

新一代读写分离技术——AlwaysOn 早在SQL Server 2005的时候微软就已经实现了数据库的查询分离技术——发布订阅.但生产库和查询库的同步性能较差,时常出现性能问题,因此在大型生产环境中一直被人所诟病. 从SQL Server 2012开始,微软逐渐使用AlwaysON技术来取代发布订阅.AlwaysOn 作为SQL Server 2012引入的一种新的技术架构,性能相比发布订阅而言提升很多,最明显的区别在于其充分利用内存高效读取的原理来实现日志的传递.下文将通过 AlwaysOn

MySQL 半同步复制模式说明及配置示例 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

SQL Server AlwaysON 同步模式的疑似陷阱

SQL Server 2012 推出的最重要的功能之一Alwayson,是一个集之前Cluster和Mirror于一体的新功能,即解决了Cluster依赖共享存储的问题,又解决了镜像不能实时读以及转移后连接串需要添加转移IP的问题,看起来的确很实用. 而且Alwayson多副本的功能为实现读写分离提供了可能,试想一下,当主副本压力比较大的时候,是否可以将读操作引向辅助副本呢?答案一般来讲是肯定的,请注意,是一般! Alwayson有两个同步模式,同步和异步,即然是同步,理所当然的我认为他是实时的

Mysql半同步复制模式说明 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是:主库开启binlog功能并授权从库连接主库,从库通过chan

配置参数innodb_flush_log_at_trx_commit丢失数据问题

数据丢失的定义:当事务提交了,数据因为特殊原因不存在了. MySQL默认情况下是开启内部的XA事务和事务的实现方式是基于redo log和undo log.也可以理解为MySQL事务是采用日志现行的策略.前提未开启binlog的情况下,数据的变更首先在内存中完成,并且将事务顺序的写入到redo log中,即表示该事务已经完成,就可以返回发给客户端已提交的信息.但此时变更后的数据还在内存中,并没有刷新写入到磁盘中,当达到一定条件,将内存中的数据合并写入到磁盘,即落地到磁盘.这样做的目的是提高性能,

探求网页同步提交、ajax和comet不为人知的秘密(上篇)

标题里的技术都是web开发里最常见的技术,但是我想这些常用的技术有很多细节是很多朋友不太清楚的,理解这些细节是我们深入掌握这些技术的一把钥匙,今天我就讲讲我使用这些技术时体会到的这些细节. 同步提交是指通过对页面的form表单执行submit操作,将用户在页面上录入的数据提交到服务器,服务器处理完数据后将结果信息返回到页面上. 当我们使用同步提交的时候有一个不可或缺的元素,就是form标签,form标签代表了一个边界,在form范围内的input,select等元素,在form执行submit事

AlwaysON同步过程

<SQL Server 2012实施与管理实战指南>中指AlwaysON同步过程如下: 任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个数据修改事务时, 它会负责把记录本次修改的日志信息先记入一段内存中的日志缓冲区,然后再写入物理日志文件(日志固化). 所以对于任何一个数据库,日志文件里都会有所有数据变化的记录. 对于配置为AlwaysOn主副本的数据库,SQL Server会为它建立一个叫Log Scanner的工作线程. 这个线程专门负责将日志

Kafka重复消费和丢失数据研究

Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交. 原因1:强行kill线程,导致消费后的数据,offset没有提交. 原因2:设置offset为自动提交,关闭kafka时,如果在close之前,调用 consumer.unsubscribe() 则有可能部分offset没提交,下次重启会重复消费.例如: try { consumer.unsubscribe(); } catch (Exception e) { } try { consumer.close(); }

在服务器端采用同步处理模式和异步处理模式的分析

同步服务为每个请求创建单一线程,由此线程完成请求任务:接收消息,处理消息,返回数据:这种情况下服务器资源对所有入栈请求开放,服务器资源被所有入栈请求竞争使用,如果入栈请求过多就会导致服务器资源耗尽宕机,或者导致竞争加剧,资源调度频繁,服务器资源利用效率降低. 异步服务则可以分别设置两个线程队列,一个专门负责接收消息,另一个专门负责处理消息并返回数据,另有一些值守线程负责任务派发和超时监控等工作.在这种情况下无论入栈请求有多少,服务器始终依照自己的能力处理请求,服务器资源消耗始终在一个可控的范围.