不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

同一台服务器部署不同应用或者同一应用部署不同环境,需要redis服务多开防止数据冲突问题。

一、安装redis

需要安装gcc编译工具 yum install gcc -y

  源码安装默认Redis程序安装在/usr/local/redis目录下;配置文件:/usr/local/redis/redis.conf,该配置文件中配置的端口为默认端口:6379;
Redis的启动命令路径:/usr/local/bin/redis-server。以下为二进制安装

tar zxvf redis-5.0.5.tar.gz -C /u01/redis
mv /u01/redis/redis-5.0.5 /u01/redis/redis_6379
cd
/u01/redis/redis_6379
make
#jemalloc/jemalloc.h没有文件报错用
make MALLOC=libc

更改redis改配置文件

vim /u01/redis/redis_6379/redis.conf

#打开redis后台启动

将daemonize no 改成daemonize yes

#开启密码验证,这个密码对应application.yml第三部分中redis模块password字段

requirepass mypassword

内存优化,增大TCP队列

vi /etc/sysctl.conf

vm.overcommit_memory = 1
net.core.somaxconn = 2048

sysctl -p

增加系统进程文件数

vi /etc/security/limits.conf

* soft noproc 10240
* hard noproc 10240
* soft nofile 65535
* hard nofile 65535

ulimit -a    #查看是否生效

 

启动redis

/u01/redis/redis_6379/src/redis-server /u01/redis/redis_6379/redis.conf


三、redis多实例

1、复制新的redis 文件夹,改变配置名称

cp -r /u01/redis/redis_6379/ /u01/redis/redis_6380/

2、修改配置文件里面的参数

vi /u01/redis/redis_6380/redis.conf
  • port 端口号
  • pidfile PID文件路径
  • logfile    日志文件路径
  • dbfilename    转储文件路径

2、启动新的redis 并放开端口

/u01/redis/redis_6380/src/redis-server /u01/redis/redis_6380/redis.conf
#查看端口是否启动
ss -ntlp|grep 6380

 

四、redis配置文件详解

# Redis 配置文件

# 默认情况下,redis不是在后台模式运行的,如果需要在后台进程运行,把该项的值更改为yes,默认为no
daemonize no
#redis服务以后台进程运行的时候,Redis默认会把pid写入/var/run/redis.pid文件组
pidfile /var/run/redis.pid
# 指定redis监听端口,默认为6379
port 6379
# 指定redis只接收来自于该IP地址的请求,如果不进行设置,默认将处理所有请求,我们是在生产环境下,所以这是必备项
bind 10.160.29.5
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
timeout 2
# 指定日志记录级别
# Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
# debug  记录很多信息,用于开发和测试
# varbose 很多精简的有用信息,不像debug会记录那么多
# notice 普通的verbose,常用于生产环境
# warning 只有非常重要或者严重的信息会记录到日志
loglevel verbose
# 可用数据库数,默认值为16,默认数据库存储在DB 0号ID库中,无特殊需求,建议仅设置一个数据库 databases 1
databases 16
# 把数据库存到磁盘上:
#   下面的例子将会进行把数据写入磁盘的操作:
#   900秒(15分钟)之后,且至少有1个key(次)变更
#   300秒(5分钟)之后,且至少有10个key(次)变更
#   60秒之后,且至少有10000个key(次)变更
#   注意:如果不需要写磁盘,则把所有 "save" 设置注释掉,即实现全内存服务器。
save 900 1
save 300 10
save 60 10000
# 数据库的文件名及存放路径
dbfilename rdbfile.rdb
# 工作目录
# 本地数据库会写到这个目录下,文件名就是上面的 "dbfilename" 的值。
dir /usr/local/rdbfile
# 主从同步。通过 slaveof 配置来实现Redis实例的备份。
# 当本机为从服务时,设置主服务的IP及端口,在Redis启动时,它会自动从主服务进行数据同步
slaveof
#当本机为从服务时,设置主服务的连接密码
# masterauth
# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
# 1) 如果 slave-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 2) 如果 slave-serve-stale-data 设置为 "no",slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
slave-serve-stale-data yes
# slave根据指定的时间间隔向服务器发送ping请求。
# 时间间隔可以通过 repl_ping_slave_period 来设置。
# 默认10秒
repl-ping-slave-period 5
# 设置最大同时连接客户端数量,0表示没有限制,一旦达到这个限制,Redis会关闭所有新连接并发送错误达到最大用户数上限。
maxclients 1024
# 设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。
maxmemory 10240000000分配10G内存
# 内存策略:如果达到内存限制了,Redis如何删除key。你可以在下面五个策略里面选:
# volatile-lru -> 根据LRU算法生成的过期时间来删除。
# allkeys-lru -> 根据LRU算法删除任何key。
# volatile-random -> 根据过期设置来随机删除key。
# allkeys->random -> 无差别随机删。
# volatile-ttl -> 根据最近过期时间来删除(辅以TTL)
# noeviction -> 谁也不删,直接在写操作时返回错误。
maxmemory-policy noeviction
# 开启累加模式,因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中,这种情况下,当Redis宕机的时候,最新的数据就丢了。
#如果不希望丢掉任何一条数据的话就该用纯累加模式:一旦开启这个模式,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件。
appendonly yes
# 设置纯累加文件名字及保存路径,默认:"appendonly.aof"
appendfilename appendonly.aof
# Redis慢查询日志可以记录超过指定时间的查询。运行时间不包括各种I/O时间。
slowlog-log-slower-than 10000

 

四、redis 服务器性能优化

1、系统内存OOM优化

 vm.overcommit_memory

Redis会占用非常大内存,所以通常需要关闭系统的OOM,方法为将“/proc/sys/vm/overcommit_memory”的值设置为1(通常不建议设置为2)
也可以使用命令sysctl设置,如:sysctl vm.overcommit_memory=1,但注意一定要同时修改文件/etc/sysctl.conf,执行“sysctl -p”,以便得系统重启后仍然生效。

可选值:0、1、2。

0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2: 表示内核允许分配超过所有物理内存和交换空间总和的内存

# cat /proc/sys/vm/overcommit_memory
0

# echo vm.overcommit_memory = 1 >> /etc/sysctl.conf

# sysctl -p

2、关闭透明大页(THP)

 

 透明大页(THP)管理和标准/传统大页(HP)管理都是操作系统为了减少页表转换消耗的资源而发布的新特性。这二者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

为使机器重启后THP配置依然生效,可以在/etc/rc.local 中追加 echo never>/sys/kernel/mm/transparent_hugepage/enabled

echo 'echo never>/sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
chmod +x  /etc/rc.d/rc.local

3.优化内存

设置maxmemory

设置Redis使用的最大物理内存,即Redis在占用maxmemory大小的内存之后就开始拒绝后续的写入请求,该参数可以确保Redis因为使用 了大量内存严重影响速度或者发生OOM(out-of-memory,发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存)。此外, 可以使用info命令查看Redis占用的内存及其它信息。
查看内存占用命令:info memory 

主要关注used_memory(数据占用内存大小) 和 used_memory_rss(操作系统算出来redis进程占用内存大小),内存碎片率mem_fragmentation_ratio =used_memory_rss / used_memory
如果>1,说明有内存碎片,如果<1,说明有内存被操作系统弄到硬盘swap区去了。

设置最大内存命令

config set maxmemory 4294967296

config配置文件中添加 <bytes>

maxmemory 4294967296

内存回收策略

  • volatile-lru  从已设置过期时间的数据集(server .db[i].expires)中挑选最近最少使用的数据淘汰。
  • allkeys-lru  从数据集(server .db[i].dict)中挑选最近最少使用的数据淘汰
  • volatile-lfu  从设置了过期时间的数据集(server .db[i].expires)中选择某段时间之内使用频次最小的键值对清除掉
  • allkeys-lfu  从所有的数据集(server .db[i].dict)中选择某段时间之内使用频次最少的键值对清除
  • volatile-ttl  从已设置过期时间的数据集(server .db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random  从已设置过期时间的数据集(server .db[i].expires)中任意选择数据淘汰
  • allkeys-random  从数据集(server .db[i].dict)中任意选择数据淘汰
  • no-enviction  当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。

allkeys-lru :如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择 allkeys-lru策略。
allkeys-random :如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。
volatile-lru和volatile-random:适合将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存
建议使用allkeys-lru策略从而更有效率的使用内存

设置淘汰策略命令

config set maxmemory-policy noeviction

config配置文件中添加

maxmemory-policy allkeys-lru

4、增大TCP队列的值

此参数是指:已完成三次握手的TCP连接队列,默认值511,但是Linux系统内核参数socket最大连接的值默认是128,对应文件/proc/sys/net/core/somaxconn,当系统并发量大且客户端连接缓慢时,应该将两个值进行参考设置。

建议将/proc/sys/net/core/somaxconn的值设置为2048, 如果重启生效,需要在/etc/sysctl.conf中设置: net.core.somaxconn = 2048 执行sysctl -p生效

[root@redis01 ~]# cat /proc/sys/net/core/somaxconn
128

[root@redis01 ~]# echo "net.core.somaxconn = 2048" >> /etc/sysctl.conf 
[root@redis01 ~]# sysctl -p
vm.overcommit_memory = 1
net.core.somaxconn = 2048

5、增大linux最大打开文件数

[root@redis01 ~]# cat /etc/security/limits.conf 

* soft noproc 10240
* hard noproc 10240
* soft nofile 65535
* hard nofile 65535 
需要重启生效
[root@redis01 ~]# ulimit -n 

6、设置密码requirepass和masterauth

requirepass用于客户端连接时的认证,masterauth用于slave向master请求复制数据时的认证。

注意事项:
    (1)密码要复杂
    (2)masterauth   不能忘记,且通过明文传输

7、将危险命令使用rename-command设置为空或别名

注意事项:
    (1)此配置不支持config set动态进行。
    (2)config命令本身不建议设置成别名。

8、使用非root用户启动,使用非默认端口

 

 

参考资料 https://www.cnblogs.com/shoshana-kong/p/14040198.html