Redis集群(一)
redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。
官方的一个简单测试:
测试完成了50个并发执行100000个请求。
设置和获取的值是一个256字节字符串。
结果:读的速度是110000次/s,写的速度是81000次/s
在这么快的读写速度下,对于一般程序来说足够用了,但是对于访问量特别大的网站来说还是稍有不足。那么如何提升redis的性能呢?搭建集群就是最好的选择。
一、概述
Redis3.0版本之后支持Cluster.(这就意味着你的Redis要安装3.0以后的版本)
1.1、redis cluster的现状
目前redis支持的cluster特性:
1):节点自动发现
2):slave->master 选举,集群容错
3):Hot resharding:在线分片
4):进群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 转向/MOVED 转向机制.

架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
1.2、FailOver设计实现
Failover,通俗地说,一个master有N(N>=1)个slave,当master挂掉以后,能选出一个slave晋升成Master继续提供服务。
Failover由失败判定和Leader选举两部分组成,Redis Cluster采用去中心化(Gossip)的设计,每个节点通过发送Ping(包括Gossip信息)/Pong心跳的方式来探测对方节点的存活,如果心跳超时则标记对方节点的状态为PFail,这个意思是说该节点认为对方节点可能失败了,有可能是网络闪断或者分区等其他原因导致通讯失败。
例如节点A给节点B发Ping/Pong心跳超时,则A将B标记为PFAIL,强调一点,仅是在A看来B节点失败。要完全判定B失败,则需要一种协商的方式,需要集群中一半以上的Master节点认为B处于PFail状态,才会正式将节点B标记为Fail。
那么问题来了,Master之间如何交换意见呢,或者说节点A如何知道其他Master也将B标记为PFfail了,并且能统计出是否有一半以上的Master认为B为PFail呢?前面提到Gossip,Gossip的主要作用就是信息交换,在A给C发Ping的时候,A将已知节点随机挑选三个节点添加到Ping包中发给C。
既然是随机,经过多次Gossip以后,A会将处于PFail的B告诉给C。在节点C上,B节点有一个失败报告的链表,A告诉C,B可能失败,将A节点添加到B节点的失败报告链表中。经过集群中所有节点之间多次Gossip,一旦B的失败报告数量超过Master数量的一半以上,就立即标记B为Fail并广播给整个集群。
那这样还会有一个问题,假设一天之内失败报告的数量超过Master的一半以上,同时报告的时间间隔又比较大,那么就会产生误判。所以得给失败报告加上一个有效期,在一定的时间窗口内,失败报告的数量超过Master的一半以上以后标记为Fail,这样才能避免误判。
至此就把失败判定说完了,剩下还有Leader选举。
Redis Cluster采用类似Raft的算法,有一点不同的是并不是slave之间进行投票,而是在所有Master中间进行投票。这样做的好处就是即使一主一从也能完成选举,Redis Cluster这样做也是有道理。slave不提供任务服务,如果允许挂N个节点,就得部署(2N+)个slave,这是资源的极大浪费。
二,Redis集群部署
1,安装Redis
官方网站:https://redis.io/download
#Redis安装
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar xzf redis-3.2..tar.gz
cd redis-3.2./src
make MANIFESTO=jemalloc && make PREFIX=/usr/local/redis-3.0. install
ln -s /usr/local/redis-3.0. /usr/local/redis
echo ' PATH=/usr/local/redis/bin/:$PATH' >> /etc/profile
source /etc/profile #设置内核参数
sysctl vm.overcommit_memory=
sed -i "s#daemonize no#daemonize yes#g" /data/redis/conf/redis.conf
#Redis启动测试
mkdir /data/redis/conf -p
cp /redis-3.2./redis.conf /data/redis/conf/
redis-server -f /data/redis/conf/redis.conf
#关闭
redsi-cli shutdown
killall redis-server
2.配置主从复制集群
A.服务器准备:
服务器ip:10.0.0.51 端口6379
服务器ip:10.0.0.51 端口6380
服务器ip:10.0.0.51 端口6381 服务器ip:10.0.0.70 端口6382
服务器ip:10.0.0.70 端口6383
服务器ip:10.0.0.70 端口6384
注意两台服务器跑多实例,且安装的Redis版本要相同
B.修改配置文件
两台主机均修改以下配置文件
port //先默认端口,等会再改
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_6379.pid //pidfile文件对应
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6379.conf //集群的配置文件
cluster-node-timeout //请求超时 默认15秒,可自行设置
appendonly yes
C.创建redis节点
配置服务器10.0.0.51多实例
#复制配置文件
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf #修改配置文件端口
sed -i "s/6379/6379/g" /data/redis/conf/.conf
sed -i "s/6379/6380/g" /data/redis/conf/.conf
sed -i "s/6379/6381/g" /data/redis/conf/.conf #启动Redis
redis-server /data/redis/conf/.conf
redis-server /data/redis/conf/.conf
redis-server /data/redis/conf/.conf
#查看服务
ps -ef | grep redis #查看是否启动成功
netstat -tnlp | grep redis #可以看到redis监听端口
配置服务器10.0.0.70多实例
#复制配置文件
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf
cp /data/redis-3.2./redis.conf /data/redis/conf/.conf #修改配置文件端口
sed -i "s/6379/6382/g" /data/redis/conf/.conf
sed -i "s/6379/6383/g" /data/redis/conf/.conf
sed -i "s/6379/6384/g" /data/redis/conf/.conf #启动Redis
redis-server /data/redis/conf/.conf
redis-server /data/redis/conf/.conf
redis-server /data/redis/conf/.conf
#查看服务
ps -ef | grep redis #查看是否启动成功
netstat -tnlp | grep redis #可以看到redis监听端口
D.创建集群
前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.
两台服务器均安装Ruby,rubygems
yum -y install gcc openssl-devel libyaml-devel libffi-devel readline-devel autoconf
yum -y install ruby rubygems zlib-devel gdbm-devel ncurses-devel gcc-c++ automake
#再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.
#换源
gem source -l
gem source --remove http://rubygems.org/
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
gem source -l
gem install redis
如果执行gem install redis报下面错误
gem install redis
ERROR: Error installing redis:
redis requires Ruby version >= 2.2..
#原因rvm版本过低
解决方案:
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm install 2.3.
rvm use 2.3.
rvm use 2.3. --default
rvm remove 2.0.
#查看现在版本为2..3则对
ruby –version
gem install redis
E.启动集群
就是靠上面这些操作 完成redis集群搭建的.
首先确认所有的节点都启动,确认两台服务器的防火墙关闭状态,否则会出现没有路由到达的错误
#测试
在10.0.0.51服务器上执行下面语句测试连通性
/data/redis-3.2.8/src/redis-cli -h 10.0.0.51 -p 6379
/data/redis-3.2.8/src/redis-cli -h 10.0.0.70 -p 6383
/data/redis-3.2.8/src/redis-cli -h 10.0.0.70 -p 6384
在10.0.0.70服务器上执行下面语句测试连通性
redis-cli -h 10.0.0.51 -p 6379
redis-cli -h 10.0.0.51 -p 6380
redis-cli -h 10.0.0.70 -p 6384
如果上面的测试没有问题,则可进行下步操作 ##在其中一台服务器执行下面命令即可
/data/redis-3.2.8/src/redis-trib.rb create --replicas 1 10.0.0.51:6379 10.0.0.51:6380 10.0.0.51:6381
10.0.0.70:6382 10.0.0.70:6383 10.0.0.70:6384
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.0.0.51:6379
10.0.0.70:6382
10.0.0.51:6380
Adding replica 10.0.0.70:6383 to 10.0.0.51:6379
Adding replica 10.0.0.51:6381 to 10.0.0.70:6382
Adding replica 10.0.0.70:6384 to 10.0.0.51:6380
M: d0b49faff3332cdf7389948593d4fb59caca1613 10.0.0.51:6379
slots:0-5460 (5461 slots) master
M: 8c8a578c750b820ce074026e59d4df059eeefd9b 10.0.0.51:6380
slots:10923-16383 (5461 slots) master
S: 731a69f9df773823be182e27e5001b95766b5528 10.0.0.51:6381
replicates b73a3a4528920064cba668aa9452f32387292ab6
M: b73a3a4528920064cba668aa9452f32387292ab6 10.0.0.70:6382
slots:5461-10922 (5462 slots) master
S: 139c02ceb5a2afe9eb0e350ed3170bceb3aa4c4b 10.0.0.70:6383
replicates d0b49faff3332cdf7389948593d4fb59caca1613
S: af498152476cd4732c47292aff44a57bcd57bb63 10.0.0.70:6384
replicates 8c8a578c750b820ce074026e59d4df059eeefd9b
Can I set the above configuration? (type 'yes' to accept): yes #输入yes即可
如果出现下面的错误:

则解决方案为:
1.删掉conf文件下的aof和rdb结尾的文件。
2.同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;
3.对新添加节点的数据库进行清除
redis-cli -h 10.0.0.51 -p
登录后执行flushdb
redis-cli -h 10.0.0.51 -p
登录后执行flushdb
redis-cli -h 10.0.0.51 -p
登录后执行flushdb

当Redis集群配好以后,下面展示下效果

Redis集群(一)的更多相关文章
- Redis集群案例与场景分析
1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...
- Java Spring mvc 操作 Redis 及 Redis 集群
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...
- Redis集群搭建与简单使用
介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...
- window下使用Redis Cluster部署Redis集群
日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...
- Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义
回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...
- [个人翻译]Redis 集群教程(中)
上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial 水 ...
- [个人翻译]Redis 集群教程(上)
官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢. 这是 ...
- Redis集群(九):Redis Sharding集群Redis节点主从切换后客户端自动重新连接
上文介绍了Redis Sharding集群的使用,点击阅读 本文介绍当某个Redis节点的Master节点发生问题,发生主从切换时,Jedis怎样自动重连新的Master节点 一.步骤如下: 1.配 ...
- Redis集群(八):Redis Sharding集群
一.Redis目前的集群方案主要有两种:Redis Sharding和Redis Cluster 1.Redis Sharding:3.0以前基本上使用分片实现集群,目前主流方案,客户端实现 2.Re ...
- Redis-Sentinel(Redis集群监控管理)
Redis的高可用方案的实现:主从切换以及虚拟IP或客户端 从Redis 2.8开始加入对Sentinel机制从而实现了服务器端的主从切换,但目前尚未发现实现虚拟IP或客户端切换方案 Redis-Se ...
随机推荐
- SQLServer 跨库查询实现方法
不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分对象名的一部分 本文给出一条 SQL 语句用于展示在同一名服务器上,不同的数据库间查询,注意当前连接用户要对两个库都有权限SQL Serve ...
- gpio irq
/***************************************************************** * gpio irq * * 一直以来都没了解过gpio的irq, ...
- 查找——图文翔解HashTree(哈希树)
引 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录的时须要进行一系列和keyword的比較.这一类的查找方法建立在"比較"的基础上.查找的效 ...
- QListView的子项的ViewMode
QListView.setViewMode(ViewMode mode) enum QListView::ViewMode Constant Value DescriptionQListV ...
- 【Java面试题】41 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对. 如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就必须相等. 如果不是要保存在HashSet或HashMap,则与hashcode没有什么 ...
- TTreeView TTreeNodes TTreeNode
TTreeView 填写 TTreeView 的内容一般是这样开始的(下图), 不过我觉得最好习惯用动态建立. 打个比方: 譬如 TreeView 是一个军营的"营部"! 这里会有 ...
- 【VR】Leap Motion 官网文档 FingerModel (手指模型)
前言: 感谢关注和支持这个Leap Motion系列翻译的朋友们,非常抱歉因为工作原因非常久没有更新,今后这个翻译还会继续(除非官方直接给出中文文档).本篇献给大家的是 <FingerModel ...
- C51中遇到一个有关data与xdata的问题,已解决
环境: 我在某个C文件定义了一个结构体变量,然后该变量仅仅是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果运行时怎么也达不到要的效果. struct BE ...
- 关于直播学习笔记-005 nginx-rtmp、sewiseplayer
1.视频采集推流及服务器端:nginx-rtmp-windows 2.视频播放段:sewiseplayer 3.双击nginx.exe运行nginx-rtmp-win32-master的nginx服务 ...
- Linux环境PHP5.5以上连接SqlServer2008
linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 Sqlserver版本:2008 FreeTDS版本:0.95 关于Linux环境安装 ...