https://zhuanlan.zhihu.com/p/106605652
Redis Cluster
呼唤集群
为什么呼唤?
- 1.并发量
redis 官方提供数据并发数10万/每秒
如果需要更高的并发量就需要另外方案了,集群
- 2.数据量
分布式的简单理解:加机器
应对:大并发量,大数据量
数据分布
顺序分区:
对数据集均分存储到各个节点
哈希分区
计算hash值然后取余数
hash(key)/节点数(例如节点取模的方式)
- 节点取余
如果节点需要增加,在进行迁移的时候比较耗空间,建议采取翻倍扩容的方式。
比如3个节点迁移,可以通过扩容到6个节点,扩容之后的数据只有50%进行了迁移。 - 一致性哈希
将token(0-2^32)顺时间对节点进行均分。
如果有节点插入,只会影响到相邻的节点,其他的节点不受影响。 - 虚拟槽分区
Redis Cluster的分区方式
- 两者的对比
搭建集群
节点之间是互相通信的
Redis Cluster架构
- 节点
cluster-enable:yes
- meet
节点之间消息共享
- 指派槽
redis指定槽的数据为16384。
key访问的时候,会做hash计算,然后取余数,找到对应在哪个范围的槽
找到对应的节点。
- 复制
安装
下面的安装方式代码不是很严谨,主要是为了了解Redis Cluster的结构。需要注意节点的端口和一些参数的设置。
1.配置开启节点
redis-server redis-7000.conf
开启节点,但是此时每个节点是相互孤立的。
2.meet
meet操作是为了节点之间消息共享
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7001
cluster节点主要配置:
3.分配槽:
总共槽数:16384
redis-cli -h 127.0.0.1 -p 7000 cluster addslots{0...5461}
redis-cli -h 127.0.0.1 -p 7001 cluster addslots{5462...10922}
redis-cli -h 127.0.0.1 -p 7002 cluster addslots{10923...16383}
4.主从(故障自动转移)
cluster replicate node-id
三主三从
redis-cli -h 127.0.0.1 -p 7003 cluster replicate ${node-id-7000}
redis-cli -h 127.0.0.1 -p 7004 cluster replicate ${node-id-7001}
redis-cli -h 127.0.0.1 -p 7005 cluster replicate ${node-id-7002}
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
启动
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
连接一个节点
redis-cli -p 7000
redis-cli -p 7000 cluster node
redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster slots
集群可用是16384个槽都被分配好
meet
redis-cli -p 7000 cluster meet 127.0.0.1 7001
redis-cli -p 7000 cluster meet 127.0.0.1 7002
redis-cli -p 7000 cluster meet 127.0.0.1 7003
redis-cli -p 7000 cluster meet 127.0.0.1 7004
redis-cli -p 7000 cluster meet 127.0.0.1 7005
分配槽
redis-cli -p 7000 cluster addslots 0
### shell命令分配槽 addslots.sh
start =$1
end =$2
port =$3
for slot in `seq ${start} ${end}`
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
执行脚本分配槽
sh addslots.sh 0 5461 7000
主从分配
redis-cli -p 7004 cluster replicate “主节点的id”
上面的方式主要是为了了解集群这个过程,后面有官方提供的更简单的方式。
如果要删除节点,先要停掉当前的任务
pkill -f redis-server
还需要删除之前 rdb文件以及log文件,nodes-*.conf文件
我的文件夹目录为
/usr/local/var/db/redis
全部删除就行
然后从新创建服务,
redis-server /Users/chennan/redis_cluster_demo/7000/redis.conf &
查看
cluster nodes
可以发现目前已经是孤立的状态了。
比较省事的创建方式mac使用
最后就是redis5.0为例的集群方式
1.首先创建6个实例(三主三从)
我这的架构是这样
先创建一个redis_cluster_demo的文件夹,然后在这个文件下面再创建6个文件夹
7000 7001 7002 8001 8002 8003
然后再每个文件夹里放入redis.conf,将系统安装redis之后的redis.conf拷过来就行。我的redis.conf目录在
/usr/local/etc/redis.conf
2.修改配置文件
修改以下7000文件下的redis.conf几个属性:
daemonize yes #配置redis作为守护进程运行,默认情况下,redis不是作为守护进程运行的
cluster-enabled yes #是否开启集群
cluster-node-timeout 5000 #集群超时时间
appendonly yes #aop日志开启,会每次进行写操作都记录一条日志
protected-mode no #3.2以后加的参数,关闭protected-mode模式,此时外部网络可以直接访问
#下面这些需要根据不同的端口进行修改
port 7000 #节点端口
pidfile /var/run/redis_7000.pid
dbfilename dump_7000.rdb
appendfilename "appendonly_7000.aof"
cluster-config-file nodes-7000.conf #该节点的对应的节点配置文件
然后将文件拷配到各个实例文件夹下,按照文件名进行修改例如7001.
port 7001
pidfile /var/run/redis_7001.pid
dbfilename dump_7001.rdb
appendfilename "appendonly_7001.aof"
cluster-config-file nodes-7001.conf
3.创建实例
redis-server /Users/chennan/redis_cluster_demo/7000/redis.conf &
redis-server /Users/chennan/redis_cluster_demo/7001/redis.conf &
redis-server /Users/chennan/redis_cluster_demo/7002/redis.conf &
redis-server /Users/chennan/redis_cluster_demo/8001/redis.conf &
redis-server /Users/chennan/redis_cluster_demo/8002/redis.conf &
redis-server /Users/chennan/redis_cluster_demo/8003/redis.conf &
4.一键开启集群
cluster-replicas的1表示每个主键点只有一个从节点。
前三个是主节点7000-7002
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1
出来的提示框输入yes。
输出结果如下即可。
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:8001 to 127.0.0.1:7000
Adding replica 127.0.0.1:8002 to 127.0.0.1:7001
Adding replica 127.0.0.1:8003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: d93815dea7a9466820106adbed8eba8d6979a756 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: 0a6af15df11eb3a4736c42ee37ba107789d91150 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 5964daefe5b38e1390e1ce4bdf6bbd3b1b889273 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: 98844eb247c216f787b72c640060621e895dc794 127.0.0.1:8001
replicates 5964daefe5b38e1390e1ce4bdf6bbd3b1b889273
S: 599ac0b1557745323c3e04e0e4f71abcc5cdc80d 127.0.0.1:8002
replicates d93815dea7a9466820106adbed8eba8d6979a756
S: 5e7ef2702a0a3568482d9c00de2bb5def3cbaf14 127.0.0.1:8003
replicates 0a6af15df11eb3a4736c42ee37ba107789d91150
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
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: d93815dea7a9466820106adbed8eba8d6979a756 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 5964daefe5b38e1390e1ce4bdf6bbd3b1b889273 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 0a6af15df11eb3a4736c42ee37ba107789d91150 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 98844eb247c216f787b72c640060621e895dc794 127.0.0.1:8001
slots: (0 slots) slave
replicates 5964daefe5b38e1390e1ce4bdf6bbd3b1b889273
S: 599ac0b1557745323c3e04e0e4f71abcc5cdc80d 127.0.0.1:8002
slots: (0 slots) slave
replicates d93815dea7a9466820106adbed8eba8d6979a756
S: 5e7ef2702a0a3568482d9c00de2bb5def3cbaf14 127.0.0.1:8003
slots: (0 slots) slave
replicates 0a6af15df11eb3a4736c42ee37ba107789d91150
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
该过程涉及到分配槽,节点之间共享消息以及主从节点的分配,比上面一步步配置省了很多时间,上面的过程,主要是为了了解Redis Cluster的架构。
其他:
redis密码设置最好的集群完之后再设置
更多技术关注公众号:python学习开发
来源:oschina
链接:https://my.oschina.net/u/4385225/blog/3205080