目前redis支持的cluster特性node
1):节点自动发现redis
2):slave->master 选举,集群容错centos
3):Hot resharding:在线分片ruby
4):进群管理:cluster xxxbash
5):基于配置(nodes-port.conf)的集群管理服务器
6):ASK 转向/MOVED 转向机制.架构
(1)全部的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.app
(2)节点的fail是经过集群中超过半数的节点检测失效时才生效.工具
(3)客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可优化
(4)redis-cluster把全部的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
redis-cluster选举:容错、
(1)领着选举过程是集群中全部master参与,若是半数以上master节点与master节点通讯超过(cluster-node-timeout),认为当前master节点挂掉.
(2):何时整个集群不可用(cluster_state:fail),当集群不可用时,全部对集群的操做作都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
a:若是集群任意master挂掉,且当前master没有slave.集群进入fail状态,也能够理解成进群的slot映射[0-16383]不完成时进入fail状态.
b:若是进群超过半数以上master挂掉,不管是否有slave集群进入fail状态.
Linux系统版本:
centos 6.5 2.6.32-431.el6.x86_64
Redis-3.0.7
ruby
Centos01:192.168.161.233 从
Centos02:192.168.161.234 从
Centos03:192.168.161.235 从
Centos04:192.168.161.236 主
Centos05:192.168.161.237 主
Centos06:192.168.161.238 主
6台机器分别安装 redis-3.0.7 #yum –y install gcc make tcl 安装软件依赖包 #cp redis-3.0.7.tar.gz /opt 将安装包拷贝至opt目录 #cd /opt 进入opt目录 #tar –xvf redis-3.0.7.tar.gz 解压 #cd redis-3.0.7 #make 编译 安装redis #make test
daemonize yes //后台运行开启 pidfile /bestpayserver/redis-3.0-data/redis.pid //pid文件 port 6380 //reids提供服务端口 logfile "/bestpayserver/redis-3.0-log/redis.log" //日志文件配置 dir /bestpayserver/redis-3.0-data/ //数据存放路径 cluster-enabled yes //打开redis集群 cluster-config-file nodes-6380.conf //cluster集群配置文件(启动自动生成) cluster-node-timeout 15000 //节点互链超时阀值 appendonly yes
也能够写成脚本用salt跑 -------------------------------------------------------------------------华丽的分割线--------------------------------------------------------------------------- #!/usr/bin/bash yum -y install gcc make tcl; cp redis-3.0.7.tar.gz /opt; cd /opt; tar -xvf redis-3.0.7.tar.gz; cd redis-3.0.7; make make test; sed -i 's/daemonize no/daemonize yes/' /opt/redis-3.0.7/redis.conf; sed -i 's/pidfile \/var\/run\/redis.pid/pidfile \/bestpayserver\/redis-3.0-data\/redis.pid/' /opt/redis-3.0.7/redis.conf; sed -i 's/port 6379/port 6380/' /opt/redis-3.0.7/redis.conf; sed -i 's/logfile ""/logfile "\/bestpayserver\/redis-3.0-log\/redis.log"/' /opt/redis-3.0.7/redis.conf; sed -i 's/dir .\//dir \/bestpayserver\/redis-3.0-data\//' /opt/redis-3.0.7/redis.conf; sed -i 's/# cluster-enabled yes/cluster-enabled yes/' /opt/redis-3.0.7/redis.conf; sed -i 's/# cluster-node-timeout 15000/cluster-node-timeout 15000/' /opt/redis-3.0.7/redis.conf; sed -i 's/appendonly no/appendonly yes/' /opt/redis-3.0.7/redis.conf; mkdir -p /bestpayserver/redis-3.0-log/; mkdir -p /bestpayserver/redis-3.0-data/; /opt/redis-3.0.7/src/redis-server /opt/redis-3.0.7/redis.conf &; -------------------------------------------------------------------------更华丽的分割线---------------------------------------------------------------------------
salt安装
Salt传输文件到各服务器 salt 'centos*' cp.get_file salt://redis-3.0.7.tar.gz /home/redis-3.0.7.tar.gz salt 'centos*' cp.get_file salt://sed.sh /home/redis3install.sh salt 'centos*' cmd.run 'sh /home/redis3insatl.sh 查看进程 salt '*' cmd.run 'ps -ef |grep redis'
Reids.trib.rb 是redis集群命令行工具,是一个ruby程序因此咱们须要ruby环境才能启动它
随意挑选两台机器安装ruby
# yum -y install ruby ruby-devel rubygems rpm-build # gem install redis
# /opt/redis-3.0.7/src/redis-trib.rb create --replicas 1 192.168.161.233:6380 192.168.161.234:6380 192.168.161.235:6380 192.168.161.236:6380 192.168.161.237:6380 192.168.161.238:6380
[OK] All 16384 slots covered 则集群建立成功。
# /opt/redis-3.0.7/src/redis-cli -c -p 6380 //进入redis客户端 127.0.0.1:6380> cluster info //查看集群信息
127.0.0.1:6380> cluster nodes //查询集群节点
CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的全部节点(node),以及这些节点的相关信息。 节点 CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 槽(slot) CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 CLUSTER FLUSHSLOTS 移除指派给当前节点的全部槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,若是槽已经指派给另外一个节点,那么先让另外一个节点删除该槽>,而后再进行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 键 CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪一个槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。