redis 集群搭建: redis-cluster
前言
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的更多相关文章
- redis集群之REDIS CLUSTER
redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00 NoSQL_博客园 原文 http://www.cnblogs.com/zhanchenjin/p/537 ...
- 25.redis集群搭建笔记
###Redis集群### 0.准备 软件: redis-3.0.0.gem redis-3.0.0.tar.gz#源码 1.安装ruby环境 redis基于ruby槽位计算,hash算法技术,k ...
- Redis 集群搭建详细指南
先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...
- 二、redis集群搭建
redis集群搭建 redis3.0后支持集群.集群中应该至少有三个节点,每个节点有一备份节点.需要6台服务器.搭建伪分布式,需要6个redis实例.搭建集群的步骤: 一.安装单机版redis 第一步 ...
- redis集群搭建及注意事项
上一篇:redis的安装及注意事项 这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口.这样的话,相当于模拟出 ...
- Linux Redis集群搭建与集群客户端实现(Python)
硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...
- [转载] Redis集群搭建最佳实践
转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...
- Linux Redis集群搭建与集群客户端实现
硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...
- Redis集群搭建-韩国庆
认真一步一步搭建下来,就可以成功.... Redis-cluster集群架构讲解 redis集群专业名词称之为Redis-cluster,redis集群是从3.0版本以后才有的概念,也就是说在3.0之 ...
- redis集群搭建及设置账户(转)
Redis集群搭建以及为集群设置密码 介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. ...
随机推荐
- CentOS 系统 git clone出错
CentOS 操作系统 安装npm git clone 项目时出现类似如下错误: fatal: unable to access 'https://github.com/creationix/nvmg ...
- ulogd(一)
参考资料: https://blog.csdn.net/eydwyz/article/details/52456335 https://blog.csdn.net/chinalinuxzend/art ...
- Laravel-nestedset that base left and right values tree package
This is a Laravel 4-5 package for working with trees in relational databases. Laravel 5.5, 5.6, 5.7, ...
- Maven学习 五 Maven项目创建(1)jar项目
第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点 ...
- ABP框架系列之二十一:(Domain-Services-领域服务)
Introduction Domain Services (or just Service, in DDD) is used to perform domain operations and busi ...
- centos7安装python3.6后导致防火墙功能无法正常工作的解决办法
问题:因为默认python版本被设置成了python3.6,而进行防火墙的指令操作频频报错. Jul 19 16:30:51 localhost.localdomain systemd[1]: Sta ...
- 【MarkMark学习笔记学习笔记】javascript/js 学习笔记
1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...
- jq的事件对象
- POJ - 1321 棋盘问题 简单搜索 dfs 格子
点这里去看题 思路:本题的难点在k<n的情况,所以我们可以另dfs中的两个参数分别代表起始行和待放棋子个数(待放棋子只能放在起始行后面的行),然后用一个c[8]来表示每一列放旗子的情况来判断列不 ...
- CUDA-存储器
1.类型(8种) register: GPU片内 device可读\写 shared memory:GPU片内 device可读\写 local memory:板载显存 device可读\写 cons ...