每个redis实例可称为一个节点,安装redis并以默认端口启动是节点,不关闭,以另一个端口启动,是一个新节点。在另一台机器安装redis并启动,也是一个新节点。
节点分为主节点 (master) ,从节点 (slave) ,数据从主节点向多个从节点上同步 。
redis3.0开始支持集群,redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制)。
搭建集群
这里以cluster为实例,下面开始搭建
机器和IP分布:3台机器,IP为 192.168.1.248 192.168.1.250 192.168.1.251
每台机器运行2个redis节点
下载源码包并解压
要先在系统中安装好gcc环境,(不然编译redis会报错)
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxvf redis-5.0.4.tar.gz
mkdir /usr/local/redis
mv redis-5.0.4 /usr/local/redis/
编译安装
cd /usr/local/redis/redis-5.0.4/
make && make install
创建cluster相应文件夹
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p {9001,9002}/data
mkdir bin
复制源码包中的执行文件到cluster目录中
cd /usr/local/redis/redis-5.0.4/src/
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis-cluster/bin/
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9001/
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/
#其他两台机器上也同时执行此操作,创建9003、9004、9005、9006
主要修改的地方为:
bind 192.168.119.128(绑定当前电脑的 IP,这是我虚拟机的,你绑定成你虚拟机的ip)
port 9001(因为我这是一台机器运行6个redis实例,所以要启动6个实例,得为它配置6个不同的端口,若你是6台机器,默认的端口就行,无需更改)
daemonize yes(这是设置是否后台启动 Redis,默认 no ,但是生产环境肯定要默认就开启 Redis,所以这里设置为 yes 。)
pidfile /var/run/redis_9001.pid(_9001这个一定要和第一个配置的端口一样)
dir /usr/local/redis-cluster/9001/data/(数据文件存放位置,我换成指定目录下存放)
appendonly yes
cluster-enabled yes(启动集群模式)
cluster-config-file nodes9001.conf(9001这个也要和之前的端口对应)
cluster-node-timeout 15000(超时时间)
#其他的9002 9003 9004 9005 9906里的redis.conf也同时修改
启动服务
#192.168.1.250
/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf
#192.168.1.251
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf
#192.168.1.248
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf
创建集群
redis-cli --cluster create 192.168.1.250:9001 192.168.1.250:9002 192.168.1.251:9003 192.168.1.251:9004 192.168.1.248:9005 192.168.1.248:9006 --cluster-replicas 1
进入redis中查看状态
redis-cli -c -h 192.168.1.250 -p 9001
192.168.1.250:9001>cluster info
...
192.168.1.250:9001>cluster nodes
...
192.168.1.250:9001> set name ppp
-> Redirected to slot [5798] located at 192.168.1.251:9003
OK
当前登录在192.168.1.250:9001,保存数据后存放在192.168.1.251:9003,并在所有机器节点上都可以查看到此数据
1,故障转移机制详解
集群中的节点会向其它节点发送PING消息(该PING消息会带着当前集群和节点的信息),如果在规定时间内,没有收到对应的PONG消息,就把此节点标记为疑似下线。当被分配了slot槽位的主节点中有超过一半的节点都认为此节点疑似下线(就是其它节点以更高的频次,更频繁的与该节点PING-PONG),那么该节点就真的下线。其它节点收到某节点已经下线的广播后,把自己内部的集群维护信息也修改为该节点已事实下线。节点资格审查:然后对从节点进行资格审查,每个从节点检查最后与主节点的断线时间,如果该值超过配置文件的设置,那么取消该从节点的资格。准备选举时间:这里使用了延迟触发机制,主要是给那些延迟低的更高的优先级,延迟低的让它提前参与被选举,延迟高的让它靠后参与被选举。(延迟的高低是依据之前与主节点的最后断线时间确定的)选举投票:当从节点获取选举资格后,会向其他带有slot槽位的主节点发起选举请求,由它们进行投票,优先级越高的从节点就越有可能成为主节点,当从节点获取的票数到达一定数值时(如集群内有N个主节点,那么只要有一个从节点获得了N/2+1的选票即认为胜出),就会替换成为主节点。替换主节点:被选举出来的从节点会执行slaveof no one把自己的状态从slave变成master,然后执行clusterDelSlot操作撤销故障主节点负责的槽,并执行 clusterAddSlot把这些槽分配给自己,之后向集群广播自己的pong消息,通知集群内所有的节点,当前从节点已变为主节点。接管相关操作:新的主节点接管了之前故障的主节点的槽信息,接收和处理与自己槽位相关的命令请求。