【1 :集群原理】
(1)redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster负责维护node<->slot<->value
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 The cluster is down)错误
【2:ruby环境】
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
拷贝redis-3.0.0.gem至/usr/local下
执行:
gem install /usr/local/redis-3.0.0.gem(是一个gem文件)
【3 : 创建集群节点】
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点: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
mkdir创建redis-cluster集群目录文件并在此目录下创建子空文件夹(最好以将用的端口命名)
mkdir 7000 7001 7002 7003 7004 7005 7006
分别将安装的bin文件复制进各个目录,并修改每个目录的redis.conf文件配置
需要配置的内容
port XXXX
#bind 192.168.101.3
cluster-enabled yes
pidfile /var/run/redis7001.pid
【4 : 启动每个节点】
分别进入7001、7002、...7006目录,执行:
./redis-server redis.conf
查看进程
【5 : 执行创建集群命令】
创建集群需要执行./redis-trib.rb文件,此文件在redis解压包的src下,并且./redis-trib.rb是ruby脚本,需要ruby环境
执行语句:
--------------------------------------------------------------------------
./redis-trib.rb create --replicas 1 192.168.131.102:7001 192.168.131.102:7002 192.168.131.102:7003 192.168.131.102:7004 192.168.131.102:7005 192.168.131.102:7006
--------------------------------------------------------------------------
注意:
这里的./redis-trib.rb运行文件是在redis解压文件的src目录下
说明:
redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点
replicas指定为1表示每个主节点有一个从节点
注意:
在开启集群时 启动./redis-cli时要用集群模式启动
普通模式:./redis-cli -p port
集群模式:./redis-cli -c -p port
注意:
如果执行时报如下错误:
[ERR] NodeXXXXXXis not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb
【6 : 成功及查询集群信息】
集群创建成功登陆任意redis结点查询集群中的节点情况。
cluster nodes查询集群结点信息
cluster info查询集群状态信息
info replication 查看单个局点信息