CentOS7/CentOS8安装Redis6.2.x
> 注:以`Redis 6.2.6`为例 # 下载 - 最新版本:[https://redis.io/download](https://redis.io/download),点击`Download 6.2.6` - 所有版本: - 直接下载:[https://download.redis.io/releases/](https://download.redis.io/releases/),点击下载 - 查看地址:[https://github.com/redis/redis-hashes/blob/master/README](https://github.com/redis/redis-hashes/blob/master/README),查看`hash`值和下载地址 下载后将安装包上传至服务器,或者使用 `wget` 命令下载,例如: ```bash wget http://download.redis.io/releases/redis-6.2.6.tar.gz ``` # 安装 下载的压缩包为源码包,需要经过编译、安装才能使用 ```bash # 解压 tar -zxf redis-6.2.6.tar.gz # 进入该目录 cd redis-6.2.6/ ``` ### CentOS7 > `CentOS7`的默认gcc版本较低,需要安装高版本 1. 安装软件集,若不执行 `make test` 则 `tcl` 不需要安装 ```bash yum -y install centos-release-scl tcl ``` 2. 刷新元数据缓存 ```bash yum makecache ``` 3. 安装高版本 `gcc` ,最低 `gcc 7.x` 版本的就可以,这里装高版本 `gcc 9.x.x` ```bash yum -y install devtoolset-9-gcc ``` 4. 启动支持高版本 `gcc` 的 `bash` ```bash scl enable devtoolset-9 bash ``` 5. 查看 `gcc` 版本,需要确认 `gcc` 版本已经是高版本,例如: `gcc (GCC) 9.3.1 20200408` ```bash gcc --version ``` 6. 编译 ```bash make ``` 7. 测试(没必要,时间很长) ```bash make test ``` 8. 安装至指定目录 ```bash make PREFIX=/usr/local/redis install ``` 9. 退出支持高版本 `gcc` 的 `bash` ```bash exit ``` 若中途编译出错,请先执行 `make distclean` 清除所有内容之后再检查环境并重新编译 ### CentOS8 1. 安装依赖(若不执行 `make test` 则 `tcl` 不需要安装) ```bash yum -y install make gcc tcl ``` 2. 编译 ```bash make MALLOC=libc ``` 3. 测试(没必要,时间很长) ```bash make test ``` 4. 安装 ```bash make PREFIX=/usr/local/redis install ``` # 环境变量 编辑环境变量配置文件 ```bash vim /etc/profile ``` 在文档末尾添加如下内容,插入后保存文件 ``` export PATH=$PATH:/usr/local/redis/bin ``` 使环境变量生效 ```bash source /etc/profile ``` # 解决WARNING 若直接启动 `redis-server` ,会出现如下四个 `WARNING` : - `Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf`<br>没有指定配置文件,使用了默认配置 - `WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.`<br>TCP backlog 值设置太小,参考: - 译文:[深入理解Linux TCP backlog](https://www.jianshu.com/p/7fde92785056) - 原文:[How TCP backlog works in Linux](http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html) - `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.`<br>overcommit_memory 不能设置为0,在内存不足的情况下,后台程序save可能失败。参考: - [有关linux下redis overcommit_memory的问题](https://blog.csdn.net/whycold/article/details/21388455) - `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.`<br>透明大页可能导致redis延迟和内存使用问题,参考: - [Linux 关于Transparent Hugepages的介绍](https://www.cnblogs.com/kerrycode/archive/2015/07/23/4670931.html) - [Linux传统Huge Pages与Transparent Huge Pages再次学习总结](https://www.cnblogs.com/kerrycode/p/7760026.html) #### WARNING 1 先跳过,下面的教程会设置配置文件 #### WARNING 2 3 编辑配置文件 ```bash vim /etc/sysctl.conf ``` 添加如下内容 ``` net.core.somaxconn = 1024 vm.overcommit_memory = 1 ``` 生效 ```bash sysctl -p ``` #### WARNING 4 > 临时生效 ```bash echo never > /sys/kernel/mm/transparent_hugepage/enabled ``` > 永久生效 编辑开机自启文件 ```bash vim /etc/rc.local ``` 将如下命令(即临时生效的命令)添加到该文件最后 ``` echo never > /sys/kernel/mm/transparent_hugepage/enabled ``` 允许rc.local执行 ```bash chmod +x /etc/rc.d/rc.local ``` # 设置配置文件 > 配置文件使用 `redis-6.2.6/redis.conf` 作为默认值 拷贝配置到安装目录下 ```bash cp redis.conf /usr/local/redis/ ``` 编辑配置文件 ```bash vim /usr/local/redis/redis.conf ``` 修改如下内容并保存 ```ini # 允许任意IP访问 bind 0.0.0.0 # 关闭保护模式(未设置密码时,允许空密码访问) protected-mode no # 端口(默认6379) port 6379 # 守护进程运行 daemonize yes # pid文件位置(防止安装多个Redis时冲突) pidfile /usr/local/redis/redis.pid # 日志文件位置 logfile /usr/local/redis/redis.log # 数据持久化保存位置(RDB与AOF均使用该配置) dir /usr/local/redis/ # 连接密码(设置初始密码,默认为空,建议设置) requirepass 123 # 开启AOF appendonly yes ``` > 从 `Redis 6` 开始, `requirepass` 只是一个兼容性设置,新版本应当使用 `ACL` 访问控制系统,这里先按照旧版本设置密码, `ACL` 后期介绍 # 设置系统服务 ### CentOS7(service) > 说明: - 以前的教程是用 `systemd` 管理的,但是不知道为啥不管用了,所以换成 `service` 管理 - 脚本中停止服务使用 `kill` 指令,原生的 `redis-cli shutdown` 在有密码的时候不管用 新建一个服务文件 ```bash vim /etc/init.d/redis ``` 内容如下 ```bash #!/bin/sh #Configurations injected by install_server below.... EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli PIDFILE=/usr/local/redis/redis.pid CONF="/usr/local/redis/redis.conf" REDISPORT="6379" ############### # SysV Init Information # chkconfig: - 58 74 # description: redis is the redis daemon. ### BEGIN INIT INFO # Provides: redis # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Should-Start: $syslog $named # Should-Stop: $syslog $named # Short-Description: start and stop redis # Description: Redis daemon ### END INIT INFO case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." kill -15 ${PID} # $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; status) PID=$(cat $PIDFILE) if [ ! -x /proc/${PID} ] then echo 'Redis is not running' else echo "Redis is running ($PID)" fi ;; restart) $0 stop $0 start ;; *) echo "Please use start, stop, restart or status as first argument" ;; esac ``` 设置开机自启 ```bash chmod +x /etc/init.d/redis chkconfig --add redis ``` 启动服务 ```bash service redis start ``` ### CentOS8(systemd) > 内容参考 `redis-6.0.8/utils/systemd-redis_server.service` 新建一个服务文件 ```bash vim /usr/lib/systemd/system/redis.service ``` 内容如下 ```ini [Unit] Description=redis.server Wants=network-online.target After=network-online.target [Service] ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf Type=forking TimeoutStartSec=infinity TimeoutStopSec=infinity [Install] WantedBy=multi-user.target ``` 刷新系统服务、设置开机自启、启动服务 ```bash systemctl daemon-reload systemctl enable redis.service systemctl start redis.service ``` # 删除源文件 ```bash cd .. rm -rf redis-6.2.6* ``` # 测试连接 > 配置文件内设置的是临时密码,建议修改一下 ```bash # 连接redis redis-cli # 登录(若配置文件内未设置密码,则跳过) AUTH 123456 # 测试(收到PONG消息) ping ```