codis学习

一.codis-proxy 结构

  • 1.Topology
  • 2.Slots
  • 3.ServerGroup
  • 4.Server

二.codis-proxy 启动过程

1.初始化ProxyInfo

  • Id
  • Addr
  • productName

2.Proxy 把自己标记成offline状态,将自己注册到zk上

  • ProxyServer -> Topology -> Proxy -> CreateProxyInfo
  • zk上的地址 /zk/codis/db_{productName}/proxy

3.Proxy 从zk上获取自己的状态

  • 判断zk上的状态是online认为注册成功,并且开始监控zk自己的变化
  • 如果还是offline状态,3秒以后重试,重新获取zk上的状态

4.监控子节点的状态

  • zk上的地址 /zk/codis/db_{productName}/actions

5.初始化slots

  • 每个codis-proxy有1024个slots
  • 在zk上逐个获取slot
  • 某一个slots在zk上的状态的path是/zk/codis/db_{productName}/slots/slot_{i}
  • slot的状态,确保是online状态
  • 在zk上逐个获取这个slot所在的server group
  • 某一个server group在zk上的状态的path是/zk/codis/db_{productName}/servers/group_{i}
  • 获取server group zk下的子节点列表
  • 逐个在zk上获取server group下的server,并创建server对象
  • 这样一个slot就是由 zk 上的slot zk上的server group(由server组成是一个一主多从的结构)组成
  • 为了使用这个slot所以需要把server group中的那些servers中的主库创建连接
  • 这里用slot的dst字段标示了slot所在主库的位置
  • 同时在codis-proxy的redis连接池中添加这个主库的连接
  • 这里需要说明一点的是,由于这个slot有可能处于migrate状态,在创建的时候同时记录了他是从哪个server group迁移过来的在migrateFrom字段,并且把迁移的主库添加到codis-proxy的连接池

6.开始事件循环

  • 主要是处理之前监控的一些zk上的变更

7.监听codis-proxy的端口

  • block

三.codis-proxy 的对外服务过程

  • 对一个redis key的操作先把这个key crc32到某一个slot上
  • 如果这个slot处于pre migrate需要阻塞对这个slot的操作
  • 判断这个key是否处于migrate状态,如果是的话,在slot的migrateFrom的redis上执行一个迁移命令,命令的参数的slot的dst的IP和端口还有KEY的名字
  • migrateFrom的这个redis会把key迁移到dst上并删除自己的key,所以migrateFrom是迁移中的那个老的实例,dst是迁移中的新实例
  • 判断迁移命令的返回值,成功的话认为迁移成功
  • 迁移成功以后,我们都是从dst这个新实例来读或者写这个key的内容返回给客户端
  • 然后做的就是一个代理该做的事情了,写目标读写,结果返回给客户端

四.为什么codis要修改redis源码来支持迁移

  • 一个原因是slot下的key set不好获得
  • 一个原因就是redis的操作都是原子性的,如果在迁移的时候,是通过proxy的在老的上get,新的上set,这样没法保证其他proxy对这个key操作的原子性

一.codis-config 启动过程

  • 解析productName zk地址
  • 利用zk创建一个分布式锁 /zk/codis/db_{productName}/LOCK
  • 关于利用zk创建分布式锁的方法有很多
  • lock的时候可以在一个root下创建一个自增的临时节点,取root下的所有节点,自己是最小的认为获得锁,否则等待比自己小1的节点删除
  • 因为zk保证里一致性,所以这个锁和单机操作系统中的信号量一样,取这个mutex的值,lock时候就减1,unlock时候加1
  • 具体ocdis-config是用的哪种实现因为是在另一个项目里,所以还没看
  • 在zk中创建配置 /zk/codis/db_{productName}/living-codis-config
  • 一个defer 结束的时候删除之前zk创建的path
  • 启动了一个监听在10086的HTTP管理后台

二.codis-config 命令

  • 如果命令是阻塞的,会先获取之前的分布式锁,执行完以后会释放锁,只不过是一个一级命令一个锁

proxy命令

list命令,获取所有codis-proxy的代理信息

  • 保存在zk的/zk/codis/db_{productName}/proxy 的子节点下

offline/online命令,将一个codis-proxy设置为下线和上线状态

  • 先获取/zk/codis/db_{productName}/proxy/{proxyName}的proxy信息
  • 如果是将proxy设置为上线状态,检查proxy下的所有slot是online状态
  • 设置proxy状态是上线状态
  • 如果是将proxy设置为下线状态,那么先设置proxy的状态为标记下线,也即是mark_offline
  • 然后订阅节点的变更,直到他的状态为offline的时候认为下线成功

slot命令

migrate命令,迁移一个slot

  • 从zk中获取所有slot的状态
  • 检查集群中是否有正在迁移的slot,保证集群中同时只能有一个slot在迁移
  • 迁移某个slot的时候先获取分布式锁,表示开始迁移某个slot,结束的时候释放
  • 检查迁移到的server gorup可用
  • 进入二阶段的提交的第一阶段,通知所有proxy 这个slot处于pre_migrate状态
  • 等待所有proxy做出回复,修改slot状态为migrate状态,保存在zk上
  • 在老的redis主库上执行slotsmgrtslot命令迁移slot到新的redis主库,直到slot中所有的key迁移完成
时间: 2024-10-15 13:15:45

codis学习的相关文章

我的2015技术学习流水账

我的2015技术学习流水账 2015年马上就要过去了,匆匆忙忙地又是一年.回头总结整理,发现这一年还挺充实的.在正常上班工作之余,学习到了不少新东西,不禁感到很欣慰!一个多月前就开始写,终于赶在2016年来临之前写完了这篇文章-- 关于本文,尽管叫做流水账,但是出于程序员条理性的"强迫症",还是进行系统分类,分类方法参照Thoughtworks技术雷达的Tecniques.Languages & Frameworks.Tools.Platforms,将其中的Tecniques改

豆瓣Redis解决方案Codis源码剖析:Proxy代理

豆瓣Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy based high performance Redis cluster solution written in Go/C, an alternative to Twemproxy. It supports multiple stateless proxy with multiple redis instan

互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)

前言 学习任何知识都会有一个学习背景 最近,我们团队乃至我司整个云服务,上go的呼声越来越高!新服务已经开始用go开发,部分现有Java版的服务重构为go也只是时间问题而已,故相关技术积累势在必行!在云网络的分布式服务乃至在一切高并发,分布式后台服务中,golang都有着很大的优势. 据我对国内互联网行业的实际考察,了解,目前国内主流互联网公司都在积极投入go的怀抱…… 青云更是全栈使用了go…… 还有火的一塌糊涂的docker. 它为云而生. 它为并发而生. 还有go的安全.简洁.高效 有良好

大数据课程学习流程

第一阶段 Java编程基础→oracle/mysql→sql优化→jdbc 第二阶段 JavaScript基础→JavaScript深入→jQuery→jquery easyui→bootstrap 第三阶段 Servlet/jsp→ajax→xml→svn→maven实战项目一 第四阶段 Struts2→hibernate→spring/spring mvc→项目实战二→web serviceshiro→mybatis→项目实战三 第五阶段linux+搜索+hadoop体系 Linux基础→s

Codis集群的搭建与使用

一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务. Codis架构图: 以上我们可以看到codis-proxy是单个节点的,因为我们可以通过结合keepalived来实现高可

常去的学习网站

阿里:http://mirrors.aliyun.com/ 反思:更改yum源后  用yum clean  all  清除缓存 阿里云epel源:wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-6.repo 阿里的yum源更改: [[email protected] ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bac

关于codis对于原redis过期事件解决方案

1.     Redis处理过期事件方式 1.1.  Redis处理过期key方式 Redis key过期的方式有二:被动方式和主动方式当clients试图访问设置了过期时间且已过期的key时,为主动过期方式.但仅是这样是不够的,以为可能存在一些key永远不会被再次访问到,这些设置了过期时间的key也是需要在过期后被删除的.因此,Redis会周期性的随机测试一批设置了过期时间的key并进行处理.测试到的已过期的key将被删除.典型的方式为,Redis每秒做10次如下的步骤:1.随机测试100个设

如何学习新技术、团队技术选型时要注意些什么

首先,要说明的是,这里的“新”不一定是指时间上的新,在后文中,也可能是指,对于个人(或者团队)来说是“新的”,就是说,这个东西,即使出现了很久,应用广泛,但是个人(团队)没有使用过,那么也可以说是“新”的. 本文地址:http://www.cnblogs.com/xybaby/p/8655593.html 为什么要学习新技术 计算机知识日新月异,经常会涌现出新的语言.框架.思想.虽然说这些东西不一定都是从0到1的创造发明,也许只是微创新,或者将某个领域的思想用到了新的领域.不管怎么样,都能开阔思

大数据学习路径

大数据学习路径我vx ①⑤零零③④③⑥⑨③① 备注 A 更多大数据第一阶段linux+搜索+hadoop体系 Linux基础→shell编程→高并发架构→lucene,solr搜索→hadoop体系→HDFS→mapreduce→hbase→zookeeper→hive→flume→sqoop→项目实战一 第二阶段机器学习 R语言→mahout→项目实战二 第三阶段storm流式计算 kafka→storm→redis→项目实战三 第四阶段spark内存计算 scala编程→spark core