Redis集群搭建、主从复制、哨兵模式、缓存击穿、穿透、雪崩

        要先说明一下,因为宝宝很穷,没办法去购买好几台服务器,只能在一台服务器上搭建一个伪集群,哈哈。

        1、基本服务搭建

                单机服务的搭建这里就不再重复了,因为在上一篇文章里已经写过了,按照上篇文章的步骤操作即可。要想在一台服务器上运行多个redis服务,只要通过不同的配置文件启动就可以了,单机服务搭建好后(只需搭建一个),多复制几个redis.conf文件,可以命名为redis1.conf,redis2.conf,redis3.conf等,然后修改配置文件中的端口号、服务id,让他们不要相同即可,如果是在同一目录下的话,还需修改日志文件名称、dump.rdb名称。

        示例:

        port 6379                                        #主机可不进行修改、从机可以改为6380、6381、6382等

        pidfile /var/run/redis_6379.pid        #主机可不进行修改、从机改为其他不一致的名称都可

        logfile "6379.log"                             #默认是没有名称的,如果不是在同一目录下,可不进行修改,同目录时也只需不一致就行

        dbfilename dump.rdb                      #同样如果不在同一目录下可以不修改,同目录时也只需不一致就行

         修改完后进入安装目录正常通过:redis-server /bug路径/redis/redis1.conf 启动即可。

        配了3个服务,都已正常启动, 那现在问题来了,怎么知道哪个是主机哪个是从机呢,重点:redis默认所有的都为主机,怎么查看呢,连接客户端后(redis-cli -p 6379端口 -a 密码,没密码的可以去掉-a),通过指令:info replication 查看信息,如图:

                 如果不是在同一台服务器上的话,其实上面的操作都可以不用进行,要怎么配置从机呢?

        2、从机连接主机

                ① 临时连接,只需执行命令:SLAVEOF 127.0.0.1 6379 ,如图:

                 ② 永久连接,修改配置文件redis.conf里的配置,如图:(注意:是修改从机的配置文件)

                         配置好后重启服务即可(不在同一服务器的话要注意防火墙哦),那连接后主机会显示什么信息呢,如图:

                 其实还有一种连接形式,现在的这种相当于:B->A,C->A。还有一种则为:C->B->A,A为主机,B和C为从机,B连接主机A,C则连接从机B,两种形式都是可行的。

二、Redis的主从复制

        1、什么是主从复制

                简单的说,在一主多从中,把主机的数据复制到从机上,就叫主从复制,主从复制只存在于集群环境中。

        2、特点

                        ① 读写分离:主机只负责写,从机只负责读。

                        ② 单向性:只能由主机复制给从机。

                        ③ 数据的保存、备份:在集群环境中,即使主机挂掉了,数据也可在从机上恢复。

                        ④ 服务的可靠性:通过哨兵模式,主机挂掉后,会选举一台从机立马变成主机,从而保证项目的正常运行。

                        ⑤ 负载均衡:因为是集群,而且又实现了读写分离,所以从机可以方便的实现负载均衡。

        3、复制的两种规则

                全量复制:复制全部数据,当一台从机断开连接后,再重新接入,这时会执行全量复制。

                增量复制:复制新增的数据,主机写入一条数据后,会即时复制给从机,这时只会复制新增的数据,不会复制全部数据。

                主从复制就差不多了,其实也没多少东西,只要搭建好集群后,redis都是自己运行的,根本不需要其他的处理,就很人性化。

三、哨兵模式

        如果只按照上面的方式搭建redis服务,那么当主机掉线后,维护人员没有第一时间处理,就会导致整个服务将不可用,无法再进行写操作,而且每次都需要人员去重新配置主机,非常的不方便!

        所以就延伸出了哨兵模式,当主机掉线后,哨兵通过投票选举,在从机里自动选举出一台成为主机,从而保证服务的可用性。

        哨兵服务最常用、也是最基本的3个配置:

        sentinel down-after-milliseconds mymaster 1000

        #sentinel down-after-milliseconds 名称 每隔1秒校验一次,可以理解为主机的心跳,超过1秒没跳动就表示可能出问题了

        sentinel monitor mymaster 127.0.0.1 6379 2

        #sentinel monitor 名称 主机ip 端口 确认数量,1秒钟没跳动哨兵就会觉得主机可能出问题了,但是这时不会立即就认为主机掉线了,而是会发送请求给其他哨兵,询问他们是否也认为主机掉线了,如果超过上面的配置2台以上都认为主机掉线了,那么才会确认主机确实掉线了,这时候哨兵就会进行选举,选举出新的主机

        sentinel auth-pass mymaster xxxxx

        #sentinel auth-pass 名称 主机的密码,如果主机没有密码,可以不用配置

        最重要的是上面两个配置,配置完就可以启动哨兵了,当然如果是搭建的伪集群,在一台服务器上,那还得配置端口号。

        开始修改配置了,首先在我们的解压目录下找到sentinel.conf文件,这个就是哨兵的配置文件,其他几个常用的配置:

daemonize yes                                                                  #是否以保护进程的方式运行,一般会改为yes

port 26379                                                                         #哨兵的端口号,搭建哨兵集群的注意修改端口号

logfile ""                                                                             #哨兵的日志文件名称

sentinel monitor mymaster 127.0.0.1 6379 2                    #上面单独解释了

sentinel auth-pass mymaster xxxxx                                  #redis主机密码

sentinel down-after-milliseconds mymaster 30000           #上面单独解释了 

sentinel parallel-syncs <master-name> <numslaves>      #从机有时会不能处理请求,这里配置允许多少的从机不能处理请求,一般会设为1

        通过配置文件启动哨兵:redis-sentinel /bug/redis/sentinel.conf(注意要进入你自己的服务路径哦),查看进程:ps -ef|grep redis

         哨兵注意事项:

                1、搭建哨兵集群的话,哨兵服务一定要是单数。

                2、主机掉线后,已经选举出了新的主机,那么原来的主机上线后会变成从机。

                就是这么简单,搞定收工!

四、什么是缓存击穿、缓存穿透、缓存雪崩及怎么避免和解决

        在讲这些之前,要先了解一下我们正常的一个请求流程:

        用户发起查询-->后端接收到请求-->程序查询redis缓存-->存在即可返回数据

                                                                                             -->不存在则查询数据库-->数据库返回数据-->程序存入redis缓存-->返回数据

        1、缓存击穿

                出现原因:缓存击穿主要出现在“查询redis缓存”流程,高并发环境中,当大量的请求查询同一条数据时,该数据不存在或者刚好过期了,这时大量的请求就会全部去查询数据库,数据库承受不住压力就会导致崩溃。

                解决方式:

                        1、既然问题是redis里数据过期导致的,那么让数据永不过期不就行了,哈哈,当然这样会占用大量的空间,而且也不可能永不过期,对于热点数据可以适量的延长过期时间。

                        2、采用互斥锁,意思就是一次只允许一个线程去查询,阻塞后面的查询请求,然后当查询出数据后存入redis缓存,让后面的查询请求去查询redis缓存,这样就可以很好的解决缓存击穿问题(注意:这样会对互斥锁要求比较高哦)。

        2、缓存穿透

                出现原因:缓存穿透主要出现在“查询数据库”流程,当查询请求出现时,大量的参数在redis缓存里查不到数据,数据库里也查不到数据,而请求却一直不停的查询,这时也会导致数据库服务器崩溃。

                解决方式:

                        1、当redis缓存里没有,数据库里也没有时,可以返回一个空字符串存入缓存,这时就不会再去请求数据库,但这种方式不太建议使用,会存在一些其他问题。

                        2、采用布隆过滤器,过滤掉不符合规则的参数。

        3、缓存雪崩

                出现原因:缓存雪崩也主要出现在“查询数据库”流程,当redis的大量缓存数据同时过期或者redis服务直接掉线了,而这时又有大量的请求出现,请求就只能去查数据库,这也会导致我们的数据库服务器崩溃。

                解决方式:

                        1、不要把大量的数据设置同时过期,在有可能出现大量请求的时候,要先对数据进行预热,先把数据分时加载进缓存,确保数据不在同时过期。

                        2、加锁,和我们上面的缓存击穿处理方式一样,虽然这样会降低用户的体验,但至少保证了服务的可用性。

                        3、增加redis服务器的数量,这样即使有一两台服务器掉线了,也对整体的服务影响不大。


总结

        我的五年java开发经验告诉我,如果项目真的到了要用到redis集群的时候,那么就一定会配备一个专门的运维人员,但是在现在的这个环境中,都在要求我们这些可怜的程序员要成为一个全栈工程师,所以即使我们不能对redis精通,但也一定要会用,知道一些基本的概念。

原文地址:https://blog.csdn.net/xiaobug_zs/article/details/124553645

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc