关于Redis集群部署和持久化的相关问题
Q1:请问Redis集群假如用三台物理机做,每台运行2个实例,如何保障每台物理机的实例不是互为主从的?
A1 : 这个问题其实我们通常情况下大家也都会遇到。第一点如果你是使用物理机来做,并且你每台机器上面运行两个实例,三台机器每个机器上面运行2个实例,一共有6个实例。这6个实例你是否可以保证它每个互相都不为主从的,其实是可以直接保证。
唯一的问题就是假如说这是一个集群,然后发生故障转移,发生节点的主动切换,就非常有可能存在你的主从发生了变更。其实这个地方的话其实我更加建议,如果你发现了这种问题的话,你手动去做切换,因为物理机环境去做这个事情,目前我还没看到有什么特别好的解决办法。
Q2 : 请问k8s 中扩容时,如何增加新节点。扩容和分配slot的步骤如何自动化的进行?
A2 : 我们分开两步来讲,第一部分是增加新节点,增加新节点的话,刚才我其实在过程里头已经提到了,增加完新的节点之后,首先你一定要让它能够和集群去做通信,然而这个地方就是需要你去修改集群的配置文件,然后你需要他有一个NodeIP,因为之间是通过IP去做通信的,所以你需要去修改它的配置文件,把它的 NodeIP加进去,这样子他才可以和集群当中的其他节点去做通信,然而这个部分的话,我更推荐的是用operator去做。
Q3 : 请问如果不用Redis operator,也不使用分布式存储,k8s如何部署cluster集群呢?
A3 : 不用Redis operator其实也是可以的,刚才我也介绍过,有两种模式,一种模式就是用StatefulSets,这种模式的话相对来说会比较稳妥一些。同时它的最主要的部分仍然是修改配置,你需要在你的Redis的容器镜像当中,你可以给它加一个init容器,然后可以在这个部分先给他做一次修改配置的操作,这是可以的。修改完配置的操作之后,再把它给拉起来,这样子他才可以加入到集群当中。
Q4 : 请问网络延迟在不同网络模型下有什么区别?
A4 : 如果我们直接使用物理机的网络,通常来讲,我们不认为这种方式有延迟,就是主机网络一般情况下我们会忽略掉它的延迟,但是如果你使用的是overlay的这种网络模型的话,因为它是覆盖层的网络,所以你在去做发包解包的时候,当然是会有不同的资源的损耗,性能的损耗都是有的。
Q5 : 请问一般建议公司公用一个Redis集群,还是各系统独立集群?
A5 : 这个问题当然是建议各个系统独立集群了,我们来举一个最简单的例子,比如说你在其中用到了list,我们都知道Redis就有一个ziplist的配置项,他其实跟你的存储和你的性能是有关系的。如果你是公司的所有的东西都用同一个集群,那你修改了Redis集群的配置的话,很可能会影响到所有的服务。但如果你是每个系统独立用一个Redis群的话,彼此之间互不影响,也不会出现某一个应用不小心把集群给打挂了,然后造成连锁反应的情况。
Q6 : 请问Redis持久化,在生产中如何考虑呢?
A6 : 这部分东西我是这样想的。如果你真的需要去做持久化,一方面Redis提供了两种核心,一种是 RDB,另外一种是AOF,如果说你的数据很多的话,相应你的RDB可能会变得很大。如果你是去做持久化,我通常建议就是两个里头去做一次权衡。因为通常来讲,即使你是使用物理机的环境,我也建议你的存储目录可以放到一个独立的盘里头,或者说你可以去挂在一个分布式的存储,但是前提是你需要保证它的性能,因为你不能因为它的写入性能而拖累你的集群,所以更加推荐的就是你可以全都把它们打开,但是如果你数据其实没那么重要,你可以你只开AOF。
Q7 : 请问生产级别的ceph可靠不?
A7 : 其实ceph的可靠性这个问题,很多人都讨论过,就我个人而言,ceph 的可靠性是有保证的。我这边在用的 ceph 很多,并且存了很多比较核心的数据,ceph 的可靠性是 ok 的。
重点在于说你能不能搞得定他,而且有一家公司其实大家可能有所了解,叫做SUSE,就是一个Linux的一个发行版,这家公司其实提供了一个企业级的存储解决方案,并且它的底层其实还是用的ceph,其实这也是正常的,只要有专人去搞这个事情,然后把它解决掉,我觉得ceph足够稳定的。
顺便提一下,如果你使用的是 k8s 的话,现在有一个项目叫做 rook,它其实提供了一个 ceph 的 operator,这种方案其实现在已经算是相对来说比较很稳定的了,推荐大家尝试一下。
Q8: 请问申请内存、限制内存、还有本身Redis内存怎么配置比较好?
A8: 这里需要考虑几个问题,首先我们先说Redis本身的内存,其实要看你的实际业务的使用场景,或者说你业务的实际需求,你肯定不可能让你的Redis的实例或者Redis集群的内存都占满。
如果是占满的话,你就需要开启lru去做驱逐之类的事情,这是一方面。另一方面就是申请内存,其实我理解你这个地方要问的问题应该是指,在k8s环境下面,在k8s下面一个是request的,一个是limit,limit肯定是你的可用限制的内存,限制内存你一定需要考虑到Redis本身还要用到的一些内存。