介绍
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 没有部署到一个孤立的网络...
对于未被孤立或您无法控制的网络,必须通过其他方式确保流量。
- [以斯通通通 (https://andsky.com/tech/tutorials/how-to-encrypt-traffic-to-redis-with-stunnel-on-ubuntu-16-04): 您需要每个服务器的进出通道 。 指南下方有一个例子。
- [用管子打通] (https://andsky.com/tech/tutorials/how-to-encrypt-traffic-to-redis-with-spiped-on-ubuntu-16-04): 您需要每个服务器创建两个系统化的单位文件, 一个用于与远程服务器通信, 一个用于转发连接到它自己的 Redis 进程 。 详情列于指南下方。
- 用PeerVPN安排一个VPN: 两个服务器都需要在VPN上可以访问. .
使用上述方法之一,在您的 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_host
和 master_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) .