百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

redis同城双活方案(redis双主模式)

mhr18 2024-10-26 10:46 36 浏览 0 评论

1.设计概述

1.1. 目标

(1).核心服务可以同时在两个机房运行,但备机房服务依然访问主机房数据。

(2).主机房出现故障后,可以迅速将全站业务流量都切换到备机房,同时备机房服务也将数据访问切换到备机房并且只读访问。

2.架构设计

2.1 redis单实例同城双活架构



2.2 业务访问流程

3.模块设计

3.1. redis

redis实例为公司原有redis实例,不做任何修改和调整。

3.2. consul

整个同城双活中的服务治理中心,负责服务的注册、销毁和查询,主机房故障或者主机房中服务出现故障后通知所有相关业务切换到备机房。

3.3. consul-agent

每个服务器上运行一个consul-agent服务,用于注册redis服务和检测redis健康状态。启动redis实例时将redis与所属appid写入到相应的consul服务配置文件,consul-agent自动读取consul服务配置文件并将新添加服务注册到consul中。周期检测服务器上注册服务的健康状态并上报到consul中。

3.4. jedis

业务方jedis客户端使用公司定制的jedis客户端。jedis负责与consul之间进行通讯,当redis服务触发切换时,consul主动通知jedis进行切换。

jedis与备机房建立连接时,只能将读请求发送到备机房;写请求直接返回失败。

3.5. zookeeper

keeper启动时都向zookeeper进行注册,cacheCloud通过监听keeper在zookeeper上的节点来判断keeper是否存活,当主keeper挂掉时执行keeper切换动作。

3.6. mysql

cacheCloud将自己管理的所有信息都存储到mysql中,mysql通过主从同步到备机房,备机房中的cacheCloud也可以读取到所有信息。

3.7. keeper

keeper负责将主机房redis实例数据同步到备机房redis实例。

支持单双工,当主机房故障恢复后,需要从备机房恢复数据到主机房。

3.7.1. keeper管理

每个keeper都是keeperContainer中的一个服务,cacheCloud通过向keeperContainer发命令来增加、删除keeper实例。cacheCloud也可以直接向keeper发送命令来管理keeper。

3.7.2. keeper怎么同步数据到备机房,slave怎么与keeper进行同步数据

主机房部署两个keeper,一个作为主keeper,一个作为备keeper,备机房keeper向主机机房keeper同步数据,然后再将数据同步到备机房redis。

3.7.3. keeper内部数据同步原理

(1).单个增量aof文件大小限制,增量aof文件数量限制

(2).RDB文件会不会被删除,aof文件会不会被删除,RDB或aof删除后,slave触发全量同步怎么处理

(3).RDB文件和大量增量aof存在时,slave触发全量同步怎么处理,回放所有aof文件吗

(4).详细的主从同步交互细节redis->keeper->keeper->redis

(5).keeper切换master后怎么处理,以及怎么与keeper下的slave进行同步数据

(6).keeper关闭后会不会删除RDB和AOF文件

(7).keeper与master断开连接重连后会不会触发全量同步,keeper与master什么情况下触发全量同步,keeper与slave什么情况下触发全量同步。

(8).master执行flushall后keeper会不会清掉自己的数据。

(9).keeper本地数据存储策略,keeper重启数据是否还在

3.7.4. keeper的高可用实现

(1).keeper启动时再zk上注册一个临时节点。

(2).cacheCloud监听zk上的keeper节点

(3).当cacheCloud检测到keeper节点挂掉之后,cacheCloud对keeper进行主从切换将备机房slave挂到新master keeper

cacheCloud要实现高可用,要部署集群模式。

3.7.5. 备机房keeper高可用实现

备机房也启动一主一备两个keeper,keeper向备机房zookeeper进行注册,备机房也起两个(如果资源紧张牺牲一定的高可用只启一个也可以)cacheCloud对zookeeper进行监控。当主keeper宕掉后cacheCloud将备keeper升级为主keeper。

3.7.6. keeper扩容

keeper容器所在服务器中内存,磁盘不足,keeper怎样进行扩容。

3.7.7. 多个keeper不能同时触发全量同步

keeper与master进行全量同步数据时,多个keeper不能同时与同一个服务器上的多个redis同步数据,否则同一机器上多个redis同时bgsave会导致内存翻倍,同时也会导致网络带宽突增,磁盘io出现瓶颈。

3.7.8. keeper支持redis密码认证

keeper中支持redis密码认证功能,

3.7.9. keeper中记录master ip和port信息

keeper如果重启,可以查看keeper中master的ip和port信息。

3.7.10. keeperContainer升级

当keeperContainer出现bug时,怎么对keeperContainer进行升级?

可以通过服务部署的方式对整个keeperContainer进行升级。


3.8. cachecloud

cachecloud负责主备两个机房redis实例的监控与管理,同时负责主备两个机房redis实例数据同步监控和管理。

主备两机房redis实例数据同步控制、同步状态监控、同步信息统计等都在cachecloud中进行。

3.8.1.增加一个IDC机房管理页面

机房列表统计信息,展示该机房有多少个机器、多少个redis、多少个keeperContainer、多少个keeper;

点击机器数量可以跳转到机器列表。

机房信息:名称、地点、备注;机柜容量、整个机房带宽等。

机器管理中添加机器时选择的机房应该是已经存在的机房;并可以只展示某个机房的机器。

3.8.2.信息展示增加IDC字段

给机器增加一个IDC字段(现在已经存在),用来区别不同的机房;其他需要展示的地方通过机器ip来识别IDC。

a.应用实例列表中显示keeper实例、实例类型、机房信息;可以指定机房

b.应用运维实例列表页面显示keeper实例、实例类型、机房信息;可以指定机房

c.应用拓扑里面也显示机房信息。

3.8.3.增加keeperContainer管理页面,keeper实例列表页面

管理所有keeperContainer,线上每个keeperContainer中有多少个keeper,以及新建和删除keeperContainer

keeper实例列表页面展示单个keeperContainer下所有的keeper列表信息;显示keeper信息的时候应该同时将相关上下有实例数据同步状态显示出来,同时也将keeper的备用keeper也显示出来。

3.8.4.增加keeper实例类型

增加keeper实例类型,在应用列表中显示keeper实例。keeper暂时只支持重新启动,不支持导入。

3.8.5.数据监控

跨机房对实例信息监控时,超时时间要相应大一些。

增加对keeperContainer、keeper的监控。

3.8.6.跨机房数据同步

同一应用下实例列表要展示出数据同步对应关系。

3.8.7.cachecloud高可用

备机房也部署一套cachecloud,但备机房cachecloud不执行周期任务和数据监控。cachecloud中增加一个配置用来表示备机房机器是否执行周期任务和数据监控

(1).主机房cacheCloud通过集群模式部署多套

过个cacheCloud依赖数据库行锁,互斥的从mysql中取任务去执行。主要包括周期信息收集任务、周期检测zk上keeper是否存活,以及keeper启动切换任务。

3.8.8.数据同步实现高可用

master实例挂掉后keeper怎样切换到新实例?

b.主keeper挂掉后,被机房实例怎样切换到备keeper?


4.风险与规避

服务注册相关:

(1).master、slave是否都需要consul-agent进行监控

consul只监控master,不监控slave,consul监控redis实例时使用的是vip。

(2).客户端自己做sharding的多个redis实例属于同一个appid还是多个appid

每个redis实例都注册到相同的appid,每个appid可以包含多个实例。

(3).consul-agent监听服务配置文件格式。

appid:subappid:redis:[master|slave]:ip:port:[other]

subappid:同一个业务需要多个redis实例时,redis实例注册时要知道一个子appid

保留一个自定义字段。

other:如果是codis数据类型,或者是业务自己做sharding时,可以在other中将本redis负责的slot信息注册到consul最后传递到客户端;是否有状态,proxy是无状态的只要有一个proxy活着就可以,切片redis则不同实例负责不同数据,只有所有的redis都健康整个服务才健康。


服务切换相关:

(1).怎样保证业务前端(客户端)的流量都切换到备机房

客户端切后端服务通过httpdns,已经实现。

(2).consul具体怎么通知到每个客户端及业务

(3).redis主从切换、slave宕机时怎样通知consul,

consul不关心主从切换和slave宕机,只今天redis对应的vip是否通。

(4).redis主从对外提供vip吗,如果对外提供vip则主从切换后客户端不需要调整

同上。


redis跨机房同步数据相关:

(1).网络故障、同步进程故障等,怎样重新进行跨机房数据同步

(2).主从切换后怎样进行跨机房数据同步

(3).同步进程状态监控报警

5. 优化点:

1.keeper通过容器或者vip部署,如果触发主从切换后保证keeper的对外ip地址不变,这样就可以避免下游节点触发全量同步。

2.slave上如果是同一份RDB时,应该避免触发全量同步,redis-4.0是否支持该功能

相关推荐

redis 7.4.3更新!安全修复+性能优化全解析

一、Redis是什么?为什么选择它?Redis(RemoteDictionaryServer)是一款开源的高性能内存键值数据库,支持持久化、多数据结构(如字符串、哈希、列表等),广泛应用于缓存、消...

C# 读写Redis数据库的简单例子

CSRedis是一个基于C#的Redis客户端库,它提供了与Redis服务器进行交互的功能。它是一个轻量级、高性能的库,易于使用和集成到C#应用程序中。您可以使用NuGet包管理器或使用以下命令行命令...

十年之重修Redis原理

弱小和无知并不是生存的障碍,傲慢才是。--------面试者总结Redis可能都用过,但是从来没有理解过,就像一个熟悉的陌生人,本文主要讲述了Redis基本类型的使用、数据结构、持久化、单线程模型...

高频L2行情数据Redis存储架构设计(含C++实现代码)

一、Redis核心设计原则内存高效:优化数据结构,减少内存占用低延迟访问:单次操作≤0.1ms响应时间数据完整性:完整存储所有L2字段实时订阅:支持多客户端实时数据推送持久化策略:RDB+AOF保障数...

Magic-Boot开源引擎:零代码玩转企业级开发,效率暴涨!

一、项目介绍基于magic-api搭建的快速开发平台,前端采用Vue3+naive-ui最新版本搭建,依赖较少,运行速度快。对常用组件进行封装。利用Vue3的@vue/compiler-sfc单文...

项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!

项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!老铁们!是不是每次面试完都感觉自己像被大厂面试官婉拒的渣男?明明刷了三个月题库,背熟八股文,结果一被问项目就支支吾吾,简历写得像大学生课程设计?...

谷歌云平台:开发者部署超120个开源包

从国外相关报道了解,Google与Bitnami合作为Google云平台增加了一个新的功能,为了方便开发人员快捷部署程序,提供了120余款开源应用程序云平台的支持。这些应用程序其中包括了WordPre...

知名互联网公司和程序员都看好的数据库是什么?

2017年数据库领域的最大趋势是什么?什么是最热的数据处理技术?学什么数据库最有前途?程序员们普遍不喜欢的数据库是什么?本文都会一一揭秘。大数据时代,数据库的选择备受关注,此前本号就曾揭秘国内知名互联...

腾讯云发布云存储MongoDB服务

近日,著名安全专家兼Shodan搜索引擎的创建者JohnMatherly发现,目前至少有35000个受影响的MongoDB数据库暴露在互联网上,它们所包含的数据暴露在网络攻击风险之中。据估计,将近6...

已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有

前言程序员,立之根本还是技术,一个程序员的好坏,虽然不能完全用技术强弱来判断,但是技术水平一定是基础,技术差的程序员只能CRUD,技术不深的程序员也成不了架构师。程序员对于技术的掌握,除了从了解-熟悉...

面试官:举个你解决冲突的例子?别怂!用这个套路……

面试官:举个你解决冲突的例子?别怂!用这个套路……最近收到粉丝私信,说被问到:团队技术方案有分歧怎么办?当场大脑宕机……兄弟!这不是送命题,是展示你情商+技术判断力的王炸题!今天教你们3招,用真实案例...

面试碰到MongoDB?莫慌,跟面试官这样吹MongoDB 复制集

推荐阅读:吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点阿里一线架构师分享的技术图谱,进阶加薪全靠它十面字节跳动,依旧空手而归,我该放弃吗?文末会分享一些MongoDB的学...

SpringBoot集成扩展-访问NoSQL数据库之Redis和MongoDB!

与关系型数据库一样,SpringBoot也提供了对NoSQL数据库的集成扩展,如对Redis和MongoDB等数据库的操作。通过默认配置即可使用RedisTemplate和MongoTemplate...

Java程序员找工作总卡项目关?

Java程序员找工作总卡项目关?3招教你用真实经历写出HR抢着要的简历!各位Java老哥,最近刷招聘软件是不是手都划酸了?简历投出去石沉大海,面试邀请却总在飞别人的简历?上周有个兄弟,13年经验投了5...

Java多租户SaaS系统实现方案

嗯,用户问的是Java通过租户id实现的SaaS方案。首先,我需要理解用户的需求。SaaS,也就是软件即服务,通常是指多租户的架构,每个租户的数据需要隔离。用户可能想知道如何在Java中利用租户ID来...

取消回复欢迎 发表评论: