系统配置

vm.overcommit_memory

Linux系统对内存请求都会分配,以便能运行更多程序。在申请内存后并不会马上使用内存,这种技术就叫做overcommit,如果参数设置为0则Redis会出现告警。

WARNING overcommit_memory is set 0!

该参数有三个值可选,Redis建议设置为1并配合maxmemory使用

描述
0 内核将检查是否有可用内存(包括swap),如果有足够的内存,则申请通过,否则将失败信息返回给应用程序
1 内核允许超量使用内存直到用完为止
2 内核保证不会超量使用内存,即不超过swap+50%的RAM值,50%是参数overcommit_ratio控制

修改内核参数

$ echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
$ sysctl vm.overcommit_memory=1

swappiness

swap内存交换空间能够在内存不足时,对部分内存页进行swap操作。但swap空间是由硬盘提供,对于高并发应用程序来说,磁盘IO能力会成为系统瓶颈。Linux并不是完全等到内存不够用时才使用swap,参数swappiness会决定系统使用swap的策略。swappiness取值范围为0~100,值越大说明系统会更积极使用swap,值越低系统就更倾向于物理内存,默认值为60

描述
0 Linux3.5以及以上:宁愿OOM killer也不用swap;Linux3.4以及更早:宁愿swap也不要OOM killer
1 Linux3.5以及以上:宁愿swap也不要OOM killer
60 默认值
100 操作系统会主动地使用swap

查看swap使用情况

$ redis-cli -h ip -p port info server | grep process_id
process_id:986

$ cat /proc/886/smaps | grep swap
Swap: 58056 kB
....

设置swappiness

$ echo 1 >/proc/sys/vm/swappiness
$ echo vm.swappiness=1 >> /etc/sysctl.conf

如果Linux > 3.5 ,则设置为1,否则设置为0。但是Redis为高可用环境时,死掉会比阻塞更好,能够及时切换到正常节点上

THP

Linux kernel在2.6.38内核增加了Transparent Huge Pages (THP)特性 ,支持大内存页(2MB)分配,默认开启。当开启时可以降低fork子进程的速度,但fork之后,每个内存页从原来4KB变为2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询。因此,建议关闭该功能。

$ echo never >  /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
$ echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
$ echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.local

NTP

无论是什么数据库环境,都强烈建议配置时间同步,避免集群节点出现时间不一致的情况,增加问题排查日志难度,定时任务异常等情况。日常可以使用NTP服务来作为时间同步,通过crontab定时同步系统时间

ulimit

open files限制单个用户最大文件打开个数。Redis的maxclients默认为10000,加上最大32个文件描述符,因此建议open files设置为至少10032,如果采用默认的4096,减去32个文件描述符,则maxclients仅为4064

$ ulimit -Sn 10032

TCP backlog

Redis默认的tcp-backlog为511,可以通过修改配置tcp-backlog进行调整,如果Linux的tcp-backlog小于Redis设置的tcp-backlog,那么在Redis启动时会看到如下日志:

# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

修改tcp backlog

$ echo 1024 > /proc/sys/net/core/somaxconn

Redis安装

解压安装包

$ tar -xvf redis-4.0.9.tar.gz

编译安装

$ cd redis-4.0.9
$ make && cd src
$ make install PREFIX=/usr/local/redis -j 4

创建数据目录

$ mdkir /service/redis/data
$ mkdir /service/redis/logs

参数配置(/etc/redis.conf)

daemonize yes
port 66803
timeout 0
tcp-keepalive 60
loglevel notice
databases 6
protected-mode no
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/service/redis"
pidfile "/service/redis/pid.file"
logfile "/service/redis/redis.log"
requirepass "Abcd123#"
maxmemory 24576000000
bind 10.240.204.157
repl-timeout 3600
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
slave-priority 50
rename-command KEYS alias-keys
rename-command FLUSHALL alias-flushall
rename-command FLUSHDB alias-flushdb

设置环境变量

$ echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile
$ source /etc/profile

启动数据库实例

$ redis-server /etc/redis.conf

附录

参数详解

参数 说明
daemonize 是否以后台进程启动
databases 创建database的数量
port 进程对应的端口,默认为6379
tcp-keepalive 指定TCP连接是否为长连接,0则关闭,非0则开启
loglevel Server日志级别:debug调试模式、verbose、notice、warning
protected-mode 外网保护模式,禁止外网访问redis,如果要设置为no,需确保数据库不会暴漏在外网,设置为YES的话需要设置bind绑定内网IP或设置实例密码
pidfile 指定pid文件的存放位置
logfile 指定日志文件的存放位置
requirepass 设置redis登录密码
maxmemory 设置redis最大内存大小,单位为byte
bind 设置绑定的网口IP,用于接收服务请求
hz Server执行后台任务的频率
save rdb持久化策略,例如save 300 1表示5分钟内至少一个key变更则触发持久化操作,禁用rdb持久化可设置save “”
rdbcompression 是否启用rdb文件压缩,默认为yes
rdbchecksum 是否对rdb文件使用CRC64校验和
stop-writes-on-bgsave-error 当bgsave持久化写入错误时是否停止
dbfilename 设置rdb文件名称,默认为dump.rdb
dir 指定持久化文件的存放位置
appendonly 是否开启AOF持久化
appendfilename 指定AOF持久化文件名称,默认为appendonly.aof
appendfsync AOF持久化策略,可选值有always、everysec、no
no-appendfsync-on-rewrite 表示rewrite重写AOF时,是否阻塞AOF持久化,no表示会阻塞
auto-aof-rewrite-percentage 触发AOF文件rewrite的增长百分比
auto-aof-rewrite-min-size 触发AOF文件rewrite的大小
aof-rewrite-incremental-fsync AOF rewrite是否采取增量文件同步策略
slaveof 当前为从库时,设置同步主库信息
masterauth 当前为从库时,设置主库的登录密码
repl-timeout 复制超时时间,单位为秒,默认为60
slave-server-stale-data 当前为从库时,在与主库连接断开时,是否继续提供服务
slave-read-only 当前为从库时,只读
redis-disable-tcp-nodelay 主从是否延迟传输
slave-priority 指定slave的优先级,在哨兵模式下,主库宕机,会将优先级最小的提升为master。如果设置为0则永远不会提升为master
slowlog-log-slower-than 慢查询日志记录阀值,单位为微秒,超过阀值将被记录到慢查询日志
slowlog-max-len 控制slow log保留多少条记录,超过后将删除最旧的一条记录
hash-max-ziplist-entries hash类型默认采用ziplist结构编码,超过该值则采用hashtable
hash-max-ziplist-value ziplist允许条目value值的最大字节数
list-max-ziplist-entries list类型默认采用ziplist结构编码,超过该值则采用linkedlist
list-max-ziplist-value ziplist允许条目value值的最大字节数
set-max-intset-entries intset中允许保存的最大条目数,如果达到阀值,才重构为hashtable
zset-max-ziplist-entries zset类型默认采用ziplist编码结构,超过阀值将重构为skiplist
zset-max-ziplist-value zset允许条目value值的最大字节数
activerehashing 是否开启顶层数据结构得rehash功能
client-output-buffer-limit normal 客户端buffer控制,normal表示普通连接,hard表示最大值,一旦到达立即关闭连接,soft表示容忍值,和seconds配合表示在超过seconds则关闭连接,都设置为0则表示禁用
client-output-buffer-limit slave 客户端buffer控制,slave表示从库连接,hard表示最大值,一旦到达立即关闭连接,soft表示容忍值,和seconds配合表示在超过seconds则关闭连接,都设置为0则表示禁用
client-output-buffer-limit pubsub 客户端buffer控制,pubsub表示pub/sub类型连接,hard表示最大值,一旦到达立即关闭连接,soft表示容忍值,和seconds配合表示在超过seconds则关闭连接,都设置为0则表示禁用
rename-command 重命名指定命令