之前已经在博文中介绍了redis以及redis的简单实用,但是在实际的项目中用单机版redis还是很少的基本上都是实用redis集群。
RedisCluster概念
RedisCluster架构
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4) Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。
例如下图
Key:a
计算a的hash值,例如值为100,100这个slot在server1上,所以a应该放到server1.
Key:hello
Hash值:10032,此slot在server3上。Hell可以应该存在server3.
redis-cluster投票:容错
(1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail)?
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
RedisCluster安装
安装redis
版本说明
本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。同时由于笔者实用的是一台虚拟机所以只是伪集群模式,但是和真集群的安装方法本质上还是类似的。
安装的前提条件:
需要安装gcc:yum install gcc-c++
下载redis的源码包,把源码包上传到linux服务器
解压源码包
- tar -zxvf redis-3.0.0.tar.gz
- Make
- Make install
- make installPREFIX=/usr/local/redis-cluster/redis01
ps:PREFIX必须大写表示redis的安装路径,执行上面几步之后单机版的redis已经安装成功。
集群环境安装
搭建集群需要使用到官方提供的ruby脚本,需要安装ruby的环境。
安装ruby
- yum install ruby
- yum install rubygems
redis集群管理工具redis-trib.rb输入如下依次命令可以找到
- cd redis-3.0.0/src
- ll*.rb
脚本需要的ruby包:
下载地址:http://download.csdn.net/detail/senior_lee/9502524
上传到Linux,并安装ruby包
geminstall redis-3.0.0.gem
集群搭建
第一步:创建6另外5个redis实例,在/usr/local/redis-cluster/文件夹下,复制redis01即可,分别命名为redis02~redis06。
注意:需要分别删除每个redis安装目录里面的dum.rdb文件。
第二步:修改redis配置文件
1将port分别改成7001~7006
2打开cluster-enable前面的注释
3把创建集群的ruby脚本复制到redis-cluster目录下。
4启动6个redis实例
5创建集群
./redis-trib.rb create --replicas 1 192.168.21.225:7001192.168.21.225:7002 192.168.21.225:7003 192.168.21.225:7004 192.168.21.225:7005192.168.21.225:7006
ps:创建了三个节点主节点,三个从节点。其中—replicas1 表示每个主节点下面有1个从节点,从节点可以是任意多个。
窗口输出结果入下:
>>> Creating cluster
Connecting to node 192.168.21.225:7001: OK
Connecting to node 192.168.21.225:7002: OK
Connecting to node 192.168.21.225:7003: OK
Connecting to node 192.168.21.225:7004: OK
Connecting to node 192.168.21.225:7005: OK
Connecting to node 192.168.21.225:7006: OK
>>> Performing hash slotsallocation on 6 nodes...
Using 3 masters:
192.168.21.225:7001
192.168.21.225:7002
192.168.21.225:7003
Adding replica 192.168.21.225:7004 to 192.168.21.225:7001
Adding replica 192.168.21.225:7005 to 192.168.21.225:7002
Adding replica 192.168.21.225:7006 to 192.168.21.225:7003
M: 5a8523db7e12ca600dc82901ced06741b3010076192.168.21.225:7001
slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53192.168.21.225:7002
slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca192.168.21.225:7003
slots:10923-16383 (5461 slots) master
S: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004
replicates 5a8523db7e12ca600dc82901ced06741b3010076
S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
Can I set the above configuration? (type'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different configepoch to each node
>>> Sending CLUSTER MEET messagesto join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check(using node 192.168.21.225:7001)
M: 5a8523db7e12ca600dc82901ced06741b3010076192.168.21.225:7001
slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53192.168.21.225:7002
slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca192.168.21.225:7003
slots:10923-16383 (5461 slots) master
M: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004
slots: (0 slots) master
replicates 5a8523db7e12ca600dc82901ced06741b3010076
M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005
slots: (0 slots) master
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006
slots: (0 slots) master
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
[OK] All nodes agree about slotsconfiguration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
测试集群
依次输入如下命令
cd/usr/local/redis-cluster/
redis01/bin/redis-cli-h 192.168.21.225 -p 7002 –c
ps:-c表示连接集群
集群就这样愉快的搭建完了,接下的文章里面会依次介绍如何使用jedis操作单机和集群版redis,jedis如何同spring集成以及如何编写jedis的工具类。