zoukankan      html  css  js  c++  java
  • twemproxy分片处理原理--剖析twemproxy代码正编

    twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的话是del k1 k2 k3。twemproxy在memcache上能处理多命令流程只有getgets命令,例如get的话是get k1 k2 k3

    但是由于twemproxy是redis或memcahe协议的代理,在后端有多台redis或memcache,为此,所有的key/value对会分散在多台redis或memcahe上。在将多个key/value对加入到redis或memcache集群中,twemproxy需要将多个对应的key/value对分别通过将key计算后的hash值路由到对应的后端redis或memcache。而要在redis或memcache集群中查询对应的key/value时,twemproxy需要将对应的key/value对通过将key计算后的hash值从对应的后端redis或memcache收集过来拼接起来返回给用户。

    如下图现在有两个后端redis或memcache,key1,key3在后端0上,key2在后端1上,twemproxy通过将收到的请求frag_owner进行分片分片成下面的两个分片将key1,key3发往后端0,key2发往后端1,分片的指针指向frag_owner。

    key1  => backend 0
    key2 => backend 1
    key3 => backend 0
     it will fragment like this:

    +-----------------+
    | msg vector |
    |(original msg) |
    |key1, key2, key3 |
    +-----------------+

    frag_owner
    /--------------------------------------+
    frag_owner / |
    /-----------+ | /------------+ frag_owner |
    | | | | | |
    | v v v | |
    +--------------------+ +---------------------+ +----+----------------+
    | frag_id = 10 | | frag_id = 10 | | frag_id = 10 |
    | nfrag = 3 | | nfrag = 0 | | nfrag = 0 |
    | frag_seq = x x x | | key1, key3 | | key2 |
    +------------|-|-|---+ +---------------------+ +---------------------+
    | | | ^ ^ ^
    | | | |
    | ----------+ | |
    +------------------+ |
    ------------------------------------------+
    例如请求是mget key1 key2 key3,twemproxy会将命令切割成mget key1 key3mget key2,分别发往后端0,后端1。
    同样的在,收到这些命令回复后,通过分片和请求之间的关系将其进行拼接后放回给用户。
  • 相关阅读:
    学习笔记180—回归系数与相关系数的关系和区别
    学习笔记178—精品书籍推荐榜
    学习笔记177—PPT生成的图片设置成特定像素级的图片【四种方法】
    学习笔记176—PS 获得一个椭圆的某个部分
    shell:利用sed删除文件中的匹配行
    常用壁纸
    Linux下编译C文件:Hello World
    属性访问、特性和修饰符
    介绍Python基本特殊方法
    kafka配置
  • 原文地址:https://www.cnblogs.com/onlyac/p/9978674.html
Copyright © 2011-2022 走看看