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
安装方法配置目录结构
一、创建网络段
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协议的主要职责就是信息交换。信息交换的载体就是节点彼此发送的消息,了解这些消息有助于我们理解集群如何完成信息交换。
消息可分为:ping消息,pongmeetfail消息等;
消息:用于通知新节点加人。消息发送者通知接收者加人到当前集群,meet消息通信正常完成后,接收节点会加人到集群中并进行周期性的、消自 交换。
消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送消息,用于检测节点是否在线和交换彼此状态信息。消息发送封装了 自身节点和部分其他节点的状态数据。
当接收到、 消息时,作为响应消息回复给发送方确认消息正常通信。消息内部封装了自身状态数据。节点也可以向集群内广播自身 的消息来通知整个集群对自身状态进行更新。
当节点判定集群内另一个节点下线时,会向集群内广播一个消息,其他节点接收到消息之后把对应节点更新为下线状态。
为什么redis选择槽的个数为16383个 对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作! 那大家思考过,为什么有16384个槽么?
ps:CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不 mod65536,而选择mod16384?因为为了节省带宽将数据包控制在2k范围内
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。