如何在Ubuntu 16.04上配置Redis复制

Redis是一个开源的键值数据存储,使用具有可选磁盘写入的内存存储模型进行持久化。它具有事务,发布/订阅消息模式和自动故障切换等功能。 Redis有大多数语言的客户端...

介绍

Redis是一个开源的键值数据存储,使用具有可选磁盘写入的内存存储模型进行持久化。它具有事务,发布/订阅消息模式和自动故障转移等功能。 Redis的客户端用大多数语言编写,推荐他们的网站 。 对于生产环境,在至少两个节点之间复制数据被认为是最佳实践。这允许在环境故障的情况下恢复,这在应用程序的用户基础增长时尤其重要。它还允许您安全地与生产数据交互,而不修改它或影响性能。 在本指南中,我们将在两个运行Ubuntu 16.04的服务器之间配置复制。如果需要,这个过程可以很容易地适应更多的服务器。

先决条件

为了完成本指南,您将需要访问两个Ubuntu 16.04服务器。在与Redis的使用的术语线中,我们将参照负责接受写请求的服务器和次级只读服务器作为从属服务器的主服务器。 你应该有一个非root用户sudo对每台服务器的配置权限。 此外,本指南假设您有一个基本的防火墙。 您可以按照我们的Ubuntu 16.04服务器初始设置指南 ,以满足这些要求。 当您准备开始时,请继续阅读本指南。

第1步:安装Redis

要开始,我们将 服务器都安装Redis的。 我们将安装使用了最新的Redis服务器软件包Chris Lea的Redis的PPA 。启用第三方存储库时始终使用警告。在这种情况下,Chris Lea是一位知名的包装商,他拥有许多高质量的包装。 首先,将PPA添加到您的两个服务器:
sudo apt-add-repository ppa:chris-lea/redis-server
ENTER接受信息库。 接下来,更新服务器的本地包索引,并通过键入以下命令来安装Redis服务器包:
sudo apt-get update
sudo apt-get install redis-server
这将安装Redis服务器并启动服务。 键入以下内容以检查Redis是否已启动并正在运行:
redis-cli ping
您应该收到以下回复:
PONG
这表示Redis正在运行,并且可供本地客户端访问。

第2步:在两个服务器之间安全流量

在设置复制之前,重要的是要了解Redis的安全模型的影响。 Redis不提供本机加密选项,并假设它已部署到可信对等体的专用网络。

如果Redis部署到隔离网络...

如果您的服务器在隔离网络中运行,您可能只需要调整Redis的配置文件以绑定到您的隔离网络IP地址。 在每台计算机上打开Redis配置文件:
sudo nano /etc/redis/redis.conf
查找bind线和追加服务器自己独立的网络IP地址:
/etc/redis/redis.conf
bind 127.0.0.1 isolated_IP_address
保存并关闭文件。键入以下命令重新启动服务:
sudo systemctl restart redis-server.service
打开对Redis端口的访问:
sudo ufw allow 6379
现在,你应该能够通过提供备用服务器的IP地址与其他访问一个服务器redis-cli使用命令-h标志:
redis-cli -h isolated_IP_address ping
PONG
Redis现在能够接受来自您的隔离网络的连接。

如果Redis未部署到隔离网络...

对于不孤立或不控制的网络,务必通过其他方式确保流量。有许多选项可确保Redis服务器之间的流量,包括:
  • 隧道与安全通道 :您需要为每个服务器的传入和传出隧道。一个例子是指南的底部。
  • 隧道与spiped :您将需要创建每个服务器有两个systemd单元文件,一个用于与远程服务器通信,一个用于转发到自己的Redis的过程连接。详细信息包括在指南的底部。
  • 设置了一个PeerVPN VPN :两个服务器都将需要对VPN访问。
使用上述方法之一,在Redis主服务器和从服务器之间建立安全通信方法。您应该知道每台计算机需要安全连接到其对等体上的Redis服务的IP地址和端口。

第3步:配置Redis主控

现在Redis在每个服务器上运行并且已经建立了安全的通信通道,我们必须编辑它们的配置文件。让我们先从这将作为功能的服务器。 打开/etc/redis/redis.conf用你喜欢的文本编辑器:
sudo nano /etc/redis/redis.conf
通过查找开始tcp-keepalive设置,并将其设置为60秒的意见建议。这将有助于Redis检测网络或服务问题:
/etc/redis/redis.conf
. . .
tcp-keepalive 60
. . .
找到requirepass指令并将其设置为一个强大的密码。虽然您的Redis流量应该是安全的从外部方,这提供了认证Redis本身。由于Redis速度快,并且不会限制密码尝试,请选择一个强大的复杂密码,以防止强力尝试:
/etc/redis/redis.conf
requirepass your_redis_master_password
最后,还有一些可选设置,您可能需要根据您的使用场景进行调整。 如果您不希望Redis在填充时自动删除较旧和较少使用的键,则可以关闭自动键删除:
/etc/redis/redis.conf
maxmemory-policy noeviction
为了提高耐久性保证,您可以打开仅追加文件持久性。这将有助于最大程度地减少系统故障时的数据丢失,同时牺牲较大的文件和稍慢的性能:
/etc/redis/redis.conf
appendonly yes
appendfilename "redis-staging-ao.aof"
完成后,保存并关闭文件。 重新启动Redis服务以重新加载我们的配置更改:
sudo systemctl restart redis-server.service
现在主服务器已配置好了,请花一点时间来测试它。

第4步:测试Redis主机

检查您是否可以使用您通过启动Redis客户端设置的密码进行身份验证:
redis-cli
首先,尝试不验证的命令:
info replication
您应该得到以下响应:
NOAUTH Authentication required.
这是预期的,表明我们的Redis服务器正确拒绝未经身份验证的请求。 接下来,使用auth命令进行验证:
auth your_redis_master_password
您应该会收到确认,表示您的凭据已被接受:
OK
如果你再次尝试该命令,它应该成功这个时候:
info replication
# Replication
role:master
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
当您进行身份验证时,请设置测试键,以便我们稍后可以检查复制:
set test 'this key was defined on the master server'
完成后退回到操作系统shell:
exit
现在我们已经准备好主服务器,让我们继续到我们的从机。

第5步:配置Redis从站

接下来,我们需要做出一些改变,让我们从服务器连接到我们的主实例。 打开/etc/redis/redis.conf从服务器上:
sudo nano /etc/redis/redis.conf
首先,找到并取消注释slaveof线。此伪指令使用您用于安全联系主Redis服务器的IP地址和端口,以空格分隔。默认情况下,Redis服务器在本地接口上侦听6379,但每个网络安全方法以某种方式修改外部方的默认值。 您使用的值取决于您用于保护网络流量的方法:
  • 独立的网络 :使用独立的网络IP地址和主服务器的端口Redis的(6379)(例如slaveof isolated_IP_address 6379 )。
  • 安全通道spiped:使用本地接口(127.0.0.1),并配置为隧道通信的端口(这将是slaveof 127.0.0.1 8000如果你跟着指南)。
  • PeerVPN:使用主服务器的VPN的IP地址和普通Redis的端口(这将是slaveof 10.8.0. 1 6379如果你跟着指南)。
一般形式是:
/etc/redis/redis.conf
slaveof ip_to_contact_master port_to_contact_master
其次,取消并填写masterauth与已对Redis的主服务器设置的密码行:
/etc/redis/redis.conf
masterauth your_redis_master_password
设置从服务器的密码以防止未经授权的访问。有关密码复杂性的相同警告适用于此处:
/etc/redis/redis.conf
requirepass your_redis_slave_password
保存并在完成后关闭文件。

第6步:测试Redis Slave并应用更改

我们重启服务之前实现我们的变化,让我们连接到本地Redis的实例从机上,并验证test关键是取消设置:
redis-cli
键入以查询键:
get test
您应该得到以下响应:
(nil)
这表明本地Redis的实例没有一键名为test 。输入以下命令退回到shell:
exit
重新启动从站上的Redis服务以实现这些更改:
sudo systemctl restart redis-server.service
这将应用我们对Redis从配置文件所做的所有更改。 重新连接到本地Redis实例:
redis-cli
与Redis主服务器一样,如果未授权,操作现在应该失败:
get test
(error) NOAUTH Authentication required.
现在,使用您在上一部分中设置的Redis从设备密码进行身份验证:
auth your_redis_slave_password
OK
如果我们尝试访问密钥这一次,我们会发现它是可用的:
get test
"this key was defined on the master server"
一旦我们在从服务器上重新启动我们的Redis服务,复制立即开始。 您可以使用Redis的的验证此info的命令,其中报告有关复制信息。 值master_hostmaster_port应该与您使用的参数slaveof选项:
info replication
# Replication
role:slave
master_host:10.8.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:1387
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
如果你碰巧看到在Redis主服务器上的相同信息,你会看到这样:
info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.8.0.2,port=6379,state=online,offset=1737,lag=1
master_repl_offset:1737
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1736
如您所见,主服务器和从服务器在其定义的关系中正确地彼此识别。

第7步:将Redis Slave升级为Master

设置复制的主要原因是以最少的数据丢失和停机时间处理故障。在Redis主机故障的情况下,Redis从机可以升级为主机状态以处理写入通信。

手动促进RedisMinion

我们可以从Redis从服务器手动执行此操作。使用Redis客户端登录:
redis-cli
使用Redis从设备密码进行验证:
auth your_redis_slave_password
在升级Redis从机之前,请尝试覆盖测试键:
set test 'this key was overwritten on the slave server'
这应该失败,因为默认情况下,Redis的Minion被配置为只读的slave-read-only yes选项:
(error) READONLY You can't write against a read only slave.
要禁用复制和促进当前服务器掌握状态,使用slaveof命令的价值no one
slaveof no one
OK
再次检查复制信息:
info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:6749
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
正如你所看到的,从站被指定为一个Redis主站。 尝试重新覆盖该键,这次它应该成功:
set test 'this key was overwritten on the slave server'
OK
请记住,由于配置文件仍将此节点指定为Redis从属服务器,如果服务在未修改配置的情况下重新启动,它将恢复复制。还要注意,您可能需要在这里重新应用用于Redis主机的任何设置(例如,打开仅追加文件或修改逐出策略)。 如果有任何其他从属,请将其指向新升级的主服务器以继续复制更改。这可以通过使用完成slaveof命令和新的主人的连接信息。 要手动恢复复制到原来的主人,指向临时主机和使用Minion回到原来的主slaveof与配置文件中使用的值命令:
slaveof ip_to_contact_master port_to_contact_master
OK
如果再次检查从站上的密钥,您应该看到Redis主站已恢复原始值:
get test
"this key was defined on the master server"
出于一致性原因,从设备上的所有数据在与主服务器重新同步时将被刷新。

自动升级Redis从机

自动升级Redis从站需要与应用程序层协调。这意味着实现很大程度上取决于应用程序环境,因此很难建议具体的操作。 但是,我们可以完成自动故障转移所需的一般步骤。以下步骤假定所有Redis服务器已配置为彼此访问:
  • 从应用程序,检测主服务器不再可用。
  • 在一个Minion,执行slaveof no one命令。这将停止复制并将其升级为主控状态。
  • 调整新主控器上的任何设置以与以前的主控器设置一致。这可以在大多数选项的配置文件中提前完成。
  • 将流量从您的应用程序导向新推出的Redis主控。
  • 上剩余的Minion,运行slaveof new_master_ip new_master_port 。这将使从属节点停止从旧主节点复制,完全丢弃其(现已弃用的)数据,并从新主节点开始复制。
在将服务恢复到原始主服务器后,您可以允许它作为指向新升级的主服务器的从服务器重新加入,也可以允许它在需要时作为主服务器恢复使用。

结论

我们设置了一个由两个服务器组成的环境,一个作为Redis主机,另一个作为从机复制数据。这在系统或网络故障的情况下提供冗余,并且由于性能原因可以帮助在多个服务器之间分配读取操作。这是设计Redis配置以适应您的生产应用程序和基础架构需求的良好起点,但绝不是有关该主题的详尽指南。要了解更多关于使用Redis的为您的应用需求,看看我们其他的Redis教程