集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。
集群由多组节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点;只有主节点负责读写请求和集群信息的维护。从节点只进行主节点数据和状态信息的复制。
以3个节点组成的集群为例:
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号: 6004/6005/6006。
安装包:redis-5.0.7.tar.gz
主机 | 操作系统 | IP地址 | 软件 / 安装包 / 工具 |
软件 / 安装包 / 工具 | 192.168.10.12 | redis-5.0.7.tar.gz |
可以看到redis服务已经安装好了
- cd /etc/redis/
- mkdir -p redis-cluster/redis600{1..6} #创建redis集群的工作目录、和每个节点的工作目录
- ls -R redis-cluster/
- cd /opt/redis-5.0.7/src/
- ls
- cd /opt/redis-5.0.7/
- for i in {1..6}; do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i; cp /opt/redis-5.0.7/src/redis-server /opt/redis-5.0.7/src/redis-cli /etc/redis/redis-cluster/redis600$i; done
- #使用for循环复制可以节省很多时间
- cd /etc/redis/redis-cluster/
- ls -R
- cd redis6001
- vim redis.conf
-
- #bind 127.0.0.1 ##第69行;注释掉监听地址,表示监听任意地址(也可设置为0.0.0.0)
- protected-mode no #修改第88行,关闭保护模式,设置为no
- port 6001 #修改第92行,修改监听端口为6001
- daemonize yes #修改第136行,开启后台运行
- appendonly yes #修改第699行,开启AOF持久化
-
-
- #集群模式配置
- cluster-enabled yes #第832行取消注释,开启集群模式
- cluster-config-file nodes-6001.conf #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)
- cluster-node-timeout 15000 #第846行,集群节点之间通信的超时时间;取消注释
- #先使用for循环把刚才我们设置的6001端口节点的配置文件覆盖到其他节点的配置文件
- for i in {2..6}; do \cp -f redis.conf /etc/redis/redis-cluster/redis600$i; done
-
- cd /etc/redis/redis-cluster/redis6002
- vim redis.conf
- port 6002 #修改第92行,修改监听端口为6002
- cluster-config-file nodes-6002.conf #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)
这边我们就不一一演示了
- cd ../redis6001
- ls
- for i in {1..6}; do cd /etc/redis/redis-cluster/redis600$i; ./redis-server redis.conf; done
- ps -elf |grep redis
- redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1 #把节点加入到集群当中
- --cluster-replicas 指定每个主节点有多少个从节点做主从复制
-
-
- redis-cli -p 6001 #登录redis数据库
- cluster slots #查看主从对应关系
- redis-cli -p 6001 -c
- -c 实现节点间的跳转,如果不加会报错
- set name hj
- redis-cli -p 6004 -c
- keys *
- get name
- redis-cli -p 6006 -c
- keys *
- get name
cluster nodes
安装包:redis-5.0.7.tar.gz
主机 | 操作系统 | IP地址 | 工具 |
Master1 | CentOS7 | 192.168.10.12:6002 | redis-5.0.7.tar.gz |
Master2 | CentOS7 | 192.168.10.13:6003 | redis-5.0.7.tar.gz |
Master3 | CentOS7 | 192.168.10.14:6004 | redis-5.0.7.tar.gz |
salve1 | CentOS7 | 192.168.10.15:6005 | redis-5.0.7.tar.gz |
salve2 | CentOS7 | 192.168.10.16:6006 | redis-5.0.7.tar.gz |
slave3 | CentOS7 | 192.168.10.17:6007 | redis-5.0.7.tar.gz |
- cd /etc/redis/
- mkdir -p redis-cluster/redis6379
- cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/
- cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/
- cd /etc/redis/redis-cluster/redis6379/
- vim redis.conf
-
- bind 192.168.10.12 ##第69行;可以注释掉监听地址,表示监听任意地址(也可设置为0.0.0.0或自己的IP地址)
- protected-mode no #修改第88行,关闭保护模式,设置为no
- port 6002 #修改第92行,修改监听端口每台不一样即可,为方便后续实验我们设置为6002 6003等
- daemonize yes #修改第136行,开启后台运行
- appendonly yes #修改第699行,开启AOF持久化
-
-
- #集群模式配置
- cluster-enabled yes #第832行取消注释,开启集群模式
- cluster-config-file nodes-6379.conf #第840行,每个集群配置文件,取消注释、可以修改对应的端口(也可以默认为6379.conf)
- cluster-node-timeout 15000 #第846行,集群节点之间通信的超时时间;取消注释
- scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.13:/etc/redis/redis-cluster/redis6379/redis.conf
- scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.14:/etc/redis/redis-cluster/redis6379/redis.conf
- scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.15:/etc/redis/redis-cluster/redis6379/redis.conf
- scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.16:/etc/redis/redis-cluster/redis6379/redis.conf
- scp /etc/redis/redis-cluster/redis6379/redis.conf root@192.168.10.17:/etc/redis/redis-cluster/redis6379/redis.conf
vim /etc/redis/redis-cluster/redis6379/redis.conf
- cd /etc/redis/redis-cluster/redis6379/
- redis-server redis.conf
- 或
- ./redis-server redis.conf
redis-cli --cluster create 192.168.10.12:6002 192.168.10.13:6003 192.168.10.14:6004 192.168.10.15:6005 192.168.10.16:6006 192.168.10.17:6007 --cluster-replicas 1
- redis-cli -h 192.168.10.12 -p 6002 -c
- cluster slots
- set mykey name
- cluster keyslot mykey
故障模拟:我们关闭192.168.10.13这台主机或者关闭这台主机的服务。已知192.168.10.17是192.168.10.14的从节点,当主节点down掉后从节点会接替主节点,就可以实现故障切换了,保证了我们服务的正常运行。
每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比6379,还有一个额外的端口(通过在这个端口号上加100Q0)作为数据端口,例如: redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000,即需要开启16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权。等等。
6379端口:主要用于客户端和服务端之间的通信以及主从复制之间相互通信
26379端口:哨兵模式之间相互通信
16379端口:集群之间的节点进行通信