系列文章
Docker系列1 - CentOS7 安装Docker
Docker系列2 - Docker常用命令
Docker系列3 - Docker文件系统及搭建Docker私服
Docker系列4 - 在Docker中测试MySQL主从数据库
分布式存储概念
哈希取余分区:hash(key) % N个机器台数;缺点:扩容或者缩容取余运算的数据变化大
一致性哈希算法分区:当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系
- 算法构建一致性哈希环
- 服务器IP节点映射
- key落到服务器的落键规则
Redis哈希槽分区:0,2^14 - 1 (16384个槽)halt slot
搭建3主3从Redis集群
#启动6个Redis容器
docker run -d --name redis-node-1 --net host -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
docker exec -it redis-node-1 /bin/bash
#cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 192.168.99.200:6381 192.168.99.200:6382 192.168.99.200:6383 192.168.99.200:6384 192.168.99.200:6385 192.168.99.200:6386 --cluster-replicas 1
yes
redis-cli -p 6381
cluster info
cluster nodes
exit
#以集群的方式连接,优化路由;如果以单机的方式连接,计算key值的槽位不在当前机器会报错
redis-cli -c -p 6381
set k1 v1
set k2 v2
set k3 v3
set k4 v4
#查看集群信息
redis-cli --cluster check 192.168.99.200:6381
Redis集群主从切换
#查看集群信息
redis-cli --cluster check 192.168.99.200:6381
M: 0d6ebb39a243d7a95dc4a9b1e784e6f77ae4b5e6 192.168.99.200:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 76af5f3d7f16d05ef0e0416adb85fa449d09c4c3 192.168.99.200:6386
slots: (0 slots) slave
replicates 0d6ebb39a243d7a95dc4a9b1e784e6f77ae4b5e6
M: 7b2d7ca7fbf3baf65adce9f4206b75ba6d6ce75f 192.168.99.200:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: caccc7cf782a2352859da72e9a9809250578a8ba 192.168.99.200:6385
slots: (0 slots) slave
replicates c6ee2d617ed0e7ba055ff6476de71cc8162dfdbb
S: 0bdba07bbe94475836373f6a5b98c09a0d7d04a7 192.168.99.200:6384
slots: (0 slots) slave
replicates 7b2d7ca7fbf3baf65adce9f4206b75ba6d6ce75f
M: c6ee2d617ed0e7ba055ff6476de71cc8162dfdbb 192.168.99.200:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
#主从随机配对的,本次的主从对应关系是
master slave
6381 6386
6382 6384
6383 6385
#关停一台主机
docker stop redis-node-1
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
#主机挂了之后,经过一段时间的心跳检测,从机会自动变更成主机
cluster nodes
#之前的数据还是能正常获取
get k1
get k2
get k3
get k4
exit
exit
#恢复启动
docker start redis-node-1
#redis-node-1自动成了从机
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes
exit
#如果要恢复redis-node-1成主机,需要把之前上位的那台先停掉,让redis-node-1上位,之后再次启动
redis-cli --cluster check 192.168.99.200:6381
Redis扩容
#增加2个节点,1主1从
docker run -d --name redis-node-7 --net host -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker exec -it redis-node-7 /bin/bash
#将新增的redis-node-7(空槽位)作为master节点加入原集群
redis-cli --cluster add-node 192.168.99.200:6387 192.168.99.200:6381
#新节点是Master(空槽位)
redis-cli --cluster check 192.168.99.200:6381
#重新分配槽号(16384/master台数)
redis-cli --cluster reshard 192.168.99.200:6381
4096
node ID填写新加入的机器
all
yes
#每个master把开头一部分槽位匀了一部分给新节点
#重新分配成本太高,所有前3台各自匀出来一部分,分别匀出1364个槽位给新节点
redis-cli --cluster check 192.168.99.200:6381
#添加从节点
redis-cli --cluster add-node 192.168.99.200:6388 192.168.99.200:6387 --cluster-slave --cluster-master-id 6387的node ID
#查看主从信息
redis-cli --cluster check 192.168.99.200:6381
Redis缩容
#查看从机的node ID
redis-cli --cluster check 192.168.99.200:6381
#先删除从机6388
redis-cli --cluster del-node 192.168.99.200:6388 6388的node ID
redis-cli --cluster check 192.168.99.200:6381
#重新分配槽号
redis-cli --cluster reshard 192.168.99.200:6381
4096 #回收槽号的数量
node ID填写6381的机器 #使6381接受分配出来的槽号
node ID填写6387的机器 #把6387的槽号释放
done
yes
#查看状态
redis-cli --cluster check 192.168.99.200:6381
#删除主机6387
redis-cli --cluster del-node 192.168.99.200:6387 6387的node ID
exit
redis-cli --cluster check 192.168.99.200:6381