介绍
Redis 是一个开源的关键值数据存储,使用内存存储模型,可选磁盘写作以保持持久性。它具有交易、pub/sub 和自动故障转换,以及其他功能。建议在生产环境中使用 Redis 与 Linux,但开发人员还提到 OS X 作为他们开发和测试的平台。
对于生产环境,在至少两个节点上复制数据被认为是最佳的做法. Redundancy 允许在环境故障的情况下恢复,这在应用程序的用户群增长时尤为重要。
在本指南结束时,我们将在DigitalOcean上设置两个Redis Droplets,如下:
- 一个 Redis 主服务器的 Droplet
- 一个 Redis 奴隶服务器的 Droplet
我们还将展示如何切换到奴隶服务器并将其设置为临时主人。
您可以自由设置不止一个奴隶服务器。
本文专注于设置主奴隶 Redis 集群; 有关 Redis 一般及其作为数据库的基本用途的更多信息,请参阅 此使用教程。
前提条件
虽然这可能在以前的版本和其他Linux发行版上工作,但我们建议使用CentOS 7。
为了测试,我们将使用小实例,因为没有真正的工作负载可处理,但生产环境可能需要更大的服务器。
- CentOS 7
- 兩個Dropplets,無論您需要的尺寸;一個 master 和一個或多個 ** slave(s)**
- 透過 SSH 存取您的機器,使用 sudo 非 root 用戶,如在 初始伺服器設定與 CentOS 7 中解釋。
步骤 1 - 安装 Redis
首先,我们需要在我们的机器上启用EPEL存储库,如果你不熟悉它,EPEL是Fedora项目开发的Extra Packages for Enterprise Linux repo,旨在为基于RHEL的发行版的企业用户提供高质量的第三方包。
1wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
如果wget
不被识别,请尝试在上面的命令之前运行yum install wget
。
现在跑:
1sudo rpm -ivh epel-release-7-5.noarch.rpm
现在类型在:
1sudo yum -y update
请注意,这可能需要一段时间才能完成,现在您可以通过运行在您的机器上安装 Redis:
1sudo yum install redis -y
安装过程完成后,通过输入以下命令启动 Redis 服务:
1sudo systemctl start redis.service
并且可以通过以下命令检查其状态:
1sudo systemctl status redis.service
它产生了类似的东西:
1[secondary_label Output]
2redis.service - Redis persistent key-value database
3 Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled)
4 Drop-In: /etc/systemd/system/redis.service.d
5 └─limit.conf
6 Active: active (running) since Wed 2015-07-22 02:26:31 EDT; 13s ago
7 Main PID: 18995 (redis-server)
8 CGroup: /system.slice/redis.service
9 └─18995 /usr/bin/redis-server 127.0.0.1:6379
最后,让我们通过运行来测试我们的Redis设置:
1redis-cli ping
如果是这样的话,你现在在你的服务器上运行了Redis,我们可以开始配置它。
1redis-benchmark -q -n 1000 -c 10 -P 5
上面的命令说,我们希望redis-benchmark
在静止模式下运行,共有1000个请求,10个平行连接和5个管道请求。
在完成后,您应该看到类似于以下的输出:
1[secondary_label Output]
2PING_INLINE: 166666.67 requests per second
3PING_BULK: 249999.98 requests per second
4SET: 200000.00 requests per second
5GET: 200000.00 requests per second
6INCR: 200000.00 requests per second
7LPUSH: 200000.00 requests per second
8LPOP: 200000.00 requests per second
9SADD: 200000.00 requests per second
10SPOP: 249999.98 requests per second
11LPUSH (needed to benchmark LRANGE): 200000.00 requests per second
12LRANGE_100 (first 100 elements): 35714.29 requests per second
13LRANGE_300 (first 300 elements): 11111.11 requests per second
14LRANGE_500 (first 450 elements): 7194.24 requests per second
15LRANGE_600 (first 600 elements): 5050.50 requests per second
16MSET (10 keys): 100000.00 requests per second
现在,对 Redis 奴隶服务器 ** 重复此部分. 如果您正在配置更多 Droplets,您可以根据需要设置尽可能多的奴隶服务器。
在此时,Redis安装并在我们的两个节点上运行.如果任何节点的输出与上面所示不相似,请仔细重复安装过程,并检查所有前提条件是否满足。
步骤 2 – 配置 Redis Master
现在,Redis已经在我们的两个Droplet集群上运行,我们必须编辑他们的配置文件,正如我们所看到的那样,配置主服务器和奴隶之间存在较小的差异。
让我们先从我们的 master 开始。
使用您最喜欢的文本编辑器打开 /etc/redis.conf
:
1sudo vi /etc/redis.conf
编辑下列行。
对 TCP 的 keepalive 计时器设置合理值:
1[label /etc/redis.conf]
2tcp-keepalive 60
通过评论这个行,让网络上的任何人都能访问服务器:
1[label /etc/redis.conf]
2#bind 127.0.0.1
鉴于Redis的性质和速度非常高,攻击者可能会在没有很多问题的情况下强行使用密码,因此我们建议不要评论requirepass
行,并添加复杂的密码(最好是复杂的密码句子):
1[label /etc/redis.conf]
2requirepass your_redis_master_password
根据您的使用场景,您可以更改下列行或不。 为本教程的目的,我们假定不会发生任何密钥删除。
1[label /etc/redis.conf]
2maxmemory-policy noeviction
最后,我们希望对数据进行下列更改,这些更改是数据备份所必需的。
1[label /etc/redis.conf]
2appendonly yes
3appendfilename "appendonly.aof"
保存你的变化
重新启动 Redis 服务以重新加载我们的配置更改:
1sudo systemctl restart redis.service
现在我们已经准备好了主服务器,让我们转向我们的奴隶机器。
步骤 3 – 配置 Redis Slave
我们需要做出一些更改,使我们的奴隶服务器能够连接到我们的主实例:
使用您最喜欢的文本编辑器打开 /etc/redis.conf
:
1sudo vi /etc/redis.conf
编辑下面的行;一些设置将类似于大师的。
通过评论这个行,让网络上的任何人都能访问服务器:
1[label /etc/redis.conf]
2#bind 127.0.0.1
奴隶服务器也需要一个密码,所以我们可以给它命令(如INFO
)。
1[label /etc/redis.conf]
2requirepass your_redis_slave_password
删除此行,并指示 IP 地址,在那里可以访问 主服务器 ,然后是该机器设置的端口。
1[label /etc/redis.conf]
2slaveof your_redis_master_ip 6379
删除masterauth
行,并提供您之前在 master server 上设置的密码/passphrase:
1[label /etc/redis.conf]
2masterauth your_redis_master_password
现在保存这些更改,然后退出文件,然后像我们在主服务器上一样重新启动服务:
1sudo systemctl restart redis.service
这将重新启动 Redis 并加载我们修改的文件。
连接到 Redis:
1redis-cli -h 127.0.0.1 -p 6379
使用奴隶服务器
的密码授权:
1AUTH your_redis_slave_password
此时,我们正在运行一个功能性的主奴隶 Redis 集群,这两个机器都已正确配置。
步骤 4 – 验证主奴隶复制
测试我们的设置将使我们能够更好地理解我们的Redis Droplets的行为,一旦我们想要开始脚本故障行为. 我们现在想要做的就是确保我们的配置正确工作,我们的主人正在与奴隶的Redis实例交谈。
首先,我们通过我们的终端连接到Redis,在主服务器上**:
首先连接到本地实例,默认情况下在端口 6379 上运行。
1redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置主机时设置的密码与 Redis 进行身份验证:
1AUTH your_redis_master_password
你应该得到一个OK
作为回应,现在,你只需要运行:
1INFO
您将看到您需要知道的所有关于 Redis 主服务器的内容,我们尤其对# Replication
部分感兴趣,该部分应该看起来像以下输出:
1[secondary_label Output]
2. . .
3
4# Replication
5role:master
6connected_slaves:1
7slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1
8master_repl_offset:407
9repl_backlog_active:1
10repl_backlog_size:1048576
11repl_backlog_first_byte_offset:2
12repl_backlog_histlen:406
13
14. . .
请注意connected_slaves:1
行,这表明我们的其他实例正在与主Droplet交谈,您还可以看到我们得到奴隶的IP地址,以及端口,状态和其他信息。
现在让我们来看看我们的奴隶机器上的# Replication
部分。过程与我们的主服务器相同。登录到Redis实例,发出INFO
命令,然后查看输出:
1[secondary_label Output]
2. . .
3
4# Replication
5role:slave
6master_host:111.111.111.111
7master_port:6379
8master_link_status:up
9master_last_io_seconds_ago:3
10master_sync_in_progress:0
11slave_repl_offset:1401
12slave_priority:100
13slave_read_only:1
14connected_slaves:0
15master_repl_offset:0
16repl_backlog_active:0
17repl_backlog_size:1048576
18repl_backlog_first_byte_offset:0
19repl_backlog_histlen:0
20
21. . .
我们可以看到,这台机器扮演了奴隶的角色,正在与主 Redis 服务器进行通信,没有自己的奴隶。
步骤五:转向奴隶
构建这种架构意味着我们还希望以确保数据完整性和我们的应用程序尽可能少的停机时间的方式处理故障。
在奴隶机器
上,我们应该连接到 Redis 实例:
1redis-cli -h 127.0.0.1 -p 6379
现在使用您在配置奴隶时设置的密码与 Redis 进行身份验证
1AUTH your_redis_slave_password
停止奴隶行为:
1SLAVEOF NO ONE
答案应该是OK
,现在输入:
1INFO
搜索# 复制
部分以找到以下输出:
1[secondary_label Output]
2. . .
3
4# Replication
5role:master
6connected_slaves:0
7master_repl_offset:1737
8repl_backlog_active:0
9repl_backlog_size:1048576
10repl_backlog_first_byte_offset:0
11repl_backlog_histlen:0
12
13. . .
正如我们预期的那样,这个奴隶已经变成了一个主人,现在已经准备好接受来自其他机器的连接(如果有的话)。
<$>[注] 如果你有多个奴隶依赖于最初的主人,他们都必须指向新晋升的主人。
这可以很容易地编写脚本,一旦检测到故障,需要执行以下步骤:
- 从应用程序发送所有请求的Redis到一个奴隶机器
- 在那个奴隶上,执行命令
SLAVEOF NO ONE
。从Redis版本 1.0.0开始,这个命令告诉奴隶停止复制数据,并开始作为主服务器 *在所有剩余的奴隶(如果有的话)上,运行SLAVEOF主机名端口
将指示他们停止复制旧主机,完全丢弃现已损失的数据,并从新主机开始复制。
<$>[注] 有许多方法可以实现上述步骤,但是,在发生任何实际故障之前,您必须为您的环境实施一个适当的解决方案,并确保在发生任何实际故障之前彻底测试它。
第6步:重新连接到主人
让我们重新连接到原始主服务器. 在 slave 服务器 上,登录到 Redis 并执行以下操作:
1SLAVEOF your_redis_master_ip 6379
如果您再次运行INFO
命令,您应该看到我们已返回原始设置。
结论
我们已经正确地设置了一个由两个服务器组成的环境,一个作为Redis主,另一个作为奴隶复制数据。这样,如果主服务器随时脱机或丢失我们的数据,我们知道如何切换到我们的奴隶之一以恢复,直到问题得到解决。
接下来的步骤可能包括编写自动故障转移程序,或通过使用VPN解决方案(https://andsky.com/tech/tutorials/how-to-setup-and-configure-an-openvpn-server-on-centos-7)来确保所有Dropplets之间的安全通信。
此外,在在生产环境中部署此类设置时,您应该采取预防措施。 Redis 文档页面应该被研究,并且您必须清楚地了解适用于您的应用程序的安全模型。
这是一个简单的起点,你的数据存储可以建立;绝不是一个完整的指南设置Redis使用主奴隶架构. 如果你认为这个指南应该涵盖的任何东西,请留下评论。