1.  RedisCluster的架构图。



          

redis集群配置密码 redis集群加密码_集群

        (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

         

redis集群配置密码 redis集群加密码_redis集群配置密码_02

        (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可看到如下:




redis集群配置密码 redis集群加密码_redis_03




集群启动:


将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