介绍
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访问。
第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_host
和
master_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
。这将使从属节点停止从旧主节点复制,完全丢弃其(现已弃用的)数据,并从新主节点开始复制。