分布式集群架构
sentinel弊端:内存的瓶颈
原来的集群是非分布式的:有集群中的redis服务器都是存储形同的内容!会做成内存的冗余!虽然有高可用性,但是内存会有浪费
所以我们才用分布式的集群架构!
说明:
1.伪集群:一台服务器,启动了6个redis服务、通过端口号区分(7001~7006)
2.真集群:6个节点或者和3个节点
伪集群(一主两从)
伪集群(一主两从)+哨兵
分布式集群
replication
说明:
1:伪集群,一台服务器,启动6个redis服务、通过端口区分(7001~7006)
2:真集群:6个节点或者3个节点
分布式集群的基本原理:
实质上就是如图所示:由原来的一主两从加上设置的哨兵,哨兵不存储东西,只负责监视和自动故障迁移!
由原来的三个服务都存储一样的数据,假设数据量是100G、那么他们三台所有的实质的数据量就是100G
但是图三中的分布式的集群架构实现了纵向的高可用性和横向的内存扩展!!!共6台redis,分为三个主和三个从,每一个主都对应一个自己的从redis,每一对的主从都有100G的内存,实现了自身的好可用和横向的内存的扩展,实质的内存存储量能达到300G!!
分布式的基本存储原理就是:假设有16384个插槽slot,数据的存储是通过hash算法来实现的,为每一条的数据在set的时候通过hash算法;用hash的key跟16384 进行取余得到的数目是一个0到16383的区间内数,又因为是三对redis服务来进行横向的扩展的,16384的数目会按照算法分配给三对服务redsi指定的数据区间,set的key跟16384取余后的结果是多少,这个结果在哪个区间就会将数据存储到对应的redis的对服务器上!!!
进行取数据的时候:因为get和set都是用的同一个hash算法来进行对同一key的跟16484的取余运算,所以结果是相同的,就能够锁定到set时所存储的redis的服务器!实现对数据的取!!
分布式集群搭建
1、后台杀掉所有的redis的进程
pkill -9 redis
#验证一下:
ps -ef|grep redis
后台没有redis的进程了!!
2、把redis/data下的所有的数据文件清空(以前应该是存储的RDB和AOF数据文件)
在指定的目录下:
rm -rf ./*
3、在redis文件夹下创建cluster-conf目录!
mkdir cluster-conf
4、从源码包复制redis.conf到指定目录
[root@zhuxm01 server]# cp redis-6.0.8/redis.conf /export/server/redis/cluster-conf/
在redis/cluster-conf文件夹下创建6个文件redis7001–7006配置文件
vi redis7001.conf
第二步:分别配置每个redis的配置文件,详细配置如下,注意区分端口
include /export/server/redis/cluster-conf/redis.conf
port 7001
#redis的进程文件
pidfile /var/run/redis7001.pid
#rdb文件名
dbfilename redis7001.rdb
#aof文件名
appendfilename "appendonly7001.aof"
# 集群
cluster-enabled yes
# 生成的node文件
cluster-config-file nodes7001.conf
#守护进程
daemonize yes
#aof、rdb文件存储目录
dir /export/server/redis/data/
bind 0.0.0.0
#如果redis设置密码,加上如下配置
requirepass "123456"
masterauth "123456"
第三步:启动每个redis服务
在redis/bin/目录下!!!
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7001.conf
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7002.conf
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7003.conf
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7004.conf
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7005.conf
[root@zhuxm01 redis]# ./redis-server /export/server/redis/cluster-conf/redis7006.conf
[root@zhuxm01 redis]# ps -ef|grep redis
root 11186 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7001 [cluster]
root 11195 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7002 [cluster]
root 11203 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7003 [cluster]
root 11212 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7004 [cluster]
root 11220 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7005 [cluster]
root 11229 1 0 09:51 ? 00:00:00 redis-server 192.168.234.131:7006 [cluster]
root 11240 7691 0 09:52 pts/0 00:00:00 grep --color=auto redis
[root@zhuxm01 redis]#
![在这里插入图片描述](https://img-blog.csdnimg.cn/27a34967864f4f529f738dc47e51f420.png
第四步:创建集群
#在redis/bin下面执行的命令!注意要用自己虚拟机的ip地址!!我的是192.168.37.126
./redis-cli --cluster create 192.168.37.126:7001 \
192.168.37.126:7002 \
192.168.37.126:7003 \
192.168.37.126:7004 \
192.168.37.126:7005 \
192.168.37.126:7006 \
--cluster-replicas 1
#最后的那个cluster-replicas 1 指的是每一个主节点都有一个从节点
输入yes同意其分配的策略!
自动帮我们按照hash算法分配好了三对的主从redis服务器 和器对应的卡槽的区间;
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.234.131:7005 to 192.168.234.131:7001
Adding replica 192.168.234.131:7006 to 192.168.234.131:7002
Adding replica 192.168.234.131:7004 to 192.168.234.131:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 7e88abdfa256140ab11dc3c2173b00c5868a0479 192.168.234.131:7001
slots:[0-5460] (5461 slots) master
M: e5845e3494d58b5400fa21d4b3c34ccafce43024 192.168.234.131:7002
slots:[5461-10922] (5462 slots) master
M: 5dbec321866665aceb8ae0c6791e2ded39464368 192.168.234.131:7003
slots:[10923-16383] (5461 slots) master
S: 8ad824d12b9f1a16a75e227266e9940aa8610422 192.168.234.131:7004
replicates 5dbec321866665aceb8ae0c6791e2ded39464368
S: 8ca84b32509e178181585206eaa736c6323dbd3a 192.168.234.131:7005
replicates 7e88abdfa256140ab11dc3c2173b00c5868a0479
S: 7a518a28534593c44694215e3a83b3311704e4d4 192.168.234.131:7006
replicates e5845e3494d58b5400fa21d4b3c34ccafce43024
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
第五步:连接集群
在redis/bin目录下
#别忘了-c 按照集群 当用的虚拟机的本机连接本机的redis的服务时不需要加-h和后面的内容 --raw 是不修改编码格式的方式运行,这样可以显示中文不乱码
./redis-cli -h 192.168.37.126 -p 7002 -c --raw
#连接上客户端后可以执行命令查看redis节点详情
info replication
可以看到配置信息中:
当前连接的端口的redis的角色是master
他的从redis是7004端口
测试集群
当我们在7002端口进行set key时,hash算法计算key并与总卡槽数16384进行取余得到数的区间在分配的7001的端口上,于是就将数据存储在了7001的端口上,我们要get这个key会自动跳转到7001的端口get到这个key!!!
hash算法的分配存储的集群实现!