转载请出自出处:http://www.cnblogs.com/hd3013779515/

一、基本概念

1、redis集群是一个可以在多个节点之间进行数据共享的设施。redis集群提供了以下两个好处
1.1 将数据自动切分(split)到多个节点
1.2 当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。

2、一个 Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。这样的话就可以很方便的向集群中添加或者移除节点。(假设集群中有A B C 三个节点)

2.1 添加节点:如果要添加一个D节点到集群中,首先要把这个节点添加到集群,然后还需要将节点ABC中的某些哈希槽移动到节点D。
2.2 移除节点:如果要移除节点A,那么只需要把节点A中的所有哈希槽转移到节点B和节点C中,然后再移除空白节点A就可以了。

3、集群中的主从复制
集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。这样集群就不会因为一个主节点的下线而无法正常工作。
注意:如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。

4、redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令

4.1 使用异步复制(asynchronous replication)是 Redis 集群可能会丢失写命令的其中一个原因

4.2 网络原因,如果网络断开时间太长,redis集群就会启用新的主节点,之前发给主节点的数据就会丢失。

二、redis cluster 搭建

要让集群正常工作至少需要 3个主节点,在这里我们要创建 6个redis 节点,其中三个为主节点,三个为从节点,对应的 redis节点的ip 和端口对应关系如下

192.168.137.174:6379
192.168.137.174:6380

192.168.137.174:6381

192.168.137.174:6382

192.168.137.174:6383

192.168.137.174:6384

1:安装redis

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -xzvf redis-3.2.9.tar.gz -C /usr/local
cd /usr/local/redis-3.2.9
make
如果报错,可以参考 http://www.cnblogs.com/hd3013779515/p/6914374.html

2:创建集群需要的目录(一台机器上模拟6个实例)

mkdir -p /usr/local/redis-cluster

cd /usr/local/redis-cluster

mkdir 6379

mkdir 6380

mkdir 6381

mkdir 6382

mkdir 6383

mkdir 6384

备注: 要让集群正常运作至少需要三个主节点

3:修改配置文件redis.conf

cp /usr/local/redis-3.2.9/redis.conf  /usr/local/redis-cluster

vi redis.conf

##修改配置文件中的下面选项

port 6379

bind 192.168.137.174

daemonize yes

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

##修改完redis.conf 配置文件中的这些配置项之后把这个配置文件分别拷贝到 6379~6384目录下面

cp /usr/local/redis-cluster/redis.conf /usr/local/redis-cluster/6379

##注意:拷贝完成之后要修改6379~6384目录下面redis.conf 文件中的 port参数,分别改为对应的文件夹的名称

4:分别启动这6redis 实例

cd /usr/local/redis-cluster/6379/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6380/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6381/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6382/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6383/

/usr/local/redis-3.2.9/src/redis-server redis.conf

cd /usr/local/redis-cluster/6384/

/usr/local/redis-3.2.9/src/redis-server redis.conf

注意:一定先进入6379~6384目录,然后再启动服务,服务启动后自动生成appendonly.aof,nodes.conf文件。

##启动之后使用命令查看redis的启动情况 ps -ef|grep redis

如下图显示则说明启动成功

5:执行redis的创建集群命令创建集群

cd /usr/local/redis-3.2.9/src

./redis-trib.rb  create --replicas 1 192.168.137.174:6379 192.168.137.174:6380 192.168.137.174:6381 192.168.137.174:6382 192.168.137.174:6383 192.168.137.174:6384

注意: replicas 是给master分配slave个数的参数,我们给的参数是1 ,那每个master就有一个从节点.

5.1执行上面的命令的时候可能会报错,因为是执行的 ruby的脚本,需要ruby的环境

错误内容: /usr/bin/env: ruby: No such file or directory

所以需要安装 ruby的环境,这里推荐使用yum install ruby安装

yum install ruby

5.2然后再执行第5步的创建集群命令,可能还会报错,提示缺少 rubygems组件,使用yum安装

错误内容:

./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)

from ./redis-trib.rb:24

yum install rubygems

5.3再次执行第5步的命令,可能还会报错,提示不能加载 redis,是因为缺少redis和 ruby的接口,使用gem 安装

错误内容:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)

from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

from ./redis-trib.rb:25

gem install redis

注意: 若公司有代理,通过gem install --http-proxy http://proxy.xxx.com:8080 redis  模式安装,红色部分是公司的代理

5.4 再次执行第5步的命令,正常执行

输入 yes,然后配置完成。

至此 redis集群即搭建成功!

6:使用redis-cli 命令进入集群环境

/usr/local/redis-3.2.9/src/redis-cli -c -h 192.168.137.174 -p 6379

备注:  -c  表示 cluster模式进入,-p 指定集群某个端口号

登录集群后,然后进行验证:

7:查看集群中的所有节点信息

/usr/local/redis-3.2.9/src/redis-cli -h 192.168.137.174 -p 6379 cluster nodes [| grep master]

8: 通过check cluster的一个节点,就知道整个集群的状况

/usr/local/redis-3.2.9/src/redis-trib.rb check 192.168.137.174:6379

9、集群配置解析

默认情况下不能从slaves读取数据,但建立连接后,执行一次命令READONLY,该slaves即可读取数据。

否则只能以redis-cli -c -h -p命令登录 -c是以集群方式

cluster-enabled yes   集群开关,默认是不开启集群模式。

cluster-config-file nodes-6379.conf  集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有 Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突。

cluster-node-timeout 15000 节点互连超时的阀值。集群节点超时毫秒数。即节点与集群其他节点断开多长时间将被认定为超时。建议稍微大一点

cluster-slave-validity-factor 10 在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor)+ repl-ping-slave-period如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移

cluster-migration-barrier 1 master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2个可工作的从节点时,它的一个从节点才会尝试迁移。

cluster-require-full-coverage yes 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。

2.Redis集群环境搭建的更多相关文章

  1. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  2. 【redis】 linux 下redis 集群环境搭建

    Redis集群 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:63791 ...

  3. Redis集群环境搭建

    Redis集群cluster环境搭建 描述:本章节主要单服务器搭建集群,在一个服务器上启动多个不同端口的redis服务,非真实环境. 真实环境下redis集群会搭建在多个物理服务器上,并非单一的服务器 ...

  4. redis集群环境搭建的错误

    安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. yum -y install ru ...

  5. [心得]redis集群环境搭建的错误

    安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. yum -y install ru ...

  6. redis 集群环境搭建-redis集群管理

    集群架构 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redi ...

  7. redis 集群环境搭建

    原理: 1,每个Redis群集的节点都需要打开两个TCP连接,由于这两个连接就需要两个端口,分别是用于为客户端提供服务的常规Redis TCP命令端口(例如6379)以及通过将10000和命令端口相加 ...

  8. 基于sentinel 的redis集群环境搭建

    环境信息,三台机器,一台master,两台slave,每台机器上启动一个sentinel master 192.168.1.106 slave1 192.168.1.102 slave2 192.16 ...

  9. 带你自行搭建虚拟机和Redis集群环境,值得收藏!

    前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...

随机推荐

  1. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

  2. 分布式理论(四)—— 一致性协议之 3PC

    前言 我们说为了实现 BASE 理论,需要在可用性和一致性之间找到一个合适的一致性理论,于是,我们在上篇文章中了解了 2PC 理论,也就是两阶段提交,二阶段提交原理简单,实现方便,但是缺点则是同步阻塞 ...

  3. [C#]记一次解析XML转对象的笔记

    项目中调用第三方API,返回格式是XML字符串,需要将XML反序列化为对象,格式如下: <?xml version="1.0"?> <Response xmlns ...

  4. 点击CheckBox让Gridview控件在编辑与正常状态之间切换

    昨晚快休息时,还有一位网友咨询Insus.NET,他想在开发时,实现一个小功能,就是想让用户在点击Gridview控件第一列的CheckBox之后,GridView进入编辑状态,取消选中的CheckB ...

  5. SQLite事务 SQLite插入多条语句为什么这么慢?.net (C#)

    今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!下面是他发给我的测试代码.我晕~~~~~~ using System.Data; ...

  6. The area (hdu1071)积分求面积

    The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  8. 面向对象的JS随笔

    Scoping 全局与局部 全局变量可用在所有环境中,局部变量只可用在局部 js中连接变量至一个从未声明的变量,后面的变量自动提升成一个全局变量(不要这样用,不易阅读) 只有function(){中才 ...

  9. (Stanford CS224d) Deep Learning and NLP课程笔记(二):word2vec

    本节课将开始学习Deep NLP的基础--词向量模型. 背景 word vector是一种在计算机中表达word meaning的方式.在Webster词典中,关于meaning有三种定义: the ...

  10. windows10局域网实现文件共享

    1.共享文件夹设置: 磁盘文件夹,鼠标右键 选择高级共享 如图,自定义选项: 控制面板中添加新用户,一定给设置一个密码(远程登录时候用) 用户: * windows键+R * \\IP地址\目录 * ...