RedisCluster概括

特性

前提:

哨兵集群中的高可用,数据备份,故障转移,投片机制存在

两两互连

底层实现的是节点间的二进制通信协议(内部通信,优化了传输速度)

哨兵进程消失

哨兵中的逻辑还在,监听,投票,最少要有三个主节点

客户端

客户端不需要关心数据的分布式计算

算法

分布式不再使用hash一致性算法,引入了新的逻辑----哈希槽

哈希槽的使用逻辑

客户端发送命令到任意一个节点(M1) (name)

节点计算好槽号 (5789)

节点判定key值的归属权 (1/0)

节点通过槽逻辑找到正确的管理者(M1)

客户端重新连接重定向到M2发送命令

M2执行槽计算,判断归属权(true),处理数据

 

redis-cluster的搭建

搭建的环境

初步搭建cluster集群,需要使用ruby的语言编写的脚本redis-trib.rb,在redis根目录的src文件夹中(如同tomcat需要在jdk环境中)

在自行购买的云主机中,不需要ruby环境也可以搭建

ruby -v

查看当前的ruby

准备配置文件

[root@10-9-104-184 redis-3.2.11]# cp redis.conf redis-cluster.conf

rdb与aof持久化比较

rdb

记录的数据是key--value

文件占用空间较小

只有单独开启rdb持久化时才加载

宕机时丢失的数据较多

不要求数据可靠性极强

aop

记录的数据是set key value

文件占用空间较大

aof的优先级比rdb更高

数据同步的实时性更高

丢失的数据少

对redis-service的压力较大

对数据的可靠性要求较高

 

修改配置文件

第593行

appendonly yes

开启第二种持久化的方式(aof)

第721行

cluster-enabled yes

开启集群模式

第729行

cluster-config-file nodes-6379.conf

集群节点的状态记录文件

准备启动的文件

创建文件夹

[root@10-9-104-184 redis-3.2.11]# mkdir 8000 8001 8002 8003 8004 8005

拷贝模板文件

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8000

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8001

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8002

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8003

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8004

[root@10-9-104-184 redis-3.2.11]# cp redis-cluster.conf 8005

修改端口号为8000-8005

:%s/6379/8000/g

:%s/6379/8001/g

:%s/6379/8002/g

:%s/6379/8003/g

:%s/6379/8004/g

:%s/6379/8005/g

启动验证查看

[root@10-9-104-184 redis-3.2.11]# redis-server 8000/redis-cluster.conf

 

集群的简单命令

登录集群节点

#redis-cli -c -p 8000

以cluster的模式登录,才能支持cluster的命令执行

查看集群信息

8000>cluster info

查看集群所有节点信息

8000>cluster nodes

 

创建一个集群

8000 8001 8002作为主节点实现一个没有高可用的最小集群创建,需要调用src/redis-trib.rb的脚本文件

[root@10-9-104-184 redis-3.2.11]# src/redis-trib.rb Usage: redis-trib <command> <options> <arguments ...>

登录集群任意一个节点

8000>cluster info 8000>cluster nodes

查询节点相关信息

127.0.0.1:8000> cluster nodes

e485b873945eca28d724e0416bd5b043c326bbf2 10.9.104.184:8002 master - 0 1566704626602 3 connected 10923-16383

ef9ecfffae0cb7e5a707897f1a8ac249aace3b04 10.9.104.184:8001 master - 0 1566704624598 2 connected 5461-10922

1e3137131e66c31ef18ec0ea63faf6be5591b4ee 10.9.104.184:8000 myself,master - 0 0 1 connected 0-5460

3bd8b77749f7a57afa92bd92cdc366767e07ecb0 10.9.104.184:8003 master - 0 1566704627605 0 connected

127.0.0.1:8000>

节点id值节点ip:port角色(登录人)主节点id与操作时间有关的值序号连接状态槽道范 围
               

 

动态添加一个从节点

8004添加8001成为从节点--add-node,需要2个选项

--slave :表示底层将新节点转化为从节点

--master-id <args>:表示新节点挂接到哪个主节点成为主从关系

[root@10-9-104-184 redis-3.2.11]# src/redis-trib.rb add-node --slave --master-id ef9ecfffae0cb7e5a707897f1a8ac249aace3b04 10.9.104.184:8004 10.9.104.184:8003

 

节点删除

redis-trib.rb 调用底层的deletenode 只能删除从节点

其他节点中关于从节点的数据删除,从节点的数据还存在

在删除节点之后,要立即将节点关闭,防止从节点继续连接集群,造成数据的混乱

从节点被删除后无法再连接到集群中

如果需要将删除的从节点添加到集群中,需要清空的持久化文件,或者重新搭建

dump*

append*

node*

 

重新搭建(测试环境中,能解决所有问题)

停,删,启,建

停:将所有的节点停止(kill ,shutdown)

[root@10-9-104-184 redis-3.2.11]# redis-cli -c -p 8004

127.0.0.1:8004> shutdown

 

删:删除所有的持久化文件

dump*

append*

node*

[root@10-9-104-184 redis-3.2.11]# rm -f dump*

[root@10-9-104-184 redis-3.2.11]# rm -f appendonly*

[root@10-9-104-184 redis-3.2.11]# rm -f nodes-*

 

启:启动所有的节点

[root@10-9-104-184 redis-3.2.11]# redis-server 8000/redis-cluster.conf

[root@10-9-104-184 redis-3.2.11]# redis-server 8001/redis-cluster.conf

[root@10-9-104-184 redis-3.2.11]# redis-server 8002/redis-cluster.conf

[root@10-9-104-184 redis-3.2.11]# redis-server 8003/redis-cluster.conf

[root@10-9-104-184 redis-3.2.11]# redis-server 8004/redis-cluster.conf

[root@10-9-104-184 redis-3.2.11]# redis-server 8005/redis-cluster.conf

 

建:redis-trib.rb命令创建

redis-trib.rb create --replicas 1 所有节点信息

--replicas 1:将所有节点的个数计算,每个主节点下至少配置一个从节点的集群被搭建(6个 形成3主 各自有1从)

 

posted @ 2021-03-17 11:05  minnersun  阅读(107)  评论(0编辑  收藏  举报