3.新建6个redis容器实例
docker run -d \ --name redis-node-1 \ --net host \ --privileged=true \ -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 \ --privileged=true \ -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 \ --privileged=true \ -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 \ --privileged=true \ -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 \ --privileged=true \ -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 \ --privileged=true \ -v /data/redis/share/redis-node-6:/data \ redis:6.0.8 \ --cluster-enabled yes \ --appendonly yes \ --port 6386
命令解释:
docker run : 创建并运行docker容器实例
--name redis-node-x : 容器的名称
--net host :使用宿主机的IP和端口
--privileged=true :获取宿主机root用户的权限
-v /data/redis/share/redis-node-x:/data :挂载容器数据卷,宿主机地址:docker内部地址
redis:6.0.8 :redis镜像和版本号
--cluster-enabled yes : 开启redis集群
--appendonly yes : 开启持久化
--port xxxx : 设置redis端口
运行完上面这些命令后,运行docker ps -a 可以查看当前的6个redis容器实例:
如果和我一样的话,那就没有问题了。
4.进入容器redis-node-1,并未6台机器构建构建集群关系
其实不一定要进入一号容器,其他几号redis容器也可以。
进入容器:
docker exec -it redis-node-1 /bin/bash
构建主从关系:
注意:进入docker容器后才能执行以下的命令,并且注意自己的真实IP地址。
redis-cli --cluster create \ 192.168.172.131:6381 \ 192.168.172.131:6382 \ 192.168.172.131:6383 \ 192.168.172.131:6384 \ 192.168.172.131:6385 \ 192.168.172.131:6386 \ --cluster-replicas 1
--cluster-replicas 1
表示为每个master创建一个slave节点,集群关联一比一,1主1从对半分。
我们运行后,会有如下显示,会发现哈希槽分区已经帮我们弄好了:
之后会让我们选择yes或者no我们选择yes:
会看到,redis分配的6381、6382、6383号机为主,而分配6384,6385,8386号机为从。
到这里,如果OK的话,那3主3从就搞定了。
5.链接进入6381作为切入点,查看集群状态
进入6381容器
docker exec -it redis-node-1 /bin/bash
进入redis客户端:
redis-cli -p 6381
然后在redis里面查看集群信息:
cluster info
查看集群的主从信息,显示各台的主从关系:
cluster nodes
下面显示6381的从服务器为6384。6382的从服务器为6385。6383的从服务器为6386。主从关系非常清晰。
但是这还没有完呢
六.主从容错切换迁移案例
我们上面虽然搭建好了3主3从的redis,但是我们只知道他们名下是怎么挂的,我们还需要学习一下这个集群的数据读写存储和容错切换迁移。我们set一个值以后,集群能不能共享数据?而且我们也知道槽位被分为3段的,这3段代表3个主机,那到底key存进来以后他存在哪里?又怎么在集群里面数据共享呢?我们还要考虑到,如果master1主机宕机了,slave1从机会不会补位?主从架构,主机宕机了,要求从机能够补位。这就是我们的俩个要考虑到的需求。
1.数据读写存储
启动6机构成的集群,并通过exec命令进入(多开几个命令窗口)
docker exec -it redis-node-1 /bin/bash
docker exec -it redis-node-2 /bin/bash
docker exec -it redis-node-3 /bin/bash
docker exec -it redis-node-4 /bin/bash
docker exec -it redis-node-5 /bin/bash
docker exec -it redis-node-6 /bin/bash
2.对6381号机新增2个key
进入6381号redis:
redis-cli -p 6381
并可以看到keys没有任何东西:
我们参数新增一个key和value:
set name lily
会发现它报错了,没有存进去,显示要移动到6382号槽位。这是为什么呢?
因为我们的键name被redis集群计算出的hash对应的是5798,1号槽位存储的hash最大值是5460,超过5460就会被要求移动到2号机或其他号机。