codisQ&A

2023-11-13

Codis 是什么?

Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务, 用户可以看成是一个无限内存的 Redis 服务, 有动态扩/缩容的能力. 对偏存储型的业务更实用, 如果你需要 SUBPUB 之类的指令, Codis 是不支持的. 时刻记住 Codis 是一个分布式存储的项目. 对于海量的 key, value不太大( <= 1M ), 随着业务扩展缓存也要随之扩展的业务场景有特效.

使用 Codis 有什么好处?

Redis获得动态扩容/缩容的能力,增减redis实例对client完全透明、不需要重启服务,不需要业务方担心 Redis 内存爆掉的问题. 也不用担心申请太大, 造成浪费. 业务方也不需要自己维护 Redis.

Codis支持水平扩容/缩容,扩容可以直接界面的 "Auto Rebalance" 按钮,缩容只需要将要下线的实例拥有的slot迁移到其它实例,然后在界面上删除下线的group即可。

我的服务能直接迁移到 Codis 上吗?

分两种情况:

  1. 原来使用 twemproxy 的用户: 可以, 使用codis项目内的redis-port工具, 可以实时的同步 twemproxy 底下的 redis 数据到你的 codis 集群上. 搞定了以后, 只需要你修改一下你的配置, 将 twemproxy 的地址改成 codis 的地址就好了. 除此之外, 你什么事情都不用做.

  2. 原来使用 Redis 的用户: 如果你使用了doc/unsupported_cmds中提到的命令,是无法直接迁移到 Codis 上的. 你需要修改你的代码, 用其他的方式实现.

相对于twemproxy的优劣?

codis和twemproxy最大的区别有两个:一个是codis支持动态水平扩展,对client完全透明不影响服务的情况下可以完成增减redis实例的操作;一个是codis是用go语言写的并支持多线程而twemproxy用C并只用单线程。 后者又意味着:codis在多核机器上的性能会好于twemproxy;codis的最坏响应时间可能会因为GC的STW而变大,不过go1.5发布后会显著降低STW的时间;如果只用一个CPU的话go语言的性能不如C,因此在一些短连接而非长连接的场景中,整个系统的瓶颈可能变成accept新tcp连接的速度,这时codis的性能可能会差于twemproxy。

相对于redis cluster的优劣?

redis cluster基于smart client和无中心的设计,client必须按key的哈希将请求直接发送到对应的节点。这意味着:使用官方cluster必须要等对应语言的redis driver对cluster支持的开发和不断成熟;client不能直接像单机一样使用pipeline来提高效率,想同时执行多个请求来提速必须在client端自行实现异步逻辑。 而codis因其有中心节点、基于proxy的设计,对client来说可以像对单机redis一样去操作proxy(除了一些命令不支持),还可以继续使用pipeline并且如果后台redis有多个的话速度会显著快于单redis的pipeline。同时codis使用zookeeper来作为辅助,这意味着单纯对于redis集群来说需要额外的机器搭zk,不过对于很多已经在其他服务上用了zk的公司来说这不是问题:)

Codis是如何分片的?

Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024。

每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供。数据的迁移也是以slot为单位的。

Codis 可以当队列使用吗?

可以, Codis 还是支持 LPUSH LPOP这样的指令, 但是注意, 并不是说你用了 Codis 就有了一个分布式队列. 对于单个 key, 它的 value 还是会在一台机器上, 所以, 如果你的队列特别大, 而且整个业务就用了几个 key, 那么就几乎退化成了单个 redis 了, 所以, 如果你是希望有一个队列服务, 那么我建议你:

  1. List key 里存放的是任务id, 用另一个key-value pair来存放具体任务信息
  2. 使用 Pull 而不是 Push, 由消费者主动拉取数据, 而不是生产者推送数据.
  3. 监控好你的消费者, 当队列过长的时候, 及时报警.
  4. 可以将一个大队列拆分成多个小的队列, 放在不同的key中

Codis 支持 MSET, MGET吗?

支持, 在比较早的版本中MSET/MGET的性能较差,甚至可能差过单机redis,但2.0开始会因为后台并发执行而比单机的mset/mget快很多。

Codis 是多线程的吗?

虽然Redis是单线程的,但Codis proxy 是多线程的(严格来说是 goroutine), 启动的线程数是 CPU 的核数, 是可以充分利用起多核的性能的。

Codis 支持 CAS 吗? 支持 Lua 脚本吗?

CAS 暂时不支持, 目前只支持eval的方式来跑lua脚本,需要配合TAG使用.

我的数据在 Codis 上是安全的吗?

首先, 安全的定义有很多个级别, Codis 并不是一个多副本的系统 (用纯内存来做多副本还是很贵的), 如果 Codis 底下的 redis 机器没有配从, 也没开 bgsave, 如果挂了, 那么最坏情况下会丢失这部分的数据, 但是集群的数据不会全失效 (即使这样的, 也比以前单点故障, 一下全丢的好...-_-|||). 如果上一种情况下配了从, 这种情况, 主挂了, 到从切上来这段时间, 客户端的部分写入会失败. 主从之前没来得及同步的小部分数据会丢失. 第二种情况, 业务短时间内爆炸性增长, 内存短时间内不可预见的暴涨(就和你用数据库磁盘满了一样), Codis还没来得及扩容, 同时数据迁移的速度小于暴涨的速度, 此时会触发 Redis 的 LRU 策略, 会淘汰老的 Key. 这种情况也是无解...不过按照现在的运维经验, 我们会尽量预分配一些 buffer, 内存使用量大概 80% 的时候, 我们就会开始扩容.

除此之外, 正常的数据迁移, 扩容缩容, 数据都是安全的.

现有redis集群上有上T的数据,如何迁移到Codis上来?

为了提高 Codis 推广和部署上的效率,我们为数据迁移提供了一个叫做 redis-port 的命令行工具,它能够:

  • 静态分析 RDB 文件,包括解析以及恢复 RDB 数据到 redis
  • 从 redis 上 dump RDB 文件以及从 redis 和 codis 之间动态同步数据

如果需要迁移现有 redis 数据到 codis,该如何操作?

  • 先搭建好 codis 集群并让 codis-proxy 正确运行起来

  • 对线上每一个 redis 实例运行一个 redis-port 来向 codis 导入数据,例如:

      for port in {6379,6380,6479,6480}; do
      	nohup redis-port sync --ncpu=4 --from=redis-server:${port} \
      		--target=codis-proxy:19000 > ${port}.log 2>&1 &
      	sleep 5
      done
      tail -f *.log
    
    • 每个 redis-port 负责将对应的 redis 数据导入到 codis
    • 多个 redis-port 之间不互相干扰,除非多个 redis 上的 key 本身出现冲突
    • 单个 redis-port 可以将负责的数据并行迁移以提高速度,通过 --ncpu 来指定并行数
    • 导入速度受带宽以及 codis-proxy 处理速度限制(本质是大量的 slotsrestore 操作)
  • 完成数据迁移,在适当的时候将服务指向 Codis,并将原 redis 下线

    • 旧 redis 下线时,会导致 reids-port 链接断开,于是自动退出

redis-port 是如何在线迁移数据的?

  • redis-port 本质是以 slave 的形式挂载到现有 redis 服务上去的

    1. redis 会生成 RDB DUMP 文件给作为 slave 的 redis-port
    2. redis-port 分析 RDB 文件,并拆分成 key-value 对,通过 slotsrestore 指令发给 codis
    3. 迁移过程中发生的修改,redis 会将这些指令在 RDB DUMP 发送完成后,再发给 redis-port,而 redis-port 收到这些指令后不作处理,而直接转发给 Codis
  • redis-port 处理还是很快的,参考:

Dashboard 中 Ops 一直是 0?

检查你的启动 dashboard 进程的机器,看是否可以访问proxy的地址,对应的地址是 proxy 启动参数中的 debug_var_addr 中填写的地址。

zk: node already exists

无论是proxy还是dashboard,都会在zk上注册自己的节点,同时在程序正常退出的时候会删掉对应的节点,但如果异常退出或试用kill -9 {pid}就会导致zk的节点无法删除,在下一次启动的时候会报“zk: node already exists”的错误。

因此关闭服务的时候直接用kill {pid}不要-9,同时如果无法启动并且确认没有其他运行中的进程占用zk上的节点,可以在zk上手动删除/zk/codis/db_test/dashboard 或/zk/codis/db_test/fence/{host:port}.

编译报错 undefined: utils.Version

说明没有正确的设置go项目路径导致生成的文件找不到。见安装教程来正确配置环境变量并用正确的方式下载代码。

zk: session has been expired by the server

因为使用的go-zookeeper库代码注释里写的session超时时间参数单位是秒,但实际上该参数的单位是毫秒,所以<=2.0.7的版本错误的将默认配置设成30。因此请将配置文件修改为30000。此外2.0.8起如果配置文件中的参数过小则自动将秒转化为毫秒。

Codis的proxy会注册在zk上并监听新的zk事件。因为涉及到数据一致性的问题,所有proxy必须能尽快知道slot状态的改变,因此一旦和zk的连接出了问题就无法知道最新的slot信息从而可能不得不阻塞一些请求以防止数据错误或丢失。

Proxy会每几秒给zk发心跳,proxy的load太高可能导致timeout时间内(默认30秒,配置文件中可以修改)没有成功发心跳导致zk认为proxy已经挂了(当然也可能proxy确实挂了), 这时如果client用了我们修改的Jedis, Jodis,是会监控到zk节点上proxy少了一个从而自动避开请求这个proxy以保证客户端业务的可用性。如果用非Java语言可以根据Jodis代码DIY一个监听zk的客户端。 另外,如果需要异步请求,可以使用我们基于Netty开发的Nedis

当然,proxy收到session expired的错误也不意味着proxy一定要强制退出,但是这是最方便、安全的实现方式。而且实际使用中出现错误的情况通常是zk或proxy的load过高导致的,即使这时不退出可能业务的请求也会受影响,因此出现这个问题通常意味着需要加机器了。

如果不依赖zk/Jodis来做proxy的高可用性(虽然我们建议这样做),可以适当延长配置文件中的超时时间以降低出这个错误的概率。

proxy异常退出

目前proxy异常退出主要有两种可能,一种是zk的session expired错误,原因见前一节;另一种是从zk获取集群信息时超时或者报错。总体来说都是因为proxy和zk的连接不稳定导致的,而现在还没有加上重试等逻辑。

不过,最新版的codis已经可以实现proxy自动启动、自动标记为online。因此可以外部通过脚本或supervisor等服务来监控proxy的进程,一旦进程退出可以直接自动重启。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

codisQ&A 的相关文章

  • [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle)

    本文介绍 MVC 4 提供的一个新特性 捆绑 Bundle 一个在 View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术 本文目录 了解VS默认加入的脚本库 当我们创建一个基本模板的 MVC
  • 数据可视化第四章答案

    热狗大赛大胃王前三 from pyecharts import Pie import pandas as pd hotplace pd read csv hot dog places csv header None hotplace pd
  • Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用

    文章目录 什么是 Resource 接口 使用 Resource 加载资源 使用 Resource 访问文件系统资源 总结 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏 收录专栏 Java框架 文章内容 Resource
  • 告别枯燥,247个Python经典实战案例集合(附代码)

    今天为大家推荐一个Python从入门到进阶的实战案例合集 共计247个案例 185页内容 从此告别枯燥 60秒学会 个 例 系统学习Python 从 门到 师 所有均含有实例代码 可直接运行 感受python之美 用最短的代码实现 02 P
  • 基于STM32单片机的智能家居毕设

    文章目录 一 硬件选型 1 硬件清单 2 硬件展示 部分 二 效果展示 1 整体效果展示 2 显示屏 触摸 效果展示 三 功能分析 1 系统总体结构框图 2 主要包含的功能 四 怎么做 1 STM32单片机部分 2 语音识别与播报部分 3
  • 【JeecgBoot】点击返回关闭当前页面(tab)且返回上一层

    首先要在你需要关闭得页面组件里面加上inject closeCurrent 如下图位置 之后写一个触发函数 这里面得reBack即是返回函数
  • HTMl中的各种标签(常见)

    HTML的元素以开始标签开始 结束标签结束 被它们包起来 且一半可以嵌套 分类 html的标签主要分为双标签和单标签 双标签
  • xmL 特殊符号转换

    一共有五个 所有的特殊字符对应的编码 特殊字符 代替符号 特殊原因 amp 每一个代表符号的开头字符 gt gt 标记的结束字符 lt lt 标记的开始字符 quot 设定属性值 apos 设定属性值 代替符号都以 开始 都包含分号 以分号
  • CUDA中动态Global Memory分配和操作

    CUDA中动态Global Memory分配和操作 CUDA中动态Global Memory分配和操作 1 Heap Memory Allocation 2 Interoperability with Host Memory API 3 E
  • vue中利用自定义指令修改elementUI对话框到顶部的距离

    Vue directive alterELDialogMarginTop 修改elementUI中el dialog顶部的距离 传入值eg marginTop 5vh inserted el binding vnode el firstEl
  • python基于机器学习的姓名预测性别网页app开发

    前言 做这个项目的起因是之前csdn给我推荐了一个问答 基于机器学习的姓名预测性别的手机app开发 我点进去发现已经有人回答了 链接点进去一看 好家伙 这不是查表算概率吗 和机器学习有半毛钱关系 而且我觉得用姓名预测性别挺扯淡的 去查了一下
  • ##顺序表 编码##

    ifndef LIST H define LIST H class List public List int size List 析构函数 void ClearList 清空线性表 bool ListEmpty 判断线性表是否为空 int
  • VXLAN 大二层网络构建实战

    1 VXLAN 大二层网络 1 VXLAN背景 传统vlan可划分1 4094个子网 如果租户数量超过4094 就需要使用vxlan了 vxlan支持1670万个隔离网络通信 可以满足众多不同租户设计自己的内部网络 租户申请的云服务器来自不
  • 简单实用的数据库文档生成器

    哈喽 大家好 我是指北君 大家有没有过这样的经历 在DeadLine即将来临之际 文档尚未完成 面对纷繁复杂的数据库中各种表 视图 关联 存储过程等 你都不知道如何清晰准确的描述他们 不得不一个个打开表 视图 存储过程等查看 甚至可能因为疏
  • springboot自定义kafka消费者KafkaListenerContainerFactory配置说明和实验

    1 说明 实验一下 在spring boot中自行创建kafkaConsumer实例 进行消费 根据配置的不同 得出相应的结果 此例中 我使用 kafkaListenerContainerFactory自行创建了kafkaListener实
  • WSL环境中Pycharm的python控制台中报错 ModuleNotFoundError: No module named ‘xxx‘(WSL+Pycharm环境搭建系列之四)

    WSL环境中Pycharm的python控制台中报错 ModuleNotFoundError No module named xxx 0 前言 1 问题现象 2 问题分析 3 解决办法 0 前言 经过前面几次的努力 我们基本上完成了环境中的
  • 《python数据分析与应用》第四章:pandas统计分析基础

    第四章 4 1 读写不同数据源的数据 4 1 1 读 写数据库数据 1 数据库数据读取 注意 数据库的用户名 一般都是root 和密码 自己设置的 都是要用自己的 地址默认的127 0 0 1 读取函数 你自己把文件存在哪了 和存储函数 你
  • 解密蓝牙mesh系列

    转载自 蓝牙技术联盟 蓝牙mesh网络基本概念 本周跟大家分享解密蓝牙mesh系列第四篇 点这里查看第一篇 第二篇和第三篇文章 同时也是蓝牙mesh网络基本概念的第二部分 借助蓝牙mesh 您将能够创建大型网络并支持成千上万的设备之间进行安
  • css的新玩法,语法与规则

    css的新玩法 语法与规则 important 语法 Selector sRule important 说明 提升指定样式规则的应用优先权 IE6及以下浏览器有个比较显式的支持问题存在 important并不覆盖掉在同一条样式的后面的规则

随机推荐

  • 将Javaweb项目部署到云服务器

    一 前言 由于业务需要 要搞一个文件上传下载服务器 代码当前已经在localhost上调试成功 现在需要把这个项目部署到云服务器上 选择的服务器是vultr的vps 系统是Ubuntu16 04 二 环境准备 1 jdk安装 常规安装即可
  • [Spring][Redis]@Cacheable与redis整合时Value和Key的理解

    更新于2019年11 08 首先 多谢CHENFU ZKK同学指出我的错误 卧槽 吓我一跳 我还以为我以前学的搞错了 若不是我亲自测试一遍 差点信你了 这两天趁有空 跟踪了 Cacheable相关的源码再次确认结果如下 1 直接使用Spri
  • 华为OD机试 - 星际篮球争霸赛(Java)

    题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场 并且让所有得分的选手得分都相同 然而比赛过程中的每1分钟的得分都只能由某一
  • 虚拟机联网图标丢失,连不上网的问题

    虚拟机连不上网 网络图标也消失不见了 输入ifconfig 发现也不显示ens33网卡 盲猜是由于关闭虚拟机的时候 一些配置出错 导致ens33网卡没有启动成功导致的 解决办法 重新开启网卡即可 1 关闭网络服务 sudo service
  • J2EE基础之集合框架List

    前言 今天跟大家发分享的是J2EE基础之集合框架List以及JavaWeb团队项目UML 昨天自己记录了J2EE一些基础知识 希望今天分享的知识对大家有用 首先跟大家讲一下今天要分享的知识 见思维导图 一 UML 1 含义 UML建模技术是
  • 异常日志分析

    从上往下看异常信息 直到第一行是自己写的代码为止 集成第三方工具 比如百度地图 先看demo 按着demo先跑来 然后再优化 跑demo出错了 先看异常日志 解决不了百度 百度地图集成注意类冲突 慢慢来
  • 无源定位入门(三)AOA(1)

    AOA交叉测向 基本原理 以M元均匀线阵为例 设单站匀速运动 第n个时刻的位置为 静止目标 则入射角方向为 设基站上有个M元均匀线阵 相邻阵元之间的间隔为d 其中为波长 第n个时刻线阵的方位角 与X正方向的夹角 为 与XY平面的夹角为 则线
  • 如何用sql语句创建一个表(简单基础)

    使用CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表 SQL CREATE TABLE 语法 CREATE TABLE 表名称 列名称1 数据类型 列名称2 数据类型 列名称3 数据类型 例题 创建一个ac
  • SPDK详解

    一 SPDK简介及基本使用 随着硬盘 闪存技术的高速发展 NVME ssd已逐渐进入分布式存储的核心领域 伴随着NVME ssd的出现 涌现出一批新型的存储名词 包括分层存储 分级存储 冷热存储 混合存储等 而这些名词的出现 也意味着ssd
  • sql 求分位数

    1 oracle求分位数 SELECT RES3 ORG NO 5 RES3 YM X1的上四分位数 PERCENTILE CONT 0 75 WITHIN GROUP ORDER BY RES3 X1 ASC AS X1 75 X1的上中
  • IntelliJ IDEA 常用快捷键,maven依赖图,个性化设置,禁用Search Everywhere

    查看idea 中jar关系图 快捷键 Ctrl 用于注释 取消注释 Ctrl Shift F 全文搜索 Ctrl F 单页面查找 Ctrl Alt Shift L 格式化代码 CTRL N 查找类CTRL SHIFT N 查找文件CTRL
  • 理解 spring 事务传播行为与数据隔离级别

    本文是为了个人学习使用 原文章链接 https www jianshu com p 760399781b78 https blog csdn net m0 37524661 article details 84935117 注 1 事务的隔
  • vite和webpack的区别

    vite和webpack的区别 1 前言 2 Webpack 2 1 Webpack简述 2 2 Webpack常用插件 3 Vite 3 1 Vite简述 3 2 Vite插件推荐 4 区别 4 1 开发模式不同 4 2 打包效率不同 4
  • 管理中计算机系统的应用论文,浅谈计算机数据库的管理与应用论文

    浅谈计算机数据库的管理与应用论文 摘要 随着社会经济的快速发展 信息化网络技术手段不断进步 信息技术在人们日常生活 工作及学习中的广泛渗透 不仅给人们生活带来了极大便利 还极大的提升了人们工作与学习效率 为社会各领域的发展起到了巨大的推动作
  • 类属性和实例属性名字冲突怎么办

    修改类属性会导致所有实例访问到的类属性全部都受影响 但是 如果在实例变量上修改类属性会发生什么问题呢 class Person object address Earth def init self name self name name p
  • 数据仓库工程师面经(未完)

    HIVE Hive row number dense rank rank三个函数的区别 Hive 窗口函数如何设置窗口大小 Hive order by sort by distribute by cluster by 区别 Hive map
  • 《Java Web开发框架——MyEclipse的安装、配置》

    Java Web程序设计 MyEclipse的安装 配置 具体安装 配置过程请参考下面的博客 MyEclipse安装 配置 测试 博客园 原博客中所需文件均存放于百度网盘中 如下载速度较慢 可使用下面的云盘进行下载 天翼云盘 不限速 访问码
  • HR:“最喜欢阿里出来的程序员了,技术又好又耐艹!” 我:???

    面试造火箭 进厂拧螺丝 真的是这样吗 缘起 估计不少同学都是被标题吸引进来的 事先声明 这句话不是我虚构的 而是我实实在在从同事的口中听到的 而且还不止一次 当时的场景就是很正常的交谈 别人也并没有故意尖酸刻薄的成分 完全就是正常的谈天的口
  • 三种常见的文件共享服务--ftp,nfs,samba

    FTP File Transfer Protocol 文件传输协议 是一种应用层协议 可以实现很好的实现跨平台 但是无法实现一些其他的功能 像如文件系统挂载等功能 NFS Network File System 网路文件系统 是工作在内核模
  • codisQ&A

    Codis 是什么 Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务 用户可以看成是一个无限内存的 Redis 服务 有动态扩 缩容的能力 对偏存储型的业务更实用 如果你需要 S