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从)