如何在Ubuntu 16.04上配置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
您应该收到以下回复:
OutputPONG
这表示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
OutputPONG
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
您应该得到以下响应:
Redis master outputNOAUTH Authentication required.
这是预期的,表明我们的Redis服务器正确拒绝未经身份验证的请求。 接下来,使用 auth命令进行验证:
auth your_redis_master_password
您应该会收到确认,表示您的凭据已被接受:
Redis master outputOK
如果你再次尝试该命令,它应该成功这个时候:
info replication
Redis master output# 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
您应该得到以下响应:
Redis slave output(nil)
这表明本地Redis的实例没有一键名为 test 。输入以下命令退回到shell:
exit
重新启动从站上的Redis服务以实现这些更改:
sudo systemctl restart redis-server.service
这将应用我们对Redis从配置文件所做的所有更改。 重新连接到本地Redis实例:
redis-cli
与Redis主服务器一样,如果未授权,操作现在应该失败:
get test
Redis slave output(error) NOAUTH Authentication required.
现在,使用您在上一部分中设置的Redis从设备密码进行身份验证:
auth your_redis_slave_password
Redis slave outputOK
如果我们尝试访问密钥这一次,我们会发现它是可用的:
get test
Redis slave output"this key was defined on the master server"
一旦我们在从服务器上重新启动我们的Redis服务,复制立即开始。 您可以使用Redis的的验证此 info的命令,其中报告有关复制信息。 值 master_hostmaster_port应该与您使用的参数 slaveof选项:
info replication
Redis slave output# 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
Redis master output# 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选项:
Redis slave output(error) READONLY You can't write against a read only slave.
要禁用复制和促进当前服务器掌握状态,使用 slaveof命令的价值 no one
slaveof no one
Redis slave outputOK
再次检查复制信息:
info replication
Redis slave output# 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'
Redis slave outputOK
请记住,由于配置文件仍将此节点指定为Redis从属服务器,如果服务在未修改配置的情况下重新启动,它将恢复复制。还要注意,您可能需要在这里重新应用用于Redis主机的任何设置(例如,打开仅追加文件或修改逐出策略)。 如果有任何其他从属,请将其指向新升级的主服务器以继续复制更改。这可以通过使用完成 slaveof命令和新的主人的连接信息。 要手动恢复复制到原来的主人,指向临时主机和使用Minion回到原来的主 slaveof与配置文件中使用的值命令:
slaveof ip_to_contact_master port_to_contact_master
Redis slave outputOK
如果再次检查从站上的密钥,您应该看到Redis主站已恢复原始值:
get test
Redis slave output"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教程
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏