当前位置:首页 > 问答 > 正文

Redis高可用怎么搞,结合Alfresco案例聊聊redis的akf那些事儿

要聊清楚Redis高可用在Alfresco这种企业级内容管理系统里怎么搞,咱们得先掰扯明白一个核心思想,AKF扩展立方体”,这个理论不是什么高深莫测的东西,你可以把它想象成一个搭积木的游戏,告诉我们系统撑不住了的时候,可以朝三个方向去扩容,而不是只会买更贵的服务器。

第一个方向是X轴:直接复制,一模一样。 这最简单,就是搞几个一模一样的Redis服务器,一个当老大(主节点),负责写数据也负责读数据;另外几个当小弟(从节点),完全复制老大的数据,只负责读数据,这就是我们最常听到的主从复制,在Alfresco里,你把Session啊、一些缓存数据啊放在Redis里,用这个模式,读的压力就可以分散到好几个小弟身上,读性能就提升了,万一老大挂了,你可以手动把一个小弟扶正成新老大,服务就能恢复,但这有个问题,扶正的过程是手动的,需要人盯着,不够自动化,停机时间可能比较长。

第二个方向是Z轴:按数据分家,各管一摊。 当你的数据量超级大,一个Redis实例根本存不下的时候,或者写操作太频繁,一个老大忙不过来,就得用这招,这就是分片,想象一下,Alfresco要存海量的文档元数据、版本信息,一个Redis装不下怎么办?那就分片,我可以定个规矩:文档ID以A-M开头的,存到Redis集群1号;N-Z开头的,存到Redis集群2号,这样,每个集群只存一部分数据,共同组成一个巨大的逻辑数据库,写压力和数据存储压力就分摊了,在Redis世界里,官方有Redis Cluster,就是干这个事的,它自动帮你管理数据分片在各个节点上的分布。

第三个方向是Y轴:按功能分家,专业的人干专业的事。 这个在AKF立方体里是关于拆分功能的,在Redis的语境下,我们可以理解为根据数据类型和用途分离实例,Alfresco用Redis可能不止一个用途,1. 存储用户会话Session,这东西读写频繁,但丢了的话用户就得重新登录,虽然重要但似乎还能接受,2. 存储系统级的高性能缓存,比如频繁访问的文档内容预览信息,这东西丢了可能只是暂时性能下降,重新生成就行,3. 存储一些需要持久化的重要业务数据,如果你把所有这些都塞进同一个Redis实例,它们会互相争抢资源,而且不好管理,一个更好的做法是,部署多个Redis实例,甚至配置成不同模式,专门弄一个Redis实例配成主从模式,只负责Session;再弄一个Redis Cluster集群,专门负责缓存那些海量的文档元数据,这就是Y轴思想的体现,按职责拆分,隔离影响,便于管理。

好了,AKF的三个方向说清楚了,那在Alfresco里到底怎么组合起来实现真正的高可用呢?光靠上面任何单一模式都不够完美,主从复制(X轴)怕主机单点故障;分片(Z轴)解决了数据量大的问题,但一个分片内部的主机挂了还是麻烦。

实战中,尤其是对于Alfresco这样的关键业务系统,大家普遍采用的终极方案是 Redis Sentinel(哨兵) 或者 Redis Cluster(集群),它们其实是AKF思想的组合拳。

先说Redis Sentinel(哨兵模式)。 它本质上是主从复制(X轴)的自动化管控版,你依然有主节点和从节点,但同时你会部署几个额外的“哨兵”进程,这些哨兵不存数据,它们的工作就是像保安一样,7x24小时盯着主节点还活不活着,一旦哨兵们通过投票发现主节点真的挂了,它们就会自动从剩下的从节点里面,民主选举出一个新的主节点,然后通知所有的客户端(比如Alfresco)去连接这个新主节点,这个过程是自动的,基本不需要人工干预,大大减少了系统停机时间,这对于Alfresco的会话管理这类需要高可用的场景非常合适,哨兵模式主要解决的是高可用问题,它本身不自动分片(Z轴),所以单主节点的数据容量和写能力还是有上限。

再说Redis Cluster(集群模式)。 这个是更彻底的方案,它把分片(Z轴)和高可用(X轴的变种)打包在一起了,Redis Cluster会自动把你的数据分散到多个分片上(比如16384个槽位),每个分片本身又是一个小的高可用单元,由一个主节点和若干个从节点组成,也就是说,它内部自动实现了数据分片,并且每个分片的主节点挂了,它分片内的从节点会自动顶上去,这对于Alfresco这种可能需要处理海量文档元数据缓存、追求极致扩展性和高可用的场景,是更理想的选择,部署和管理起来也比哨兵模式稍微复杂一点。

在Alfresco里搞Redis高可用:

  • 思想上,遵循AKF立方体,明白可以朝复制、分片、分功能三个方向努力。
  • 实践上,根据业务需求选择:
    • 如果数据量不大,但要求高可用,避免手动切换,用Redis Sentinel(哨兵)
    • 如果数据量巨大,同时要求高可用和高扩展性,用Redis Cluster(集群)
    • 更进一步,可以采用Y轴思想,为Alfresco的不同用途(如会话、缓存)部署不同的Sentinel集群或Cluster集群,实现资源和技术方案的精准匹配。

最后提一嘴持久化,高可用是保证服务不中断,但万一整个机房断电了,所有Redis节点都重启,数据不能丢啊,所以无论用哪种模式,都要配置好RDB快照和AOF日志这两种持久化策略,确保数据能恢复,这才是完整的高可用方案。

Redis高可用怎么搞,结合Alfresco案例聊聊redis的akf那些事儿