部署Redis集群

2023-05-16

部署Redis集群

# 创建网卡
docker network create redis --subnet 172.38.0.0/16

# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

# 启动6个redis容器
for port in $(seq 1 6); \
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

# *可选 单个启动
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 进入redis
docker exec -it redis-1 sh

# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

# 连接redis
redis-cli -c

# 集群信息
cluster info

# 当前连接节点所属集群的配置信息
cluster nodes

# 查看集群信息
redis-cli --cluster check ip:port

哈希取余分区

2亿条记录就是2亿个k.y,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

优点

简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。

使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。

缺点

原来规划好的节点,进行扩容或者缩容时比较麻烦,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机,原来的取模公式就会发生变化。

此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。

某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。

一致性哈希算法分区

为了在节点数目发生改变时尽可能少的迁移数据

将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放。

而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。

步骤

  • 算法构建一致性哈希环
  • 服务器ip节点映射
  • key落到服务器的落键规则

优点

  • 容错性
  • 扩展性

加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。

缺点

  • 数据倾斜

数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

哈希槽分区

为什么会出现

一致性哈希算法的数据倾斜问题

哈希槽实质就是一个数组,数组[0,2^14-1]形成hash slot空间

能干什么

解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之问的关系,现在就相当于节点上放的是槽,槽里放的是数据

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。

哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

名少个hash槽

一个集群只能有16384个植,编号0-16383 (0-2414-1)。

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot= CRC16(key) % 16384,以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。

主从扩容

  • 新建6377、6378两个节点+新建后启动+查看是否8节点
docker run -p 6377:6379 -p 16377:16379 --name redis-7 \
-v /mydata/redis/node-7/data:/data \
-v /mydata/redis/node-7/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.17 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6378:6379 -p 16378:16379 --name redis-8 \
-v /mydata/redis/node-8/data:/data \
-v /mydata/redis/node-8/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.18 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
  • 进入6377容器实例内部
docker exec -it redis-7 sh
  • 将新增的6377节点(空槽号)作为master节点加入原集群
redis-cli --cluster add-node 172.38.0.17:6379 172.38.0.11:6379
  • 检查集群情况第1次
redis-cli --cluster check ip:port
  • 重新分派槽号
redis-cli --cluster reshard ip:port
  • 检查集群情况第2次

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

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

  • 为主节点6377分配从节点6378
redis-cli --cluster add-node 172.38.0.18:6379 172.38.0.17:6379 --cluster-slave --cluster-master-id 新主机节点id
  • 检查集群情况第3次

主从缩容

  • 检查集群情况1,获得6378的节点ID
  • 将6378删除,从集群中将4号从节点6378删除
redis-cli --cluster del-node 172.38.0.18:6379 从机6378节点di
  • 将6377的槽号清空,重新分配,本例将清出来的槽号都给6371
redis-cli --cluster reshard 172.38.0.11:6379
  • 检查集群情况第二次

  • 将6377删除

redis-cli --cluster del-node 172.38.0.17:6379 主机6377节点di
  • 检查集群情况第三次
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署Redis集群 的相关文章

  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • 由于配置文件错误,无法启动 Redis 服务器

    我刚刚按照此处的说明安装了 Redis http redis io download http redis io download 当我运行 redis server redis conf 时出现以下错误 FATAL CONFIG FILE
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • 如何通过ARM模板输出返回Redis的primaryKey?

    我正在尝试借助下面列出的 ARM 模板来部署 Redis 然后返回其主密钥 Azure 门户中 Redis 的 访问密钥 gt 主 下可用的秘密字符串 但是 我从管道 AzureResourceManagerTemplateDeployme
  • memcache、redis 和 ehcache 作为分布式缓存框架的比较 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要做出的决定之一是在我的系统中使用什么缓存框架 有这么多可供选择 我目前正在研究 redis ehcache 和 memcached
  • 如何高效地将数十亿数据插入Redis?

    我有大约 20 亿个键值对 我想将它们有效地加载到 Redis 中 我目前正在使用 Python 并使用 Pipe 如redis py https redis py readthedocs io en latest redis Redis
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red
  • 为什么Redis SET性能优于GET?

    根据Redis基准 http redis io topics benchmarkss Redis 可以执行 100 000 SET 操作 秒和 80 000 GET 操作 秒 Redis 是一种内存数据库 这似乎令人惊讶 因为通常人们会认为

随机推荐

  • linux线程调度方式测试总结

    总结 xff1a 对三种线程调度方式进行测试 1 SCHED OTHER 分时调度策略 xff0c 为默认方式 xff0c 凡是采用本模式的线程 xff0c 线程优先级会强制为0 xff0c 通俗点将 xff0c 工作在本模式下的线程 xf
  • 网络小白入门之路之以太网链路聚合 ---尚文网络奎哥

    随着业务的发展和园区网络规模的不断扩大 xff0c 用户对于网络的带宽 可靠性要求越来越高 传统解决方案通过升级设备方式提高网络带宽 xff0c 同时通过部署冗余链路并辅以STP xff08 Spanning Tree Protocol x
  • libGL error: MESA-LOADER: failed to open swrast libGL error: failed to load driver: swrast X Error o

    在ubuntu22 04 运行代码 出现这个错误 xff0c 显卡驱动正常 xff0c 并且cuda也能调 xff0c 目前还不知道怎么处理 后续 查了很多资料 xff0c 有些说是环境没配好 xff0c 有些说是显卡驱动与内核版本不一致
  • SDN(一) 用OpenWRT将路由器刷成openflow交换机

    1 引言 积跬步以至千里 xff0c 积怠情以至深渊 xff0c 我要做一个踏实的ABCer 没想到还是正式步入了SDN这条康庄大道上 一切还需从初识Mininet WIFI说起 xff0c 以为SDN如仿真层面那般 xff0c 一个模块对
  • 树莓派(二) 树莓派开启VNC远程连接服务

    1 启用树莓派 VNC 服务 在树莓派命令行终端执行如下命令 xff1a sudo raspi span class token operator span config 出现如下界面 xff1a 依次操作 xff1a Interfacin
  • 自己操作SMT贴片过程 BGA QFN封装

    提前准备 xff1a 1 钢网 xff08 如果有bga 尽量选择0 01mm的厚度吧 xff09 2 锡膏 xff08 如果过期了 xff0c 可以找个空板 xff0c 加点锡膏过一次回流焊测一下导通性 xff09 3 固定台 xff08
  • Linux系统Ubuntu终端用命令编辑一文件并保存

    1 首先进入到该文件所在的目录下 xff0c 比如我要找learn test1 file txt这个文件 xff1a ls表示查看该目录下的所有文件 2 查看该文件的内容 xff0c 使用命令cat file txt xff0c 如下可看到
  • 异常与中断

    异常比中断的优先级高 xff0c 中断可以屏蔽 xff0c 但异常是一定要去处理的 1 undefined instruction CPU遇到了不认识的指令 xff0c 则会进入未定义指令异常处理函数 xff0c 因为CPU不认识该指令 x
  • 大学老师告诉我:20年内程序员会被取代,未来不需要程序员...

    今天收到一个同学的邮件 xff0c 他告诉我 xff0c 他们的大学计算机老师告诉他 xff0c 以后机器人可以自动生成代码 xff0c 估计20年 xff0c 程序员就会被取代 所以他现在感觉很苦恼 xff0c 既然会被淘汰 xff0c
  • MySQL 主从复制

    新建主服务器容器实例3307 span class token function docker span run p span class token number 3307 span 3306 name mysql master span
  • 盘点strlen()、sizeof()、length()、size()的区别

    目录 序言 1 总览 2 用法 2 1 sizeof 2 2 strlen 3 length 和size 序言 项目中经常用到这些用于计算大小的函数 或运算符 xff0c 网上也有许多关于其间区别的文章介绍 xff0c 在此按自己的思路整理
  • Android:知识体系结构

    刚开始接触android xff0c 学习之初 xff0c 各种迷茫阿 xff0c 网上看到了这个知识结构体系的图 xff0c 觉得很有用 xff0c 在此备份一下 xff0c 或许以后的某一天我成了android大神 xff08 PS x
  • android studio导入一个已存在的项目

    在使用android studio导入一个已经存在的项目之前 xff08 xff01 xff01 xff01 记住是导入之前 xff09 xff0c 需要做三件事 xff1a 1 xff0c 查看项目的gradle wrapper grad
  • 从内部类中访问本地变量temp; 需要被声明为最终类型

    class Outer 定义外部类 private String info 61 34 hello world 34 定义外部类的私有属性 public void fun final int temp 定义外部类的方法 class Inne
  • Android学习笔记 ---- 四大组件之 Activity

    1 Activity的概念与Activity的生命周期图 xff1a Activity是一个应用程序的组件 xff0c 他在屏幕上提供了一个区域 xff0c 允许用户在上面做一些交互性的操作 xff0c 比如打电话 xff0c 照相 xff
  • Docker ubuntn 使用apt-get update报错

    在docker 容器中执行apt get update有时候会报错 xff0c 当然造成错误的原因有很多情况 xff0c 具体情况具体分析 xff0c APT Hash sum mismatch错误的常见解决方法总结这篇博客写的不错 xff
  • npm安装报错 rollbackFailedOptional verb npm-session 解决办法

    该问题一般情况是因为代理问题 xff0c npm代理和git代理都要设置 首先确认网络是否需要设置代理 如果是公司网络需要设置代理 xff0c 则设置npm代理和git代理 1 设置npm代理 1npm config set proxy a
  • Docker 安装C#编译环境

    Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 xff0c 然后发布到任何流行的 Linux或Windows操作系统的机器上 xff0c 也可以实现虚拟化 本文主要介绍Docke
  • 关于句柄中带命名空间对实际程序运行中的影响

    ROS头文件 include lt ros ros h gt 自定义msg产生的头文件 include lt topic demo gps h gt int main int argc char argv 用于解析ROS参数 xff0c 第
  • 部署Redis集群

    部署Redis集群 span class token comment 创建网卡 span span class token function docker span network create redis subnet span clas