1. 程式人生 > 實用技巧 >Redis 6.1 redis-cluster-proxy 實踐說明

Redis 6.1 redis-cluster-proxy 實踐說明

背景

​ Redis3.0版本之後開始支援了Redis Cluster,Redis也開始有了分散式快取的概念。關於Redis Cluster的相關說明,可以看之前的幾篇文章:Redis Cluster 原理相關說明redis-cli --cluster help說明。其架構如下:

因為 Redis Cluster 內部使用的是P2P中的Gossip協議,每個節點既可以從其他節點得到服務,也可以向其他節點提供服務,沒有中心的概念,通過一個節點可以獲取到整個叢集的所有資訊。所以如果應用連線Redis Cluster可以配置一個節點地址,也可以配置多個節點地址。但需要注意如果叢集進行了上下節點的的操作,其應用也需要進行修改,這樣會導致需要重啟應用,非常的不友好。從Redis 6.0開始支援了Prxoy,可以直接用Proxy來管理各個叢集節點。本文來介紹下如何使用官方自帶的proxy:

redis-cluster-proxy

說明

通過使用 redis-cluster-proxy 可以與組成Redis叢集的一組例項進行通訊,就像是單個例項一樣。Redis群集代理是多執行緒的,使用多路複用通訊模型,因此每個執行緒都有自己的與群集的連線,該連線由屬於該執行緒本身的所有客戶端共享。

在某些特殊情況下(例如MULTI事務或阻塞命令),多路複用將被禁用;並且客戶端將擁有自己的叢集連線。這樣客戶端僅傳送諸如GET和SET之類的簡單命令就不需要Redis叢集的專有連線。

redis-cluster-proxy的主要功能:

  • 路由:每個查詢都會自動路由到叢集的正確節點
  • 多執行緒
  • 支援多路複用和專用連線模型
  • 在多路複用上下文中,可以確保查詢執行和答覆順序
  • 發生ASK | MOVED錯誤後自動更新叢集的配置:當答覆中發生此類錯誤時,代理通過獲取叢集的更新配置並重新對映所有插槽來自動更新叢集。 更新完成後所有查詢將重新執行,因此,從客戶端的角度來看,一切正常進行(客戶端將不會收到ASK | MOVED錯誤:他們將在收到請求後直接收到預期的回覆) 群集配置已更新)。
  • 跨槽/跨節點查詢:支援許多命令,這些命令涉及屬於不同插槽(甚至不同叢集節點)的多個鍵。這些命令會將查詢分為多個查詢,這些查詢將被路由到不同的插槽/節點。 這些命令的回覆處理是特定於命令的。 某些命令(例如MGET)將合併所有答覆,就好像它們是單個答覆一樣。 其他命令(例如MSET或DEL)將彙總所有答覆的結果。 由於這些查詢實際上破壞了命令的原子性,因此它們的用法是可選的(預設情況下禁用)。
  • 一些沒有特定節點/插槽的命令(例如DBSIZE)將傳遞到所有節點,並且將對對映的回覆進行對映縮減,以便得出所有回覆中包含的所有值的總和。
  • 可用於執行某些特定於代理的操作的附加PROXY命令

安裝

下載

git clone https://github.com/RedisLabs/redis-cluster-proxy.git

安裝

-- 安裝
make

-- 32位二進位制檔案
make 32bit

-- 安裝詳細資訊,請使用V選項
make V=1

-- 重建依賴關係
make distclean

-- 啟動測試
make test

注意:預設情況下,安裝redis-cluster-proxy,需要配置環境變數REDIS_HOME(/etc/profile),gcc版本必須大於4.9,即:

REDIS_HOME=/usr/local/redis6.0/
export PATH=$PATH:$REDIS_HOME/bin

使用make安裝,安裝成功之後,執行檔案proxy目錄的在src下,如果使用 make install,則安裝成功之後,執行檔案在/usr/local/bin目錄中

使用說明

基本用法:

./redis-cluster-proxy CLUSTER_ADDRESS

說明:CLUSTER_ADDRESS是任何群集例項的主機地址(入口點),通過IP:PORT的形式表示TCP連線,或者通過指定檔名將其表示為UNIX套接字。如:

./redis-cluster-proxy 127.0.0.1:6379
./redis-cluster-proxy /path/to/entry-point.socket

help說明:

redis-cluster-proxy -h
Usage: redis-cluster-proxy [OPTIONS] [node1_host:node1_port,node2_host:node2_port,...]
  -c <file>            指定配置檔案
  -p, --port <port>    Proxy埠,預設7777;使用0禁止TCP連線Proxy
  --maxclients <n>     最大客戶端連線,預設10000
  --threads <n>        執行緒數配置,預設8,最大500
  --tcpkeepalive       TCP活躍連線時間,預設300秒
  --tcp-backlog        TCP連線中已完成佇列(完成三次握手之後)的長度,預設511
  --daemonize          是否後臺執行
  --pidfile <path>     指定pid檔案,如/var/run/redis-cluster-proxy.pid
  --logfile <path>     定日誌檔案,預設情使用STDOUT。如果daemonize開啟,並未指定日誌檔案,則該代理完全不會記錄日誌。
  --unixsocket <sock_file>   套接字路徑,預設空
  --unixsocketperm <mode>    套接字許可權,預設0
  --bind <address>           繫結一個地址(可以多次使用繫結多個地址)
  --connections-pool-size <size>        連線池的大小,0禁用連線池。預設值:10,最大值:50
  --connections-pool-min-size <size>    連線池中的最小連線數。 低於此值,執行緒將以定義的速率開始重新生成連線,直到池再次變滿。 預設值:10   
  --connections-pool-spawn-every <ms>   重新生成連線池中連線的時間間隔(以毫秒為單位)。 預設值:50
  --connections-pool-spawn-rate <num>   每個週期在連線池中重新產生的連線數。 預設值:2
  --disable-multiplexing <opt>          何時應禁用多路複用值:(auto|always)(預設值:auto)
  --enable-cross-slot       啟用跨槽查詢(注意:路由到多個節點的跨槽查詢不能是原子的)
  -a, --auth <passw>        連線密碼
  --auth-user <name>        連線使用者
  --disable-colors          禁止彩色輸出
  --log-level <level>       日誌級別:debug|info|success|warning|error,預設info
  --dump-queries        轉儲查詢引數(僅適用於日誌級別的debug)
  --dump-buffer         轉儲查詢緩衝區(僅用於日誌級別的debug)
  --dump-queues         轉儲請求佇列(僅適用於日誌級別的debug) 
  -h, --help            列印幫助

說明:預設情況下,redis-cluster-proxy埠是7777,使用-p或--port選項對其進行更改。 此外,預設情況下,Redis群集埠將繫結所有可用的網路介面以偵聽傳入的連線。使用--bind選項繫結到特定介面。 可以繫結一個介面,也可以通過多次使用--bind選項來繫結多個介面。

還可以通過使用--unixsocket選項指定套接字檔名,或者使用--unixsocketperm設定套接字檔案許可權,來告訴Redis叢集埠偵聽UNIX套接字。如果只想在UNIX套接字上偵聽,請將--port設定為0,以使代理完全不在TCP套接字上偵聽。

例子

① 監聽7888埠

./redis-cluster-proxy --port 7888 127.0.0.1:7000

② 繫結地址:127.0.0.1

./redis-cluster-proxy --bind 127.0.0.1 127.0.0.1:7000

③ 繫結多個介面

./redis-cluster-proxy --port 7888 --bind 192.168.0.10 --bind 10.0.0.10 127.0.0.1:7000

④ 在UNIX套接字上偵聽並禁用TCP連線

./redis-cluster-proxy --unixsocket /path/to/proxy.socket --port 0 127.0.0.1:7000

⑤ 更改執行緒數

./redis-cluster-proxy --port 7888 127.0.0.1:7000 --threads 16

⑥ 使用配置檔案:在Redis Cluster Proxy的主目錄內找到一個示例proxy.conf檔案

redis-cluster-proxy -c /path/to/my/proxy.conf 127.0.0.1:7000

啟動後,連線到代理,就好像是普通的Redis伺服器一樣(但是請確保瞭解當前的限制)。

專用連線池

每個執行緒都有自己的連線池,其中包含到叢集的隨時可用的專用連線,該叢集的套接字在建立時即已預先連線。這允許需要專用連線(即在執行諸如MULTI之類的命令或阻塞命令之後)的客戶端立即使用可能已經連線到群集的連線,而不是從頭開始重新連線到群集(這種情況可能會減慢順序的速度)從客戶端本身的角度執行查詢)。

每個連線池都有預定義的大小,並且不允許建立超出其大小允許的連線數的連線。可以通過--connections-pool-size選項配置連線池的大小(預設為10)。當池中的連線用完時,每個需要專用連線的新客戶端都將從頭開始建立一個新的專用連線,它必須連線到叢集並等待連線建立。在這種情況下,連線模型將是“惰性的”,這意味著僅當查詢需要與該節點的連線時,新連線的套接字才會連線到群集的特定節點。

如果連線數降至指定的最小值以下後,每個執行緒將重新填充其自己的池,預設情況下,該數量與池本身的大小相同,並且可以通過--connections-pool-min-大小選項。填充速率和間隔可以由--connections-pool-spawn-every(間隔以毫秒為單位)和--connections-pool-spawn-rate(每個間隔的新連線數)定義。如:

redis-cluster-proxy --connections-pool-size 20 connections-pool-min-size 15 --connections-pool-spawn-rate 2 --connections-pool-spawn-every 500 127.0.0.1:7000

說明:建立一個包含20個連線(最大)的連線池,並在連線數降至15以下時重新填充它,方法是每500毫秒建立2個新連線。記住,代理啟動時,每個池都將完全填充。 同樣重要的是要注意,當擁有專用連線的客戶端斷開連線時,如果池本身尚未滿,則他們的執行緒將嘗試回收其專用連線,以便再次將其新增到池中。

受密碼保護的群集和Redis ACL

如果叢集節點受密碼保護,則可以使用-a,-auth命令列選項或auth配置檔案選項,以指定身份驗證密碼。此外,如果叢集使用ACL,並且有多個使用者,則可以使用--auth-user命令列選項(或配置檔案中的auth-user)向特定使用者進行身份驗證。如:

redis-cluster-proxy -a MYPASSWORD 127.0.0.1:7000

redis-cluster-proxy --auth MYPASSWORD 127.0.0.1:7000

redis-cluster-proxy --auth-user MYUSER --auth MYPASSWORD 127.0.0.1:7000

proxy將使用這些憑據對叢集進行身份驗證並獲取群集的內部配置,它還將對所有客戶端進行身份驗證。因此使用--auth-user指定的使用者或預設使用者(如果未指定使用者)對將要連線到proxy的所有客戶端進行身份驗證,而無需自己呼叫AUTH命令:在這種情況下,客戶端將使用專用連線而不是共享的多路複用連線。

啟用跨槽查詢

跨槽查詢使用屬於不同槽甚至不同節點的多個鍵。 不能保證執行是原子的(它們實際上可以破壞許多Redis命令的原子設計),因此預設情況下將其禁用。 如果想要此功能,則可以在啟動時通過使用--enable-cross-slot或通過在配置檔案中設定enable-cross-slot yes來啟用它。 您還可以在代理執行時通過使用特殊的PROXY命令啟用此功能。

注意:即使啟用了此功能,也不是所有命令都支援跨槽查詢(即,不能將其與EVAL或ZUNIONSTORE以及許多其他命令一起使用)。 在這種情況下,將收到特定的錯誤回覆。 可以使用PROXY命令來獲取在跨槽查詢中無法使用的命令列表

PROXY命令

PROXY命令允許獲取特定的資訊或執行特定的操作。該命令具有各種子命令,下面是一些清單:

  • PROXY CONFIG GET|SET option [value]

    用於獲取或設定Proxy特定選項,其中選項與命令列引數(不帶-字首)中使用的選項相同,或在配置檔案中指定。並非所有選項都可以更改(其中某些選項(即執行緒)是隻讀的)

    PROXY CONFIG GET threads
    PROXY CONFIG SET log-level debug
    PROXY CONFIG SET enable-cross-slot 1
    PROXY MULTIPLEXING STATUS|OFF
    
  • PROXY MULTIPLEXING STATUS|OFF

    獲取客戶端多路複用連線模型的狀態,或通過禁用多路複用

    -> PROXY MULTIPLEXING STATUS
    -> Reply: "on"
    -> PROXY MULTIPLEXING off
    
  • PROXY INFO

    返回特定叢集的資訊,類似於Redis中的INFO命令。

  • PROXY COMMAND [UNSUPPORTED|CROSSSLOTS-UNSUPPORTED]
    回由Redis Cluster Proxy處理(已知)的所有Redis命令的列表,UNSUPPORTED:不支援的命令;CROSSSLOTS-UNSUPPORTED:不能與跨槽查詢一起使用的命令,即使配置中啟用了跨槽查詢。

  • PROXY CLIENT

    執行特定客戶的操作

    PROXY CLIENT ID: -- 獲取當前客戶的內部ID
    PROXY CLIENT THREAD: -- 獲取當前客戶端的執行緒
    
  • PROXY CLUSTER [subcmd]

    執行與呼叫客戶端關聯的叢集有關的操作。
      PROXY CLUSTER或PROXY CLUSTER INFO獲取有關群集的資訊。 資訊是一個數組,其元素採用名稱/值對的形式,其中名稱是特定的功能,例如狀態,連線等。 也可以檢索單個特定功能的資訊,即通過呼叫代理群集狀態。 以下是可以檢索的常見資訊列表:

    status:叢集的當前狀態,可以更新,更新或破壞
    connection:連線型別,如果客戶端在多路複用上下文中(因此連線與執行緒的所有客戶端共享),則可以共享;如果客戶端使用其自己的專用連線,則可以共享。
    nodes:一個巢狀陣列,其中包含叢集的所有主節點的列表。 每個節點都是另一個巢狀的陣列,其中包含名稱/值對。
    

    ​ PROXY CLUSTER UPDATE:請求更新當前叢集的配置。

    如:

    -> PROXY CLUSTER
    
    1) status
    2) updated
    3) connection
    4) shared
    5) nodes
    6) 1)  1) name
           2) 8d829c8b66f67dd9c4adad16e5c0a4c82aadd810
           3) ip
           4) 127.0.0.1
           5) port
           6) (integer) 7002
           7) slots
           8) (integer) 5462
           9) replicas
          10) (integer) 1
          11) connected
          12) (integer) 1
      ...
    
  • **PROXY LOG [level] MESSAGE
    **將MESSAGE記錄到代理的日誌中,以進行除錯。可選級別可用於定義日誌級別:debug, info, success, warning, error(預設為debug)

  • **PROXY DEBUG
    **

    為除錯目的執行不同的操作,其中子命令可以是:SEGFAULT:使用sigsegv使代理崩潰;ASSERT:由於斷言失敗而使代理崩潰。

  • **PROXY SHUTDOWN [ASAP]
    **關閉代理。 可選的ASAP選項使代理立即退出(不安全退出)。

  • **PROXY HELP
    **PROXY命令的幫助

特殊行為的命令

  1. PING:PONG由Proxy直接答覆
  2. MULTI:通過在客戶端本身中建立專用連線來禁用多路複用。 注意:由於必須是原子的,因此跨槽查詢無法在多事務內執行。
  3. DBSIZE:將查詢傳送到叢集中的所有節點並對它們的答覆求和,以便結果將是整個叢集中的鍵總數。
  4. SCAN:在群集的所有主節點上執行掃描。 答覆中包含的游標將有一個特殊的四位數字字尾,指示必須掃描的節點的索引。 注意:有時游標可能類似於“ 00001”,因此當客戶端必須使用它來執行下一次掃描時,不必將其轉換為整數。

當前狀態

目前,該專案是alpha程式碼,旨在由社群評估以獲取建議和貢獻。 不建議在任何生產環境中使用它。

測試說明

配置檔案說明

# Redis Cluster Proxy configuration file example.
# 通過配置檔案啟動方式
# ./redis-cluster-proxy -c /path/to/proxy.conf

################################## INCLUDES ###################################
# include /path/to/local.conf
# include /path/to/other.conf

######################## CLUSTER ENTRY POINT ADDRESS ##########################
#與在redis-cluster-proxy命令列引數中指示的方式相同的方式指示入口點地址,可以被命令列引數本身覆蓋。 可以通過新增更多行來指定多個入口點
cluster 192.168.163.134:8379
cluster 192.168.163.134:8380
cluster 192.168.163.134:8381

################################### MAIN ######################################
#設定Redis叢集代理埠
port 7777

#繫結地址,通過宣告多行繫結來繫結多個介面
bind 192.168.163.134
bind 127.0.0.1

# Unix套接字的路徑
unixsocket /usr/local/redis-cluster-proxy/proxy.socket

# 設定Unix套接字許可權
unixsocketperm 760

# 設定執行緒數
threads 8

#TCP活躍連線時間,預設300秒
tcpkeepalive 300

#TCP連線中已完成佇列(完成三次握手之後)的長度
tcp-backlog 511


#連線池的大小,使用0完全禁用連線池,每個執行緒都有其隨時可用的連線池。 當代理啟動時,每個執行緒將填充一個池,該池包含與叢集所有節點的連線。 每當客戶端需要專用連線時,它都可以從池中建立連線(如果有)。 這將加速客戶端從執行緒的共享連線到其自己的專用連線的轉換,因為來自執行緒池的連線應該已經連線並且可以使用。 否則,具有優先連線的客戶端必須重新連線群集的節點(這種重新連線將以“惰性”方式進行)
connections-pool-size 10

#連線池中最小連線數。 低於此值,執行緒將以定義的速率開始重新生成連線,直到池再次變滿。
connections-pool-min-size 10

#用於重新生成池中連線的時間間隔(以毫秒為單位),當池中的連線數下降到最小值以下(connections-pool-min-size)時,執行緒將開始重新分配池中的連線,直到池再次充滿。 新連線將按此指定間隔新增。
connections-pool-spawn-every 50

#在每個週期中重新生成的連線數,每個週期的間隔由connections-pool-spawn-every定義
connections-pool-spawn-rate 50

# 後臺執行
daemonize yes

#pid檔案路徑
pidfile /usr/local/redis-cluster-proxy/redis-cluster-proxy.pid

#指定日誌檔名,空字串還可用於強制Redis Cluster Porxy登入標準輸出。 如果使用標準輸出進行日誌記錄但進行守護程序,則日誌將傳送到/dev/null
logfile /usr/local/redis-cluster-proxy/proxy.log

# 啟用使用不同插槽甚至不同節點的多個鍵的跨插槽查詢。 警告:這些查詢將破壞許多Redis命令的原子性設計。 注意:即使啟用了此功能,也不是所有命令都支援跨槽查詢
enable-cross-slot yes

# 最大客戶端連線數
maxclients 10000

#如果叢集的節點受密碼保護,則用於在叢集上進行認證的認證密碼, 還用於獲取叢集的配置以及自動驗證代理與叢集本身的內部連線。
auth dba

# 使用者認證,支援Redis 6.0 ACL
auth-user dba

################################# LOGGING #####################################

# 日誌等級: debug, info, success, warning o error.
log-level error

# 轉儲從客戶端收到的查詢到日誌中(log-level debug)
# dump-queries no

# 轉儲緩衝區到日誌中(log-level debug)
# dump-buffer no

# 轉儲請求的佇列到日誌中(log-level debug)
# dump-queues no

測試說明

條件:

Host:192.168.163.134
Port:8379、8380、8381
# ACL
User:dba
Pwd:dba

啟動:

redis-cluster-proxy -c /usr/local/redis-cluster-proxy/proxy.conf 

登陸:

redis-cli -h 127.0.0.1 -p 7777
127.0.0.1:7777>  

管理:

> proxy help
 1) PROXY <subcommand> arg arg ... arg
 2) INFO   [section]           -- 檢視Proxy資訊
 3) CONFIG GET <param>         -- 檢視Proxy引數
 4) CONFIG SET <param> <value> -- 設定Proxy引數
 5) MULTIPLEXING STATUS|OFF    -- 獲取當前客戶端的多路複用狀態或將其關閉
 6) COMMAND [type]             -- 當前已知的列表命令可用於過濾(unsupported|crosslots-unsupported)
 7) CLIENT <subcmd>            -- 執行特定於客戶的操作(有關詳細資訊,請鍵入“PROXY CLIENT HELP”: PROXY CLIENT ID(獲取當前客戶端id),PROXY CLIENT THREAD(獲取當前執行緒))
 8) CLUSTER [subcmd]           -- 執行特定於群集的操作(有關詳細資訊,請鍵入“PROXY CLUSTER HELP”:INFO、STATUS、CONNECTION、NODES、UPDATE)
 9) DEBUG <subcmd>             -- 用於除錯代理的實用程式(更多資訊,請鍵入“PROXY DEBUG HELP”)
10) SHUTDOWN [ASAP]            -- 關閉代理。 如果使用`ASAP`,請立即執行(不安全退出),否則傳送SIGINT。
11) LOG [level] <message>      -- 將訊息記錄到日誌中,以進行除錯

> PROXY CLIENT HELP
1) PROXY CLIENT <subcommand> [arg arg ... arg]
2) ID     -- 獲取客戶端內部ID
3) THREAD -- 獲取當前客戶端的執行緒ID

> PROXY CLUSTER HELP
1) PROXY CLUSTER [subcommand]
2) -,INFO     -- 獲取與呼叫客戶端關聯的叢集的資訊
3) STATUS     -- 獲取與呼叫客戶端關聯的群集的狀態。 狀態可以是:更新(updated)|更新(updating)|中斷(broken)
4) CONNECTION -- 獲取與呼叫客戶端關聯的群集的連線型別。 型別可以是:公有(shared)|私有(private)
5) NODES      -- 獲取與呼叫客戶端關聯的群集的主節點列表。 型別可以是:公有(shared)|私有(private)
6) UPDATE     -- 請求更新與當前客戶端關聯的群集的配置。

> PROXY DEBUG HELP
1) PROXY DEBUG <subcommand> [ARGS...]
2) SEGFAULT            -- Cause a SEGFAULT on the proxy
3) ASSERT              -- Cause an assertion failure  on the proxy
4) KILL <thread> [sig] -- Send signal to thread (can be MAIN,SELF or the thread ID). Signal can be TERM,INT,KILL or a signal number.

測試:

①:管理命令測試

-- 設定引數
> proxy config get connections-pool-size
1) connections-pool-size
2) (integer) 10
> proxy config get enable-cross-slot
1) enable-cross-slot
2) (integer) 0
> proxy config set enable-cross-slot 1
OK
> proxy config set connections-pool-size 5
OK


-- 檢視Proxy資訊
> proxy info
# Proxy
proxy_version:999.999.999
proxy_git_sha1:ac83840d
proxy_git_dirty:0
proxy_git_branch:unstable
os:Linux 4.15.0-99-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:7.5.0
process_id:64512
threads:8
tcp_port:7777
uptime_in_seconds:1262
uptime_in_days:0
config_file:/usr/local/redis-cluster-proxy/proxy.conf
acl_user:dba
unix_socket:/usr/local/redis-cluster-proxy/proxy.socket
unix_socket_permissions:760

# Memory
used_memory:6736984
used_memory_human:6.42M
total_system_memory:2065895424
total_system_memory_human:1.92G

# Clients
connected_clients:1
max_clients:10000
thread_0_clinets:1
thread_1_clinets:0
thread_2_clinets:0
thread_3_clinets:0
thread_4_clinets:0
thread_5_clinets:0
thread_6_clinets:0
thread_7_clinets:0

# Cluster
address:192.168.163.134:8379
entry_node:192.168.163.134:8379


-- 檢視叢集資訊
> proxy cluster info
1) status
2) updated
3) connection
4) shared
5) nodes
6) 1)  1) name
       2) 91463f2fbb73cbbda4203fe88de465cafa0423fb
       3) ip
       4) 192.168.163.134
       5) port
       6) (integer) 8380
       7) slots
       8) (integer) 5462
       9) replicas
      10) (integer) 0
      11) connected
      12) (integer) 1
   2)  1) name
       2) afec09788ceeacad2b9c4d5cd92aa986e161d93e
       3) ip
       4) 192.168.163.134
       5) port
       6) (integer) 8379
       7) slots
       8) (integer) 5461
       9) replicas
      10) (integer) 1
      11) connected
      12) (integer) 1
   3)  1) name
       2) ff7a6f8ba650540cee8355f8042854b4131d49da
       3) ip
       4) 192.168.163.134
       5) port
       6) (integer) 8381
       7) slots
       8) (integer) 5461
       9) replicas
      10) (integer) 0
      11) connected
      12) (integer) 1

②:應用命令測試

127.0.0.1:7777> get a
"a"
127.0.0.1:7777> 
127.0.0.1:7777> get b
"b"
127.0.0.1:7777> get c
"c"
127.0.0.1:7777> get d
"d"
127.0.0.1:7777> mget a b c d
(error) ERR Cross-slot queries are disabled. They can be enabled by using the --enable-cross-slot option, or by calling `PROXY CONFIG SET enable-cross-slot 1`. WARN: cross-slot queries can break the atomicity of the query itself.
127.0.0.1:7777> PROXY CONFIG SET enable-cross-slot 1
OK
127.0.0.1:7777> mget a b c d
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:7777> mset a abc b cbd c cba d dba
OK
127.0.0.1:7777> dbsize  --支援所有節點key的彙總統計
(integer) 18
127.0.0.1:7777> SDIFF a b
(error) ERR Cross-slot queries are not supported for this command
127.0.0.1:7777> SINTER a b
(error) ERR Cross-slot queries are not supported for this command
127.0.0.1:7777> SMOVE a b
(error) ERR Cross-slot queries are not supported for this command
127.0.0.1:7777> SUNION a b
(error) ERR Cross-slot queries are not supported for this command
127.0.0.1:7777> hmget hd
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:7777> rename a aaaaa
(error) ERR Cross-slot queries are not supported for this command

說明:通過測試發現,redis-cluster-proxy可以使用mset、mget、dbsize等跨節點和slot的操作,還有一些操作都不支援。

③:更多測試

目前沒有使用redis-cluster-proxy,等需要的時候再做測試。如果正打算用的同學需要做更多的功能和效能測試。

④:更多的問題

比如如何避免Proxy的單點,Proxy的配置優化等等。

總結

目前Redis之父在自己部落格裡宣告:退出開源專案維護,將 Redis 交給 Redis 社群。個人感覺後面Redis 社群會穩定和逐步完善自己的Proxy。拭目以待吧!

參考文件

https://github.com/RedisLabs/redis-cluster-proxy

https://www.cnblogs.com/zhoujinyi/p/13267222.html