摘要:2018年10月 Redis 发布了最新稳定版本 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为使用 C语言编写的 redis-cli的方式,使集群的构建方式复杂度大大降低。
Redis官网搭建集群教程链接:https://redis.io/topics/cluster-tutorial
我们先来看一下redis-cluster架构图,如下图所示。可以看到Redis集群是没有统一入口的,客户端连集群中的哪台设备都行,集群中各个设备之间都定时进行交互,以便知道节点是否还正常工作。
那么假如某个节点挂掉了怎么办?Redis集群是有容错投票机制的,如下图所示。浅黄色的那个节点向红色的那个节点发出ping命令,红色节点没有回应,这时浅黄色节点便认为这个节点可能挂掉了,它会投上一票,不过这时只是疑问,所以浅黄色节点画了一个"?",然后浅黄色节点告诉别的节点说这个红色的节点可能挂掉了,第二个节点去尝试和这个红色节点联系,发现也ping不通,于是第二个节点也认为这个红色节点挂掉了,第二个节点也投上一票,接着第三个节点去和红色节点联系,也联系不上,于是也投上一票,这样便三票了。Redis的容错投票机制是集群中过半数的节点认为某个节点检测失效时,才认定这个节点挂了。这时要看这个红色节点还有没有备用节点,如果没有备用节点了,那么整个集群将停止对外提供服务,如果有备份节点,那么会将备份节点扶正,继续对外提供服务。
redis-cluster架构总结:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.通过投票机制
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
(5)redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
由于Redis的容错投票机制是集群中过半数的节点认为某个节点检测失效时才生效,所以搭建最小集群模式至少需要三个节点,但是为了集群的高可用,就需要为每一个节点增加一个备份机,所以就需要六台服务器。
但是在一台电脑上搭建六台服务器会有些吃不消,所以这里我们就搭建伪分布式集群:在一台机器里面运行六个redis实例,端口分别设置为 (7001~7006)
2. 创建 redis-cluster目录,方便我们管理创建的六个redis实例,并复制一份之前搭建好的redis,重命名为redis01
[root@localhost ~]# cd /usr/local/server/ //进入到server目录下 (这个目录是我之前建的,用于管理各种安装软件的)
[root@localhost server]# mkdir redis-cluster //创建redis-cluster目录,用来管理redis集群
[root@localhost server]# cp -r redis-5.0.3 ./redis-cluster/redis01 //拷贝redis-5.0.3到redis-cluster目录下,并重命名为redis01
进入redis01目录:
[root@node redis01]# vim redis.conf
1、把 bind 127.0.0.1 给注释掉,这里的bind指的是只有指定的网段才能远程访问这个redis,注释掉后,就没有这个限制了。
2、开启远程访问 protected-mode no 和 修改端口 port 7001
3、设置后台运行 daemonize yes
4、设置pidfile存放在 run目录下的文件名 pidfile /var/run/redis_7001.pid
5、设置redis集群密码 masterauth sunshine 和 requirepass sunshine 注意:所有节点的密码都必须一致,masterauth也要加
6、设置开启AOF模式 appendonly yes
7、设置启用集群模式 cluster-enabled yes,开启配置文件cluster-config-file nodes-7001.conf ,超时时间 cluster-node-timeout 5000
8、配置好后,拷贝 redis01再创建五个redis实例
[root@localhost etc]# cd /usr/local/server/redis-cluster/ //进入到redis-cluster目录
[root@localhost redis-cluster]# cp -r redis01 redis02 //创建实例
[root@localhost redis-cluster]# cp -r redis01 redis03
[root@localhost redis-cluster]# cp -r redis01 redis04
[root@localhost redis-cluster]# cp -r redis01 redis05
[root@localhost redis-cluster]# cp -r redis01 redis06
[root@localhost redis-cluster]# ls //查看redis-cluster目录
redis01 redis02 redis03 redis04 redis05 redis06
9、修改redis02 ~ redis06五个实例的配置文件,把端口号port改成 7002 ~ 7006,并把pidfile改成 /var/run/redis_7002.pid ~ /var/run/redis_7006.pid,把redis02~redis06五个实例的cluster-config-file nodes-7001.conf改成cluster-config-file nodes-7002.conf ~cluster-config-file nodes-7006.conf
10、在redis-cluster目录下,编写redis_cluster_all_start.sh启动脚本,用于启动六个redis实例,并给文件添加执行权限
[root@node redis-cluster]# touch redis_cluster_all_start.sh
[root@node redis-cluster]# chmod u+x redis_cluster_all_start.sh
[root@node redis-cluster]# vim redis_cluster_all_start.sh
#!/bin/bash
cd /usr/local/server/redis-cluster/redis01/src
./redis-server ../redis.conf
cd /usr/local/server/redis-cluster/redis02/src
./redis-server ../redis.conf
cd /usr/local/server/redis-cluster/redis03/src
./redis-server ../redis.conf
cd /usr/local/server/redis-cluster/redis04/src
./redis-server ../redis.conf
cd /usr/local/server/redis-cluster/redis05/src
./redis-server ../redis.conf
cd /usr/local/server/redis-cluster/redis06/src
./redis-server ../redis.conf
11、启动六个redis实例
[root@node redis-cluster]# ./redis_cluster_all_start.sh
查看启动后的redis进程:[root@node redis-cluster]# ps -ef|grep redis
12、进入到redis01/src/ 目录下,拷贝一份 redis-cli 到 redis-cluster/ 目录下
[root@localhost redis-cluster]# cd /usr/local/server/redis-cluster/redis01/src/
[root@localhost src]# cp redis-cli /usr/local/server/redis-cluster/
[root@localhost src]# cd /usr/local/server/redis-cluster/
[root@node redis-cluster]# ls
redis01 redis02 redis03 redis04 redis05 redis06 redis-cli redis_cluster_all_start.sh
13、创建集群 注意:由于我们设置了redis集群的密码,所以要带上 -a sunshine (密码)
[root@node redis-cluster]# ./redis-cli --cluster create 192.168.161.101:7001 192.168.161.101:7002 192.168.161.101:7003 192.168.161.101:7004 192.168.161.101:7005 192.168.161.101:7006 --cluster-replicas 1 -a sunshine //每一个节点上有一个副本
14. 集群搭建完毕。对于链接集群测试,关闭集群脚本编写等日后再补