前言

  redis数据存储在内存中, 就会受到内存的限制, 大家都知道, 一台电脑, 硬盘可以有1T, 但是内存, 没有听说有1T的内存吧.

  那如果数据非常多, 超过一台电脑的内存空间, 怎么办呢?

  正常思维, 都是, 一台电脑不够, 那我再加一台电脑嘛, 不就够了.

redis集群架构图

  

每一台redis server之间都是保持通讯的. 也就是说, 如果 server1 上面没有要查找的值, 会跳转到别的服务器上查找.

注: 

  如果其中有一个服务器挂了, 如 server4 挂了. redis是怎么处理的呢?

  redis集群中, 有一个投票机制, 当server4挂了之后, 会由server1, server2, server3 共同投票, 因为他们都与server4有通讯关系, 当大家都认定server4 确实挂了之后, 大家的投票结果就是, 大家可以休息了, 下班了.

  那很明显, 这里有不合理性. 那怎么解决呢?

  在集群中, 为了保证一台机子挂了之后, 系统任然正常运行, 一个常用的方法是加备份机.(备胎)

  redis中也是这样, 如果给每一台机子上加一台备份机, 那么大家投票认为server4挂了之后, 备胎就有福了. 可以取而代之. 这样就可以保证, 系统还可以正常运行.

搭建集群

根据上面的架构图, 以及投票机制和备胎机制, 一个合格的redis集群, 应该是要6台电脑. 作为我个人来讲, 我去哪里弄6台电脑啊, 装6台虚拟机还差不多. 但是同时跑6台虚拟机, 你累不累啊?

既然没有那么多电脑, 也不想装那么多虚拟机, 那么久来个伪集群吧. 到生产环境中, 需要多台电脑来搭建集群的时候, 步骤是一样的. 结果其实也是一样的, 没差, 甚至更简单点.

一. 搭建多个redis

  接着前面的篇幅中的redis文件.

1. 拷贝创建redis-cluster文件夹

  

2. 进入redis-cluster, 将bin文件重命名

  

3. 对redis1下的redis.conf文件进行端口和集群配置

vim ./redis1/redis.conf

  3.1 端口修改

  

  3.2 允许集成开关

  

  这里默认是被注释掉的. 只要打开注释就可以了

4. 将redis1复制5份出来, 分别命名为redis2,redis3, redis4, redis5, redis6

  

5. 修改redis2~redis6的端口号, 分别为7002~7006. 修改方式与3.1一样的.

6. 创建一把启动脚本. vim start-all.sh 

cd /usr/local/redis-cluster/redis1
./redis-server redis.conf
cd ../redis2
./redis-server redis.conf
cd ../redis3
./redis-server redis.conf
cd ../redis4
./redis-server redis.conf
cd ../redis5
./redis-server redis.conf
cd ../redis6
./redis-server redis.conf

7. 修改start-all.sh的权限

  如果不改权限, 直接运行, 是跑不起来的

[root@localhost redis-cluster]# chmod u+x start-all.sh

  修改完之后, 就可以牵出来溜一下, 看看是否都能跑起来

  

  通过ps看一下

  

8. 创建一把结束脚本 vim shutdown-all.sh

  有始有终, 一把开始, 当然也需要一把结束, 总不能一个一个去结束吧, 太麻烦了

cd /usr/local/redis-cluster/redis1
./redis-cli -p 7001 shutdown
cd ../redis2
./redis-cli -p 7002 shutdown
cd ../redis3
./redis-cli -p 7003 shutdown
cd ../redis4
./redis-cli -p 7004 shutdown
cd ../redis5
./redis-cli -p 7005 shutdown
cd ../redis6
./redis-cli -p 7006 shutdown

  同样的, 这个脚本也需要修改访问权限, 与上面是一样的.

chmod u+x shutdown-all.sh

  跑一下这个脚本看看

[root@localhost redis-cluster]# ./shutdown-all.sh 

  这时候, 再通过ps看看

  

  都关掉了.

 

二. 集群

注:

  在开始搭建之前, 有一些概念, 要搞清楚.

  在redis-cluster中, 吧所有的物理节点都映射到[0-16383]个slot(槽)上, 由cluster负责维护.

  那具体是怎么分配这些槽的呢?

  当有一个数据进来需要进行缓存时, redis会先对key使用crc16算法, 计算出一个结果, 然后对16384进行取余, 这样, 每个key都会得到一个在0-16383之间的数, 这个数, 就是他的槽值. 根据这个数, 将数据存入槽所在的电脑里面.

  也就是说, 如果有3台电脑A,B,C, A->[0, 5000], B->[5001, 10000], C->[10001, 16383]. 进来一个值, key计算最后结果是5005, 则会将这个值存入B电脑里面. 再进来一个值, key计算是10010, 则会存入C电脑中.

  这个槽点, 并不是key的个数, 这里需要注意以下. 理论来说, 可以进行16284台电脑的集群, 每台电脑分一个槽. 但是每个电脑, 肯定会存一堆值.

1. 拷贝redis-trib.rb文件到redis-cluster中

[root@localhost redis-cluster]# cd /usr/java/redis-4.0.6/src/
[root@localhost src]# cp redis-trib.rb /usr/local/redis-cluster/

  

2. 安装ruby

  上面拷贝的文件, 是rb后缀的, 从这个后缀, 应该能看出为啥要安装ruby吧

yum install ruby
yum install rubygems

  安装完成之后, 还需要安装一个 gem

gem install redis --version 3.0.0

3. 使用ruby脚本搭建集群

./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

  在搭建集群的时候, 有可能会报一个错误

  

  这个是为啥呢?

  在集群的时候, 需要保证各redis都是空的, 里面不存数据的. 所以, 这里就需要我们手动来清一下数据.

  在将 各 redis 启动之后, 执行flushdb命令

[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7001
127.0.0.1:7001> flushdb
OK
127.0.0.1:7001>
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> flushdb
OK
127.0.0.1:7002>
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7003
127.0.0.1:7003> flushdb
OK
127.0.0.1:7003>
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7004
127.0.0.1:7004> flushdb
OK
127.0.0.1:7004>
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7005
127.0.0.1:7005> flushdb
OK
127.0.0.1:7005>
[root@localhost redis-cluster]# ./redis1/redis-cli -h 127.0.0.1 -p 7006
127.0.0.1:7006> flushdb
OK
127.0.0.1:7006>

  如果清除之后还不行, 则删除

  目录中的dum.rdb, nodes.conf, appendonly.aof 文件, 每一个redis都要删.

  做完了这些, 一件很重要的事情别忘了:  重启以下redis , 否则, 在集群的时候, 还是会报错的

  

4. 使用

  通过以上的步骤, 就将redis集群搭建好了, 接下来, 就是来验证一番.

  连接集群的时候和连接单机的时候, 稍有不同, 需要在连接指令后面加上 -c

[root@localhost redis-cluster]# ./redis1/redis-cli -p 7001 -c

  

  在存储的时候, 会根据key计算, 找到存放的电脑, 跳转过去存放

  那现在我存放了三个值, 分别在7002, 7003里面, 7001里面没有存值, 还是看的出来的. 现在我通过7001来取一下, 看看可能取出来

  

  在我取的时候, 也是会跳转到相应的存储服务器取数据.

redis 集群搭建: redis-cluster的更多相关文章

  1. redis集群之REDIS CLUSTER

    redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00  NoSQL_博客园 原文  http://www.cnblogs.com/zhanchenjin/p/537 ...

  2. 25.redis集群搭建笔记

    ###Redis集群### 0.准备 软件: redis-3.0.0.gem redis-3.0.0.tar.gz#源码   1.安装ruby环境 redis基于ruby槽位计算,hash算法技术,k ...

  3. Redis 集群搭建详细指南

    先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...

  4. 二、redis集群搭建

    redis集群搭建 redis3.0后支持集群.集群中应该至少有三个节点,每个节点有一备份节点.需要6台服务器.搭建伪分布式,需要6个redis实例.搭建集群的步骤: 一.安装单机版redis 第一步 ...

  5. redis集群搭建及注意事项

    上一篇:redis的安装及注意事项 这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口.这样的话,相当于模拟出 ...

  6. Linux Redis集群搭建与集群客户端实现(Python)

    硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...

  7. [转载] Redis集群搭建最佳实践

    转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...

  8. Linux Redis集群搭建与集群客户端实现

    硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...

  9. Redis集群搭建-韩国庆

    认真一步一步搭建下来,就可以成功.... Redis-cluster集群架构讲解 redis集群专业名词称之为Redis-cluster,redis集群是从3.0版本以后才有的概念,也就是说在3.0之 ...

  10. redis集群搭建及设置账户(转)

    Redis集群搭建以及为集群设置密码 介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. ...

随机推荐

  1. pycharm快捷键及中文说明【使用翻译工具一条一条翻译】

    Search Everywhere: Double Shift Go to File : Ctrl+Shilf+N Recent Files: Ctrl+E Navigation Bar: Alt+H ...

  2. hibernate save数据的时候报错:ids for this class must be manually assigned before calling save()

    这个错误是因为eclipse  这种jpatools 自动生成的实体类内没把id 设置为自增,还有id的值在生成的时候默认为string 即使加上了也所以无法自增 ,所以还需要把string 换成In ...

  3. SpringMvc在返回数据之前进行统一处理

    这里其实有多种解决方案 如果你不需要获取request对象 可以采用aop(环绕通知)的方式来统一修改 如果你需要获取request对象,那么就需要采用下面的方式 0自己定义一个注解,内容如下 @Ta ...

  4. ABP框架系列之二十二:(Dynamic-Web-API-动态WebApi)

    Building Dynamic Web API Controllers This document is for ASP.NET Web API. If you're interested in A ...

  5. 什么是servlet?

    一.servlet是什么? 是用java编写的应用在服务端的程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和修改数据,生成动态Web内容,例如页面等等.从实现上讲,Servlet可以响应任 ...

  6. log4j控制台乱码解决办法

    1.控制台编码问题 这两天碰到一个问题,在windows启动tomcat的时候tomcat控制台日志突然乱码了, 我发现在log4j.properties文件中加了一行配置log4j.appender ...

  7. 项目中使用同一dll的不同版本

    在一个项目中,因为使用了一些插件,这些插件使用了不同版本的log4net,有1.2版本,有2.0版本的.当运行的时候发生冲突. 解决办法:在config中加入如下的配置 <dependentAs ...

  8. 二叉搜索树的平衡--AVL树和树的旋转

    二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...

  9. 微信小程序scroll-view 横向和纵向scroll-view组件

    scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效.滚动视图常用的地方一般都是Item项比较多的界面,比如我的模块 主 ...

  10. 标签页(tab)切换的原生js,jquery和bootstrap实现

    概述 这是我在学习课程Tab选项卡切换效果时做的总结和练手. 原课程中只有原生js实现,jquery和bootstrap实现是我自己补上的. 本节内容 标签页(tab)切换的原生js实现 标签页(ta ...