前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上配置Redis群集

如何在Ubuntu 14.04上配置Redis群集

原创
作者头像
温浪
修改2018-09-25 10:23:47
5830
修改2018-09-25 10:23:47
举报
文章被收录于专栏:云计算教程系列

介绍

Redis是一个开源键值数据存储,使用内存存储模型和可选的磁盘写入来实现持久性。它具有事务,发布/订阅和自动故障转移等功能。建议将Redis与Linux一起用于生产环境,但开发人员还将OS X作为他们开发和测试的平台。Redis的客户使用大多数语言编写,其中的一些在其网站上有推荐。

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

在本指南结束时,我们将在DigitalOcean上设置两个Redis Droplet,如下所示:

  • Redis主服务器的一个Droplet
  • Redis slave服务器的一个Droplet

我们还将演示如何切换到从属服务器并将其设置为临时主服务器。

随意设置多个从服务器。

要完成本教程,你需要具备一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

准备

虽然这可能适用于早期版本和其他Linux发行版,但我们建议使用Ubuntu 14.04。

出于测试目的,我们将使用小型实例,因为没有实际工作负载需要处理,但生产环境可能需要更大的服务器。

  • Ubuntu 14.04 LTS
  • 两个你需要的任何尺寸的Droplet; 一个主服务器和一个或多个从服务器
  • 可以使用sudo权限的非root用户通过SSH访问您的计算机

第1步 - 安装Redis

从将托管我们的主服务器的Droplet开始,我们的第一步是安装Redis。首先,我们需要添加Chris Lea的Redis存储库(一如既往的,在添加第三方存储库时要格外小心;我们正在使用这个存储库,因为它的维护者是一个有信誉的人物):

代码语言:javascript
复制
sudo add-apt-repository ppa:chris-lea/redis-server

ENTER接受存储库。

运行以下命令以更新我们的包:

代码语言:javascript
复制
sudo apt-get update

安装Redis服务器:

代码语言:javascript
复制
sudo apt-get install redis-server

检查Redis是否已启动并运行:

代码语言:javascript
复制
redis-benchmark -q -n 1000 -c 10 -P 5

上面的命令说我们希望redis-benchmark以安静模式运行,总共有1000个请求,10个并行连接和5个管道请求。有关为Redis运行基准测试的更多信息,在终端键入redis-benchmark --help将打印有用的信息和示例。

让基准测试运行。完成后,您会看到类似于以下内容的输出:

代码语言:javascript
复制
Output
PING_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 Master

既然Redis已经在我们的双Droplet集群上运行,我们就必须编辑它们的配置文件。正如我们将看到的,配置主服务器和从服务器之间存在细微差别。

让我们先从我们的主服务器开始吧。

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

代码语言:javascript
复制
sudo nano /etc/redis/redis.conf

编辑以下行。

为TCP的keepalive计时器设置一个合理的值:

代码语言:javascript
复制
tcp-keepalive 60

通过注释掉这一行,让网络上的任何人都可以访问服务器:

代码语言:javascript
复制
#bind 127.0.0.1

鉴于Redis的性质及其非常高的速度,攻击者可能会在没有太多问题的情况下强行破解密码。这就是为什么我们建议取消注释requirepass行并添加复杂的密码(或最好是复杂的密码):

代码语言:javascript
复制
requirepass your_redis_master_password

根据您的使用场景,您可以选择是否更改以下行。出于本教程的目的,我们假设不必进行密钥删除。取消注释该行并将其设置如下:

代码语言:javascript
复制
maxmemory-policy noeviction

最后,我们要进行以下更改,以备份数据。取消注释和/或设置这些行,如下所示:

代码语言:javascript
复制
appendonly yes
appendfilename redis-staging-ao.aof

保存更改。

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

代码语言:javascript
复制
sudo service redis-server restart

现在我们已准备好主服务器,让我们继续我们的从机。

第3步 - 配置Redis Slave

我们需要进行一些更改,以允许我们的从服务器连接到我们的主实例:

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

代码语言:javascript
复制
sudo nano /etc/redis/redis.conf

编辑以下行; 一些设置将类似于主服务器的设置。

通过注释掉这一行,让网络上的任何人都可以访问服务器:

代码语言:javascript
复制
#bind 127.0.0.1

从服务器也需要密码,因此我们可以给它命令(例如INFO)。取消注释此行并设置服务器密码:

代码语言:javascript
复制
requirepass your_redis_slave_password

取消注释该行并指示可以到达主服务器的IP地址,然后指定该计算机上设置的端口。默认情况下,端口为6379:

代码语言:javascript
复制
slaveof your_redis_master_ip 6379

取消注释masterauth行并提供您在主服务器上先前设置的密码/密码:

代码语言:javascript
复制
masterauth your_redis_master_password

现在保存这些更改,然后退出该文件。接下来,重启服务,就像我们在主服务器上所做的那样:

代码语言:javascript
复制
sudo service redis-server restart

这将重新初始化Redis并加载我们修改过的文件。

连接到Redis:

代码语言:javascript
复制
redis-cli -h 127.0.0.1 -p 6379 

使用从服务器的密码进行授权:

代码语言:javascript
复制
AUTH your_redis_slave_password

此时,我们正在运行功能主从Redis群集,两台机器都已正确配置。

第4步 - 验证主从复制

一旦我们想要开始编写故障转移行为脚本,测试我们的设置将使我们能够更好地理解Redis Droplet的行为。我们现在要做的是确保我们的配置正常工作,并且我们的主人正在与从属Redis实例进行通信。

首先,我们通过主服务器上的终端连接到Redis :

首先连接到本地实例,默认情况下在端口6379上运行。如果您更改了端口,请相应地修改命令。

代码语言:javascript
复制
redis-cli -h 127.0.0.1 -p 6379

现在使用您在配置主服务器时设置的密码对Redis进行身份验证:

代码语言:javascript
复制
AUTH your_redis_master_password

你应该得到一个OK的回应。现在,你只需要运行:

代码语言:javascript
复制
INFO

您将看到有关Redis主服务器的所有信息。我们对#Replication部分特别感兴趣,该部分应如下所示:

代码语言:javascript
复制
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命令,查看输出:

代码语言:javascript
复制
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
​
. . .

我们可以看到这台机器作为从机,正在与Redis主服务器通信,并且没有自己的从机。

第5步 - 切换到从属

构建此体系结构意味着我们还希望以这样的方式处理故障,即我们确保数据完整性并尽可能减少应用程序的停机时间。任何从机都可以晋升为主机。首先,让我们手动测试切换。

从机上,我们应该连接到Redis实例:

代码语言:javascript
复制
redis-cli -h 127.0.0.1 -p 6379

现在使用您在配置从站时设置的密码对Redis进行身份验证

代码语言:javascript
复制
AUTH your_redis_slave_password

关闭从属行为:

代码语言:javascript
复制
SLAVEOF NO ONE

反馈会是OK。现在输入:

代码语言:javascript
复制
INFO

查找# Replication部分以查找以下输出:

代码语言:javascript
复制
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的所有请求发送到从属计算机
  • 在该从站上,执行SLAVEOF NO ONE命令。从Redis版本1.0.0开始,此命令告诉从属服务器停止复制数据,并开始充当主服务器
  • 在所有剩余的从站(如果有的话)上,运行SLAVEOF hostnameport将指示它们停止从旧主站复制,完全丢弃现在已弃用的数据,并从新主站开始复制。确保从新升级的主人那里使用正确的值替换hostnameport
  • 分析问题后,如果您的特定设置需要,您可以返回将初始服务器作为主服务器

有许多方法可以完成上述步骤。但是,您可以为您的环境实施适当的解决方案,并确保在发生任何实际故障之前对其进行彻底测试。

第6步 - 重新连接到主服务器

让我们重新连接到原始主服务器。在从属服务器上,登录Redis并执行以下命令:

代码语言:javascript
复制
SLAVEOF your_redis_master_ip 6379

如果再次运行INFO命令,您会看到我们已经返回到原始设置。

结论

我们已经正确地建立了一个由两个服务器组成的环境,一个服务器充当Redis主服务器,另一个服务器复制数据作为从服务器。这样,如果主服务器脱机或丢失我们的数据,我们就知道如何切换到我们的一个从服务器进行恢复,直到问题得到解决。

接下来的步骤可能包括编写自动故障转移过程的脚本,或通过使用OpenV**或Tinc等V**解决方案确保所有Droplet之间的安全通信。此外,测试过程和脚本对于验证配置至关重要。

此外,在生产环境中部署此类设置时应采取预防措施。在Redis的文档页面应该研究,你必须有一个什么样的安全模型是足以满足您的应用程序一个清晰的认识。我们经常使用Redis作为会话存储,它包含的信息对攻击者来说很有价值。通常的做法是只能通过专用网络访问这些机器,并将它们放在多层安全性之后。

这是一个可以构建数据存储的简单起点; 绝不是关于设置Redis以使用主从架构的详尽指南。

想要了解更多关于配置Redis群集的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Configure a Redis Cluster on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步 - 安装Redis
  • 第2步 - 配置Redis Master
  • 第3步 - 配置Redis Slave
  • 第4步 - 验证主从复制
  • 第5步 - 切换到从属
  • 第6步 - 重新连接到主服务器
  • 结论
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档