Redis

首页 -  Redis  -  redis集群,docker redis集群

redis集群,docker redis集群

redis集群,docker redis集群 使用redis5搭建建群的方式 下面为docker compose的配置文件

image为镜像名称你也可以拉取官方镜像源


docker pull redis
version: "3.3" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
  redis_200: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.200   #设置ip地址
    container_name: redis5_cluster_200 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6320:6379" # php java python 语言连接
      - "16320:16379" # 对节点 6379 + 10000 = 端口 对节点进行通信
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/200:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
  redis_201: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.201   #设置ip地址
    container_name: redis5_cluster_201 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6321:6379"
      - "16321:16379"
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/201:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
  redis_202: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.202   #设置ip地址
    container_name: redis5_cluster_202 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6322:6379"
      - "16322:16379"
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/202:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
  redis_203: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.203   #设置ip地址
    container_name: redis5_cluster_203 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6323:6379"
      - "16323:16379"
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/203:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
  redis_204: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.204   #设置ip地址
    container_name: redis5_cluster_204 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6324:6379"
      - "16324:16379"
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/204:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
  redis_205: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis# 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
       redis5sm:
         ipv4_address: 192.160.1.205   #设置ip地址
    container_name: redis5_cluster_205 # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6325:6379"
      - "16325:16379"
    volumes: # 配置数据挂载
        - /redis_2004/cluster/redis5/205:/redis
    command: /usr/local/bin/redis-server /redis/conf/redis.conf
# 网段设置
networks:
  #引用外部预先定义好的网段
  redis5sm:
    external:
      name: redis5sm

常用命令删除所有docker容器

docker stop $(docker ps -a -q) | xargs docker rm

安装方法配置目录结构

image.png

一、创建网络段

docker network create --subnet=192.160.1.0/24 redis5sm

二、构建容器进入docker-compose 根目录执行

docker-compose up -d

三、创建集群

redis-cli --cluster create 192.160.1.200:6379 192.160.1.201:6379 192.160.1.202:6379 192.160.1.203:6379 192.160.1.204:6379 192.160.1.205:6379 --cluster-replicas 1

四、可更根据下面命令查看节点槽的分配情况

redis-cli -h 192.160.1.200 cluster slots

配置文件下载地址

链接:https://pan.baidu.com/s/1v9choza1kmVUK1RhOK_gfg 

提取码:ybvr 


节点通讯

redis集群常用的是虚拟槽的一共有0-16383 共16384个

1. 集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加10000。

2. 每个节点在固定周期内通过特定规则选择几个节点发送 ping 消息。 

3. 接收到 ping 消息的节点用 pong 消息作为响应。

集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致的 状态。当节点出故障、新节点加入、主从角色变化、槽信息变更等事件发生时,通过不断的 ping/pong 消息通信,经过一段时间后所有的节点都会知道整个集群 全部节点的最新状态,从而达到集群状态同步的目的。

Gossip消息 Gossip协议的主要职责就是信息交换。信息交换的载体就是节点彼此发送的Gossip消息,了解这些消息有助于我们理解集群如何完成信息交换。

Gossip消息可分为:ping消息,pong消息,meet消息,fail消息等; 

meet消息:用于通知新节点加人。消息发送者通知接收者加人到当前集群,meet消息通信正常完成后,接收节点会加人到集群中并进行周期性的pingpong消自 交换。 

ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息。ping消息发送封装了 自身节点和部分其他节点的状态数据。 

pong消息:当接收到pingmeet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据。节点也可以向集群内广播自身 pong消息来通知整个集群对自身状态进行更新。 

fail消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态。

为什么redis选择槽的个数为16383对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作! 那大家思考过,为什么有16384个槽么

ps:CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不 mod65536,而选择mod16384?因为为了节省带宽将数据包控制在2k范围内

(0)
分享:

本文由:xiasohu168.com 作者:xiaoshu发表,转载请注明来源!

标签:

相关阅读