Ubuntu18.04系统中Redis的安装

  Redis是一款非常流行的Nosql数据库。其支持丰富的数据结构:字符串(string)、散列(hash)、列表(list)、集合(set)和有序集合(sorted set)(传统5项),后续版本又增加了HyperLogLog、位图、流和地理坐标等新的数据结构。除此之外,它也是一款内存数据库(所有的数据都存储在内存中),所以具有天然的速度优势。

  实践是检验真理的唯一标准,技术类的知识只有多实践才能学得扎实,因此搭建合适的环境是必不可少的。本文将讲解如何在Linux中搭建Redis服务(由于时间有限,只会演示在Ubuntu18.04中的安装步骤)

一、安装准备

1.1、下载安装包

在安装之前,需要先从官网下载Redis安装包:
https://download.redis.io/releases
我选择的版本是6.0.9

1.2、检查是否安装过redis

在安装之前还需要检查下之前是否安装过redis,以及是否安装过gcc(编译工具):

# 检查是否安装过redis
whereis redis
# 检查是否安装过gcc
whereis gcc

假如结果如下:

redis:

表示本机尚未安装redis服务。
如果输出如下,则表示redis的相关文件已经存在:

root@proxy_server_01:~# whereis redis
redis: /usr/local/redis

注:需要注意的是文件存在 不代表redis服务已经启动

为了确定redis服务进程是否已经启动,还需要执行:

ps -ef|grep redis-server

 

二、安装步骤

2.1、复制安装包到服务器

2.1.1、复制安装包

在本地机器上下载redis安装包,我是通过Xshell连接到Linux服务器的。所以可以通过下面的命令将包复制到服务器:

# 打开文件选择窗口
rz -r

说明:

  • 运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器
  • 只适合传输较小的文件
2.1.2、解压安装包

解压安装包:

# 以root身份登录系统,解压文件,在home目录生成redis-6.0.9的文件夹
tar -xzf redis-6.0.9.tar.gz

2.2、编译和安装

打开目录到~/redis-6.0.9

cd ./redis-6.0.9

编译代码:

make

安装redis

# 通过PREFIX指定redis的安装路径
make install PREFIX=/usr/local/redis

该命令执行后:

  • 生成/usr/local/redis
  • redis目录中只有一个bin目录

Q:那么为什么要使用PREFIX参数呢?

这个关键字用于在编译的时候指定程序存放的路径

如果不指定该参数,Linux将会按如下规则存放文件:

  • 可执行文件 => /usr/local/bin
  • 库文件 => /usr/local/lib
  • 配置文件 => /usr/local/etc
  • 其他的资源文件 => /usr/local/share

所以,指定该参数的目的就是 方便后续的软件卸载

# 卸载redis
rm -rf /usr/local/redis

redis目录内容如下:
install后
bin目录中有如下文件:

  • redis-benchmark:redis的批量操作工具,也是redis的性能测试工具
  • redis-check-aof:检查aof的日志是否正常的工具
  • redis-check-rdb:检查rdb日志是否正常的工具
  • redis-cli:redis客户端
  • redis-server:redis服务的启动命令
  • redis-sentinal:redis的哨兵

相关内容如下所示:
bin目录
注:网上有些教程是直接将bin目录生成在源码目录的,这里不推荐这么做。因为我们要尽量搭建一个干净纯粹的环境

 
在正式启动redis服务之前,我们还需要复制一份配置到/usr/local/redis:

# 复制redis.conf到/usr/local/redis/conf/目录
mkdir conf && cp ~/redis-6.0.9/redis.conf /usr/local/redis/conf/

这里我们暂且使用默认的配置参数。
 

2.3、启动Redis服务

可以通过两种方式启动redis服务:

  1. 以后台服务启动
  2. 随系统开机启动
2.3.1、以后台服务启动

通过如下命令可在后台启动redis:

/usr/local/redis/bin/redis-server& /usr/local/redis/conf/redis.conf 

启动成功后会在终端打印启动信息
启动信息
说明:

  • 默认以单机模式运行Redis服务
  • 以后台服务运行,可以回车后继续在服务器做其他事情。
2.3.2、随系统开机启动

追加启动脚本
打开/etc/rc.local:

# 打开/etc/rc.local
vim /etc/rc.local
# 追加如下启动命令
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

如果使用的是Ubuntu系统,并且本地没有/etc/rc.local文件,可以参考我的另一篇文章:

[Linux]Ubuntu18.04如何增加开机启动服务

重启服务

# 重启服务
systemctl restart rc-local.service

2.4、连接到Redis

有两种方式连接redis-server服务:

  1. redis-cli
  2. 远程连接(redis客户端)

在平时的工作中更多的是使用第二种方式访问redis中的数据。redis-cli连接方式更适合于在服务器本地对redis中的数据进行管理(DBA可能更喜欢这种方式)。

2.4.1、redis-cli连接

可以在服务器通过执行如下命令连接到Redis服务:

 /usr/local/redis/bin/redis-cli

成功连接的效果如下:

127.0.0.1:6379> 
# 设置键值key1
127.0.0.1:6379> SET key1 12345
OK
# 获取key1的值
127.0.0.1:6379> GET key1
"12345"

追问:

是否可以通过redis-cli进行远程连接?
答案 :可以进行远程连接。
 
代码如下:
/usr/local/redis/bin/redis-cli -h 192.168.43.9 -p 6379
-h 是host,-p 是端口号

2.4.2、远程连接

我使用的Redis客户端是:Another Redis Desktop Manager
但是在连接Redis的时候报了如下的错:
redis连接报错
报错关键字为:

write ECONNABORTED Config right?

突然记起一件很重要的事:

redis 3.2以上的版本默认是不允许外网访问的需要修改redis.conf配置文件
并且在2.2节曾经说过:

…暂且使用默认的配置参数

那么先检查下redis.conf的相关配置吧:

  • 注释掉bind 127.0.0.1 => 否则redis服务只能在服务器本地访问
  • protected-mode设置为no => 解除保护模式
  • daemonize设置为yes => 设为守护进程

注释bind
vim编辑器中可通过如下命令进行protected-mode的设置:

# 非编辑模式下按yy => 复制当前行
yy
# 再按p => 粘贴到下一行
p
# 将protected-mode yes改为 protected-mode no

在这里插入图片描述
重启一下Redis服务:

# 在客户端中执行如下命令
#~~此时因为无法远程连接,只能通过在服务器使用redis-cli连接后执行~~
shutdown SAVE

重新连接,还是报错。
那么是否是防火墙的问题呢?

#ufw是Ubuntu18.04的防火墙设置命令
root@proxy_server_01:~# ufw status
Status: inactive

防火墙是关闭的,所以不是防火墙的原因。

在本机(windows系统)的cmd命令行中执行如下命令连接到Redis服务器的6379端口:

telnet 192.168.43.9 6379

弹出如下提示:

-DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

看提示信息,好像是修改的配置文件没有生效。再仔细检查下启动信息??
启动信息
在启动信息中发现一处权限禁止的提示。

难道是文件的权限问题?

# ll后的结果
-rw-r--r-- 1 root root 84892 Aug 14 12:46 redis.conf

修改redis.conf的权限

cd /usr/local/redis/conf
chmod 777 redis.conf

重新启动redis-server服务,又报了如下错误:

Bad directive or wrong number of arguments

解决办法见:3.1.1节
 
再次重新启动,使用Another Redis Desktop Manager可以成功连接:
成功连接
新建一个Key:
first_key
值为1234,且永不过期:
key
在服务器使用redis-cli访问刚刚创建的key,结果报错了:

127.0.0.1:6379> get first_key
(error) NOAUTH Authentication required.
127.0.0.1:6379> 

这是因为在redis.conf中配置了验证密码,所以需要进行身份验证。
解决方法见3.1.2

redis-cli中查看first_key的效果如下:

127.0.0.1:6379> get first_key
"1234"
127.0.0.1:6379> 

本节总结:
第一次的报错是因为:默认配置启用了保护模式,并且bind了ip地址为127.0.0.1(这就导致只能在服务器本地连接redis-server服务)。

修改redis.conf后重启服务还是报错是因为:redis.conf在修改的过程中破坏了某些配置(后来通过重新复制安装目录中的配置,另外借助git一步一步修改才将问题解决)

 

三、错误和总结

3.1、遇到的错误

3.1.1、报错:Bad directive or wrong number of arguments
*** FATAL CONFIG FILE ERROR (Redis 6.0.9) ***
Reading the configuration file, at line 1867
>>> 'list 1,10-11'
Bad directive or wrong number of arguments

报错原因:
配置文件在修改的过程中产生错误,导致启动失败。

解决方案:
方案一:
创建自己的conf文件。只设置关键的几个配置:

protected-mode no
daemonize yes
requirepass !xu73821234
logfile "/data/logs/redis.log"

注:在此之前,需要创建目录 /data/logs,否则使用 systemctl restart rc-local.service 重启redis服务会不成功。

如果不成功,可以通过如下命令定位问题:

systemctl status rc-local.service 
# 输出
● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled)
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: failed (Result: exit-code) since Sat 2024-07-27 19:10:31 CST; 50s ago
     Docs: man:systemd-rc-local-generator(8)
  Process: 15618 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)

Jul 27 19:10:31 VM-16-12-ubuntu systemd[1]: Starting /etc/rc.local Compatibility...
Jul 27 19:10:31 VM-16-12-ubuntu rc.local[15618]: *** FATAL CONFIG FILE ERROR (Redis 6.0.9) ***
Jul 27 19:10:31 VM-16-12-ubuntu rc.local[15618]: Reading the configuration file, at line 261
Jul 27 19:10:31 VM-16-12-ubuntu rc.local[15618]: >>> 'logfile "/data/logs/redis.log"'
Jul 27 19:10:31 VM-16-12-ubuntu rc.local[15618]: Can't open the log file: No such file or directory
Jul 27 19:10:31 VM-16-12-ubuntu systemd[1]: rc-local.service: Control process exited, code=exited status=1
Jul 27 19:10:31 VM-16-12-ubuntu systemd[1]: rc-local.service: Failed with result 'exit-code'.
Jul 27 19:10:31 VM-16-12-ubuntu systemd[1]: Failed to start /etc/rc.local Compatibility.

方案二:
重新从安装包中复制一份原始配置文件。借助于git的版本控制功能,定位可能的错误。

我这边按照这个方案定位问题时,因为没有及时保存出错的配置文件,所以没有定位到问题。但是这个方案的思路是可行的。

通过sz将配置文件复制到本地,然后调整配置项:

# cd到redis配置文件目录
cd /usr/local/redis/conf
# 下载到本地
sz redis.conf

改动项如下:

  • 注释掉bind 127.0.0.1
    解除bind
  • 取消保护模式
    取消保护模式
  • 守护进程的方式启动
    守护进程
    以该方式启动时,将不在控制台打印启动信息。如果指定了日志文件路径,启动信息将写入日志文件。
     
  • 指定日志文件路径
    指定日志文件路径
    注:如果不指定日志文件。默认会将日志发送到/dev/null(即空设备)。其结果就是将日志数据进行丢失。 这里推荐设置该配置项
     
  • 设置验证密码
    设置验证密码
    出于安全性考虑,推荐设置验证密码。
     
3.1.2、报错:(error) NOAUTH Authentication required

使用redis-cli获取某个key的值时,报了如下错误:

127.0.0.1:6379> get first_key
(error) NOAUTH Authentication required.

报错原因:
Redis设置了认证密码,但是使用redis-cli登录时没有输入密码。
解决方法:

# auth "password",这里请填写实际的密码(conf文件中requirepass参数的值)
auth !xu73821234
3.1.3、kill redis进程时,报了如下错误:
27818:M 27 Jul 2024 18:31:45.494 * Saving the final RDB snapshot before exiting.
27818:M 27 Jul 2024 18:31:45.494 # Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis/conf) for saving: Permission denied
27818:M 27 Jul 2024 18:31:45.494 # Error trying to save the DB, can't exit.
27818:M 27 Jul 2024 18:31:45.494 # SIGTERM received but errors trying to shut down the server, check the logs for more information

核心报错信息:

Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis/conf) for saving: Permission denied

报错原因:
kill redis进程时,需要向 /usr/local/redis/conf 目录中写入 dump.rdb 文件。
但是该目录的权限如下:
在这里插入图片描述
没有写的权限。

解决方法

修改 /usr/local/redis/conf 目录的权限:

# 修改目录权限
sudo chmod 774 /usr/local/redis/conf/

# 查看redis进程
ps -ef|grep redis

# 杀死进程
kill 进程id

 
 
 
 

3.2、总结

本文主要讲述了如何检查服务器是否安装过Redis,以及从哪里可以获取Redis的安装包。

其间重点说明了Redis在Ubuntu18.04中是如何安装和部署的。需要关注的是编译安装时需要使用PREFIX参数指定Redis的安装目录,以方便后续的软件卸载。

后面还介绍了如何配置Redis服务随系统开机启动以及如何验证Redis是否安装成功(redis-cli)。Redis服务想要真正发挥作用,必须可以进行远程连接,本文也告诉读者如何配置和操作以使得可以远程连接Redis服务。在此过程中遇到一些问题,文章详细描述了问题的现象和解决方法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值