摘要: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)
1、安装Redis5.0 安装Redis5.0链接:Linux下安装Redis
2、创建 redis-cluster目录,方便我们管理创建的六个redis实例,并复制一份之前搭建好的redis,重命名为redis01
[root@localhost ~]# cd /usr/local/software/ //进入到software目录下 (这个目录是我之前建的,用于管理各种安装软件的)
[root@localhost software]# mkdir redis-cluster //创建redis-cluster目录,用来管理redis集群
[root@localhost software]# ls //查看software目录
fastDFS_software nginx_software redis-cluster zookeeper-3.4.13
jdk1.8 redis-5.0.0 tomcat9
[root@localhost software]# cp -r redis-5.0.0 ./redis-cluster/redis01 //拷贝redis-5.0.0到redis-cluster目录下,并重命名为redis01
3、修改redis01的redis.conf配置文件
[root@localhost software]# cd ./redis-cluster/ //进入到redis-cluster目录下
[root@localhost redis-cluster]# cd ./redis01/etc/ //进入到redis01的etc目录下
[root@localhost etc]# ls //查看etc
redis.conf
[root@localhost etc]# 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 123456 和 requirepass 123456 注意:所有节点的密码都必须一致,masterauth也要加
6、设置开启AOF模式 appendonly yes
7、设置启用集群模式 cluster-enabled yes,开启配置文件cluster-config-file nodes.conf ,超时时间 cluster-node-timeout 5000
8、配置好后,拷贝 redis01再创建五个redis实例
[root@localhost etc]# cd /usr/local/software/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
10、在redis-cluster目录下,编写redis_cluster_start_all.sh启动脚本,启动六个redis实例
[root@localhost redis-cluster]# vim redis_cluster_start_all.sh
cd /usr/local/software/redis-cluster/redis01/bin/
./redis-server ../etc/redis.conf
cd /usr/local/software/redis-cluster/redis02/bin/
./redis-server ../etc/redis.conf
cd /usr/local/software/redis-cluster/redis03/bin/
./redis-server ../etc/redis.conf
cd /usr/local/software/redis-cluster/redis04/bin/
./redis-server ../etc/redis.conf
cd /usr/local/software/redis-cluster/redis05/bin/
./redis-server ../etc/redis.conf
cd /usr/local/software/redis-cluster/redis06/bin/
./redis-server ../etc/redis.conf
11、由于刚创建好的redis_cluster_start_all.sh脚本是没有执行权限的,所以需要给脚本添加可执行权限
[root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
-rw-r--r-- 1 root root 505 Nov 17 18:15 redis_cluster_start_all.sh
[root@localhost redis-cluster]# chmod +x redis_cluster_start_all.sh //添加可执行权限
[root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
-rwxr-xr-x 1 root root 505 Nov 17 18:15 redis_cluster_start_all.sh
12、启动六个redis实例
[root@localhost redis-cluster]# ./redis_cluster_start_all.sh
13、进入到redis01/bin/ 目录下,拷贝一份 redis-cli 到 redis-cluster/ 目录下
[root@localhost redis-cluster]# cd /usr/local/software/redis-cluster/redis01/bin/
[root@localhost bin]# ls
appendonly.aof nodes.conf redis-check-aof redis-server
mkreleasehdr.sh redis-benchmark redis-cli
[root@localhost bin]# cp redis-cli /usr/local/software/redis-cluster/
[root@localhost bin]# cd /usr/local/software/redis-cluster/
[root@localhost redis-cluster]# ls
redis01 redis03 redis05 redis-cli
redis02 redis04 redis06 redis_cluster_start_all.sh
14、创建集群 注意:由于我们设置了redis集群的密码,所以要带上 -a 123456 (密码)
./redis-cli --cluster create 192.168.30.1:7001 192.168.30.1:7002 192.168.30.1:7003 192.168.30.1:7004 192.168.30.1:7005 192.168.30.1:7006 --cluster-replicas 1 -a 123456
15、在redis-cluster目录下,编写redis_cluster_stop_all.sh关闭脚本 注意:由于我们设置了redis集群的密码,所以要带上 -a 123456 (密码)
[root@localhost redis-cluster]# vim redis_cluster_stop_all.sh
cd /usr/local/software/redis-cluster/redis01/bin/
./redis-cli -p 7001 -a 123456 shutdown save
cd /usr/local/software/redis-cluster/redis02/bin/
./redis-cli -p 7002 -a 123456 shutdown save
cd /usr/local/software/redis-cluster/redis03/bin/
./redis-cli -p 7003 -a 123456 shutdown save
cd /usr/local/software/redis-cluster/redis04/bin/
./redis-cli -p 7004 -a 123456 shutdown save
cd /usr/local/software/redis-cluster/redis05/bin/
./redis-cli -p 7005 -a 123456 shutdown save
cd /usr/local/software/redis-cluster/redis06/bin/
./redis-cli -p 7006 -a 123456 shutdown save
16、由于刚创建好的redis_cluster_stop_all.sh脚本是没有执行权限的,所以需要给脚本添加可执行权限
[root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
-rw-r--r-- 1 root root 505 Nov 17 18:15 redis_cluster_start_all.sh
[root@localhost redis-cluster]# chmod +x redis_cluster_start_all.sh //添加可执行权限
[root@localhost redis-cluster]# ll | grep redis_cluster_start_all.sh
-rwxr-xr-x 1 root root 505 Nov 17 18:15 redis_cluster_start_all.sh
17、设置redis集群开机启动
[root@localhost redis-cluster]# vim /etc/rc.d/rc.local
添加如下代码到 /etc/rc.d/rc.local 中:
/usr/local/software/redis-cluster/redis_cluster_start_all.sh
如果有遇到不懂或者有问题时,可以扫描下方二维码,欢迎进群交流与分享,希望能够跟大家交流学习!