哈希槽算法
先简单介绍下哈希槽,搭建的时候以及扩容缩容的时候会经常看到 slot 字眼。一个集群对应16384个槽,这些槽会分配给集群中的所有主节点,集群会记录节点和槽的对应关系。解决了节点和槽的关系后,对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。数据放在槽里,槽放在节点里。
由于它以槽为单位移动数据,槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
它解决了哈希取余分配算法的扩缩容的问题,redis节点数变化后,映射关系需要重新计算;也解决了节点太少时哈希一致性算法(哈希环)的落点分布不均问题,也就是数据倾斜问题。
拉取镜像
docker pull redis:7.0.4
解释一下这条命令,相当于:docker 拉取 redis:版本号
查看镜像:docker images,图中第1行数据就是刚才拉取的redis镜像:
创建并运行容器
redis的conf配置文件,可以自己编写并载入容器,也可以在启动容器时作为参数传入。这里采用参数传入。如果是生产环境,一般会在不同的云服务器上面创建实例。
# 节点1
docker run -d --name redis-node-1 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6381
# 节点2
docker run -d --name redis-node-2 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6382
# 节点3
docker run -d --name redis-node-3 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6383
# 节点4
docker run -d --name redis-node-4 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6384
# 节点5
docker run -d --name redis-node-5 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6385
# 节点6
docker run -d --name redis-node-6 --net host --privileged=true redis:7.0.4 --cluster-enabled yes --port 6386
redis的参数--cluster-enabled yes
表示启动集群--port 6381
表示此实例使用6381端口
redis持久化。如果需要把数据持久化到宿主机,则需要加上这两个参数--appendonly yes
是否开启持久化-v /home/data/redis/redis-node-1:/data
。这意思是把 redis 的数据目录 /data 挂截到宿主机的 /home/data/redis/redis-node-1 目录。
docker的参数--name redis-node-1
表示给这个容器取个名字,叫 redis-node-1-d
后台运行--net host
使用宿主机的ip和端口
查看容器是否在运行中:docker ps
创建集群
1、进入容器
docker exec -it redis-node-1 /bin/bash
2、进入docker容器后才能执行以下命令。这里填宿主机的 ip 即可。如果是在生产环境中,不同 redis 实例会分布在不同云服务器,这里的 ip 地址填对应服务器的 ip 即可。
redis-cli --cluster create 10.0.3.15:6381 10.0.3.15:6382 10.0.3.15:6383 10.0.3.15:6384 10.0.3.15:6385 10.0.3.15:6386 --cluster-replicas 1
#--cluster-replicas 1 表示为每个master创建一个slave节点
输入yes,然后回车
检查集群状态:redis-cli --cluster check 10.0.3.15:6381
看到如下图,表示创建成功了。
两个常见问题:
1 连接redis时报这个错:
Couldn’t map cluster keyspace using any provided seed in…
是因为连接的redis连不上,或者不是集群。编程写代码连接时,连接的必须是正确的集群(cluster)
2 最后创建集群时,界面一直在这里点点点没动动静,卡住了:
Waiting for the cluster to join …
原因:
前面没按步骤进行操作。或者几台redis间相互不通。
解决方案:
删除节点,重新操作
docker rm -f redis-node-6 redis-node-5 redis-node-4 redis-node-3 redis-node-2 redis-node-1