一:安装Redis和配置Redis
Redis版本是:redis-5.0.14.cluster
如上图所示,一共是三个master(redis1,redis2,redis3),三个从节点(redis1-1,redis3-1,redis2-1,)。六个节点端口号分别为:7001、7002、7003、7004、7005、7006。
修改Redis.conf,如下所示:
# 端口号,每个目录都不同
port 7001
# 开启集群模式
cluster-enabled yes
#节点超时实际,单位毫秒 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 5000
#集群内部配置文件(默认为 nodes-6379.conf)
cluster-config-file nodes.conf
# 启动 AOF
appendonly yes
# 默认是no,改成 yes,意思是是否要后台启动。
daemonize yes
这时候进入redis1目录 执行命令,redis启动,然后在关闭他,我就简单粗暴了, ps -ef|grep redis 找到redis进程 ,kill -9 进程id。这步启动然后关闭,其目的是为生成一些文件。
redis-server redis.conf
ps -ef|grep redis
kill -9 进程
二、启动6个节点的redis
分别进入每一个端口下的redis 执行启动命令,例如
cd redis2
redis-server redis.conf
6个节点都启动成功后,自己看一下 ps -ef|grep redis
guodong@sh-guodong src % ps -ef|grep redis
501 72133 1 0 11:21上午 ?? 0:15.68 redis-server 127.0.0.1:7001 [cluster]
501 72389 1 0 11:21上午 ?? 0:15.58 redis-server 127.0.0.1:7002 [cluster]
501 72594 1 0 11:21上午 ?? 0:15.58 redis-server 127.0.0.1:7003 [cluster]
501 72891 1 0 11:22上午 ?? 0:15.34 redis-server 127.0.0.1:7004 [cluster]
501 73095 1 0 11:22上午 ?? 0:15.33 redis-server 127.0.0.1:7005 [cluster]
501 73216 1 0 11:22上午 ?? 0:15.03 redis-server 127.0.0.1:7006 [cluster]
501 9060 93357 0 12:25下午 ttys001 0:00.00 grep redis
三、关联所有节点
进入7001节点的redis src目录中执行命令,进入控制台
redis-cli -p 7001
依次执行下面的命令
127.0.0.1:7001> cluster meet 127.0.0.1 7002
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7003
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7004
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7005
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7006
OK
此时,所有的节点都关联起来了。
四、 分配 slot
redis Cluster 是由 16384 个 slot 组成的,那么我们需要将这些槽分散到这其中 3 个节点里(3 主 3 从)。
进入7003的redis目录中执行命令
redis-cli -p 7001 cluster addslots {0..5461}
redis-cli -p 7003 cluster addslots {5462..10922}
redis-cli -p 7005 cluster addslots {10923..16383}
此时节点已经分配好了。通过以下命令验证:
redis-cli -p 7000 cluster nodes
现在6个节点都是主节点,并且给7001 、7003 、7005分配了槽。
五、变成主从复制
去7001的redis目录下执行
redis-cli -p 7001 cluster nodes
5e94ae9b31b2029b2e881e9e302800941e1debcd 127.0.0.1:7004@17004 master - 0 1648956907000 3 connected
9c807c577b336d3aa4c86b4c5c2da452d3e3383d 127.0.0.1:7005@17005 master - 0 1648956908478 4 connected 10923-16383
7f3d314fb9c504861dc2cbe767f63cfc78d30b8e 127.0.0.1:7002@17002 master - 0 1648956906000 1 connected
cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 127.0.0.1:7001@17001 myself,master - 0 1648956904000 0 connected 0-5461
5500c4ce07bbb0b9f0d10ade053a423fd319afa6 127.0.0.1:7003@17003 master - 0 1648956907000 2 connected 5462-10922
ab84c1e455a92cfb4c49eb56b0f4197badea7b5b 127.0.0.1:7006@17006 master - 0 1648956907466 5 connected
看到我框上的那一串 16 进制字符串,其实就是后面对应进程节点的NodeId,这个是用处的,先放着。
然后分别设置7002、 7004 、7006节点的主库,执行下面命令,你们要对应自己的NodeId。
redis-cli -p 7002 cluster replicate cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e (7001的nodeID)
OK
redis-cli -p 7004 cluster replicate 5500c4ce07bbb0b9f0d10ade053a423fd319afa6 (7003的nodeID)
OK
redis-cli -p 7006 cluster replicate 9c807c577b336d3aa4c86b4c5c2da452d3e3383d (7005的nodeID)
OK
这时候在执行
redis-cli -p 7001 cluster nodes
guodong@sh-guodong src % redis-cli -p 7001 cluster nodes
5e94ae9b31b2029b2e881e9e302800941e1debcd 127.0.0.1:7004@17004 slave 5500c4ce07bbb0b9f0d10ade053a423fd319afa6 0 1648960701331 2 connected
9c807c577b336d3aa4c86b4c5c2da452d3e3383d 127.0.0.1:7005@17005 master - 0 1648960700322 4 connected 10923-16383
7f3d314fb9c504861dc2cbe767f63cfc78d30b8e 127.0.0.1:7002@17002 slave cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 0 1648960700000 0 connected
cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 127.0.0.1:7001@17001 myself,master - 0 1648960697000 0 connected 0-5461
5500c4ce07bbb0b9f0d10ade053a423fd319afa6 127.0.0.1:7003@17003 master - 0 1648960699302 2 connected 5462-10922
ab84c1e455a92cfb4c49eb56b0f4197badea7b5b 127.0.0.1:7006@17006 slave 9c807c577b336d3aa4c86b4c5c2da452d3e3383d 0 1648960698000 4 connected
guodong@sh-guodong src %
到这里三主三从已经设置好了。记住一下:从redis5.0开始,建议使用redis-cli作为创建集群的命令,不推荐再使用redis-trib.rb来创建集群了,毕竟使用redis-trib.rb还要安装Ruby程序,比redis-cli麻烦的多。
六、集群客户端命令(redis-cli -c -p port)
记住:-c是以集群模式启动redis客户端
集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键
redis --help命令查看信息
guodong@sh-guodong src % redis-cli --help
redis-cli 6.2.6
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1).
-p <port> Server port (default: 6379).
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server.
You can also use the REDISCLI_AUTH environment
variable to pass this password more safely
(if both are used, this argument takes precedence).
--user <username> Used to send ACL style 'AUTH username pass'. Needs -a.
--pass <password> Alias of -a for consistency with the new --user option.
--askpass Force user to input password with mask from STDIN.
If this argument is used, '-a' and REDISCLI_AUTH
environment variable will be ignored.
-u <uri> Server URI.
-r <repeat> Execute specified command N times.
-i <interval> When -r is used, waits <interval> seconds per command.
It is possible to specify sub-second times like -i 0.1.
-n <db> Database number.
-3 Start session in RESP3 protocol mode.
-x Read last argument from STDIN.
-d <delimiter> Delimiter between response bulks for raw formatting (default: \n).
-D <delimiter> Delimiter between responses for raw formatting (default: \n).
-c Enable cluster mode (follow -ASK and -MOVED redirections).
查看Redis集群信息
guodong@sh-guodong src % redis-cli -p 7001 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:0
cluster_stats_messages_ping_sent:5293
cluster_stats_messages_pong_sent:5052
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:10350
cluster_stats_messages_ping_received:5052
cluster_stats_messages_pong_received:5298
cluster_stats_messages_received:10350
guodong@sh-guodong src %
七:Redis操作命令如下
guodong@sh-guodong src % redis-cli -c -p 7001
127.0.0.1:7001> set name gg
-> Redirected to slot [5798] located at 127.0.0.1:7003
OK
127.0.0.1:7003> set age 66
-> Redirected to slot [741] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7003
"gg"
127.0.0.1:7003> get age
-> Redirected to slot [741] located at 127.0.0.1:7001
"66"
127.0.0.1:7001>
如上图所示:在集群模式启动下,会重定向到指定的节点存储数据、获得数据。如果以不是集群的方式启动,则会报错,如下所示:
guodong@sh-guodong src % redis-cli -p 7001
127.0.0.1:7001> set name guodong
(error) MOVED 5798 127.0.0.1:7003
127.0.0.1:7001> set age 99
OK
127.0.0.1:7001> get name
(error) MOVED 5798 127.0.0.1:7003
127.0.0.1:7001>
1:Redis Cluster特点
- 多主多从,去中心化:从节点作为备用,复制主节点,不做读写操作,不提供服务
- 不支持处理多个key:因为数据分散在多个节点,在数据量大高并发的情况下会影响性能;
- 支持动态扩容节点:这是我认为算是Rerdis Cluster最大的优点之一;
- 节点之间相互通信,相互选举,不再依赖sentinel:准确来说是主节点之间相互“监督”,保证及时故障转移
2:Redis Cluster与其它集群模式的区别
- 相比较sentinel模式,多个master节点保证主要业务(比如master节点主要负责写)稳定性,不需要搭建多个sentinel实例监控一个master节点;
- 相比较一主多从的模式,不需要手动切换,具有自我故障检测,故障转移的特点;
- 相比较其他两个模式而言,对数据进行分片(sharding),不同节点存储的数据是不一样的;
- 从某种程度上来说,Sentinel模式主要针对高可用(HA),而Cluster模式是不仅针对大数据量,高并发,同时也支持HA。