线上的实际情况是总共有4台服务器。现在主要用的是memcache
,并且目前只用了61M左右的内存空间。公司的需求是逐步把整个网站的缓存迁移到redis。
目前的想法是拿3台服务器拿来做集群,每台服务器配置一个Master实例。为了实现高可用,还需要给每台服务器配置一个Slave实例。我想问的是,可不可以将Master实例和Slave实例配置到一个主机当中,以及这样配置所带来的影响?
还有一种想法是,只用2台服务器,1台服务器运行3个Master实例,另一台服务器运行3个Slave实例。大家还有更好的解决方案吗?
还听他们说,集群的话至少要有3个主节点。用2个主节点不行吗?
如果把master和slave放在同一台机器上,会有问题:
master和slave运行时都需要占用内存,机器的内存可能不够用
如果机器宕机,断电,或者网络断开,那么master和slave没有什么高可用可言了。
master和slave最好都要放在不同的机器。
至于为什么是3而不是2。这是集群选举的时候的最佳策略。redis3.0开始支持集群。
一般,集群要对某个公共状态达成共识,都需要集群中过半数的redis实例同意。
为什么要过半数呢,因为要考虑集群发生脑裂(split-brain)的情况,也就是网络隔离(network-partition),
过半数可以保证,无论网络怎么隔离,无论脑怎么裂,无论大集群被隔离成了多少个小集群,能够提供服务(意味着有过半数的实例)的那个小集群里,至少有一个实例是同步到最新的状态信息的。
在理解上面所说的过半数,然后才有背景来谈谈为什么是奇数的问题
偶数也可以有过半数,例如,4个实例的集群,3就是一个过半数。
但为什么还是奇数最好?
如果集群有5个实例,那么只能容忍2个实例的崩溃。
如果集群中有6个实例,同样也只能容忍2个实例的崩溃。
在相同的容忍度下,6个和5个有什么区别:
由于集群间需要互相通信,实例越多,网络开销越大
实例越多,5个实例的时候,发生3个实例崩溃的概率要小于6个实例的时候。
所以当然是奇数的性价比最高了。
是可以的,设置不同端口就行了,至于影响,我感觉也没啥特别影响。
有3台的话,各跑一个master, 然后各自的slave放在不同的机器做成环形备份,不把鸡蛋放在一个篮子里。
ip资源够的话,找个ha中间件把高可用也做上。
生产环境不建议放在同一台物理机上。集群3台master说的是3.0集群,奇数节点保证投票能够出确定结果
恩,那还是把Slave放在其他地方。
看看这个设计怎么样?