天天看点

Linux下Redis详细安装及配置

分享知识 传递快乐

在安装前先安装以下插件:

yum install gcc-c++

yum install pcre pcre-devel

yum install zlib

zlib-devel yum install openssl openssl–devel

否则不能编译通过。

连接时一定要关闭防火强:

[root@WEB redis-3.0.6]# make
cd src && make all
make[1]: 进入目录“/root/lnmp_soft/redis-3.0.6/src”
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
#include <jemalloc/jemalloc.h>
^
编译中断。
make[1]: [adlist.o] 错误 1
make[1]: 离开目录“/root/lnmp_soft/redis-3.0.6/src”
make: [all] 错误 2      

如果出现上术问题,直接输入:make MALLOC=libc。

Linux启动Redis时出现警告

./redist-server

或者指定配置文件

./redis-server redis.conf

则可以看到启动日志,这里会有三个WARN:

11980:M 08 Dec 11:30:51.347 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
11980:M 08 Dec 11:30:51.347 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
11980:M 08 Dec 11:30:51.347 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.      

按照提示分别修复

1.第一个提示somaxconn这个值为128太小了,这个值是系统的网络连接队列大小,而redis的TCP backlog设置的值为511,因此受限,所以修改下系统的值

$ vim /etc/sysctl.conf
$ net.core.somaxconn = 20480  #最大队列长度,应付突发的大并发连接请求,默认为128
$ net.ipv4.tcp_max_syn_backlog = 20480  #半连接队列长度,此值受限于内存大小,默认为1024
$ sysctl -p  #使参数生效      

2.​

​overcommit_memory​

​设置为0,在低内存条件下可能会保存失败,修复方法是在sysctl.conf下添加​

​vm.overcommit_memory = 1​

vm.overcommit_memory不同的值说明:

0 表示检查是否有足够的内存可用,如果是,允许分配;如果内存不够,拒绝该请求,并返回一个错误给应用程序。

1 允许分配超出物理内存加上交换内存的请求

2 内核总是返回true

redis的数据回写机制分为两种

同步回写即SAVE命令。redis主进程直接写数据到磁盘。当数据量大时,这个命令将阻塞,响应时间长。

异步回写即BGSAVE命令。redis 主进程fork一个子进程,复制主进程的内存并通过子进程回写数据到磁盘。

由于RDB文件写的时候fork一个子进程。相当于复制了一个内存镜像。当时系统的内存是4G,而redis占用了近3G的内存,因此肯定会报内存无法分配。如果 「vm.overcommit_memory」设置为0,在可用内存不足的情况下,就无法分配新的内存。如果 「vm.overcommit_memory」设置为1。 那么redis将使用交换内存。

修改方案:

$ vim /etc/sysctl.conf
$ vm.overcommit_memory = 1  
$ sysctl -p  #使参数生效      

3.关闭THP透明内存

​Transparent Huge Pages (THP)​

​告警,这是一个关于透明内存巨页的话题。简单来说内存可管理的最小单位是page,一个page通常是4kb,那1M内存就会有256个page,CPU通过内置的内存管理单元管理page表记录。Huge Pages就是表示page的大小已超过4kb了,一般是2M到1G,它的出现主要是为了管理超大内存。个人理解上TB的内存。而THP就是管理Huge Pages的一个抽象层次,根据一些资料显示THP会导致内存锁影响性能,所以一般建议关闭此功能。

/sys/kernel/mm/transparent_hugepage/enabled有三个值,如下:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
####
# always 尽量使用透明内存,扫描内存,有512个 4k页面可以整合,就整合成一个2M的页面
# never 关闭,不使用透明内存
# madvise 避免改变内存占用      

修改方法:

$ vim /etc/rc.local
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled  #在开机脚本里追加此命令      

再启动,则不报错了。

以上配置只能在本机访问,不能远程访问

redis 远程连接方法

在虚拟机上安装了redis,启动后本机客户端可以连接访问,但是外部主机一直访问不了,解决方法如下:

修改redis服务器的配置文件:

vim redis.conf

注释以下绑定的主机地址:

# bind 127.0.0.1 (开启这个配置时:redis 只接收来自于该 IP 地址列表的请求,如果不进行设置,那么将处理所有请求。)      

或分别修改以下值:

bind 0.0.0.0

此时还是不能访问redis,redis默认开启了保护模式,继续查看redis.conf文件,发现3.2后新增protected-mode配置,默认是yes,即开启。

解决方法分为两种:

1、关闭protected-mode模式

protected-mode no

2、配置bind或者设置密码

requirepass admini (在redis.conf配置文件中)

继续阅读