1.1、编辑/etc/sysctl.conf,增加以下对应配置:
#内存分配策略 1表示内核允许分配所有的物理内存,而不管当前的内存状态如何 vm.overcommit_memory=1 #系统默认的128,限制了接收新 TCP 连接侦听队列的大小 net.core.somaxconn = 2048 |
然后执行sysctl -p,使生效
1.2、修改文件数,文件数限制了tcp连接数量。
执行命令:ulimit -n 65535
再编辑/etc/security/limits.conf,增加以下配置:
* soft nofile 65535 * hard nofile 65535 |
1.3、 禁用大内存页面
执行命令:echo never > /sys/kernel/mm/transparent_hugepage/enabled
参数 |
设置值 |
含义 |
bind |
对应访问ip |
只能通过对应ip进行访问 |
protected-mode |
yes |
保护模式,默认开启 |
Port |
对应端口 |
Redis监听端口,默认端口为6379 |
tcp-backlog |
2048 |
此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p |
daemonize |
yes |
yes:后台运行; no:不是后台运行 |
pidfile |
配置对应路径,如果一台上部署多台redis,最好设置 |
redis的进程文件 |
logfile |
配置对应路径 |
指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。 |
save |
默认值(启动rdb方式进行持久化,因为集群之间也是通过rdb文件进行同步的,而且手动切换时,手动执行save命令,进行强制备份,保证数据持久化不丢失,恢复大量数据时,rdb方式会比aof快很多) |
设置sedis进行数据库镜像的频率。 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化) |
stop-writes-on-bgsave-error |
no |
当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作 |
rdbcompression |
no(不必压缩) |
使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间 |
rdbchecksum |
no(不必校验) |
是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。 |
dir |
手动指定 |
如果对应日志、集群配置文件、rdb、aof等文件没有配置绝对路径,则都会在此目录下 |
repl-diskless-sync |
yes(只有一个slave节点) |
是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。 |
repl-diskless-sync-delay |
0(只有一个slave节点) |
diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。 |
repl-ping-slave-period |
3 |
slave根据指定的时间间隔向服务器发送ping请求。单位秒 |
repl-timeout |
300 |
复制连接超时时间,单位秒。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。 |
maxclients |
0 |
设置同一时间最大客户端连接数,默认10000,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 |
maxmemory |
给os留下足够的内存,避免使用交换分区 |
redis配置的最大内存容量,单位byte。当内存满了,需要配合maxmemory-policy策略进行处理。注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。 |
maxmemory-policy |
noeviction |
内存容量超过maxmemory后的处理策略。 volatile-lru:利用LRU算法移除设置过过期时间的key。 volatile-random:随机移除设置过过期时间的key。 volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL) allkeys-lru:利用LRU算法移除任何key。 allkeys-random:随机移除任何key。 noeviction:不移除任何key,只是返回一个写错误。 |
maxmemory-samples |
5 |
lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除。 |
cluster-enabled |
yes |
集群开关,默认是不开启集群模式 |
cluster-config-file |
配置文件路径,最好配置绝对路径,文件名:nodes-端口号.conf
|
集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件由Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突 |
cluster-node-timeout |
5000 |
节点互连超时的阀值。集群节点超时毫秒数 |
cluster-slave-validity-factor |
10 |
在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是: 比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 |
cluster-migration-barrier |
2 |
master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。 |
cluster-require-full-coverage |
no(需要根据使用方式来定) |
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。 |
slowlog-log-slower-than |
10000 |
单位ns,记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。 |
slowlog-max-len |
128 |
慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。 |
配置 |
默认值 |
含义 |
bind |
127.0.0.1 |
绑定的主机地址,只能通过指定的主机地址进行访问。 |
protected-mode |
yes |
3.2增加的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码 和bind,可以开启。否 则最好关闭,设置为no。 |
port |
6379 |
指定Redis监听端口,默认端口为6379 |
tcp-backlog |
511 |
此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p |
timeout |
0 |
当客户端闲置多长时间后关闭连接,为0则服务端不会主动断开连接 |
tcp-keepalive |
300 |
keepalive参数,单位秒。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端断开的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值 |
daemonize |
no |
yes:后台运行; no:不是后台运行 |
pidfile |
/var/run/redis_6379.pid |
redis的进程文件 |
loglevel |
notice |
服务端日志的级别。级别包括:debug(方便开发、测试),verbose(基本的信息),notice(适合生产环境),warn(只有非常重要的信息) |
logfile |
“” |
指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。 |
databases |
16 |
数据库的数量,默认使用的数据库是DB 0。可以通过”SELECT “命令选择一个db |
save |
save 900 1 save 300 10 save 60 10000 |
设置sedis进行数据库镜像的频率。 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化) |
stop-writes-on-bgsave-error |
yes |
当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作 |
rdbcompression |
yes |
使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间 |
rdbchecksum |
yes |
是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。 |
dbfilename |
dump.rdb |
rdb文件的名称 |
dir |
./ |
rdb、aof文件都会写在这个目录 |
slaveof |
不启用 |
slave实时同步master节点数据 |
masterauth |
不启用 |
如果master设置了requirepass,那么slave要连上master,配置master密码 |
slave-serve-stale-data |
yes |
当slave同master失去连接或者复制正在进行,slave有两种运行方式:yes会继续响应客户端的请求;no除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress” |
slave-read-only |
yes |
作为slave,是否只读 |
repl-diskless-sync |
no |
是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。 |
repl-diskless-sync-delay |
5 |
diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。 |
repl-ping-slave-period |
10 |
slave根据指定的时间间隔向服务器发送ping请求。 |
repl-timeout |
60 |
复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。 |
repl-disable-tcp-nodelay |
no |
是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。 |
repl-backlog-size |
1m |
复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。 |
repl-backlog-ttl |
3600 |
master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。 |
slave-priority |
100 |
当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。 |
requirepass |
不启用 |
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH |
maxclients |
10000 |
设置同一时间最大客户端连接数,默认10000,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 |
maxmemory |
默认无上限 |
redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进行处理。注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。 |
maxmemory-policy |
noeviction |
内存容量超过maxmemory后的处理策略。 volatile-lru:利用LRU算法移除设置过过期时间的key。 volatile-random:随机移除设置过过期时间的key。 volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL) allkeys-lru:利用LRU算法移除任何key。 allkeys-random:随机移除任何key。 noeviction:不移除任何key,只是返回一个写错误。 |
maxmemory-samples |
5 |
lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除。 |
appendonly |
no |
默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。 |
appendfilename |
“appendonly.aof” |
aof文件名 |
appendfsync |
everysec |
aof持久化策略的配置 no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。 always表示每次写入都执行fsync,以保证数据同步到磁盘。 everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。 |
no-appendfsync-on-rewrite |
no |
在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。 |
auto-aof-rewrite-percentage |
100 |
aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。 |
auto-aof-rewrite-min-size |
64mb |
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写 |
aof-load-truncated |
yes |
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。 |
cluster-enabled |
不启用 |
集群开关,默认是不开启集群模式 |
cluster-config-file |
不启用 |
集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件由Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突 |
cluster-node-timeout |
不启用 |
节点互连超时的阀值。集群节点超时毫秒数 |
cluster-slave-validity-factor |
不启用 |
在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是: 比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 |
cluster-migration-barrier |
不启用 |
master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。 |
cluster-require-full-coverage |
不启用 |
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。 |
slowlog-log-slower-than |
10000 |
单位ns,记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。 |
slowlog-max-len |
128 |
慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。 |
aof-rewrite-incremental-fsync |
yes |
在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。 |