Docker高级篇笔记(七)在docker里面进行redis三主三从的集群案例搭建步骤

2022-05-09 10:07:55 浏览数 (1)

目录

  • 搭建三主三从集群
    • 数据读写存储
    • 主从容错的切换迁移
    • 主从扩容
    • 主从缩容

搭建三主三从集群

1 先启动docker 2 拉取redis镜像 3 创建6个redis容器

代码语言:javascript复制
docker run -d --name redis-node-6381 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6381:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381
 
docker run -d --name redis-node-6382 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6382:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382
 
docker run -d --name redis-node-6383 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6383:/data redis:latest --cluster-enabled yes --appendonly yes --port 6383
 
docker run -d --name redis-node-6384 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6384:/data redis:latest --cluster-enabled yes --appendonly yes --port 6384
 
docker run -d --name redis-node-6385 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6385:/data redis:latest --cluster-enabled yes --appendonly yes --port 6385
 
docker run -d --name redis-node-6386 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6386:/data redis:latest --cluster-enabled yes --appendonly yes --port 6386

执行完成以上的命令

4 ·进入容器redis-node-6381并为6台机器构建集群关系

代码语言:javascript复制
docker exec -it redis-node-6381 /bin/bash

5 进入之后,开始·构建主从关系

代码语言:javascript复制
redis-cli --cluster create 192.168.40.129:6381 192.168.40.129:6382 192.168.40.129:6383 192.168.40.129:6384 192.168.40.129:6385 192.168.40.129:6386 --cluster-replicas 1

执行完成以上的命令 –cluster-replicas 1 表示为每个master创建一个slave节点

·一切OK的话,3主3从搞定

对应关系是

数据读写存储

我们已经搭建了三主三从的集群,一个集群里面最大有16384个槽位,现在有3个主节点,那么就会将16384分到3个主里面,每个主节点划分一段槽位;

通过以上的搭建的时候,输出的东西,我们可以看到,redis集群内部已经给你划分好了,哪些槽位是在哪个redis主节点;

我们先连接6381这个节点,里面设置一个值

发现设置不进去,一看提示,是因为根据这个key,算出来的槽位是在12706里面,但是当前的6381这个节点,redis集群只给分了0-----5460这些,所以,使用这个节点,根本存储不进去

问题: 不是搭建了集群,就可以随便连接一个,就可以存储进去嘛,会自动的找集群里面的一些节点存储东西嘛,为什么现在存储不进去呢? 回答

我们进入这个6381,是使用单机版的redis-cli进入的,我们不能使用这个,因为现在是集群,所以应该使用redis-cli -p 6381 -c

加入参数-c,优化路由

进入之后,我们重新设置值,看看能不能存进去

我们看到,已经将这个值存到6383这个节点上面了

主从容错的切换迁移

主从节点的关系如上

我们以一个为例 6381为主,6385为从; 我们先把6381停机,看看6385能不能变为主

以上是停止了6381

我们连接6382 ,查看集群的状态,可以看到

6381宕机了,6385上位成为了新的master。

那么当6381回来了,他还是主嘛?

他回来了,变成了从

主从扩容

一说到扩容,就是新增机器,现在我们想的是实现4主4从,所以还需要加两个redis,一个为主,一个为从,那么我们首先做的就是创建两个redis容器; 6387 6388 两个端口的容器

1 创建两个redis容器

代码语言:javascript复制
docker run -d --name redis-node-6387 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6387:/data redis:latest --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-6388 --net host --privileged=true -v /usr/local/docker_redis/cluster_slave/redis-node-6388:/data redis:latest --cluster-enabled yes --appendonly yes --port 6388

以上是以创建,我们进入6387里面

代码语言:javascript复制
docker exec -it redis-node-6387 /bin/bash

然后在这个里面,将新的节点,加入到集群里面,命令是:

代码语言:javascript复制
redis-cli --cluster add-node 自己实际IP地址:6387   自己实际IP地址:6381

6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,
相当于6387拜拜6381的码头从而找到组织加入集群
代码语言:javascript复制
redis-cli --cluster add-node 192.168.40.129:6387   192.168.40.129:6381

执行以上的命令

以上只是将6387加入到集群里面,还没有分配槽位了,刚进去的时候,6387里面的槽位还是空的;

我们进入6381的里面,执行命令,进行重新分派槽号

代码语言:javascript复制
重新分派槽号
命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.40.129:6381

以上就分配完了

我们可以看到6387的槽位,是分段的,也就是说明,当前的槽位是其他节点给他的,分别给了他一点;

代码语言:javascript复制
为什么6387是3个新的区间,以前的还是连续?
重新分配成本太高,所以前3家各自匀出来一部分,
从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

6387新节点已经有槽位了,现在就给他分配从节点了

代码语言:javascript复制
命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
 
redis-cli --cluster add-node 192.168.40.129:6388 192.168.40.129:6387 --cluster-slave --cluster-master-id cfaed9404ec032a9bd8523690a7c06c91f71a43c-------这个是6387的编号,按照自己实际情况

执行完成之后,我们看节点集群情况

主从缩容

以上经过扩容,已经成为4主4从,现在我们想要变为原来的3主3从,所以,我们要实现缩容;

我们要先删除从机,因为万一有人再写东西咋办;

使用一个命令就可以删除从节点

代码语言:javascript复制
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
 
redis-cli --cluster del-node 192.168.40.129:6388 fb4bff2dbd7e801f86bea7ffedbb412e5b70331f

查看集群状态,就可以看到没有从机的了 ·将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

代码语言:javascript复制
6381   13084bfff1d5a6412df33d3372cb22b0a26a208d
6387   cfaed9404ec032a9bd8523690a7c06c91f71a43c
redis-cli --cluster reshard 192.168.40.129:6381

以上就将从机的槽位分配给了其他的主了,之后就可以删除这个空槽位的节点就可以了

代码语言:javascript复制
命令:redis-cli --cluster del-node ip:端口 6387节点ID
 
redis-cli --cluster del-node 192.168.40.129:6387 cfaed9404ec032a9bd8523690a7c06c91f71a43c

我们再查看集群节点

当前的集群又回到3主3从了

0 人点赞