redis(八)集群

简介

redis提供的服务OPS可以达到10万/秒,当前业务OPS已经达到10万/秒

内存单机容量达到256G,当前业务需求内存容量1T

出现以上问题的时候说明一点,该加机器了

简介:

集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果

作用:

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难

集群结构设计

1.数据存储设计

  • 通过算法设计,计算出key应该保存的位置
  • 将所有的存储空间计划切割成16384份,每台主机保存一部分
    • 每份代表的是一个存储空间,不是一个key的保存空间
  • 将key按照计算出的结果放到对应的存储空间

当服务器添加的时候会从之前的的主机中各自抽取一部分放到新的机器上面

当服务器减少的时候将减少主机中的部分分散到其他主机上面去

2.集群内部通讯设计

image

为了让key两次就能命中,所以每个主机上存有一份槽的编号数据

从而即使第一次命中不到,也可以直接通过编号数据找到对应的槽

cluster集群结构搭建

本机打算搭建三主三从的集群结构

1.配置

创建如下6个配置文件

image

填如对应的信息及端口,记得去掉之前的主从复制配置

masterauth zhao56

cluster-enabled yes

cluster-config-file nodes-6379.conf

cluster-node-timeout  10000

2.启动对应的docker 的redis实例

docker run -p 6379:6379 --name redis-6379 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6379.conf

docker run -p 6380:6380 --name redis-6380 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6380.conf

docker run -p 6381:6381 --name redis-6381 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6381.conf

docker run -p 6382:6382 --name redis-6382 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6382.conf

docker run -p 6383:6383 --name redis-6383 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6383.conf

docker run -p 6384:6384 --name redis-6384 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6384.conf

查看日志可以看到如下信息,表示等待连接

image

3.查询对应docker分配的地址

docker inspect redis-6379 redis-6380  redis-6381 redis-6382 redis-6383 redis-6384 |grep IPAddress 

得到如下信息

docker实例 ip
redis-6379 10.88.0.41
redis-6380 10.88.0.42
redis-6381 10.88.0.43
redis-6382 10.88.0.44
redis-6383 10.88.0.45
redis-6384 10.88.0.46

4.组建集群

redis 4.0的时候用redis-trib命令 需要ruby环境 我们用的是最新版的此处不再赘述

5.0以上在redis-cli上面 用cluster

进入6379的容器中

docker exec -it redis-6379  /bin/bash
 redis-cli --cluster create 10.88.0.41:6379 10.88.0.42:6380 10.88.0.43:6381 10.88.0.44:6382 10.88.0.45:6383 10.88.0.46:6384  --cluster-replicas 1 -a zhao56

其中

--cluster-replicas 后面的1表示每个master节点上面都有一个salve节点,如果是0则都是master节点

-a zhao56 表示连接时的密码

执行命令如下图

image

1.上面两句表示在6台主机上执行hash槽

主机0,1,2上面分别分配了0-5460,5461-10922,10923-16383三个范围

分配slave给三个master

在nodes-6379.conf上面也能看到对应的绑定信息

image

上面可以看出来如下信息

master slave
6380 6384
6379 6383
6381 6382

5.验证

进入到6379redis中

docker exec -it redis-6379 redis-cli

image

执行set name 和get name会提示到6380中去操作

从新进入6379此时带上-c的参数

docker exec -it redis-6379 redis-cli -c

image

可以看出执行set name 的时候会跳到6380中去执行操作

查看集群的节点信息

 cluster nodes 

image

下线6383slave

查看6383的master6379.log日志文件

image

查看集群状态

image

发现将6383置为了fail的状态

重新上线6383

image

连接恢复正常了

下线6379master

查看salve节点的 6383.log文件

image

redis-6379连接不上了,所以6383变成了master

image

查看cluster nodes发现有四个master了,然后6383变为了master 6379标记为fail

redis-6379上线

查看cluster nodes

image

发现6379变为了从节点

6.Cluster配置及指令总结

1.配置

添加节点

cluster-enabled yes|no

cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容

cluster-config-file <filename>

节点服务响应超时时间,用于判定该节点是否下线或切换为从节点

cluster-node-timeout <milliseconds>

master连接的slave最小数量

cluster-migration-barrier  <count>

2指令

查看集群节点信息

cluster nodes

进入一个从节点 redis,切换其主节点

cluster replicate <mater-id>

发现一个新节点,新增主节点

cluster meet ip:port

忽略一个没有solt的节点

cluster forget <id>

手动故障转移

cluster failover

posted @ 2021-06-11 13:33  zhao56  阅读(58)  评论(0编辑  收藏  举报