JAVA面试中的数据一致性问题

1.redis一致性(容灾)

原面试题:redis集群数据一致性如何保证,如果挂了一台机会怎样?可以从故障检测和从节点选举说起。

故障检测:

  • 集群中每个节点都会定期的向集群中的其他节点发送PING信息。

  • 如果在一定时间内,发送ping的节点A没有收到某节点B的pong回应,那么A将B标识为pfail。
    A在后续发送ping时,会带上B的pfail信息,通知给其他节点。
    如果B被标记为pfail的个数大于集群主节点个数的一半(N/2 + 1)时,B会被标记为fail,A向整个集群广播,该节点已经下线。 其他节点收到广播,标记B为fail。(又是过半原则)

  • 从节点选举
    每个从节点,根据自己对master复制数据的offset(偏移量),来设置一个选举时间,offset越大的从节点,选举时间越靠前,优先进行选举。
    所有的Master开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 +1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成master。 RedisCluster失效的判定: 1、集群中半数以上的主节点都宕机(无法投票) 2、宕机的主节点的从节点也宕机了(slot槽分配不连续)
    当slave 收到过半的master 同意时,会成为新的master。此时会以最新的Epoch 通过PONG 消息广播 自己成为master,让Cluster 的其他节点尽快的更新拓扑结构(node.conf)。

2.mysql数据一致性

‘mysql主从复制,并不能保证数据的实时一致性,你可以通过修改my.conf文件,启用mysql主从复制中的半同步复制和异步复制,来减少数据的延迟。

可以通过shardingjdbc或者shardingproxy来实现数据一致性(或者减少延迟),shardingjdbc的特性如下:

  1. 提供一主多从的读写分离配置。仅支持单主库,可以支持独立使用,也可以配合分库分表使 用
  2. 独立使用读写分离,支持SQL透传。不需要SQL改写流程
  3. 同一线程且同一数据库连接内,能保证数据一致性。如果有写入操作,后续的读操作均从主 库读取。
  4. 基于Hint的强制主库路由。可以强制路由走主库查询实时数据,避免主从同步数据延迟。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值