如何保证数据可靠性?(宕机情况下数据不丢?)
当遇到这个问题的时候,首先我们每个人可能熟悉的数据库都不太一样,这时我们需要以我们熟悉的某一个具体的数据库的实现方案来阐述这个问题。下面以我们比较熟悉的MySQL数据库为例,来阐述这个问题的常规的解决思路如下:
-
冷备:打快照,例如,MySQL里面的binlog和redolog的使用。
-
热备
- 同步:影响性能,但有改进方案
- 异步:可能会丢,同步延迟
-
异步复制:可能会丢,同步延迟
-
半同步复制:也叫 semi-sync 复制,指的就是主库写入 binlog 日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后,接着会返回一个 ack 给主库,主库接收到至少一个从库的 ack 之后才会认为写操作完成了。
-
组同步复制:从节点大多数回放成功后回复ack后主节点复制成功。
-
并行复制:指的是从库开启多个线程,并行读取 relay log 中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。
实际如何解决复制延迟问题:
- 使用
show status
指令查看主从复制的延迟时间到底有多大,几十毫秒能接受,几百毫秒需要改进 - 打通专线网络,给最好最大的宽带资源。
- 分库后,从节点回放日志采用并行复制的策略。
网友评论