Redis应怎么管理

46次阅读
没有评论

共计 4454 个字符,预计需要花费 12 分钟才能阅读完成。

这篇文章主要介绍“Redis 应怎么管理”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis 应怎么管理”文章能帮助大家解决问题。

一、安全

谈到安全,我们会联想到些什么?
比如,可信任的环境会给我们带来安全感,陌生的环境则会让你感到未知的恐惧和孤独。
再比如,国产化替代信创项目(安可替代),这里我简称为国创项目,就是要达到信任、安全可靠以及自主可控的的目的。

上面谈了这么多(瞎扯了很多,我黔驴尽穷了),只是为了提升我们的安全意识。

Redis 以简洁为美,创始人曾这么描述过。但同样在安全层面也没做过多的工作。

这里补充一点,上次没有讲到如何优雅的关闭 Redis 服务。虽然可以杀掉进程来控制,但推荐使用如下方式关闭:

$ /opt/redis-6.0.8/src/redis-cli shutdown

1、可信环境

Redis 的安全设计是基于“Redis 运行在可信任的环境”这个前提下做出来的。在生产环境(正式发布环境)运行时,不允许外部直接连接到 Redis 服务器上,此时应该通过应用程序进行中转,运行在可信任的环境中是保证 Redis 安全至关重要的方法。

1.1、bind 参数

在 Redis 的默认配置文件 redis.conf 中,只会接受本地的网络请求。但通过在配置文件中修改 bind 参数更改这一设置,默认的 bind 设置为:

bind:127.0.0.1

bind 参数同样可以绑定多个 IP 地址,IP 地址以间隔空格分隔,如下示例:

# Examples:# bind 192.168.1.100 10.0.0.1# bind 127.0.0.1 ::1

1.2、protected-mode 参数

在 Redis3.2 的版本中,引入了一个特殊模式:保护模式,来更好地确保 Redis 运行在可信环境之中。值得注意的是,保护模式在默认情况下是开启的。

参数设置:

#开启保护模式 protected-mode yes# 禁止保护模式 protected-mode no

作用:

开启保护模式:接收到来自不在 bind 绑定的网络客户端发送命令时,如果客户端没有设置密码,Redis 会返回错误拒绝(DENIED)执行该命令。

禁止保护模式:可以在配置中使用 protected-mode no 禁止。

安全:对于生产环境需要确保开启了护盾(防火墙),达到确保可信客户端连接服务器的目的。

在测试的时候,比如我在 Windows 下连接我的 linux 上的 Redis 服务。为了方便测试,此时临时关闭防护墙 firewalld,或者采用 firewall-cmd 命令加入 6379 默认端口以及 Redis 服务,关于防火墙的知识可以参考我之前的文章《firewalld 与 iptables 防火墙工具》:

# 临时关闭防火墙 systemctl stop firewalld.service

注意:Redis3.2 之前的版本默认会绑定所有网络接口,任何网络上的计算机(包含公网)都可连接至 Redis 服务器上。使用旧版的需要注意,最好修改这个参数,或者升级到新版。

2、数据库密码

Redis 中提供了数据库密码功能。最开始我傻傻的以为直接就能连上,岂不是没有密码,真不安全。直到后来在工作的实践中,才发现原来这货可以是设置密码的,只是我以前并不知道而已。值得注意的是:并且在 6.0 版本中支持多用户权限控制功能。

2.1、Redis 密码设置

在我的上一篇文章也有提到过。Redis 数据库密码是通过参数 requirepass 来控制的,默认的 6.0.8 版本是禁用掉了,需要手动开启。

# 默认禁用掉了 #requirepass foobared# 启用密码 requirepass 123456

客户端每次连接到 Redis 时都需要发送密码,否则 Redis 会拒绝执行客户端发来的命令。例如我使用 Windows 客户端连接:
开启了保护模式,开始提示 DENIED。利用 bind 绑定了信任的 ip 或者禁止保护模式,最后还会提示密码为验证。

示例:设置键 sky,set“sky”“hello redis”

# 设置 skyset  sky   hello redis

重启 redis 服务(需要读取到 redis.conf 文件),会提示验证密码,如下图所示。

# 获取 skyget sky(error) NOAUTH Authentication required. 
#提示需要密码认证
#认证 auth 123456
#再次获取 skyget sky hello redis

虽然数据库设置密码很方便,但是在复杂的场景中经常需要使用更加细粒度的访问权限控制。比如:

生产环境中的应用程序下不应该具有执行 CONFIG、FLUSHALL 涉及到管理或者数据安全的命令权限

多个程序因不同用途共用一个 Redis 服务时,建议限制某个程序访问其它程序产生的键。

tips:为此,Redis6.0 推出了访问控制列表(ACL)功能,可以支持多用户,并且设置每个用户可以使用的命令和访问的键名规则等。可以通过配置文件设置,如下:

将 ACL 配置直接写在 Redis 配置文件中

将 ACL 配置写在单独的文件中,然后在 Redis 配置文件通过 aclfile 指令引入,例如:

aclifile /opt/person/conf.acl

2.1、Redis 主从复制注意事项

在配置 Redis 复制的时候,如果主库设置了密码,需要在从库的配置文件中通过 masterauth master-password 参数设置主库的密码,使从库连接主库时自动使用 auth 命令验证,配置如下。

masterauth  master-password

3、命名命令

Redis 支持在配置文件中将命令重命名,例如将 FLUSHALL 命令重命名为一个比较复杂的名字,达到保证只有自己的应用可以使用该命令。当然,这个功能可以看做在 6.0 版本之前没有 ACL,作为对命令安全性的一个补充。如下配置:

rename-command FLUSHALL redisabcdsky1r2d3is

如果希望直接一点,直接禁用,通过重命名为空字符

rename-command FLUSHALL 

再次强调:安全起见,无论设置密码还是重命名命令,都应遵循保证配置文件的安全性,否则就无意义了。

二、通信协议

之前有了解到 Redis 的主从复制以及持久化 AOF 文件的格式,通过了解 Redis 通信协议能更好的理解 Redis。

当然 Redis 支持两种通信协议。如下:

一种是二进制安全的统一请求协议(unified request protocol)

第二种是比较直观的便于在 telnet 程序中输入的简单协议

1、简单协议

简单协议适合在 telnet 程序中和 Redis 通信。如下是通过 telnet 测试与 Redis 通信:

linux 下 Redhat 系列安装 telnet 通过 yum 命令:

yum -y install telnet

Windows 在启用或关闭 Windows 功能中启用 telnet

[root@dywangk redis-6.0.8]# telnet 127.0.0.1 6379Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is  ^] .auth 123456 # 同样需要验证密码, 之前设置了密码+OKset foo bar 
get foo$3bar# 输入 quit 退出 telnet

1.1、错误回复

错误回复(error reply)以 – 开头并在后面跟着错误信息:

-ERR unknown command ``, with args beginning with:

1.2、状态回复

状态回复(status reply)以 + 开头

+OK

1.3、整数回复

整数回复(integer reply)以:开头

:3

1.4、字符串回复

字符串(bulk reply)回复以 $ 开头

$3

2、统一请求协议

统一请求协议是从 Redis1.2 开始加入的,其命令格式与多行字符串回复格式类似。也以 telnet 为例演示:

[root@dywangk redis-6.0.8]# telnet 127.0.0.1 6379Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is  ^] .auth 123456 # 同样需要验证密码, 之前设置了密码+OK
*3$3set$3foo$3bar 
+OK# 输入 quit 退出 telnet

同样,在发送命令的时候指定了后面字符串的长度,所以每个命令的每个参数都可以包含二进制的字符。

Redis 的 AOF 文件和主从复制时数据库发送的内容使用了统一请求协议。如果简单的使用 telnet 与 Redis 进行通信,使用简单协议即可。

三、管理工具 1、redis-cli

看到 redis-cli 大家肯定不陌生,是的我们学习测试快速融入都是使用的 redis-cli 命令进行的,Redis 自带的客户端。Redis 可以执行大部分的 Redis 命令,包括查看数据库信息的 info 命令、更改数据库设置的 config 命令和强制进行 RDB 快照的 save 命令。简单介绍几个管理 Redis 常用的命令。

1.1、耗时命令日志

当一条命令执行时间超过限制时,Redis 会将该命令的执行时间等信息加入耗时命令日志(slow log)以供开发者查看。通过配置文件的 slowlog-log-slower-than 10000 参数设置限制,注意单位是微秒,可以看到默认为 10000。通过 slowlog-max-len 128 限制记录的条数。

获取当前耗时命令日志

slowlog get

每条日志由以下 4 个部分组成

唯一日志 ID

执行的 Unix 时间

耗时时间,单位为微秒

命令及其参数

测试时,将 slowlog-log-slower-than 0 参数设置为 0

slowlog-log-slower-than 0

1.2、命令监控

Redis 提供了 monitor 来监控 Redis 执行的所有命令,redis-cli 也支持。例如:

monitor

注意:一般用于调试和纠错使用。

2、Medis

当 Redis 中的键比较多时,此时使用 redis-cli 管理略显不足。Medis 是一款 macOS 下的可视化 Redis 管理工具。通过界面即可实现管理 Redis。

3、phpRedisAdmin

看到 phpRedisAdmin,大家也许会联想到以网页形式管理 MySQL 的 phpMyAdmin 管理工具。

关于工具的使用,可以参考 github 说明,这里不做过多介绍。

建议:github 那访问速度大家都懂的,建议导入到 gitee 作为镜像仓库使用,每隔一段时间同步。

4、Rdbtools

一款采用 Python 语言开发的 Redis 的快照文件解析器,它可以根据快照文件导出 json 数据文件、分析 Redis 中每个键的占用空间情况。

关于“Redis 应怎么管理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计4454字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)