如何配置redis参数配置然后注入

注意这种方式启动redis参数配置 使用嘚是默认配置

redis参数配置.conf 是一个默认的配置文件我们可以根据需要使用自己的配置文件

1. redis参数配置默认不是以守护进程的方式运行,可以通過该配置项修改使用yes启用守护进程

3. 指定redis参数配置监听端口,默认端口为6379作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因為6379在手机按键上MERZ对应的号码而MERZ取自意大利歌女Alessia Merz的名字

5.当 客户端闲置多长时间后关闭连接,如果指定为0表示关闭该功能

7. 日志记录方式,默认为标准输出如果配置redis参数配置为守护进程方式运行,而这里又配置为日志记录方式为标准输出则日志将会发送给/dev/null

8. 设置数据库的数量,默认数据库为0可以使用SELECT <dbid>命令在连接上指定数据库id

9. 指定在多长时间内,有多少次更新操作就将数据同步到数据文件,可以多个条件配合

10. 指定存储至本地数据库时是否压缩数据默认为yes,redis参数配置采用LZF压缩如果为了节省CPU时间,可以关闭该选项但会导致数据库文件变嘚巨大

11. 指定本地数据库文件名,默认值为dump.rdb

12. 指定本地数据库存放目录

13. 设置当本机为slav服务时设置master服务的IP地址及端口,在redis参数配置启动时它會自动从master进行数据同步

15. 设置redis参数配置连接密码,如果配置了连接密码客户端在连接redis参数配置时需要通过AUTH <password>命令提供密码,默认关闭

16. 设置同┅时间最大客户端连接数默认无限制,redis参数配置可以同时打开的客户端连接数为redis参数配置进程可以打开的最大文件描述符数如果设置 maxclients 0,表示不作限制当客户端连接数到达限制时,redis参数配置会关闭新的连接并向客户端返回max number of clients reached错误信息

17. 指定redis参数配置最大内存限制redis参数配置茬启动时会把数据加载到内存中,达到最大内存后redis参数配置会先尝试清除已到期或即将到期的Key,当此方法处理 后仍然到达最大内存设置,将无法再进行写入操作但仍然可以进行读取操作。redis参数配置新的vm机制会把Key存放内存,Value会存放在swap区

18. 指定是否在每次更新操作后进行ㄖ志记录redis参数配置在默认情况下是异步的把数据写入磁盘,如果不开启可能会在断电时导致一段时间内的数据丢失。因为 redis参数配置本身同步数据文件是按上面save条件来同步的所以有的数据会在一段时间内只存在于内存中。默认为no

20. 指定更新日志条件共有3个可选值: 

21. 指定昰否启用虚拟内存机制,默认值为no简单的介绍一下,VM机制将数据分页存放由redis参数配置将访问量较少的页即冷数据swap到磁盘上,访问多的頁面由磁盘自动换出到内存中(在后面的文章我会仔细分析redis参数配置的VM机制)

24. redis参数配置 swap文件分成了很多的page一个对象可以保存在多个page上面,但一个page上不能被多个对象共享vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象page大小最好设置为32或者64bytes;如果存储很夶大对象,则可以使用更大的page如果不 确定,就使用默认值

25. 设置swap文件中的page数量由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中嘚,在磁盘上每8个pages将消耗1byte的内存。

26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的可能會造成比较长时间的延迟。默认值为4

27. 设置在向客户端应答时是否把较小的包合并为一个包发送,默认为开启

28. 指定在超过一定的数量或者朂大的元素超过某一临界值时采用一种特殊的哈希算法

29. 指定是否激活重置哈希,默认为开启(后面在介绍redis参数配置的哈希算法时具体介紹)

30. 指定包含其它的配置文件可以在同一主机上多个redis参数配置实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

在配置时主要难以理解的主要囿:removeAbandoned :)   logAbandoned=true的话,将会在回收事件后在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了在调试的时候很有用。
  在这里私人建议maxWait的时间不要设得太长maxWait如果设置太长那么客户端会等待很久才激发回收事件

DBCP提供的validationQuery参数进行连接的预检测,它会在与连接池交互嘚过程中加入一些钩子定点执行validationQuery指定的SQL语句,如果SQL语句执行成功表示此连接有效,分配给应用如果执行失败,则丢弃此连接这种方法还能应对网络故障等问题造成的连接失效问题。其他的一些方法比如空闲连接检测,乐观获取连接等方式都无法保证完全对应用透明,应用还是能感知到数据库操作失败

minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟)是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象個数不小于_minIdle如果连接池的连接数小于最小空闲连接数,则创建数据库连接同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入連接池中否则销毁此对象。

如果你用redis参数配置缓存技术的话肯定要考虑如何用redis参数配置来加多台机器,保证redis参数配置是高并发的还有就是如何让redis参数配置保证自己不是挂掉以后就直接死掉了。

redis參数配置高并发:主从架构一主多从,一般来说很多项目其实就足够了,单主用来写入数据单机几万QPS,多从用来查询数据多个从實例可以提供每秒10万的QPS。

redis参数配置高并发的同时还需要容纳大量的数据:一主多从,每个实例都容纳了完整的数据比如redis参数配置主就10G嘚内存量,其实你就最对只能容纳10g的数据量如果你的缓存要容纳的数据量很大,达到了几十g甚至几百g,或者是几t那你就需要redis参数配置集群,而且用redis参数配置集群之后可以提供可能每秒几十万的读写并发。

redis参数配置高可用:如果你做主从架构部署其实就是加上哨兵僦可以了,就可以实现任何一个实例宕机,自动会进行主备切换

一.redis参数配置如何通过读写分离来承载读请求QPS超过10万+?

1.redis参数配置高并发哏整个系统高并发的关系

Rredis参数配置要搞高并发那就要把底层的缓存搞好,让更少的请求直接到数据库因为数据库的高并发实现起来是仳较麻烦的,而且有些操作还有事务的要求等等所以很难做到非常高的并发。

redis参数配置并发做的好对于整个系统的并发来说还是不够的但是redis参数配置作为整个大型的缓存架构,在支撑高并发的架构里面是非常重要的一环

要实现系统的高并发,首先缓存中间件、缓存系統必须要能够支撑起高并发然后在经过良好的整体缓存架构设计(多级缓存、热点缓存),才能真正支撑起高并发。

2.redis参数配置不能支撑高并发嘚瓶颈

redis参数配置不能支撑高并发的瓶颈主要是单机问题也就是说只有一个单一的redis参数配置,就算机器性能再怎么好也是有上限的。

3.如哬支撑更高的并发

单机的redis参数配置不可能支撑太高的并发量要想支持更高的并发可以进行 读写分离 。对于缓存来说一般都是支撑读高並发的,写的请求是比较少的因此可以基于主从架构进行读写分离。

配置一个master(主)机器用来写入数据配置多个slave(从)来进行数据的读取,在master接收到数据之后将数据同步到slave上面即可这样slave可以配置多台机器,就可以提高整体的并发量

一个master节点下面挂若干个slave节点,写操作将数据寫到master节点上面去然后在master写完之后,通过异步操作的方式将数据同步到所有的slave节点上面去保证所有节点的数据是一致的。

(1)redis参数配置采用异步方式复制数据到slave节点不过redis参数配置2.8开始,slave node会周期性地确认自己每次复制的数量

(5)slave node在做复制的时候,也不会阻塞自己的操作它会用旧的数据来提供服务;但是复制完成的时候,需要删除旧的数据加载新的数据,这个时候会对外暂停提供服务

(6)slave node主要用来進行横向扩容,做读写分离扩容的slave node 可以提高吞吐量。

3.master持久化对主从架构的安全意义

如果采用这种主从架构那么必须要开启master node的持久化。鈈建议使用slave node作为master node的热备份因为如果这样的话,如果master一旦宕机那么master的数据就会丢失,重启之后数据是空的其他的slave node要是来复制数据的话,就会复制到空这样所有节点的数据就都丢了。

要对备份文件做多种冷备份防止整个机器坏了,备份的rdb数据也丢失的情况

三.redis参数配置主从复制原理、断点续传、无磁盘化复制、过期key处理

③开始 full resynchronization的时候,master会启动一个后台线程 开始生成一份RDB快照文件,同时还会将从客户端新接收到的所有写命令缓存在内存当中

④master node将生成的RDB文件发送给slave node,slave现将其写入本地磁盘然后再从磁盘加载到内存当中。然后master node会将内存Φ缓存的写命令发送给slave nodeslave node也会同步这部分数据 。

2.主从复制的断点续传

从redis参数配置2.8开始支持断点续传如果在主从复制的过程中,网络突然斷掉了那么可以接着上次复制的地方,继续复制而不是从头复制一份。

无磁盘化复制是指master直接再内存中创建RDB文件,然后发送给slave不會在自己本地磁盘保存数据。

repl-diskless-sync-delay:该参数表示等待一定时长再开始复制这样可以等待多个slave节点从新连接上来。

如果master过期了一个key或者淘汰叻一个key,那么master会模拟发送一条del命令 给slaveslave接到之后会删除该key。

②slave node内部有一个定时任务每秒检查是否有新的master node要连接个复制,如果发现就跟master node建立socket网络连接。

指的是slave第一次连接master时的情况执行的是全量复制。

这个倒不是说特定就用在全量复制的主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况

backlog主要是用来做全量复制中断时候的增量复制的

用途:slave根据其来定位唯一的master。

3.全量复制流程与机淛

③对于千兆网卡的机器一般每秒传输100M,传输6G文件很可能超过60秒

④master node在生成RDB文件时,会将所有新接到的写命令缓存在内存中在slave node保存了RDB攵件之后,再将这些写命令复制个slave node

⑥slave node接收到RDB文件之后,清空自己的数据然后重新加载RDB文件到自己的内存中,在这个过程中基于旧数據对外提供服务。

⑦如果slave node开启了AOF那么会立即执行BRREWRITEAOF,重新AOF、rdb生成、rdb通过网络拷贝、slave旧数据的清理、slave aof rewrite很耗费时间,如果复制的数据量在4G~6G之間那么很可能全量复制时间消耗到1分半到2分钟。

4.增量复制流程与机制

①如果全量复制过程中master和slave网络连接断掉,那么slave重新连接master会触发增刊复制

master默认每隔10秒发送一次,slave node默认每隔1秒发送一次

master每次接收到写命令之后,现在内部写入数据然后异步发送给slave node

五.redis参数配置主从架构丅如何才能做到99.99%的高可用性?

高可用性(英语:high availability缩写为 HA),IT术语指系统无中断地执行其功能的能力,代表系统的可用性程度是进行系统设计时的准则之一。高可用性系统与构成该系统的各个组件相比可以更长时间运行

高可用性通常通过提高系统的容错能力来实现。萣义一个系统怎样才算具有高可用性往往需要根据每一个案例的具体情况来具体分析

其度量方式,是根据系统损害、无法使用的时间鉯及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较计算公式为: 

A(可用性),MTBF(平均故障间隔)MDT(平均修复时间)

在线系统和執行关键任务的系统通常要求其可用性要达到5个9标准(99.999%)。

redis参数配置不可以包含了单实例的不可用主从架构的不可用。

①主从架构的master节点挂叻如果master节点挂了那么缓存数据无法再写入,而且slave里面的数据也无法过期这样就导致了不可用。

②如果是单实例那么可能因为其他原洇导致redis参数配置进程死了。或者部署redis参数配置的机器坏了

不可用的后果 :首先缓存不可用了,那么请求就会直接走数据库如果涌入大量请求超过了数据库的承载能力,那么数据库就挂掉了这时候如果不能及时处理好缓存问题,那么由于请求过多数据库重启之后很快僦又会挂掉,直接导致整个系统不可用

①保证每个redis参数配置都有备份。

②保证在当前redis参数配置出故障之后可以很快切换到备份redis参数配置上面去。

为了解决这个问题引入下面的哨兵机制。

六.redis参数配置哨兵架构的相关基础知识的讲解

哨兵(Sentinal)是redis参数配置集群架构当中非常重要嘚一个组件它主要有一下功能:

消息通知,如果某个redis参数配置实例有故障那么哨兵负责发送消息作为报警通知给管理员。

故障转迻如果master挂掉了,会自动转移到slave上

配置中心,如果故障发生了通知client客户端连接到新的master上面去。

①哨兵本身是分布式的需要作为一個集群去运行,个哨兵协同工作

②故障转移时,判断一个master宕机了需要大部分哨兵同意才行。

③即使部分哨兵挂掉了哨兵集群还是能囸常工作的。

④哨兵至少需要3个实例来保证自己的健壮性。

⑤哨兵+redis参数配置主从结构是无法保证数据零丢失的,只会保证redis参数配置集群的高可用

⑥对应哨兵+redis参数配置主从这种架构,再使用之前要做重复的测试和演练。

3.为什么哨兵集群部署2个节点无法正常工作

哨兵集群必须部署2个以上的节点。如果集群仅仅部署了2个哨兵实例那么quorum=1(执行故障转移需要同意的哨兵个数)。

如图如果这时候master1宕机了,哨兵1囷哨兵2中只要有一个认为master1宕机了就可以进行故障转移同时哨兵1和哨兵2会选举出一个哨兵来执行故障转移。

同时这个时候需要majority(也就是所有集群中超过一半哨兵的数量)2个哨兵那么majority就是2,也就说需要至少2个哨兵还运行着才可以进行故障转移。

但是如果整个master和哨兵1同时宕机了那么就只剩一个哨兵了,这个时候就没有majority来运行执行故障转移了虽然两外一台机器还有一个哨兵,但是1无法大于1也就是无法保证半數以上,因此故障转移不会执行

4.经典的3节点哨兵集群

如果M1所在机器宕机了,那么三个哨兵还剩下2个S2和S3可以一致认为master宕机,然后选举出┅个来执行故障转移

同时3个哨兵的majority是2所以还剩下的2个哨兵运行着,就可以允许执行故障转移

七.redis参数配置哨兵主备切换的数据丢失问题:異步复制、集群脑裂

1.两种数据丢失的场景

①异步复制导致的数据丢失

因为从master到slave的数据复制过程是异步的可能有部分数据还没来得及复制箌slave上面去,这时候master就宕机了那么这部分数据就丢失了。

②集群脑裂导致的数据丢失

什么是脑裂:脑裂也就是说,某个master所在机器突然脱離了正常的网络跟其他slave机器不能连接,但是实际上master还运行着

此时哨兵可能就会认为master宕机了,然后开启选举将其他slave切换成了master。

这个时候集群里就会有两个master,也就是所谓的脑裂

此时虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master还继续写向旧master的数据可能也丢夨了。

因此旧master再次恢复的时候会被作为一个slave挂到新的master上去,自己的数据会清空重新从新的master复制数据

2.解决异步复制的脑裂导致的数据丢夨

要解决这个问题,就需要配置两个参数:

表示 要求至少有一个slave 在进行数据的复制和同步的延迟不能超过10秒

如果一旦所有的slave数据同步和複制的延迟都超过了10秒,那么这个时候master就会在接受任何请求了。

①减少异步复制的数据丢失

有了min-slaves-max-lag这个配置就可以确保说,一旦slave复制数據和ack延时太长就认为可能master宕机后损失的数据太多了,那么就拒绝写请求这样可以把master宕机时由于部分数据未同步到slave导致的数据丢失降低嘚可控范围内。

如果一个master出现了脑裂跟其他slave丢了连接,那么上面两个配置可以确保说如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息那么就直接拒绝客户端的写请求。

这样脑裂后的旧master就不会接受client的新数据也就避免了数据丢失。

上面的配置就确保了如果跟任何一个slave丢了连接,在10秒后发现没有slave给自己ack那么就拒绝新的写请求。

因此在脑裂场景下最多就丢失10秒的数据

八.redis参数配置哨兵嘚多个核心底层原理的深入解析(包含slave选举算法)

sdown是主观宕机,就一个哨兵如果自己觉得一个master宕机了那么就是主观宕机。

odown是客观宕机洳果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机

sdown到odown转换的条件很简单如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也認为那个master是sdown了那么就认为是odown了,客观认为master宕机

2.哨兵集群的字段发现机制

①哨兵相互之间的发现,是通过redis参数配置的pub/sub系统实现的每个哨兵都会往 __sentinel__:hello 这个channel里面发送一个消息,这时候其他的哨兵都可以消费这个消息并感知其他哨兵的存在。

④每个哨兵还会根据其他哨兵交换對master的监控配置互相进行监控配置的同步。

哨兵会负责自动纠正slave的一些配置比如slave如果要成为潜在的master候选人,哨兵会确保slave在复制现有master数据;如果slave连接到了一个错误的master上比如故障转移之后,那么哨兵会确保他们连接到正确的master上来

如果一个master被认为odown了,而且majority数量的哨兵都允许叻主备切换那么某个哨兵就会执行主备切换,此时首先要选举一个slave出来选举会考虑到一下情况:

对应剩下的slave按照如下规定排序:

①首先,按照slave的优先级进行排序slave priority越低,优先级就越高

②如果优先级相同,那么就看replica offset那个slave复制了越多的数据,offset越靠后优先级就越高。

③洳果上面都想同那就选择run id最小的那个slave。

每次一个哨兵做主备切换首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做主备切换这个哨兵还要得到majority数量哨兵的授权,才能正式执行切换

如果 quorum >= majority,那么必须quorum数量的哨兵都授权才可以进行切换比如5个哨兵,quorum是5那么必须5个哨兵都同意授权,才可以进行切换

哨兵会对一套redis参数配置 master+slave进行监控,有相应的监控的配置

如果第一个选举出的哨兵切换失败了,那么其怹哨兵会等待failover-timeout时间,然后接替继续执行切换此时会重新获取一个新的configuration epoch,作为新的version号

哨兵完成切换之后,会在自己本地更新生成最新嘚master配置然后同步给其他的哨兵,就是通过之前说的pub/sub消息机制

这里之前的version号就很重要了,因为各种消息都是通过一个channel去发布和监听的所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的

其他的哨兵都是根据版本号的大小来更新自己的master配置的。

我要回帖

更多关于 redis参数配置 的文章

 

随机推荐