如何在 Ubuntu 16.04 上配置 Redis 复制

介绍

Redis 是一个开源的关键值数据存储,使用内存存储模型,可选为持久性写磁盘。 它提供了交易、 pub/sub 消息模式以及其他功能中的自动故障转换。 Redis 拥有客户端以大多数语言编写,并在 他们的网站提供推荐的语言。

对于生产环境,至少在两个节点上复制数据被认为是最佳实践,这允许在环境故障的情况下恢复,这在应用程序的用户群增长时尤为重要。

在本指南中,我们将配置两个服务器之间的复制,两者都运行Ubuntu 16.04. 如果需要,这个过程可以很容易地适应更多的服务器。

前提条件

为了完成本指南,您需要访问两个Ubuntu 16.04服务器,按照Redis所使用的术语,我们将把主服务器称为接受写入请求的 master 服务器,并将次要只读的服务器称为** slave** 服务器。

此外,本指南将假定您有一个基本的防火墙,您可以遵循我们的 Ubuntu 16.04 初始服务器设置指南来满足这些要求。

当你准备好开始时,继续这个指南。

步骤1:安装 Redis

要开始,我们将在 master 和** slave** 服务器上安装 Redis。

我們將使用 Chris Lea 的 Redis PPA安裝最新的 Redis Server 套件。在啟用第三方儲存庫時,總是要小心。在這種情況下,Chris Lea 是一個擁有許多高品質套件的已知包裝商。

首先,将 PPA 添加到您的两个服务器:

1sudo apt-add-repository ppa:chris-lea/redis-server

Enter来接受存储库。

接下来,更新服务器的本地包索引并通过键入安装 Redis 服务器包:

1sudo apt-get update
2sudo apt-get install redis-server

这将安装Redis服务器并启动服务。

检查 Redis 是否已启动并通过键入运行:

1redis-cli ping

您应该收到以下回复:

1[secondary_label Output]
2PONG

这表明 Redis 正在运行并可供本地客户端访问。

步骤2:确保两个服务器之间的安全流量

Redis 不提供原生加密选项,并假定它已部署到由可信同行组成的私人网络中。

如果 Redis 部署到一个孤立的网络...

如果您的服务器运行在一个孤立的网络中,您可能只需要调整 Redis 的配置文件以连接到您的孤立的网络 IP 地址。

在每个计算机上打开 Redis 配置文件:

1sudo nano /etc/redis/redis.conf

查找绑定行,并附上服务器自己的孤立网络IP地址:

1[label /etc/redis/redis.conf]
2bind 127.0.0.1 isolated_IP_address

保存并关闭文件. 重启服务,键入:

1sudo systemctl restart redis-server.service

打开 Redis 端口:

1sudo ufw allow 6379

您现在应该能够通过提供替代服务器的IP地址来访问一个服务器从另一个服务器到redis-cli命令的-h旗帜:

1redis-cli -h isolated_IP_address ping
1[secondary_label Output]
2PONG

Redis 现在可以接受来自您的孤立网络的连接。

如果 Redis 没有部署到一个孤立的网络...

对于未被孤立或您无法控制的网络,必须通过其他方式确保流量。

使用上述方法之一,在您的 Redis 主和奴隶服务器之间建立一个安全的通信方法. 您应该知道每个机器需要安全连接到其同行的 Redis 服务的 IP 地址和端口。

第3步:配置 Redis Master

现在Redis在每个服务器上运行,并建立了一个安全的通信渠道,我们必须编辑他们的配置文件。

使用您最喜欢的文本编辑器打开 /etc/redis/redis.conf:

1[environment fourth]
2sudo nano /etc/redis/redis.conf

首先,找出tcp-keepalive设置,并按评论建议将其设置为60秒,这将有助于 Redis 检测网络或服务问题:

1[environment fourth]
2[label /etc/redis/redis.conf]
3. . .
4tcp-keepalive 60
5. . .

查找requirepass指令并将其设置为强有力的密码短语,而您的 Redis 流量应该受到外部人员的保护,这为 Redis 提供身份验证,因为 Redis 是快速的,并且不限制密码尝试,选择强有力的、复杂的密码短语来保护您免受暴力攻击:

1[environment fourth]
2[label /etc/redis/redis.conf]
3requirepass your_redis_master_password

最后,有一些可选的设置,您可能希望根据您的使用场景进行调整。

如果您不希望 Redis 在填充时自动切割旧和少使用的密钥,您可以关闭自动删除密钥:

1[environment fourth]
2[label /etc/redis/redis.conf]
3maxmemory-policy noeviction

为了获得更好的耐用性保证,您可以启用仅附件的文件持久性,这将有助于在系统故障的情况下减少数据损失,从而损害更大的文件和略有减缓的性能:

1[environment fourth]
2[label /etc/redis/redis.conf]
3appendonly yes
4appendfilename "redis-staging-ao.aof"

完成后,保存并关闭文件。

重新启动 Redis 服务以重新加载我们的配置更改:

1[environment fourth]
2sudo systemctl restart redis-server.service

现在主服务器已配置,请花一点时间来测试它。

第4步:测试 Redis Master

检查您是否可以使用您通过启动 Redis 客户端设置的密码进行身份验证:

1[environment fourth]
2redis-cli

首先,尝试一个命令而无需身份验证:

1[environment fourth]
2info replication

你应该得到以下答案:

1[environment fourth]
2[secondary_label Redis master output]
3NOAUTH Authentication required.

這是預期的,並表示我們的 Redis 伺服器正確拒絕未驗證的請求。

接下来,使用auth命令来验证:

1[environment fourth]
2auth your_redis_master_password

您应该收到确认您的凭证已被接受的确认:

1[environment fourth]
2[secondary_label Redis master output]
3OK

如果您再次尝试该命令,该命令应该成功:

1[environment fourth]
2info replication
 1[environment fourth]
 2[secondary_label Redis master output]
 3# Replication
 4role:master
 5connected_slaves:0
 6master_repl_offset:0
 7repl_backlog_active:0
 8repl_backlog_size:1048576
 9repl_backlog_first_byte_offset:0
10repl_backlog_histlen:0

当您已验证时,请设置测试密钥,以便我们稍后可以检查复制:

1[environment fourth]
2set test 'this key was defined on the master server'

退出后返回操作系统壳:

1[environment fourth]
2exit

现在我们已经准备好了主服务器,让我们转向我们的奴隶机器。

步骤 5:配置 Redis 奴隶

接下来,我们需要做出一些更改,以允许我们的奴隶服务器连接到我们的主实例。

在奴隶服务器上打开 /etc/redis/redis.conf:

1[environment fifth]
2sudo nano /etc/redis/redis.conf

首先,查找和解除奴隶线条. 此指令采用您安全地与主 Redis 服务器联系的 IP 地址和端口,分隔一个空间. 默认情况下,Redis 服务器在本地接口上收听 6379,但每个网络安全方法以某种方式对外部方修改了默认。

您使用的值将取决于您用来保护网络流量的方法:

隔离网络 :使用主服务器的隔离网络 IP 地址和 Redis 端口(6379)(例如 slaveof isolated_IP_address 6379)。* stunnel* 或** spiped** :使用本地接口(127.0.0.1)和配置为隧道流量的端口(如果您遵循指南,这将是 slaveof 127.0.0.1 8000)。

一般形式是:

1[environment fifth]
2[label /etc/redis/redis.conf]
3slaveof ip_to_contact_master port_to_contact_master

接下来,删除评论并用为 Redis 主服务器设置的密码填写masterauth行:

1[environment fifth]
2[label /etc/redis/redis.conf]
3masterauth your_redis_master_password

为你的奴隶服务器设置密码,以防止未经授权的访问。

1[environment fifth]
2[label /etc/redis/redis.conf]
3requirepass your_redis_slave_password

保存并关闭文件,当你完成。

步骤6:测试 Redis 奴隶并应用更改

在我们重新启动服务以实现我们的更改之前,让我们连接到奴隶机器的本地Redis实例,并验证测试密钥未设置:

1[environment fifth]
2redis-cli

通过键入来查询密钥:

1[environment fifth]
2get test

你应该得到以下答案:

1[environment fifth]
2[secondary_label Redis slave output]
3(nil)

这表明本地 Redis 实例没有一个名为测试的密钥。

1[environment fifth]
2exit

在奴隶上重新启动 Redis 服务以实现这些更改:

1[environment fifth]
2sudo systemctl restart redis-server.service

这将适用于我们对 Redis 奴隶配置文件所做的所有更改。

重新连接到本地 Redis 实例:

1[environment fifth]
2redis-cli

与 Redis 主服务器一样,如果没有授权,操作现在应该失败:

1[environment fifth]
2get test
1[environment fifth]
2[secondary_label Redis slave output]
3(error) NOAUTH Authentication required.

现在,使用您在最后一节设置的 Redis 奴隶密码进行身份验证:

1[environment fifth]
2auth your_redis_slave_password
1[environment fifth]
2[secondary_label Redis slave output]
3OK

如果我们尝试访问这个密钥,我们会发现它是可用的:

1[environment fifth]
2get test
1[environment fifth]
2[secondary_label Redis slave output]
3"this key was defined on the master server"

一旦我们在奴隶上重新启动了我们的Redis服务,复制立即开始。

您可以通过 Redis 的info命令来验证此情况,该命令会报告有关复制的信息. master_hostmaster_port 的值应匹配您为slaveof 选项使用的参数:

1[environment fifth]
2info replication
 1[environment fifth]
 2[secondary_label Redis slave output]
 3# Replication
 4role:slave
 5master_host:10.8.0.1
 6master_port:6379
 7master_link_status:up
 8master_last_io_seconds_ago:5
 9master_sync_in_progress:0
10slave_repl_offset:1387
11slave_priority:100
12slave_read_only:1
13connected_slaves:0
14master_repl_offset:0
15repl_backlog_active:0
16repl_backlog_size:1048576
17repl_backlog_first_byte_offset:0
18repl_backlog_histlen:0

如果你偶然在Redis主服务器上查看相同的信息,你会看到这样的东西:

1[environment fourth]
2info replication
 1[environment fourth]
 2[secondary_label Redis master output]
 3# Replication
 4role:master
 5connected_slaves:1
 6slave0:ip=10.8.0.2,port=6379,state=online,offset=1737,lag=1
 7master_repl_offset:1737
 8repl_backlog_active:1
 9repl_backlog_size:1048576
10repl_backlog_first_byte_offset:2
11repl_backlog_histlen:1736

正如你所看到的,主和奴隶服务器在定义的关系中正确地相互识别。

步骤7:促进一个Redis奴隶成为主人

创建复制的主要原因是以最小数据损失和停机时间来处理故障 Redis 奴隶可以在 Redis 主故障的情况下被提升到掌握状态来处理写入流量。

手动推广 Redis 奴隶

我們可以手動從 Redis 奴隸伺服器進行此操作. 登入 Redis 客戶端:

1[environment fifth]
2redis-cli

使用 Redis 奴隶密码进行身份验证:

1[environment fifth]
2auth your_redis_slave_password

在推广 Redis 奴隶之前,尝试重写测试密钥:

1[environment fifth]
2set test 'this key was overwritten on the slave server'

这应该失败,因为默认情况下,Redis 奴隶被配置为只读的,使用只读奴隶选项:

1[environment fifth]
2[secondary_label Redis slave output]
3(error) READONLY You can't write against a read only slave.

要禁用复制并将当前服务器提升到主状态,请使用slaveof命令,值为No one:

1[environment fifth]
2slaveof no one
1[environment fifth]
2[secondary_label Redis slave output]
3OK

再次检查复制信息:

1[environment fifth]
2info replication
 1[environment fifth]
 2[secondary_label Redis slave output]
 3# Replication
 4role:master
 5connected_slaves:0
 6master_repl_offset:6749
 7repl_backlog_active:0
 8repl_backlog_size:1048576
 9repl_backlog_first_byte_offset:0
10repl_backlog_histlen:0

正如你所看到的,奴隶现在被指定为雷迪斯大师。

尝试重写密钥,这次它应该成功:

1[environment fifth]
2set test 'this key was overwritten on the slave server'
1[environment fifth]
2[secondary_label Redis slave output]
3OK

请记住,由于配置文件仍然将此节点指定为 Redis 奴隶,如果该服务重新启动而不修改配置,则将恢复复复制。

如果有其他奴隶,请将其指向新晋升的主人,以便继续复制变化,可以使用奴隶命令和新主人的连接信息。

要手动恢复对原始主的复制,请将临时主和奴隶指向原始主,使用slaveof命令与配置文件中使用的值:

1[environment fifth]
2slaveof ip_to_contact_master port_to_contact_master
1[environment fifth]
2[secondary_label Redis slave output]
3OK

如果你再次检查奴隶上的密钥,你应该看到 Redis 主人已经恢复了原始值:

1[environment fifth]
2get test
1[environment fifth]
2[secondary_label Redis slave output]
3"this key was defined on the master server"

出于一致性原因,当它与主服务器重新同步时,奴隶上的所有数据都会被清除。

自动推广 Redis 奴隶

自动推广 Redis 奴隶需要与应用层进行协调,这意味着实现很大程度上取决于应用环境,因此很难建议具体的操作。

但是,我们可以回顾实现自动故障的一般步骤. 下面的步骤假定所有 Redis 服务器都已配置为相互访问:

  • 联合国 从应用程序中检测到主服务器已无法使用.
  • 联合国 在一个奴隶身上,执行`无人奴隶'的命令。 这将停止复制,并推广到掌握状态。
  • 联合国 调整新主机上的任何设置,以便与以前的主机设置保持一致。 这可以在大多数选项的配置文件中提前完成.
  • 从您的申请直接传送到新升入的Redis主机.
  • 联合国 对任何剩余的奴隶,经营 " 奴隶新主 " 。 这将让奴隶们停止从老主人那里复制,彻底地抛弃他们(现在已堕落)的数据,并开始从新主人那里复制. .

将服务恢复到原始主服务器后,您可以允许它重新加入作为一个奴隶,指向新晋升的主人,或者允许它在必要时恢复作为主人的职责。

结论

我们建立了一个由两个服务器组成的环境,一个是作为雷迪斯主机,另一个是作为奴隶复制数据。 这将在系统或网络出故障时提供冗余功能,并可以基于性能原因帮助在多个服务器之间分配读取操作. 这是设计符合你生产应用和基础设施需要的Redis配置的良好起点,但绝不是这方面的详尽指南。 要了解更多关于使用Redis满足您的应用程序需要的情况, 请检查我们的[其他 Redis 教程] (https://andsky.com/tags/redis) .

Published At
Categories with 技术
comments powered by Disqus