阅读更多
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节点上存储,此时会发送一个重定向的命令。