设为首页 收藏本站
查看: 900|回复: 0

[经验分享] Redis分布式集群

[复制链接]

尚未签到

发表于 2016-12-18 08:18:44 | 显示全部楼层 |阅读模式
1.Redis分布式缓存的实现模式

Redis一开始并不支持分布式的,从Redis3.0后才开始支持Redis分布式缓存。可以从三种不同的方式来搭建Redis分布式缓存系统。
1)客户端分片
这种方案将分片工作放在业务程序端,程序代码根据预先设置的路由规则,直接对多个Redis实例进行分布式访问。它的好处是实现方法和代码都自己可控,可随时调整,不足之处是这实际上是一种静态分片技术。Redis实例的增减,都得手工调整分片程序。
2)代理分片
这种方案,将分片工作交给专门的代理程序来做。代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的Redis实例并返回给   业务程序。这种机制下,一般会选用第三方代理程序(而不是自己研发),因为后端有多个Redis实例,所以这类程序又称为分布式中间件。目前有一些框架专门来做代理分片的,如国内的Codis。
3)Redis Cluster(Redis 3.0 以上的版本才支持)
在这种机制下,没有中心节点(和代理模式的重要不同之处)。   Redis Cluster将所有Key映射到16384个Slot中,集群中每个Redis实例负责一部分,业务程序通过集成的Redis Cluster客户端进行操作。客户端可以向任一实例发出请求,如果所需数据不在该实例中,则该实例引导客户端自动去对应实例读写数据。

2.Redis分布式缓存基础

1.TCP Ports
每个Redis节点使用两个端口,一个提供对外服务端口,默认6379,另一个用于集群间同步数据通知,端口号是在对外服务端口上加10000,即默认为16379. 每一个节点都需要知道其他节点的情况,这里就包括其他节点负责处理哪些键值对。这也就是客户端向任一实例发出请求,如果所需数据不在该实例中,则该实例引导客户端自动去对应实例读写数据。
2.数据分片(Sharding)
所有key 分布在16384个hash slot上,数据分组及迁移都是以hash slot为单位。使用CRC16算法计算一个key应该落在哪个hash slot上。
Redis集群采用的是hash slot分片来完成的。例如:
       Node A contains hash slots from 0 to 5500.
       Node B contains hash slots from 5501 to 11000.
       Node C contains hash slots from 11001 to 16384.
3.主从模式(Master-Salve)
Redis cluster的拓扑结构,由3个以上Master节点形成数据分片集群,覆盖所有16384个hash slots, 数据只能在Master节点间以slot为单位迁移。
每个Master可以有多个replica节点(即slave), 以防灾备,当master宕机时,集群会通过选举晋升这个master的一个slave节点变为master, 继续提供服务。master宕机可能会丢失写的数据。因为master在接收请求处理完后会立即返回客户端,master如果在同步到slave之前就down了,就会lose write.(机制决定,不可避免)。
4.Redis Cluster失效
在下面的两种情况下,Redis Cluster就失败,即不对外提供服务了。
1)如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。
2)如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态。
5.Redis Cluster 数据迁移
   Redis支持在线进行数据迁移。Redis默认的slave节点是不支持写操作的,我们需要修改它的配置
#slave-read-only yes
slave-read-only no
创建一个新的Redis的实例,执行命令salveof redis节点IP地址,即开始进行数据同步了。通过查询命令info来查询同步是否完成,完成之后,就可以将其提升为Master节点了。
6.客户端框架
从官方网站上看,Redis目前有很多客户端框架,在Java中,目前用得比较多的是Spring Data Redis和Jedis。

3.安装步骤

1)安装依赖包
yum -y install gcc openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel gcc-c++ automake autoconf

上面的包必须在之前就安装好,否则安装ruby,rubygem时就会报错(即安装ruby,rubygem时依赖上面的包)。

下载ruby, rubygem的源码包并安装它们。
tar -xvzf ruby-2.2.1.tar.gz  
cd ruby-2.2.1  
./configure -prefix=/usr/local/ruby   
make  
make install   
cp ruby /usr/local/bin

tar -xvzf rubygems-2.4.6.tgz  
cd rubygems-2.4.6  
ruby setup.rb  
cp bin/gem /usr/local/bin   

下载redis-3.2.1.gem(这个是用于创建redis集群时用到),然后执行下面的命令:
gem install -l ./redis-3.2.1.gem (在官网上打不开链接,可以到百度上去搜索下载的地方)

至此,所有的基础环境就安装好,下面就是安装Redis源码包了。

2)安装Redis-3.0.4

下载redis的源码包: wget http://download.redis.io/releases/redis-3.0.4.tar.gz  
解压源码包: tar xzvf redis-3.0.4.tar.gz
编译: make
安装:make install (root权限下安装)

安装完后,对redis.conf进行配置(redis.conf就是在解压redis包下可以找到)
按照官网的示例来配置(http://www.redis.io/topics/cluster-tutorial)

port 7000  //每个Redis实例的商品必须是唯一的
cluster-enabled yes //支持集群
cluster-config-file nodes.conf //nodes.conf这个文件不用我们去编辑
cluster-node-timeout 5000
appendonly yes


3)创建多个Redis实例

上面的步骤只是创建了一个Redis实例,我们需要创建Redis多个实例,即是集群。
#这里仅在一个VM中建立多个实例。
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

上面安装的目录是在7000下,后面的工作就是将7000目录下的redis实例复制到7001,7002,7003,7004,7005目录下。唯一要改的就是redis.conf中的port,分别改成7001,7002,7003,7004,7005。

进入到7000~7005目录下,启动Redis实例:redis-server ./redis.conf
通过查看redis实例进程,可以发现它们都启动了。


现在真正来创建Redis集群了,通过下面的的命令来完成:
./redis-trib.rb  create --replicas 1 172.30.2.74:7000 172.30.2.74:7001 172.30.2.74:7002 172.30.2.74:7003 172.30.2.74:7004 172.30.2.74:7005

其中:--replicas 1 表示每个实例都有一个Salve节点,在这里,是3个Master节点,3个Salve节点。


Redis分布式集群创建好了,下面进行测试。这里通过redis-cli 客户端命令进行测试。
可以连接任何一个Redis节点,如果想存放一个数据,如果此时它存储的地方并不是当前节点上,它会自动引导到对应的redis节点上存储,此时会发送一个重定向的命令。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315744-1-1.html 上篇帖子: 8: redis的主从复制 下篇帖子: redis 6 redis的常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表