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上能處理多命令流程只有get\gets命令,例如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。
同樣的在,收到這些命令回復后,通過分片和請求之間的關系將其進行拼接后放回給用戶。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM