Docker搭建Redis集群(Redis Cluster)

概述

集群搭建准备:至少6个节点才能构成高可用的集群。集群也实现了自动的故障转移。
配置文件路径:Redis集群配置文件

前提

无论是在redis-server 5.x版本,还是老的ruby创建集群的方式, 在create cluster的环节是不能配置redis密码的,
如果设置了密码,redis-cli --cluster create会报用户认证失败的错误

解决方法:
在搭建集群时去除所有redis节点的密码,也就是redis-cli --cluster create 的时候是没有密码参数配置的,所有在这里我们不要配置密码

当集群配置完成后,通过config set的方式动态的为每一个节点设置密码(不需要重启redis,且重启后仍然有效)
例如:
$ redis-cli -h 127.0.0.1 -p 6379 -c
127.0.0.1:6379> config set requirepass ‘password’ // 设置密码
127.0.0.1:6379> config set masterauth ‘password’ // 设置连接密码
127.0.0.1:6379> config rewrite // 把config set 操作写入配置文件中

设置密码后连接集群
redis-cli -h 127.0.0.1 -p 6379 -c -a password

搭建集群

#任意进入一个容器: 前半部分是主,后半部分是从
#--replicas 1是指分配几个从节点
#redis-trib.rb create --replicas 1 主1 ip:port  主2 ip:port  主3 ip:port 从1 ip:port 从2 ip:port 从3 ip:port

#master 1 2 3  41 42 43 
#slave 1 2 3 51 52 53
redis-cli --cluster create  192.168.1.41:6379 192.168.1.42:6379 192.168.1.43:6379 192.168.1.51:6379 192.168.1.52:6379 192.168.1.53:6379 --cluster-replicas 1


#redis-cli --cluster create --replicas 1 主1 ip:port  主2 ip:port  主3 ip:port 从1 ip:port 从2 ip:port 从3 ip:port


迁移

进入到需要被迁移的节点
先迁移槽到新节点 再忘记 再删除
redis-trib.rb reshard ip:port --from id(all) --to 主节点id --slots 4096 总数量
cluster reset忘记再删除
redis-trib.rb del-node ip:port id

假设当前每台机器4096个,

收缩
先迁移到已存在的,再忘记-》删除

伸缩

Redis集群采用流言协议 Gossip,节点彼此之间不断通信交换信息,类似流言传播,到了一段时间都会知道完整的集群信息。

备注

哨兵:高可用;客户端请求到哨兵获取可访问的节点。
数据量不大,但是读取频率超级大。

集群:分布式存储;客户端有访问集群的扩张,可以方便访问集群数据。
海量数据,大量写请求。一般集群+哨兵组合。

数据自动切分。
自动故障转移。
数据分布:顺序分区、哈希分区(redis cluster)

哈希分区:节点伸缩的时候会导致哈希值重新计算,数据迁移

1.节点取余分区
2.一致性哈希
3.虚拟槽分析(redis cluster)
使用分散度良好的哈希函数,把所有数据映射到固定范围的整数集合中,证书定义为槽-slot。这个范围远远大于节点数,redis cluster的槽范围是0~16383。
槽是集群内部数据管理和迁移的基本单位。大范围槽为了方便数据拆分和集群扩展。
伸缩节点,会迁移槽,槽迁移完成,数据也就迁移完成了。
rediscrc16算法

数据槽:每个槽存放多个key。数据存在槽中,槽分布在节点上,伸缩节点会导致槽重新分配,但是数据是在槽内,所以数据跟着槽发生变化。

从节点也会复制主节点的槽。

修改redis-trib.rb加上密码
Redis.new(,:password=>“xxx”)

准备节点

节点之间是需要通信的,会在你当前监听的端口前面加10000,tcp通信
配置文件
master
port 6379
开启集群模式
cluster-enabled yes
节点超时时间,ms
cluster-node-timeout 15000
集群内部配置文件,自动生成
cluster-config-file “nodes-6379.conf”
logfile “/log/redis.log”
dir /data
requirepass abc123 #自身密码
daemonize no

slave
port 6379
开启集群模式
cluster-enabled yes
节点超时时间,ms
cluster-node-timeout 15000
集群内部配置文件,自动生成
cluster-config-file “nodes-6379.conf”
logfile “/log/redis.log”
dir /data
requirepass 123456 #自身密码
daemonize no
masterauth abc123 #主机密码
从节点只是做备份,读写都是在主节点。

握手

节点握手
指定集群ip端口
cluster-announce-ip
cluster-announce-port 6379
cluster-announce-bus-port 16379

cluster meet ip port
cluster nodes
#在每个从节点设置自己的主节点
cluster replicate 节点id
redis-cli -a passwd -h ip -p port cluster replicate 节点id

分配槽 给主节点分配槽

redis-cli -a passwd -h ip -p port cluster addslots {0…5461}
redis-cli -a passwd -h ip -p port cluster addslots {5462…10922}
redis-cli -a passwd -h ip -p port cluster addslots {10923…16383}

数据进入了某个槽,那么只能在指定槽所在的主节点写入数据。
redis-cli -a passwd -c #以集群的方式访问

发布了264 篇原创文章 · 获赞 23 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Edu_enth/article/details/103726987