介绍
Redis是一个开源的键值数据存储,使用内存存储模型和可选的磁盘写入持久性。 它具有事务,pub / sub和自动故障转移等功能。 建议在生产环境中使用Redis和Linux,但开发人员还提到OS X作为开发和测试的平台。 Redis的写着大多数语言,用精选的那些建议客户自己的网站 。
对于生产环境,在至少两个节点之间复制数据被认为是最佳实践。 冗余允许在环境故障的情况下恢复,这在应用程序的用户群增长时尤其重要。
到本指南结束时,我们将在DigitalOcean上设置两个Redis Droplet,如下所示:
- 一个用于Redis主服务器的Droplet
- 一个用于Redis从服务器的Droplet
我们还将演示如何切换到从服务器并将其设置为临时主服务器。
随意设置多个从服务器。
本文主要关注设置主从Redis集群; 了解更多关于Redis的一般,其基本用法数据库,请参见本使用教程 。
先决条件
虽然这可能适用于早期版本和其他Linux发行版,我们建议使用Ubuntu 14.04。
为了测试的目的,我们将使用小实例,因为没有要处理的实际工作负载,但生产环境可能需要更大的服务器。
- ubuntu 14.04 LTS
- 两个Droplet,你需要的任何大小; 一个主站和一个或多个从(多个)
- 在解释通过SSH与Sudo非root用户访问你的机器与Ubuntu 14.04初始服务器设置
第1步 - 安装Redis
与将承载我们的主服务器的Droplet开始,我们的第一个步骤是安装Redis的。 首先,我们需要添加Chris Lea的Redis存储库(一如既往,在添加第三方存储库时要格外小心;我们使用这个存储库,因为它的维护者是一个有信誉的人物):
sudo add-apt-repository ppa:chris-lea/redis-server
按ENTER
接受信息库。
运行以下命令更新我们的包:
sudo apt-get update
安装Redis服务器:
sudo apt-get install redis-server
检查Redis是否已启动并正在运行:
redis-benchmark -q -n 1000 -c 10 -P 5
上述命令是说,我们希望redis-benchmark
在安静模式下运行,以1000的总要求,10个并行连接和管道5的请求。 有关运行基准Redis的,打字的更多信息redis-benchmark --help
在终端会打印举例有用的信息。
让基准运行。 完成后,您应该看到类似于以下内容的输出:
OutputPING_INLINE: 166666.67 requests per second
PING_BULK: 249999.98 requests per second
SET: 249999.98 requests per second
GET: 499999.97 requests per second
INCR: 333333.34 requests per second
LPUSH: 499999.97 requests per second
LPOP: 499999.97 requests per second
SADD: 499999.97 requests per second
SPOP: 499999.97 requests per second
LPUSH (needed to benchmark LRANGE): 499999.97 requests per second
LRANGE_100 (first 100 elements): 111111.12 requests per second
LRANGE_300 (first 300 elements): 27777.78 requests per second
LRANGE_500 (first 450 elements): 8333.33 requests per second
LRANGE_600 (first 600 elements): 6369.43 requests per second
MSET (10 keys): 142857.14 requests per second
现在,重复本节Redis的从服务器 。 如果要配置更多的Droplet,您可以根据需要设置任意数量的从服务器。
此时,Redis在我们的两个节点上安装并运行。 如果任何节点的输出与上面所示的不相似,请仔细重复设置过程,并检查是否满足所有先决条件
第2步 - 配置Redis主机
现在Redis在我们的双Droplet集群上运行,我们必须编辑他们的配置文件。 我们将看到,在配置主服务器和从服务器之间存在细微的差异。
让我们首先与我们的主开始。
打开/etc/redis/redis.conf
用你喜欢的文本编辑器:
sudo nano /etc/redis/redis.conf
编辑以下行。
为TCP的keepalive定时器设置一个合理的值:
tcp-keepalive 60
通过注释掉此行,使网络上的任何人都可以访问服务器:
#bind 127.0.0.1
鉴于Redis的性质及其非常高的速度,攻击者可能会强行强制密码而没有很多问题。 这就是为什么我们建议取消注释requirepass
线并增加一个复杂的密码(或一个复杂的密码,最好是):
requirepass your_redis_master_password
根据您的使用场景,您可以更改以下行或不更改。 对于本教程的目的,我们假设不必进行键删除。 取消注释此行并将其设置如下:
maxmemory-policy noeviction
最后,我们要进行以下更改,这是备份数据所必需的。 取消注释和/或设置如下所示的这些行:
appendonly yes
appendfilename redis-staging-ao.aof
保存更改。
重新启动Redis服务以重新加载我们的配置更改:
sudo service redis-server restart
如果你想多走一英里,你可以通过以下Redis的操作部分添加一些独特的内容到主数据库本教程中 ,所以后来我们可以看到它如何被复制到从服务器。
现在我们已经准备好主服务器,让我们继续到我们的从机。
第3步 - 配置Redis从站
我们需要做出一些改变,让我们从服务器连接到我们的主实例:
打开/etc/redis/redis.conf
用你喜欢的文本编辑器:
sudo nano /etc/redis/redis.conf
编辑以下行; 一些设置将类似于主人的。
通过注释掉此行,使网络上的任何人都可以访问服务器:
#bind 127.0.0.1
从属服务器需要一个密码,以及所以我们可以给它的命令(如INFO
)。 取消注释此行并设置服务器密码:
requirepass your_redis_slave_password
取消注释该行并指明主服务器可到达的IP地址,然后在该计算机上设置的端口。 缺省情况下,端口为6379:
slaveof your_redis_master_ip 6379
取消对masterauth
线和提供密码/密码前面设置在主服务器上:
masterauth your_redis_master_password
现在保存这些更改,并退出文件。 接下来,像我们在主服务器上一样重新启动服务:
sudo service redis-server restart
这将重新初始化Redis并加载我们修改的文件。
连接到Redis:
redis-cli -h 127.0.0.1 -p 6379
与从服务器的密码授权:
AUTH your_redis_slave_password
此时,我们运行一个功能主从Redis集群,两台机器正确配置。
第4步 - 验证主从复制
测试我们的设置将允许我们更好地了解我们的Redis Droplets的行为,一旦我们想要启动脚本故障转移行为。 我们现在要做的是确保我们的配置正常工作,并且我们的主机正在与从属Redis实例通信。
首先,我们通过我们的终端连接到Redis的,在主服务器上:
首先连接到本地实例,默认情况下在端口6379上运行。如果您更改了端口,请相应地修改命令。
redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置主站时设置的密码向Redis进行身份验证:
AUTH your_redis_master_password
而且你应该得到一个OK
作为响应。 现在,你只需要运行:
INFO
您将看到您需要了解的有关主Redis服务器的所有信息。 我们在特别感兴趣#Replication
部分,它应该像下面的输出:
Output. . .
# Replication
role:master
connected_slaves:1
slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1
master_repl_offset:407
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:406
. . .
注意connected_slaves:1
线,这表明我们的其他实例与主Droplet说话。 您还可以看到,我们获得从属IP地址,以及端口,状态和其他信息。
现在让我们来看看#Replication
我们从机上一节。 该过程与我们的主服务器相同。 登录到Redis的情况下,发出INFO
的命令,并查看输出:
Output. . .
# Replication
role:slave
master_host:111.111.111.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1401
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
. . .
我们可以看到,这台机器具有slave的作用,正在与主Redis服务器通信,并且没有自己的slave。
第5步 - 切换到从站
构建此架构意味着我们还希望以这样一种方式处理故障,以确保数据完整性和尽可能少的停机时间为我们的应用程序。 任何Minion都可以晋升为主人。 首先,让我们手动测试切换。
在子机 ,我们应连接到Redis的实例:
redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置从站时设置的密码向Redis进行身份验证
AUTH your_redis_slave_password
关闭从站行为:
SLAVEOF NO ONE
响应应该是OK
。 现在键入:
INFO
查找# Replication
部分,找到下面的输出:
Output. . .
# Replication
role:master
connected_slaves:0
master_repl_offset:1737
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
. . .
正如我们所期望的,从站已经变成主站,并且现在准备接受来自其他机器(如果有的话)的连接。 我们可以使用它作为临时备份,而我们调试我们的主要主服务器。
如果你有多个依赖于初始主机的从机,它们都必须指向新升级的主机。
这可以容易地编写脚本,一旦检测到故障,需要执行以下步骤:
- 从应用程序,将所有Redis请求发送到从属计算机
- 在那个Minion,执行
SLAVEOF NO ONE
命令。 从Redis版本1.0.0开始,此命令告诉从属程序停止复制数据,并开始充当主服务器 - 在所有剩余的Minion(如果有的话),运行
SLAVEOF hostname port
将指导他们停止从老师傅复制,完全抛弃现在反对的数据,并开始由新的主机复制。 请务必将hostname
和port
与正确的价值观,从升班马主 - 分析问题后,如果您的特定设置需要它,您可能会返回将初始服务器作为主服务器
存在许多实现上述步骤的方式。 然而,由您来为您的环境实施一个适当的解决方案,并确保在任何实际故障发生之前彻底测试它。
第6步 - 重新连接到主站
让我们重新连接到原来的主服务器。 在从服务器 ,登录到Redis的,并执行以下命令:
SLAVEOF your_redis_master_ip 6379
如果运行INFO
再次命令,你会看到我们已经回到了原来的设置。
结论
我们已经正确地设置了一个由两个服务器组成的环境,一个作为Redis主机,另一个作为从机复制数据。 这样,如果主服务器脱机或丢失了我们的数据,我们知道如何切换到我们的从服务器进行恢复,直到问题得到解决。
接下来的步骤可能包括脚本的自动故障转移过程中,或通过使用VPN解决方案,如确保所有油Droplet间的安全通信的OpenVPN或TINC 。 此外,测试程序和脚本对于验证您的配置至关重要。
此外,在生产环境中部署此类设置时,应采取预防措施。 在Redis的文档页面应该研究,你必须有一个什么样的安全模型是足以满足您的应用程序一个清晰的认识。 我们经常使用Redis作为会话存储,并且其包含的信息对于攻击者可能是有价值的。 通常的做法是让这些机器只能通过专用网络访问,并将它们置于多层安全之后。
这是一个简单的起点,可以在其上构建数据存储; 绝不是关于设置Redis以使用主从架构的详尽指南。 如果您认为本指南应该包含任何内容,请在下面留下评论。 有关此主题的更多信息和帮助, DigitalOcean Q&A是一个良好的开端。