如何在CentOS7上配置Redis集群
介绍
Redis 是一个开源的键值对数据存储,使用内存存储模型和可选的磁盘写入来实现持久性。 它具有事务、发布/订阅和自动故障转移等功能。 建议将 Redis 与 Linux 一起用于生产环境,但开发人员也提到 OS X 作为他们开发和测试的平台。 Redis 拥有用大多数语言编写的客户端,在 他们的网站 上有推荐的客户端。
对于生产环境,跨至少两个节点复制数据被认为是最佳实践。 冗余允许在环境故障的情况下进行恢复,这在应用程序的用户群增长时尤其重要。
在本指南结束时,我们将在 DigitalOcean 上设置两个 Redis Droplet,如下所示:
- 一个用于 Redis 主服务器的 Droplet
- 一个用于 Redis 从属服务器的 Droplet
我们还将演示如何切换到从服务器并将其设置为临时主服务器。
随意设置多个从服务器。
本文重点介绍如何搭建主从Redis集群; 要了解更多关于 Redis 的一般信息及其作为数据库的基本用法,请参阅 this usage tutorial。
先决条件
虽然这可能适用于早期版本和其他 Linux 发行版,但我们建议使用 CentOS 7。
出于测试目的,我们将使用小型实例,因为没有要处理的实际工作负载,但生产环境可能需要更大的服务器。
- CentOS 7
- 两个液滴,您需要的任何大小; 一个 master 和一个或多个 slave(s)
- 如 CentOS 7 的初始服务器设置 中所述,使用 sudo 非 root 用户通过 SSH 访问您的计算机
第 1 步 — 安装 Redis
从托管我们的 主服务器 的 Droplet 开始,我们的第一步是安装 Redis。 首先,我们需要在我们的机器上启用 EPEL 存储库。 如果您不熟悉它,EPEL 是企业 Linux 存储库的 Extra Packages,由 Fedora 项目开发,旨在为基于 RHEL 的发行版的企业用户提供优质的第三方软件包。
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
如果 wget
无法识别,请尝试在上述命令之前运行 yum install wget
。
现在运行:
sudo rpm -ivh epel-release-7-5.noarch.rpm
现在输入:
sudo yum -y update
请注意,这可能需要一段时间才能完成。 现在你可以在你的机器上安装 Redis,通过运行:
sudo yum install redis -y
安装过程完成后,通过输入以下命令启动 Redis 服务:
sudo systemctl start redis.service
可以使用以下命令检查其状态:
sudo systemctl status redis.service
输出类似于:
Outputredis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Wed 2015-07-22 02:26:31 EDT; 13s ago Main PID: 18995 (redis-server) CGroup: /system.slice/redis.service └─18995 /usr/bin/redis-server 127.0.0.1:6379
最后,让我们运行以下命令来测试我们的 Redis 设置:
redis-cli ping
这应该打印一个 PONG
作为响应。 如果是这种情况,您现在在您的服务器上运行了 Redis,我们可以开始配置它。 可以通过运行以下命令对我们的设置进行额外测试:
redis-benchmark -q -n 1000 -c 10 -P 5
上面的命令是说我们希望 redis-benchmark
以安静模式运行,总共有 1000 个请求,10 个并行连接和管道 5 个请求。 有关运行 Redis 基准测试的更多信息,请在终端中键入 redis-benchmark --help
将打印带有示例的有用信息。
让基准运行。 完成后,您应该会看到类似于以下内容的输出:
OutputPING_INLINE: 166666.67 requests per second PING_BULK: 249999.98 requests per second SET: 200000.00 requests per second GET: 200000.00 requests per second INCR: 200000.00 requests per second LPUSH: 200000.00 requests per second LPOP: 200000.00 requests per second SADD: 200000.00 requests per second SPOP: 249999.98 requests per second LPUSH (needed to benchmark LRANGE): 200000.00 requests per second LRANGE_100 (first 100 elements): 35714.29 requests per second LRANGE_300 (first 300 elements): 11111.11 requests per second LRANGE_500 (first 450 elements): 7194.24 requests per second LRANGE_600 (first 600 elements): 5050.50 requests per second MSET (10 keys): 100000.00 requests per second
现在对 Redis 从服务器 重复此部分。 如果您要配置更多 Droplet,您可以根据需要设置尽可能多的从属服务器。
至此,Redis 已安装并运行在我们的两个节点上。 如果任何节点的输出与上面显示的不同,请仔细重复设置过程并检查是否满足所有先决条件。
第 2 步 — 配置 Redis Master
现在 Redis 在我们的两个 Droplet 集群上启动并运行,我们必须编辑它们的配置文件。 正如我们将看到的,配置主服务器和从服务器之间存在细微差别。
让我们首先从我们的 master 开始。
使用您喜欢的文本编辑器打开 /etc/redis.conf
:
sudo vi /etc/redis.conf
编辑以下行。
为 TCP 的 keepalive 计时器设置一个合理的值:
/etc/redis.conf
tcp-keepalive 60
通过注释掉这一行,使网络上的任何人都可以访问服务器:
/etc/redis.conf
#bind 127.0.0.1
鉴于 Redis 的性质及其非常高的速度,攻击者可以暴力破解密码而不会出现很多问题。 这就是为什么我们建议取消注释 requirepass
行并添加复杂密码(最好是复杂密码):
/etc/redis.conf
requirepass your_redis_master_password
根据您的使用场景,您可以更改或不更改以下行。 出于本教程的目的,我们假设不必删除密钥。 取消注释此行并将其设置如下:
/etc/redis.conf
maxmemory-policy noeviction
最后,我们要进行备份数据所需的以下更改。 取消注释和/或设置这些行,如下所示:
/etc/redis.conf
appendonly yes appendfilename "appendonly.aof"
保存您的更改。
重新启动 Redis 服务以重新加载我们的配置更改:
sudo systemctl restart redis.service
现在我们已经准备好了主服务器,让我们继续我们的从机。
第 3 步 — 配置 Redis 从站
我们需要进行一些更改,以允许我们的 从服务器 连接到我们的主实例:
使用您喜欢的文本编辑器打开 /etc/redis.conf
:
sudo vi /etc/redis.conf
编辑以下行; 一些设置将类似于大师的。
通过注释掉这一行,使网络上的任何人都可以访问服务器:
/etc/redis.conf
#bind 127.0.0.1
从服务器也需要密码,这样我们就可以给它命令(例如INFO
)。 取消注释此行并设置服务器密码:
/etc/redis.conf
requirepass your_redis_slave_password
取消注释此行并指明可以访问 主服务器 的 IP 地址,然后是该机器上设置的端口。 默认情况下,端口为 6379:
/etc/redis.conf
slaveof your_redis_master_ip 6379
取消注释 masterauth
行并提供您之前在 主服务器 上设置的密码/密码:
/etc/redis.conf
masterauth your_redis_master_password
现在保存这些更改,然后退出文件。 接下来,像我们在主服务器上一样重新启动服务:
sudo systemctl restart redis.service
这将重新初始化 Redis 并加载我们修改过的文件。
连接到 Redis:
redis-cli -h 127.0.0.1 -p 6379
使用从服务器的密码授权:
AUTH your_redis_slave_password
此时,我们正在运行一个功能齐全的主从 Redis 集群,两台机器都已正确配置。
第 4 步 — 验证主从复制
一旦我们想开始编写故障转移行为的脚本,测试我们的设置将使我们能够更好地了解 Redis Droplet 的行为。 我们现在要做的是确保我们的配置正常工作,并且我们的主服务器正在与从属 Redis 实例通信。
首先,我们通过 主服务器 上的终端连接到 Redis:
首先连接到本地实例,默认在 6379 端口上运行。 如果您更改了端口,请相应地修改命令。
redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置主服务器时设置的密码使用 Redis 进行身份验证:
AUTH your_redis_master_password
你应该得到一个 OK
作为响应。 现在,您只需运行:
INFO
您将看到有关主 Redis 服务器的所有信息。 我们对 #Replication
部分特别感兴趣,它应该类似于以下输出:
Output. . . # Replication role:master connected_slaves:1 slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1 master_repl_offset:407 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:406 . . .
请注意 connected_slaves:1
行,这表明我们的另一个实例正在与主液滴对话。 您还可以看到我们获取了从 IP 地址以及端口、状态和其他信息。
现在让我们看一下我们从机上的 #Replication
部分。 该过程与我们的主服务器相同。 登录 Redis 实例,发出 INFO
命令,查看输出:
Output. . . # Replication role:slave master_host:111.111.111.111 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:1401 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . .
我们可以看到这台机器有slave的角色,正在与主Redis服务器通信,并且没有自己的slave。
第 5 步 — 切换到从站
构建此架构意味着我们还希望以确保数据完整性和尽可能少的应用程序停机时间的方式处理故障。 任何奴隶都可以被提升为主人。 首先,让我们手动测试切换。
在 从机 上,我们应该连接到 Redis 实例:
redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置从站时设置的密码使用 Redis 进行身份验证
AUTH your_redis_slave_password
关闭从属行为:
SLAVEOF NO ONE
响应应该是 OK
。 现在输入:
INFO
查找 # Replication
部分以找到以下输出:
Output. . . # Replication role:master connected_slaves:0 master_repl_offset:1737 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . .
正如我们所料,slave 已经变成了 master,现在准备好接受来自其他机器的连接(如果有的话)。 我们可以在调试主主服务器时将其用作临时备份。
如果您有多个依赖于初始 master 的 slave,则它们都必须指向新提升的 master。
这可以很容易地编写脚本,一旦检测到故障,需要执行以下步骤:
- 从应用程序中,将对 Redis 的所有请求发送到从机
- 在该从站上,执行
SLAVEOF NO ONE
命令。 从 Redis 版本 1.0.0 开始,此命令告诉从服务器停止复制数据,并开始充当主服务器 - 在所有剩余的从站(如果有的话)上,运行
SLAVEOF hostname port
将指示它们停止从旧主站复制,完全丢弃现在不推荐使用的数据,并开始从新主站复制。 确保将hostname
和port
替换为正确的值,来自新提升的主人 - 分析问题后,如果您的特定设置需要,您可以返回将初始服务器作为主服务器
有许多方法可以完成上述步骤。 但是,您可以为您的环境实施适当的解决方案,并确保在发生任何实际故障之前对其进行彻底测试。
第 6 步 — 重新连接到主服务器
让我们重新连接到原来的主服务器。 在从服务器上,登录Redis并执行以下命令:
SLAVEOF your_redis_master_ip 6379
如果再次运行 INFO
命令,您应该会看到我们已经返回到原始设置。
结论
我们已经正确设置了一个由两台服务器组成的环境,一台作为 Redis 主服务器,另一台作为从服务器复制数据。 这样,如果主服务器离线或丢失我们的数据,我们知道如何切换到我们的一个从服务器进行恢复,直到问题得到解决。
接下来的步骤可能包括编写自动故障转移过程的脚本,或通过使用 VPN 解决方案(如 OpenVPN)确保所有 Droplet 之间的安全通信。 此外,测试程序和脚本对于验证您的配置至关重要。
此外,在生产环境中部署此类设置时应采取预防措施。 应该研究 Redis 文档 页面,并且您必须清楚地了解哪种安全模型适合您的应用程序。 我们经常使用 Redis 作为会话存储,它包含的信息对攻击者来说可能很有价值。 通常的做法是让这些机器只能通过专用网络访问,并将它们置于多层安全性之后。
这是一个可以构建数据存储的简单起点; 绝不是关于设置 Redis 以使用主从架构的详尽指南。 如果您认为本指南应涵盖任何内容,请在下方发表评论。 有关此主题的更多信息和帮助,请访问数字海洋问答是一个很好的起点。