-
Notifications
You must be signed in to change notification settings - Fork 330
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
tendis failover use too much time #73
Comments
below is one configuration, other is just different in bind&port:
|
If a slave improve to be a master, there are conditions:
More details in You can see the log in ./home/log/INFO, what happened at that moment. |
现在能failover了。 我杀掉192.168.149.15:51001,然后立即多次重试对27:51001的访问 约一二十秒后终于能够读取了: 所以我有如下几个问题: |
@TendisDev 请问上面这个failover时间过长的问题,如何解 |
@vinchen |
这个情况应该是执行了正常shutdown的行为,资源回收,并刷盘等操作还在执行,并且gossip通讯相关线程仍在工作,所以其他节点没有及时对这个节点判死 可以尝试使用kill -9终止进程 收到shutdown指令,gossip 相关线程尽快退出应该可以加快这种情况的HA,我们评估下 |
退出慢可以用kill -9解,但是从之后又重连7秒的过程如何缩短?且报data age to large不能选主的问题如何解呢? |
可以看下shutdown逻辑,将cluster相关的线程退出提前,编译一个版本看看效果 |
我是指主已经退出了从又重连7秒的问题,这个把主的cluster线程退出提前,也影响不了前者啊,毕竟前者是在主完全退出才开始的 |
如果仍然存在,提供一下完整的配置的操作流程,我们先重现一下 |
(1)开始选主之前的延迟是因为 需要一半以上的master 对fail节点进行标记,标记完成后统计达到一半以上发广播,和从一种重连7秒应该没有关系 |
@flywukong data age to large这里触发是因为你的time out时间太小,因此主从之间上次通信的时间有个最大值的限制,他是根据timeout时间计算的,这里看日志通信时间超过了2秒限制。 |
发现把旧的从也重启,就可以变主了,没有data age to large错误了。 |
@TendisDev 请问上面这个data age to large:不能选主的问题怎么解呢 |
上次主从通信的时间psynctime是由主从同步模块来记录的,从节点选举需要满足下面这个条件 |
我看到过https://github.com/Tencent/Tendis/blob/dev-2.2/src/tendisplus/cluster/cluster_manager.cpp#L2601 |
旧的从这里重启 可以变主是一个bug (刚拉起psynctime有个初始化值), 这里应该不可用变主,因为它数据是不对的,我们正在修复 |
1秒通信一次,不需要你配置,cluster-node-timeou时间太小不合适,导致data_age这里满足不了条件,或者你可以修改一下这个cluster-slave-validity-factor 改成小于10的值(比如5), 这样data_age就不容易触发 |
是这个条件,意思是psynctime必须要最近时间点的,fator是改大 , 后面这块逻辑会优化下, 只要不是timeout时间太小导致误判 其它负面影响应该不大 |
探测到master fail后, slave 会延迟下面一段时间发起选举: |
我是三主三从,模拟线上情况。 |
如果一个master 只有一个slave , cluster_manager.cpp 里面这行代码你可以按照自己的需求改下,改小一点 ,改成0应该也没问题 |
是为了避免同时竞争选主, _clusterMgr->stop()可以提前 |
上面说的stop前的约1秒等待,能定位什么原因吗?是否可优化 |
@flywukong @TendisDev
这是两个脚本输出的对比。69999999920153478是因为failover,写进程第一个访问出错的key。读写qps大概是700/s,通过predixy代理来进行访问 以上两种测试,各tendis节点都是如下配置(仅bind和port不同),三主三从
|
@piaoairy219 感谢细致的测试和回复
如果进程没有异常,需要进行主备切换,应该使用
主备强同步机制正在评估和实现中。 期待使用 |
手动的failover我进行过,的确没有损失可用性,也保证了至少最终一致性。 之所以这里着重展示kill的结果是因为,我猜测tendis应该是像redis一样异步同步,如果kill -9进程根本没有机会去同步最后那一段数据,丢数据是必然的,几乎不用测试,何况在线上遇到这种操作的概率也比较小。 |
我看你们的stop流程,有_replMgr->stop()这一步,貌似是去尝试做同步数据再触发切主的,但是实际上,还是出错了,是不是这里有什么问题。 |
2 machine 192.168.149.15/192.168.149.27 centos7.7

3 instances in every machine
use latest release version: tendis-2.1.2-rocksdb-v5.13.4
192.168.149.15:51001 (master) -> 192.168.149.27:51001 (slave)
192.168.149.15:51002 (master) -> 192.168.149.27:51002 (slave)
192.168.149.15:51003 (master) -> 192.168.149.27:51003 (slave)
follow the instruction in http://tendis.cn/#/Tendisplus/%E8%BF%90%E7%BB%B4/new_cluster
redis-cli -c can set and get many keys successfully(moved related slots)
but when I kill 192.168.149.15:51001, it can't failover and improved 192.168.149.27:51001 into master automatically, and I can't get any key, even which isn't in slots of down master.
doesn't tendis failover automatically?
The text was updated successfully, but these errors were encountered: