Redis集群搭建
什么是Redis集群
Redis集群是一个分布式、容错的Redis实现,它由多个Redis节点组成,在多个Redis节点之间进行数据共享。集群可以使用的功能是普通单机Redis所能使用的功能的一个子集,他提供了复制和故障转移功能。
Redis集群中不存在中心节点和代理节点,而且不支持那些需要同时处理多个键的Redis命令。
Redis集群的设计目标是达到线性可扩展性。
Redis集群为了保证数据的一致性,而牺牲一部分容错性。
Redis集群通过分区来提供一定程度的可用性,当集群中有部分节点失效或无法提供服务时,集群也可以继续完成相关的命令请求。
Redis集群实现了单机Redis中所有处理单个数据库键的命令,它不支持多数据库功能。它默认使用0号数据库,并且不能使用SELECT命令。
使用集群的好处:
- 可以实现将数据自动切分到多个节点
- 当集群中有部分节点失效或者无法提供服务的时候,它依然可以继续完成相关的命令请求
- Redis集群的使用可以解决高并发、大数据量的问题
集群中的节点和槽
节点
一个Redis集群通常由多个节点(Node)组成。在没有搭建Redis集群之前,每个节点都是相互独立的,彼此之间没有关系,每个节点都只包含在自己的集群中,只有将多个节点连接在一起,才能组建一个可以工作的集群。
#连接各个独立的节点
#将这条命令发送个某个节点,就可让该节点与ip和port所指定的节点进行握手。当握手成功时,就表示该节点已经进入集群中
CLUSTER MEET <ip> <port>
在开启集群模式的时候,服务器会创建一个 clusterState类型的结构来保存当前节点视角下的集群状态。
在集群模式中,每个节点都会使用cluster.h/clusterNode结构来保存自己的当前状态。
槽
Redis集群为了能够存出大量的数据信息,采用分片的方式将大量方式保存在数据库中,这个数据库被划分为16384个槽(Slot)。槽是虚拟槽,槽是有一定的范围,在Redis中的范围是0~16383,每个槽映射一个大数据子集,一般比节点数大
集群搭建
集群搭建步骤
Redis自带的集群搭建
三主三从集群
- 主节点:7000、7001、7002
- 主从关系:7003-->7000(7003是7000的从节点)、7004-->7001、7005-->7002
配置开启节点
- port${port}:指定端口。
- decmonize yes:以守护进程的方式启动。
- dir "/home/redis/data":数据目录。
- dfilename "dump-${port} .rdb": 指定RDB文件。
- logfle "redis-cluster-${port}.log":指定日志文件。
- cluster-enabled yes:开启集群模式,表示该节点是一个cluster节点。
- cluster-config- file nodes-$ {port}.conf: 为cluster 节点指定配置文件。
- cluster-enabled yes:开启集群模式,表示该节点是一个 cluster 节点。
- cluster-node- timeout 15000:表示故障转移的时间或节点超时的时间,15s。
- I cluster-config-file "nides.conf": 集群节点的配置。
- lster-require fl-ovcrage yes:是否需要集群的所有节点都提供服务,才会认为这个集群是否是正常运行。
准备6个配置文件(7000->7005)
配置文件redis-cluster-7000.conf
port 7000
daemonize yes
dir "/home/redis/data"
logfile "cluster-7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
配置文件redis-cluster-7001.conf
port 7001
daemonize yes
dir "/home/redis/data"
logfile "cluster-7001.log"
dbfilename "dump-7001.rdb"
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-require-full-coverage no
配置文件redis-cluster-7002.conf
port 7002
daemonize yes
dir "/home/redis/data"
logfile "cluster-7002.log"
dbfilename "dump-7002.rdb"
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-require-full-coverage no
其它的三个配置文件也是这样配置。
启动节点
redis-server redis-cluster-7000.conf
redis-server redis-cluster-7001.conf
redis-server redis-cluster-7002.conf
redis-server redis-cluster-7003.conf
redis-server redis-cluster-7004.conf
redis-server redis-cluster-7005.conf
#查看集群信息
redis-cli -p 7000 cluster info
Redis集群中的节点的责任:
- 保存客户端发送过来的键值对数据
- 记录集群的状态,以及某个键到其所对应的节点映射
- 自动发现其他节点,监控其他节点,当某个节点出现故障时进行故障转移
搭建集群
#分别建立7000与7002、7003、7004、7005节点的握手关系
redis-cli -p 7000 cluster meet 127.0.0.1 7002
redis-cli -p 7000 cluster meet 127.0.0.1 7003
redis-cli -p 7000 cluster meet 127.0.0.1 7004
redis-cli -p 7000 cluster meet 127.0.0.1 7005
#查看节点之间的关系
redis-cli -p 7005 cluster nodes
创建脚本文件,来为指定节点指派槽
vim addsloat.sh
start=$1
end=$2
port=$3
for slot in 'seq ${satrt} ${end}'
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
#为7000节点指派0~5461范围内的槽
sh addsloat.sh 0 5461 7000
#查看集群和节点信息
cluster info
#为7001节点指派5462~10922范围内的槽
sh addsloat.sh 5462 10922 7001
#为7002节点指派10923~16383范围内的槽
sh addsloat.sh 10923 16383 7002
主从分配
#查看节点信息
redis-cli -p 7000 cluster nodes
#分配主从关系
redis-cli -p 7003 cluster replicate node-id #node-id是节点信息里面的节点id
redis-cli -p 7004 cluster replicate node-id #node-id是节点信息里面的节点id
redis-cli -p 7005 cluster replicate node-id #node-id是节点信息里面的节点id
#查看主从关系
redis-cli -p 7003 replicate