集群已经搭建完成,3对主从,java程序应该调用哪个ip来进行读写。
为什么用Redis Desktop Manager看6个redis的数据,都只有0号库。
顺便问一下在没有网络的环境下能搭建集群吗。gem install redis命令 能怎么替换吗?
集群已经搭建完成,3对主从,java程序应该调用哪个ip来进行读写。
为什么用Redis Desktop Manager看6个redis的数据,都只有0号库。
顺便问一下在没有网络的环境下能搭建集群吗。gem install redis命令 能怎么替换吗?
(1)主节点同步数据到从节点之前宕机,从节点升级为主节点,导致数据丢失。
例如主节点A, 有一个从节点B, 主节点A收到set name zhangsan的命令后,处理结束后返回客户端成功,然后再异步去通知从节点B set命令。如果主节点A在返回客户端之后,通知从节点之前宕机,过一段时间之后会由集群的选举机制选举从节点B为新的主节点,但是B节点是没有name zhangsan这条数据的,即便过一会主节点A恢复,也会同步节点B的数据,name 这条数据就丢失了。
解决方案:wait命令,将客户端阻塞,异步变同步。wait命令使用方式:wait 1 意思是等待主节点之前的所有写操作成功通知一个从节点之后返回。也可以加上超时时间,wait 1 1000 最长不能超过1秒返回,1秒后超时返回成功同步的从节点个数。
(2)脑裂
比如有集群:A a B b C c 主节点:A B C 从节点 a1 b1 c1 。 如果出现网络问题,集群脑裂成两个子集群 A B a1 b1 c1和 C, 在多数节点的集群中,检测到C主节点宕机,c1从节点升级为主节点,网络恢复之后,C节点加入成为c1的从节点。就会导致网络分裂时期对C节点的数据写入丢失。
解决方案:节点超时时间(node timeout)。主节点宕机超过node timeout后,从节点C1升级为主节点。如果主节点C在超过node timeout后,还是无法感知大多数的主节点,则变为error状态并拒绝写入操作。