集群概念
Redis集群实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。每个节点负责一部分插槽(slot
),注意在Redis Cluster中,只有mater才拥有插槽的所有权。
分片实现
Redis集群通过分片的方式来保存数据库中的键值对,集群的整个数据库被分为16384(0-16383)个槽,数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个。只有当数据库中的16384个槽都有节点在处理时,集群才处于上线状态。
集群搭建
我们在一台机器上使用6个端口,模拟集群搭建
安装Redis
下载redis安装包,进行解压,编译,安装。此处省略
集群配置
- 创建6个节点的配置文件目录
conf
,日志目录logs
,数据存储目录data
,如下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| mkdir -p /usr/local/redis/redis_cluster/7001/conf/ mkdir -p /usr/local/redis/redis_cluster/7001/logs/ mkdir -p /usr/local/redis/redis_cluster/7001/data/
mkdir -p /usr/local/redis/redis_cluster/7002/conf/ mkdir -p /usr/local/redis/redis_cluster/7002/logs/ mkdir -p /usr/local/redis/redis_cluster/7002/data/
mkdir -p /usr/local/redis/redis_cluster/7003/conf/ mkdir -p /usr/local/redis/redis_cluster/7003/logs/ mkdir -p /usr/local/redis/redis_cluster/7003/data/
mkdir -p /usr/local/redis/redis_cluster/7004/conf/ mkdir -p /usr/local/redis/redis_cluster/7004/logs/ mkdir -p /usr/local/redis/redis_cluster/7004/data/
mkdir -p /usr/local/redis/redis_cluster/7005/conf/ mkdir -p /usr/local/redis/redis_cluster/7005/logs/ mkdir -p /usr/local/redis/redis_cluster/7005/data/
mkdir -p /usr/local/redis/redis_cluster/7006/conf/ mkdir -p /usr/local/redis/redis_cluster/7006/logs/ mkdir -p /usr/local/redis/redis_cluster/7006/data/
|
- 创建7001的配置文件,并添加如下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| bind 127.0.0.1
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile /usr/local/redis/redis_cluster/7001/logs/redis.log
dir /usr/local/redis/redis_cluster/7001/data
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
appendonly yes
appendfsync always
|
其他节点配置文件仿照7001分别创建
启动集群
- 启动每一个Redis节点
1 2 3 4 5 6
| redis-server /usr/local/redis/redis_cluster/7001/conf/redis.conf redis-server /usr/local/redis/redis_cluster/7002/conf/redis.conf redis-server /usr/local/redis/redis_cluster/7003/conf/redis.conf redis-server /usr/local/redis/redis_cluster/7004/conf/redis.conf redis-server /usr/local/redis/redis_cluster/7005/conf/redis.conf redis-server /usr/local/redis/redis_cluster/7006/conf/redis.conf
|
- 使用redis-cli创建Redis集群
1
| redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
|
redis-cli --cluster
代表集群操作命令
create
代表创建集群
--cluster-replicas 1
指定集群中每个mater的副本数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量n。因此节点列表中的前n个就是master节点,其他节点都是slave节点,随机分配到不同master
- 查看刚创建的集群状态,如下命令:(在任一台机器中查看任一节点信息,会带出所有节点信息)
1
| redis-cli --cluster check 127.0.0.1:7001
|
- 测试集群是否正常
连接集群中任一节点,注意:集群操作时,需要给redis-cli加上-c参数才可以
添加一个key进入集群
1 2 3 4
| 127.0.0.1:7001> set name wangweiye -> Redirected to slot [5798] located at 127.0.0.1:7002 OK 127.0.0.1:7002>
|
可以看到,set之后,Redis会自动重定向到7002节点的5798插槽,接着我们进入7003节点,观察是否能查到此key
1 2 3 4
| 127.0.0.1:7003> get name -> Redirected to slot [5798] located at 127.0.0.1:7002 "wangweiye" 127.0.0.1:7002>
|
出现以上结果,说明我们搭建的集群运作正常。当集群中某个master节点故障时,相应的slave节点会自动升级为master,保证集群的可靠性。当故障节点恢复正常,则变为slave节点提供副本职能,请自行测试
注意
Redis集群中每个实例会使用两个TCP端口,一个用于客户端(redis-cli或其他应用)通信,另一个用于集群中实例相互通信的总线端口,且第二个端口比第一个端口一定大1000。如果外网配置时,请注意网络的连通性