redis3 叢集監控介紹
阿新 • • 發佈:2018-12-25
一 redis請求處理介紹
1. redis Server是單執行緒
- 優點:因為CPU不是Redis的瓶頸。Redis的瓶頸最有可能是機器記憶體或者網路頻寬,採用佇列模式將併發訪問變為序列執行。
- redis快速原因是絕大部分請求是純粹的記憶體操作(非常快速),採用單執行緒,避免了不必要的上下文切換和競爭條件,非阻塞IO
- 缺點:要求每個請求執行必須時間非常的快。如果請求都是耗時的,採用單執行緒吞吐量及效能可想而知了。應該說redis為特殊的場景選擇了合適的技術方案。
1. redis cluster叢集
- 沒有叢集功能的Redis,每個master-slave主從複製都獨立於其他結點,sharding需要在客戶端如Jedis中控制。可以使用官方提供的Sentinel監控主從的狀態,實現自動的Fail-over切換。公司目前採用阿里雲redis 2.8,master-slave,HA功能有阿里雲自己研發。
- redis叢集的三個目標:效能:這是Redis賴以生存的看家本領,增加叢集功能後當然不能對效能產生太大影響,所以Redis採取了P2P而非Proxy方式、非同步複製、客戶端重定向等設計,而犧牲了部分的一致性、使用性。
水平擴充套件:叢集的最重要能力當然是擴充套件,文件中稱可以線性擴充套件到1000結點。可用性:在Cluster推出之前,可用性要靠Sentinel保證。有了叢集之後也自動具有了Sentinel的監控和自動Failover能力。
二 redis desktop管理工具
1. Redis Desktop Manager
2. 常用command
- redis-cli連線node
redis-cli -h host -p part
[root@iZbp11ti9rpeoo64gv0dz9Z src]# redis-cli -c -h 172.16.30.37 -p 7001
172.16.30.37:7001>
172.16.30.37:7001> cluster nodes
NOAUTH Authentication required.
# 如果執行命令報 NOAUTH Authentication required. 再請用auth+password 登入。
127.0.0.1:6379> auth "yourpassword"
- 如下命令可以在redisDesktop tools下的Console視窗下執行。
- 切換不同的db
# select 切換到指定的資料庫,資料庫索引號 index 用數字值指定
redis-37-7007:14>select 15
OK
redis-37-7007:15>
- 開發需要了解監控redis cluster資訊,命令INFO將返回關於Redis伺服器的各種資訊和統計數值。幫助開發規劃設計監控自己cache。
server : 一般 Redis 伺服器資訊,包含以下域:
redis_version : Redis 伺服器版本
redis_git_sha1 : Git SHA1
redis_git_dirty : Git dirty flag
os : Redis 伺服器的宿主作業系統
arch_bits : 架構(32 或 64 位)
multiplexing_api : Redis 所使用的事件處理機制
gcc_version : 編譯 Redis 時所使用的 GCC 版本
process_id : 伺服器程序的 PID
run_id : Redis 伺服器的隨機識別符號(用於 Sentinel 和叢集)
tcp_port : TCP/IP 監聽埠
uptime_in_seconds : 自 Redis 伺服器啟動以來,經過的秒數
uptime_in_days : 自 Redis 伺服器啟動以來,經過的天數
lru_clock : 以分鐘為單位進行自增的時鐘,用於 LRU 管理
clients : 已連線客戶端資訊,包含以下域:
connected_clients : 已連線客戶端的數量(不包括通過從屬伺服器連線的客戶端)
client_longest_output_list : 當前連線的客戶端當中,最長的輸出列表
client_longest_input_buf : 當前連線的客戶端當中,最大輸入快取
blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量
memory : 記憶體資訊,包含以下域:
used_memory : 由 Redis 分配器分配的記憶體總量,以位元組(byte)為單位
used_memory_human : 以人類可讀的格式返回 Redis 分配的記憶體總量
used_memory_rss : 從作業系統的角度,返回 Redis 已分配的記憶體總量(俗稱常駐集大小)。這個值和 top 、 ps 等命令的輸出一致。
used_memory_peak : Redis 的記憶體消耗峰值(以位元組為單位)
used_memory_peak_human : 以人類可讀的格式返回 Redis 的記憶體消耗峰值
used_memory_lua : Lua 引擎所使用的記憶體大小(以位元組為單位)
mem_fragmentation_ratio : used_memory_rss 和 used_memory 之間的比率
mem_allocator : 在編譯時指定的, Redis 所使用的記憶體分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
在理想情況下, used_memory_rss 的值應該只比 used_memory 稍微高一點兒。
當 rss > used ,且兩者的值相差較大時,表示存在(內部或外部的)記憶體碎片。
記憶體碎片的比率可以通過 mem_fragmentation_ratio 的值看出。
當 used > rss 時,表示 Redis 的部分記憶體被作業系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。
Because Redis does not have control over how its allocations are mapped to memory pages, high used_memory_rss is often the result of a spike in memory usage.
當 Redis 釋放記憶體時,分配器可能會,也可能不會,將記憶體返還給作業系統。
如果 Redis 釋放了記憶體,卻沒有將記憶體返還給作業系統,那麼 used_memory 的值可能和作業系統顯示的 Redis 記憶體佔用並不一致。
檢視 used_memory_peak 的值可以驗證這種情況是否發生。
persistence : RDB 和 AOF 的相關資訊
stats : 一般統計資訊
replication : 主/從複製資訊
cpu : CPU 計算量統計資訊
commandstats : Redis 命令統計資訊
cluster : Redis 叢集資訊
keyspace : 資料庫相關的統計資訊
- redisCluster叢集node資訊
172.16.30.37:7001> cluster nodes
ae72a76f3dfd252ffea9dd4f99eed73956985e8d 172.16.30.37:7003 master - 0 1519891351817 8 connected 10923-16383
2d515d01d5c340c056e45f532f87e2e9a710ad2e 172.16.30.37:7002 master - 0 1519891353827 2 connected 5461-10922
a55520dc10558d288315617a540b16ea753fae90 172.16.30.37:7004 master - 0 1519891349813 9 connected 0-5460
f61d2cce02eba73886449f7be22ae66c6909644f 172.16.30.37:7006 slave ae72a76f3dfd252ffea9dd4f99eed73956985e8d 0 1519891352821 8 connected
0f34e5062e6ab8b203288adb27b76b6499f81097 172.16.30.37:7005 slave 2d515d01d5c340c056e45f532f87e2e9a710ad2e 0 1519891350814 5 connected
960a22035faacce41dc10ea185b962fe706c4adf 172.16.30.37:7001 myself,slave a55520dc10558d288315617a540b16ea753fae90 0 0 1 connected
172.16.30.37:7001>
更多關於新增叢集,刪除叢集node的命令請關注瞭解如下:
- 叢集
- cluster info:列印叢集的資訊
- cluster nodes:列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。
- 節點
- cluster meet :將ip和port所指定的節點新增到叢集當中,讓它成為叢集的一份子。
- cluster forget:從叢集中移除 node_id 指定的節點。
- clusterreplicate :將當前節點設定為node_id指定的節點的從節點。
- clustersaveconfig:將節點的配置檔案儲存到硬盤裡面。
- 槽(slot)
cluster addslots<slot> [slot ...]:將一個或多個槽(slot)指派(assign)給當前節點。
clusterdelslots <slot> [slot ...]:移除一個或多個槽對當前節點的指派。
clusterflushslots:移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
cluster setslot<slot> node <node_id>:將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
cluster setslot<slot> migrating <node_id>:將本節點的槽 slot 遷移到node_id 指定的節點中。
cluster setslot<slot> importing <node_id>:從 node_id 指定的節點中匯入槽slot 到本節點。
cluster setslot<slot> stable:取消對槽 slot 的匯入(import)或者遷移(migrate)。
- 鍵
cluster keyslot<key>:計算鍵 key 應該被放置在哪個槽上。
clustercountkeysinslot <slot>:返回槽 slot 目前包含的鍵值對數量。
clustergetkeysinslot <slot> <count>:返回 count 個 slot 槽中的鍵。
三 redisCluster 介紹
pipeline批量commod優化前後
- 我們公司真實生產,用來cache kafka offset變化的
# Stats
total_connections_received:6268502
total_commands_processed:27403503791
instantaneous_ops_per_sec:23432
total_net_input_bytes:947346345264
total_net_output_bytes:316704548663
instantaneous_input_kbps:1209.41
instantaneous_output_kbps:1224.92
input_limit_tokens:31456683
output_limit_tokens:31457240
- 才pipeline 批量命令後的結果:
# Stats
total_connections_received:6270546
total_commands_processed:27477368164
instantaneous_ops_per_sec:2678
total_net_input_bytes:951300825607
total_net_output_bytes:320813929044
instantaneous_input_kbps:91.40
instantaneous_output_kbps:21.98
input_limit_tokens:31457266
output_limit_tokens:31457273
input_strict_limit:0
output_strict_limit:0
rejected_connections:0
rejected_connections_status:0
sync_full:1
sync_partial_ok:2