一:安装Redis和配置Redis

Redis版本是:redis-5.0.14.cluster

Cluster搭建 Galera mysql cluster-enabled_d3

如上图所示,一共是三个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

Cluster搭建 Galera mysql cluster-enabled_redis_02

现在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。