如何在Ubuntu 16.04上安装和配置Redis集群

Redis集群已经发展成为缓存,队列等的流行工具,因为它具有可扩展性和速度的潜力。本指南旨在使用三个Linode创建一个集群来演示分片。然后,如果发生故障,您将需要把一个从节点变为主节点。

Redis作为内存存储允许极其快速的操作,如计数,缓存,排队等。集群设置通过减少故障点大大提高了Redis的可靠性。

在开始之前,我们建议您熟悉以下内容:

在每个Linode上安装Redis

根据您的Linux版本,可以通过包管理器安装Redis。只有Redis 3.0及更高版本支持群集。以下步骤用于安装最新的Redis稳定分支。

  1. 安装依赖项:
sudo apt-get update && sudo apt-get upgrade sudo apt install make gcc libc6-dev tcl

注意,您可以使用build-essential加载Redis的依赖项。

  1. 从文档中,下载当前的稳定分支,然后提取:
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
sudo make install

1. 运行以下命令确保安装成功:

make test

如果安装成功,控制台将输出:

\o/ All tests passed without errors!

2. 对将成为群集一部分的每个服务器重复安装。

配置主节点和从节点

本指南在三个Linode上手动连接每个主站和从站。考虑使用tmux来管理多个终端窗口。

尽管官方文档建议创建6个节点,但本指南将使用最少3个具有以下拓扑结构的节点:

此设置使用三个Linode,每个Linode运行两个Redis服务器实例。您必须确保每个主机都是独立的,然后在需要维护正常运行时间要求时考虑使用其他节点。

  1. SSH到服务器1。导航redis-stable/然后复制redis.conf。本指南中的配置文件的命名与上图一致:
cp redis.conf c_slave.conf
mv redis.conf a_master.conf

警告:Redis群集中的节点需要定义的端口和高于10000的端口。在此实例中,TCP端口6379和16379都需要打开。确保正确配置iptables或ufw。

  1. a_master.conf,注释该bind指令并启用集群模式。此示例中的端口范围为6379到6381。/redis-stable/a_master.conf
  2. c_slave.conf,除了更新端口号之外,配置将类似。redis-trib.rb稍后将使用它将其配置为适当主设备的从设备,而不是slaveof指令。
/redis-stable/c_slave.conf

bind 127.0.0.1
protected-mode no
port 6381
pidfile /var/run/redis_6381.pid
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000
  1. 在剩下的两个linode上重复这个过程,注意为所有主从对指定端口号。

连接Master和Slave

通过在每个节点上运行Redis服务器的两个实例,可以跨三个节点实现主/从复制。

  1. SSH到服务器1并启动两个Redis实例。redis-server redis-stable/a\_master.conf redis-server redis-stable/c\_slave.conffghjkl使用内置Ruby脚本创建集群
  2. 替换剩余的两台服务器a_master.confc_slave.conf使用适当的配置文件。所有主节点都应以群集模式启动。

使用内置Ruby脚本创建集群

此时,每个Linode都托管两个独立的主节点。Redis安装附带一个Ruby脚本~/redis-stable/src/,可以帮助创建和管理集群。

1. 如果尚未安装Ruby,可以在包管理器中找到它:

sudo apt install ruby

2. 安装Redis gem:

gem install redis

3. 导航到源目录以运行脚本。redis-stable/src/redis-trib.rb create ip.of.server1:6379 ip.of.server2:6380 ip.of.server3:6381

4.接受三个Master的配置。成功设置群集将返回以下消息:

>>>Creating cluster
>>>Performing hash slots allocation on 3 nodes...
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

5. 使用该redis-cli工具查看连接到群集的所有当前节点。该-c标志指定与群集的连接。redis-cli -c -h ip.of.server1 -p 6379 ip.of.server1>CLUSTER NODES

这将返回当前在其ID和从属标识的集群中的节点列表 - 如果存在。要退出界面,请单击exit

ip.of.server1>exit

注意:Redis关键字不区分大小写。但是,为了清楚起见,它们在本指南中作为所有大写字母编写。

添加从节点(Slave node)

redis-trib工具还可用于向集群添加新节点。使用其余三个节点,您可以手动将它们添加到选定的主节点。

  1. 使用add-note和指定将从站连接到给定的主站master_id

./redis-trib.rb add-node --slave --master-id master\_id\_c ip.of.server1:6381 ip.of.server3:6381

结果输出应该是:

>>> Adding node ip.of.server1:6381 to cluster ip.of.server3:6381
>>> Performing Cluster Check (using node ip.of.server3:6381)
M: [master_id_c] ip.of.server3:6381
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
M: [master_id_a] ip.of.server1:6379
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
M: [master_id_b] ip.of.server2:6380
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node ip.of.server1:6381 to make it join the cluster.
Waiting for the cluster to join...
>>> Configure node as replica of ip.of.server3:6381.
  1. 重复其余两个节点。./redis-trib.rb add-node --slave --master-id master\_id\_a ip.of.server2:6379 ip.of.server1:6379 ./redis-trib.rb add-node --slave --master-id master\_id\_b ip.of.server3:6380 ip.of.server2:6380

添加键值对和分片

除了返回有关群集的信息之外,命令行界面还提供了一种方法SETGET键。在本地计算机上,您可以连接到任何主节点并浏览Redis群集的某些属性。

  1. 如果需要,请在本地计算机上重复安装Redis。检查防火墙设置是否允许与主节点通信。

redis-cli -c -h ip.of.server1 -p 6379

  1. 使用此CLUSTER INFO命令可以查看有关群集状态的信息,例如大小,哈希槽和故障(如果有)。
ip.of.server1:6379>CLUSTER INFO cluster\_state:ok cluster\_slots\_assigned:16384 cluster\_slots\_ok:16384 cluster\_slots\_pfail:0 cluster\_slots\_fail:0 cluster\_known\_nodes:6 cluster\_size:3 cluster\_current\_epoch:6 cluster\_my\_epoch:1 cluster\_stats\_messages\_ping\_sent:8375 cluster\_stats\_messages\_pong\_sent:9028 cluster\_stats\_messages\_meet\_sent:1 cluster\_stats\_messages\_sent:17404 cluster\_stats\_messages\_ping\_received:9022 cluster\_stats\_messages\_pong\_received:8376 cluster\_stats\_messages\_meet\_received:6 cluster\_stats\_messages\_received:17404
  1. 要检查主/从复制,请INFO replication返回有关从站的信息。
ip.of.server1:6379>INFO replication
role:master
connected_slaves:1
slave0:ip=ip.of.server1,port=6381,state=online,offset=213355,lag=1
master_replid:cd2e27cba094f2e7ed38b0313dcd6a979ab29b7a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:213355
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:197313
repl_backlog_histlen:16043
  1. 要演示分片,您可以设置一些示例键值对。设置密钥会将值重定向到三个主节点中的散列槽。
ip.of.server1:6379> SET John Adams
-> Redirected to slot [6852] located at ip.of.server2:6380
OK
ip.of.server2:6380> SET James Madison
-> Redirected to slot [2237] located at ip.of.server1:6379
OK
ip.of.server1:6379> SET Andrew Jackson
-> Redirected to slot [15768] located at ip.of.server3:6381
OK
ip.of.server3:6381> GET John
-> Redirected to slot [6852] located at ip.of.server2:6380
"Adams"
ip.of.server2:6380>

促使从节点(Slave)成为主节点(Master)

根据当前拓扑,如果其中一个Linode发生故障,群集将保持联机状态。此时,您可以期望从属服务器在复制数据的情况下升级为主服务器。

  1. 添加键值对。
ip.of.server1:6379> SET foo bar
-> Redirected to slot [12182] located at ip.of.server3:6381
OK
ip.of.server3:6381> GET foo
"bar"

密钥foo将添加到服务器3上的主服务器并复制到服务器1上的从服务器

  1. 在事件服务器3关闭的情况下,服务器1上的从节点将成为主节点,并且群集将保持在线。
ip.of.server1:6379> CLUSTER NODES
[slave_id_b] ip.of.server3:6380@16380 slave,fail [master_id_b] 1502722149010 1502722147000 6 connected
[slave_id_a] ip.of.server2:6379@16379 slave [master_id_a] 0 1502722242000 5 connected
[slave_id_c_promoted] ip.of.server1:6381@16381 master - 0 1502722241651 7 connected 10923-16383
[master_id_b] ip.of.server2:6380@16380 master - 0 1502722242654 2 connected 5461-10922
[master_id_c] ip.of.server3:6381@16381 master,fail - 1502722149010 1502722145402 3 connected
[master_id_a] ip.of.server1:6379@16379 myself,master - 0 1502722241000 1 connected 0-5460
  1. 以前位于服务器3上的散列槽中的密钥,密钥值对现在存储在服务器1上
ip.of.server1:6379> GET foo
-> Redirected to slot [12182] located at ip.of.server1:6381
"bar"

请记住确保防火墙设置适用于所有Redis实例。补充功能,例如添加其他节点,创建多个从属或重新分片,这些都超出了本文档的范围。有关更多指导,请参阅Redis官方文档以了解如何实现这些功能。

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 阿小庆 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端杂货铺

服务端事件EventSource揭秘

服务端推 服务端推,指的是由服务器主动的向客户端发送消息(响应)。在应用层的HTTP协议实现中,“请求-响应”是一个round trip,它的起点来自客户端,因...

3085
来自专栏张善友的专栏

服务器未能识别 HTTP 标头 SOAPAction 的值

SOAPAction HTTP request header被用来标识SOAP HTTP请求的目的地,其值是个URI地址。SOAP发送并不限制格式、URI特征或...

2696
来自专栏腾讯云Elasticsearch Service

logstash input插件开发

logstash作为一个数据管道中间件,支持对各种类型数据的采集与转换,并将数据发送到各种类型的存储库,比如实现消费kafka数据并且写入到Elasticsea...

5194
来自专栏草根专栏

使用Angular CLI进行Build (构建) 和 Serve

Build. Build主要会做以下动作: 编译项目文件并输出到某个目录 Build targets决定了输出的结果 bundling 打包 生产环境的buil...

3757
来自专栏好好学java的技术栈

java工程师必备linux常用命令,这篇文章就够了

bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)...

2351
来自专栏windealli

常用压测工具

webbench 是常用的网站压力测试工具,webbench用C语言编写,代码仅有区区几百行。

7045
来自专栏乐沙弥的世界

Percona XtraDB Cluster GCache和Record-Set缓存

在Percona XtraDB集群中,有一个GCache和Record-Set缓存(也可称为事务写集缓存)的概念。如果您正在运行长事务,那么使用这两个缓存通常会...

1140
来自专栏潇涧技术专栏

One Trip of building a Crawler

最近需要从网上抓取大量的数据,于是体验了一下爬虫程序的开发和部署,主要是学会了一些实用工具的操作。

1082
来自专栏大数据实战演练

Ambari自定义服务干货

                    “ ambari自定义服务干货,非常干的那种”

4282
来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

58513

扫码关注云+社区