1. RedisCluster的架构图。
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上(哈希槽),cluster负责维护
Redis 集群中内置了 16384个哈希槽,当需要在Redis 集群中放置一个 key-value 时,redis 先对 key 使用crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
2. 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 Thecluster is down)错误。
3. redis哈希槽概念
"用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?"
Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。
"为了动态增删节点的时候,不至于丢失数据么?"
节点增删时不丢失数据和hash算法没什么关系,不丢失数据要求的是一份数据有多个副本。
“还有集群总共有2的14次方,16384个哈希槽,那么每一个哈希槽中存的key 和 value是什么?”
当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。
作者:胖了胖了的
4. redis集群安装
因为redis-cluster的运行要依赖于ruby脚本,所以首先要安装ruby相关组件。
1.安装ruby与相关组件:
查看服务器是否安装ruby:
yum list | grep ruby
rpm -qa | grep ruby
若没有安装,则安装组件:
yum install ruby
然后输入y则安装成功
安装gcc用于编译redis:
yum install gcc
安装gem相关:
yum install rubygems
gem install redis
2.安装redis:
进入/usr/local目录:cd /usr/local
创建redis-cluster文件夹: mkdir redis-cluster
进入redis-cluster:cd redis-cluster
在redis-cluster下创建:
redis01 redis02 redis03 redis04 redis05 redis06文件夹.
至于为什么要这样做,是因为redis-cluster要求最少6个节点(maseter*3 + slave*3)
在redis-cluster文件夹下做如下操作:
下载redis-3.0.5.tar.gz(我这里采用的是编译源码的方式):
解压目录到linux下/usr/local/redis-cluster目录下:
解压命令:tar -zxvf redis-3.0.5.tar.gz
进入解压后的文件夹redis-3.0.5下编译src:
执行make命令,如果执行报错,可尝试: make MALLOC=libc
拷贝/redis-3.0.5/src目录下的4个文件:
redis-server redis-cli redis.conf redis-benchmark到redis-3.0.5目录
复制redis-3.0.5的文件到6个redis文件夹下,执行命令:
cp -Rf ./redis-3.0.5/* /redis01
......
cp -Rf ./redis-3.0.5/* /redis06
修改六个文件夹下redis.conf,主要修改三个内容:
daemonize yes------修改yes为守护进程,no为独占线程
prot 7001 各个文件夹下分别为7001-7006
cluster-enabled yes
启动每个redis,如果认为麻烦,可创建脚本启动:
.进入每个redis文件夹:
分别执行命令: ./redis-server ./redis.conf
如果没有权限,提升权限: chmode 777 ./redis-server
启动完成后:
执行ps -ef|grep redis可看到如下:
集群启动:
将src文件夹下的redis-trib.rb文件拷贝到redis-cluster目录下,执行命令:
./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集群
启动成功如下:
[OK] All nodes agree about slotsconfiguration.
>>> Check for open slots...
>>> Check slots coverage...
进入redis01
执行:
./redis-cli -c -p 7001则进入客户端.
集群状态查看:
cluster nodes
cluster info
修改redis日志文件和持久化路径:
vim redis.conf
logfile /data/redis_cache/logs/redis.log #日志路径
dir /data/redis_cache #持久化路径,修改后 记得要把dump.rdb持久化文件拷贝到/data/redis_cache下
./redis.cli -p 7001 shutdown
redis集群重启需要删除各个节点下的文件,删除命令如下:
rm -rf appendonly.aof | rm -rf dump.rdb | rm -rf nodes.conf | rm -rf redis.log
如果集群要设置密码,集群启动后要在各个节点下设置:
config set masterauth xxx
config set requirepass xxx
然后在各个节点下重置配置:
config rewrite