• 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。
    同样的在,收到这些命令回复后,通过分片和请求之间的关系将其进行拼接后放回给用户。
  • 相关阅读:
    redis数据同步之redis-shake
    spring拦截机制中Filter(过滤器)、interceptor(拦截器)和Aspect(切面)的使用及区别
    MySQL之MVCC与幻读
    Notepad
    mac环境,python+selenium环境搭建,解决chromedriver报错问题
    大规模抓取的抓取效率和抓取技巧问题
    安卓逆向8,解决app抓包抓不到的问题
    [loj6033]棋盘游戏
    [ccBB]Billboards
    [loj6051]PATH
  • 原文地址:https://www.cnblogs.com/onlyac/p/9978674.html
Copyright © 2020-2023  润新知