Docker搭建redis集群

目录

一、问题

二、搭建步骤

 三、主从容错切换迁移案例

1.数据读写存储

 2. 容错切换迁移

四、主从扩容案例

五、主从缩容案例

 六、集群的 Jedis  开发

七、Redis  集群提供了以下好处

八、Redis  集群的不足


一、问题

1~2亿条数据需要缓存,请问如何设计这个存储案例?

单机单台100%不可能,肯定是分布式存储

另外,主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。之前通过代理主机来解决,但是 redis3.0 中提供了解决方案。就是无中心化集群配置。

二、搭建步骤

1.新建6个docker容器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

参数解释

参数 说明
--net host  使用宿主机的IP和端口,默认
--privileged=true 获取宿主机root用户权限
-v /data/redis/share/redis-node-6:/data 

容器卷,宿主机地址:docker内部地址

 redis:6.0.8

redis镜像和版本号

--cluster-enabled yes

开启redis集群

--appendonly yes

开启持久化

--port 6386

redis端口号

 

2. 进入容器 

docker exec -it redis-node-1 /bin/bash

3. 构建主从关系

注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址

redis-cli --cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1

--cluster-replicas 1 表示为每个master创建一个slave节点

Docker搭建redis集群_第1张图片

Docker搭建redis集群_第2张图片 

Docker搭建redis集群_第3张图片 

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

4.链接进入6381作为切入点,查看集群状态

Docker搭建redis集群_第4张图片

 查看节点状态

Docker搭建redis集群_第5张图片

 三、主从容错切换迁移案例

1.数据读写存储

普通方式,对6381新增两个key

在 redis-cli 每次录入、查询键值,redis都会计算出该 key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的 redis实例地址和端口。 

-c 采用集群策略连接

实现自动重定向,设置数据会自动切换到相应的写主机

Docker搭建redis集群_第6张图片

查看集群信息 

Docker搭建redis集群_第7张图片

redis-cli --cluster check 192.168.111.147:6381 

Docker搭建redis集群_第8张图片

注意:

 不在一个 slot 下的键值,是不能使用 mget,mset 等多键操作。

可以通过{}来定义组的概念,从而使 key中{}内相同内容的键值对放到一个 slot 中去。 

 

 2. 容错切换迁移

主6381和从机切换,先停止主机6381,再次查看集群信息 

Docker搭建redis集群_第9张图片

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

再次启动6381,再次查看集群信息,6381成为从机

Docker搭建redis集群_第10张图片

 

四、主从扩容案例

1.新建6387、6388两个节点+新建后启动+查看是否8节点

docker run -d --name redis-node-7 --net host --privileged=true -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 --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

2. 进入6387容器实例内部 

docker exec -it redis-node-7 /bin/bash

3.将新增的6387节点(空槽号)作为master节点加入原集群

将新增的6387作为master节点加入集群

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381

6387 就是将要作为master新增节点

6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

Docker搭建redis集群_第11张图片Docker搭建redis集群_第12张图片 

4. 检查集群情况第1次

redis-cli --cluster check 真实ip地址:6381

Docker搭建redis集群_第13张图片Docker搭建redis集群_第14张图片 

5.重新分派槽号

redis-cli --cluster reshard 192.168.111.147:6381

Ip地址端口号为master的即可,相当于突破口

Docker搭建redis集群_第15张图片Docker搭建redis集群_第16张图片

Source node #1: all 所有master槽位平均给receiving node分配4096个槽位

6. 检查集群情况第2次

redis-cli --cluster check 真实ip地址:6381

Docker搭建redis集群_第17张图片Docker搭建redis集群_第18张图片 槽号重新分配说明

为什么6387是3个新的区间,以前的还是连续?

重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

7. 为主节点6387分配从节点6388

redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机6487节点ID

Docker搭建redis集群_第19张图片Docker搭建redis集群_第20张图片

8. 检查集群情况第3次

redis-cli --cluster check 192.168.111.147:6382

Docker搭建redis集群_第21张图片Docker搭建redis集群_第22张图片

五、主从缩容案例

目的:6387和6388下线

1.检查集群情况1获得6388的节点ID

redis-cli --cluster check 192.168.111.147:6382

Docker搭建redis集群_第23张图片

2. 从集群中将4号从节点6388删除 

redis-cli --cluster del-node ip:从机端口 从机6388节点ID

redis-cli --cluster check 192.168.111.147:6382

 检查一下发现,6388被删除了,只剩下7台机器了。Docker搭建redis集群_第24张图片

 3. 将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

redis-cli --cluster reshard 192.168.111.147:6381

Docker搭建redis集群_第25张图片Docker搭建redis集群_第26张图片

4.  检查集群情况第二次

redis-cli --cluster check 192.168.111.147:6381

4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

Docker搭建redis集群_第27张图片

5.将6387删除 

命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451

 6.检查集群情况第三次

redis-cli --cluster check 192.168.111.147:6381

Docker搭建redis集群_第28张图片

 六、集群的 Jedis  开发

即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。

无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

public class JedisClusterTest {
    public static void main(String[] args) {
        Setset =new HashSet();
        set.add(new HostAndPort("192.168.111.147",6381));
        JedisCluster jedisCluster=new JedisCluster(set);
        jedisCluster.set("k1", "v1");
        System. out.println(jedisCluster.get("k1"));
    }
}

七、Redis  集群提供了以下好处

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

八、Redis  集群的不足

  • 多键操作是不被支持的

你可能感兴趣的:(#,redis,redis,docker,数据库)