文档章节

Redis集群的安装

会跳舞的机器人
 会跳舞的机器人
发布于 2017/08/27 00:25
字数 2614
阅读 8
收藏 0

一、基本介绍

Redis集群至少需要3个主节点,要保证Redis的高可用性,那每个主节点至少需要一个从节点(如果没有从节点,那集群中的某个主节点挂掉了,那这个节点中的数据也就获取不到了),所以Redis集群就至少需要6个节点,3个主节点,3个从节点。

Redis集群的数据共享

Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:

一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个哈希槽, 其中:

  • 节点 A 负责处理 0 号至 5500 号哈希槽。
  • 节点 B 负责处理 5501 号至 11000 号哈希槽。
  • 节点 C 负责处理 11001 号至 16384 号哈希槽。

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。

与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。 因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。 所以每次往Redis中set值的时候,会根据Redis的计算规则算出这个这个值的哈希值,然后再把数据放到对应处理这个哈希值的节点上,获取数据的时候也是一样的道理。

二、安装

1、服务器规划

注意:端口的规划请事先确认好是否已经被占用,建议各个服务器对应端口的数值带有一定的规律性,便于安装和维护

Paste_Image.png

2、在对应的服务器中打开对应的端口

切换至root用户

# vi /etc/sysconfig/iptables

192.168.31.143中增加:

## redis 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17111 -j ACCEPT

192.168.31.103中增加:

## redis 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7112 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17112 -j ACCEPT

192.168.31.154中增加:

## redis 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7113 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17113 -j ACCEPT

192.168.31.117中增加:

## redis 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7114 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17114 -j ACCEPT

192.168.31.146中增加: ## redis  -A INPUT -m state --state NEW -m tcp -p tcp --dport 7115 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 17115 -j ACCEPT 192.168.31.173中增加:

## redis 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7116 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17116 -j ACCEPT

在各个服务器增加完端口后,进行端口配置重启

# service iptables restart

下面对Redis进行安装,安装目录:/usr/local/redis3,安装用户:root

3、编译和安装所需要的包

# yum install gcc tcl

4、下载或者上传Redis3的最新稳定版本到/usr/local/src

# cd /usr/local/src
# wget http://download.redis.io/releases/redis-3.0.3.tar.gz

5、创建安装目录:

# mkdir /usr/local/redis3

6、解压并进入目录

# tar -zxvf redis-3.0.3.tar.gz
# cd redis-3.0.3

7、编译安装(使用PREFIX指定安装目录)

# make PREFIX=/usr/local/redis3 install

安装完成后,可以看到/usr/local/redis3目录下有一个bin目录,bin目录里面就是redis的命令脚本,如下:

redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis-sentinel  redis-server

以上步骤在每台机器上都要执行安装 ####8、创建集群配置目录,并拷贝redis.conf配置文件到各个节点配置目录

192.168.31.143

# mkdir -p /usr/local/redis3/cluster/7111
# cp /usr/local/src/redis3.0/redis.conf /usr/local/redis3/cluster/7111/redis-7111.conf

192.168.31.103

# mkdir -p /usr/local/redis3/cluster/7112
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7112/redis-7112.conf

192.168.31.154

# mkdir -p /usr/local/redis3/cluster/7113
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7113/redis-7113.conf

192.168.31.117

# mkdir -p /usr/local/redis3/cluster/7114
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7114/redis-7114.conf

192.168.31.146

# mkdir -p /usr/local/redis3/cluster/7115
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7115/redis-7115.conf

192.168.31.173

# mkdir -p /usr/local/redis3/cluster/7116
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7116/redis-7116.conf

9、修改6个节点的redis.conf配置文件内容

Paste_Image.png使用以下命令逐个启动这6个Redis节点实例

192.168.31.143

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf

192.168.31.103

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf

192.168.31.154

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf

192.168.31.117

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf

192.168.31.146

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf

192.168.31.173

# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf

逐个启动后,可以用ps -ef|grep redis命令来检测是否启动成功

root       3273      1  3 15:18 ?        00:00:00 /usr/local/redis3/bin/redis-server *:7111 [cluster]

接下来准备创建集群 ####10、安装ruby和rubygems(注意:需要ruby的版本在1.8.7及以上)

# yum install ruby rubygems

查看ruby的版本信息

# ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

11、gem安装redis ruby接口

# gem install redis

出现如下信息:

Successfully installed redis-3.3.1
1 gem installed
Installing ri documentation for redis-3.3.1...
Installing RDoc documentation for redis-3.3.1...

12、执行Redis集群创建命令(只需要在其中一个节点上执行即可)

拷贝集群创建文件:

# cp /usr/local/src/redis-3.0.3/src/redis-trib.rb /usr/local/bin/redis-trib

执行集群创建脚本:

# redis-trib create --replicas 1 192.168.31.117:7114 192.168.31.146:7115 192.168.31.173:7116 192.168.31.143:7111 192.168.31.103:7112 192.168.31.154:7113

集群创建过程说明: 给定redis-trib程序的命令是create,这表示我们希望创建一个新的集群,--replicas 1表示每个主节点下面有一个从节点,后面的参数则是redis实例的地址列表,程序使用这些地址所指示的实例来创建新的集群。 在第一次执行的时候,输出信息如下:

>>> Creating cluster
Connecting to node 192.168.31.117:7114: OK
Connecting to node 192.168.31.146:7115: OK
Connecting to node 192.168.31.173:7116: OK
Connecting to node 192.168.31.143:7111: OK
Connecting to node 192.168.31.103:7112: OK
Connecting to node 192.168.31.154:7113: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.31.154:7113
192.168.31.173:7116
192.168.31.143:7111
Adding replica 192.168.31.146:7115 to 192.168.31.154:7113
Adding replica 192.168.31.117:7114 to 192.168.31.173:7116
Adding replica 192.168.31.103:7112 to 192.168.31.143:7111
S: 26a53ca5649a85d75d7f78c17897846fad8548c3 192.168.31.117:7114
   replicates 3dc26de1ddb9304dc3451e7044c91b3fd5cb77b9
S: 51dfb182af4fdc33c69218fe6f8421c0311f67f0 192.168.31.146:7115
   replicates e9b5cd667523705b7f4052dd847a45c9abd4ff2e
M: 3dc26de1ddb9304dc3451e7044c91b3fd5cb77b9 192.168.31.173:7116
   slots:5461-10922 (5462 slots) master
M: 45d00776095446fcf7e194a53e50311da4e2c87e 192.168.31.143:7111
   slots:10923-16383 (5461 slots) master
S: aa1577c0295783245870e114ffdcabd0ee9bfd07 192.168.31.103:7112
   replicates 45d00776095446fcf7e194a53e50311da4e2c87e
M: e9b5cd667523705b7f4052dd847a45c9abd4ff2e 192.168.31.154:7113
   slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): 

从以上信息可以看到master节点为7111、7113、7116,这和我们预先计划的不一致,预先计划的master节点是7111、7112、7113,所以在确认这一步,我们输入no,然后再执行上面的脚本,在试过几次后终于得到了我们预想的设置(好像是随机的,没有规律,这一步要注意核对主从关系是否是你所预想的)

>>> Creating cluster
Connecting to node 192.168.31.117:7114: OK
Connecting to node 192.168.31.146:7115: OK
Connecting to node 192.168.31.173:7116: OK
Connecting to node 192.168.31.143:7111: OK
Connecting to node 192.168.31.103:7112: OK
Connecting to node 192.168.31.154:7113: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.31.103:7112
192.168.31.154:7113
192.168.31.143:7111
Adding replica 192.168.31.146:7115 to 192.168.31.103:7112
Adding replica 192.168.31.173:7116 to 192.168.31.154:7113
Adding replica 192.168.31.117:7114 to 192.168.31.143:7111
S: 26a53ca5649a85d75d7f78c17897846fad8548c3 192.168.31.117:7114
   replicates 45d00776095446fcf7e194a53e50311da4e2c87e
S: 51dfb182af4fdc33c69218fe6f8421c0311f67f0 192.168.31.146:7115
   replicates aa1577c0295783245870e114ffdcabd0ee9bfd07
S: 3dc26de1ddb9304dc3451e7044c91b3fd5cb77b9 192.168.31.173:7116
   replicates e9b5cd667523705b7f4052dd847a45c9abd4ff2e
M: 45d00776095446fcf7e194a53e50311da4e2c87e 192.168.31.143:7111
   slots:10923-16383 (5461 slots) master
M: aa1577c0295783245870e114ffdcabd0ee9bfd07 192.168.31.103:7112
   slots:0-5460 (5461 slots) master
M: e9b5cd667523705b7f4052dd847a45c9abd4ff2e 192.168.31.154:7113
   slots:5461-10922 (5462 slots) master
Can I set the above configuration? (type 'yes' to accept): 

输入yes,集群就会将配置应用到各个节点,并join各个节点,让各个节点开始通讯,输出如下信息

>>> 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.....
>>> Performing Cluster Check (using node 192.168.31.117:7114)
M: 26a53ca5649a85d75d7f78c17897846fad8548c3 192.168.31.117:7114
   slots: (0 slots) master
   replicates 45d00776095446fcf7e194a53e50311da4e2c87e
M: 51dfb182af4fdc33c69218fe6f8421c0311f67f0 192.168.31.146:7115
   slots: (0 slots) master
   replicates aa1577c0295783245870e114ffdcabd0ee9bfd07
M: 3dc26de1ddb9304dc3451e7044c91b3fd5cb77b9 192.168.31.173:7116
   slots: (0 slots) master
   replicates e9b5cd667523705b7f4052dd847a45c9abd4ff2e
M: 45d00776095446fcf7e194a53e50311da4e2c87e 192.168.31.143:7111
   slots:10923-16383 (5461 slots) master
M: aa1577c0295783245870e114ffdcabd0ee9bfd07 192.168.31.103:7112
   slots:0-5460 (5461 slots) master
M: e9b5cd667523705b7f4052dd847a45c9abd4ff2e 192.168.31.154:7113
   slots:5461-10922 (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以看出:

  • 192.168.31.117:7114从节点所属的主节点为192.168.31.143:7111
  • 192.168.31.146:7115从节点所属的主节点为192.168.31.103:7112
  • 192.168.31.173:7116从节点所属的主节点为192.168.31.154:7113(通过replicates 后面的值去匹配,相当于外键ID)
  • 192.168.31.103:7112分配的槽点是是0-5460段
  • 192.168.31.154:7113分配的槽点是5461-10922段
  • 192.168.31.143:7111分配的槽点是10923-16383段

集群中的每个节点负责处理一部分哈希槽, 最后一行信息表示集群中的16384个槽都有至少一个主节点在处理,集群运行正常

13、查看redis集群的从属状态关系

# /usr/local/redis3/bin/redis-cli -p 7111 cluster nodes

输出:

26a53ca5649a85d75d7f78c17897846fad8548c3 192.168.31.117:7114 slave 45d00776095446fcf7e194a53e50311da4e2c87e 0 1471133132198 4 connected

3dc26de1ddb9304dc3451e7044c91b3fd5cb77b9 192.168.31.173:7116 slave e9b5cd667523705b7f4052dd847a45c9abd4ff2e 0 1471133130178 6 connected

aa1577c0295783245870e114ffdcabd0ee9bfd07 192.168.31.103:7112 master - 0 1471133133207 5 connected 0-5460

51dfb182af4fdc33c69218fe6f8421c0311f67f0 192.168.31.146:7115 slave aa1577c0295783245870e114ffdcabd0ee9bfd07 0 1471133134217 5 connected

45d00776095446fcf7e194a53e50311da4e2c87e 192.168.31.143:7111 myself,master - 0 0 4 connected 10923-16383

e9b5cd667523705b7f4052dd847a45c9abd4ff2e 192.168.31.154:7113 master - 0 1471133131189 6 connected 5461-10922

14、集群的简单测试

随便挑一个节点,启动redis终端

# /usr/local/redis3/bin/redis-cli -c -p 7114
127.0.0.1:7114> set key1 dreyer
-> Redirected to slot [9189] located at 192.168.31.154:7113
OK
192.168.31.154:7113> get key1
"dreyer"
192.168.31.154:7113> 

可以看到set的key重定向192.168.31.154:711这个节点,因为redis集群会有一个使用公式CRC16(key) % 16384来计算key属于哪个槽

我们切换到192.168.31.154:7113这个节点上来获取刚刚设置key的值,因为设置的key值就落在这个节点上,所以能直接获取到数据

127.0.0.1:7113> get key1
"dreyer"

我们再切换到192.168.31.143:7111这个节点上来获取刚刚设置的key值

# /usr/local/redis3/bin/redis-cli -c -p 7111`
127.0.0.1:7111> get key1
-> Redirected to slot [9189] located at 192.168.31.154:7113
"dreyer"

可以看到这7111这个节点获取数据的时候,会重定向至192.168.31.154:7113节点上获取数据

至此,完成!

© 著作权归作者所有

上一篇: Redis持久化
会跳舞的机器人
粉丝 6
博文 23
码字总数 28541
作品 0
广州
私信 提问
Redis Cluster(集群)的搭建

Redis Cluster(集群)的搭建 一、Redis的下载、安装、启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: 安装完成,下面我们启动Redis服务: Redis启动成功,将采用Redis的默...

Java同学会
2018/06/05
0
0
Redis从单机到集群,一步步教你环境部署以及使用

Redis作为缓存系统来说还是很有价值的,在大数据方向里,也是需要有缓存系统的。一般可以考虑tachyon或者redis,由于redis安装以及使用更简单,所以还是优先考虑了它。那么在一些场景下为了保...

青夜之衫
2017/12/04
0
0
Linux(Ubuntu)Redis 搭建集群

Redis 发布的 5.x 系列和5.x之前的版本,进行集群的构建方式有所调整而并不通用。 一、基础环境准备 1.1 Linux下的C语言编译环境 Redis是C语言开发的,安装redis需要C语言的编译环境。如果没有...

PythonJsGo
04/04
163
1
【Redis学习】--Redis集群搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/83038344 Redis部署 以Linux(CentOS7.4)为例 1.1 安装依赖环境 Redis是c语言开发...

杨晓慧_Hepburn
2018/10/13
0
0
windows上redis集群搭建附github下载地址

下载安装 下载Redis for windows最新版本;解压到d:/redis目录下 下载地址:https://github.com/ServiceStack/redis-windows 本案例使用的版本是3.0.501 下载 RubyInstaller 下载地址:http:...

u010570551
2017/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 7系统增加swap

转载请注明文章出处:CentOS 7系统增加swap swap是位于磁盘上的特殊文件(或分区),属于“虚拟内存”的一部分。通俗点就是内存的备胎,内存充足的情况下,基本上没swap什么事(和设置有关)...

tlanyan
24分钟前
2
0
基于Prometheus和Grafana的监控平台 - 环境搭建

相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics。 Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。比如我们说...

JAVA日知录
今天
5
0
PHP运行时全局构造体

struct _php_core_globals { zend_bool magic_quotes_gpc; // 是否对输入的GET/POST/Cookie数据使用自动字符串转义。 zend_bool magic_quotes_runtime; //是否对运行时从外部资源产生的数据使...

冻结not
今天
4
0
webpack插件html-webpack-plugin

本文转载于:专业的前端网站→webpack插件html-webpack-plugin 1、插件安装 npm install html-webpack-plugin --save-dev 2、插件使用 webpack.config.js配置文件为: var htmlWebpackPlugin=...

前端老手
今天
6
0
数据挖掘

zhengchen1996
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部