• 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。
    同样的在,收到这些命令回复后,通过分片和请求之间的关系将其进行拼接后放回给用户。
  • 相关阅读:
    利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行
    public string err属性
    table冻结表头和列[转]
    转:Js日期操作
    ASP.NET中JSON的序列化和反序列化
    javascript Date format(js日期格式化) [转]
    刚开通的博客
    调用图片
    散记兼容,需要整理
    ie6、div高度低于字体大小、则继承fontsize
  • 原文地址:https://www.cnblogs.com/onlyac/p/9978674.html
Copyright © 2020-2023  润新知