目录
- 搭建三主三从集群
- 数据读写存储
- 主从容错的切换迁移
- 主从扩容
- 主从缩容
搭建三主三从集群
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从了