redis監控腳本
① 用軟體增加了一條數據到mysql,是否用php可以監控到增加了數據呢
可以用腳本來實現;
思路:
1.創建一個ceshi.txt文件,內容是資料庫內數據數量;
2.腳本內容查詢資料庫數量,讀取並更新ceshi.txt內的數量,判斷查詢出的數量大於ceshi.txt內的數量就是新增,小於就是刪除,並執行php程序;
② redis是如何執行的
對於任何一門技術,如果你只停留在「會用」的階段,那就很難有所成就,甚至還有被裁員和找不到工作的風險,我相信能看此篇文章的你,一定是積極上進想有所作為的人,那麼藉此機會,我們來深入的解一下 Redis 的執行細節。
一條命令的執行過程有很多細節,但大體可分為:客戶端先將用戶輸入的命令,轉化為 Redis 相關的通訊協議,再用 socket 連接的方式將內容發送給伺服器端,伺服器端在接收到相關內容之後,先將內容轉化為具體的執行命令,再判斷用戶授權信息和其他相關信息,當驗證通過之後會執行最終命令,命令執行完之後,會進行相關的信息記錄和數據統計,然後再把執行結果發送給客戶端,這樣一條命令的執行流程就結束了。如果是集群模式的話,主節點還會將命令同步至子節點,下面我們一起來看更加具體的執行流程。
步驟二:客戶端先將命令轉換成 Redis 協議,然後再通過 socket 連接發送給伺服器端
客戶端和伺服器端是基於 socket 通信的,伺服器端在初始化時會創建了一個 socket 監聽,用於監測鏈接客戶端的 socket 鏈接,源碼如下:
當 socket 成功連接之後,客戶端會先把命令轉換成 Redis 通訊協議(RESP 協議,REdis Serialization Protocol)發送給伺服器端,這個通信協議是為了保障伺服器能最快速的理解命令的含義而制定的,如果沒有這個通訊協議,那麼 Redis 伺服器端要遍歷所有的空格以確認此條命令的含義,這樣會加大伺服器的運算量,而直接發送通訊協議,相當於把伺服器端的解析工作交給了每一個客戶端,這樣會很大程度的提高 Redis 的運行速度。例如,當我們輸入 set key val 命令時,客戶端會把這個命令轉換為 *3 $3 SET $4 KEY $4 VAL 協議發送給伺服器端。 更多通訊協議,可訪問官方文檔: https://redis.io/topics/protocol
擴展知識:I/O 多路復用
Redis 使用的是 I/O 多路復用功能來監聽多 socket 鏈接的,這樣就可以使用一個線程鏈接來處理多個請求,減少線程切換帶來的開銷,同時也避免了 I/O 阻塞操作,從而大大提高了 Redis 的運行效率。
綜合來說,此步驟的執行流程如下:
步驟三:伺服器端接收到命令
當數據大小驗證通過之後,伺服器端會對輸入緩沖區中的請求命令進行分析,提取命令請求中包含的命令參數,存儲在 client 對象(伺服器端會為每個鏈接創建一個 Client 對象)的屬性中。
步驟四:執行前准備
① 判斷是否為退出命令,如果是則直接返回;
② 非 null 判斷,檢查 client 對象是否為 null,如果是返回錯誤信息;
③ 獲取執行命令,根據 client 對象存儲的屬性信息去 redisCommand 結構中查詢執行命令;
④ 用戶許可權效驗,未通過身份驗證的客戶端只能執行 AUTH(授權) 命令,未通過身份驗證的客戶端執行了 AUTH 之外的命令則返回錯誤信息;
⑤ 集群相關操作,如果是集群模式,把命令重定向到目標節點,如果是 master(主節點) 則不需要重定向;
⑥ 檢查伺服器端最大內存限制,如果伺服器端開啟了最大內存限制,會先檢查內存大小,如果內存超過了最大值會對內存進行回收操作;
⑦ 持久化檢測,檢查伺服器是否開啟了持久化和持久化出錯停止寫入配置,如果開啟了此配置並且有持久化失敗的情況,禁止執行寫命令;
⑧ 集群模式最少從節點(slave)驗證,如果是集群模式並且配置了 repl min slaves to write(最小從節點寫入),當從節點的數量少於配置項時,禁止執行寫命令;
⑨ 只讀從節點驗證,當此伺服器為只讀從節點時,只接受 master 的寫命令;
⑩ 客戶端訂閱判斷,當客戶端正在訂閱頻道時,只會執行部分命令(只會執行 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE,其他命令都會被拒絕)。
⑪ 從節點狀態效驗,當伺服器為 slave 並且沒有連接 master 時,只會執行狀態查詢相關的命令,如 info 等;
⑫ 伺服器初始化效驗,當伺服器正在啟動時,只會執行 loading 標志的命令,其他的命令都會被拒絕;
⑬ lua 腳本阻塞效驗,當伺服器因為執行 lua 腳本阻塞時,只會執行部分命令;
⑭ 事務命令效驗,如果執行的是事務命令,則開啟事務把命令放入等待隊列;
⑮ 監視器 (monitor) 判斷,如果伺服器打開了監視器功能,那麼伺服器也會把執行命令和相關參數發送給監視器 (監視器是用於監控伺服器運行狀態的)。
當伺服器經過以上操作之後,就可以執行真正的操作命令了。
步驟五:執行最終命令,調用 redisCommand 中的 proc 函數執行命令。
步驟六:執行完後相關記錄和統計 ① 檢查慢查詢是否開啟,如果開啟會記錄慢查詢日誌; ② 檢查統計信息是否開啟,如果開啟會記錄一些統計信息,例如執行命令所耗費時長和計數器(calls)加1; ③ 檢查持久化功能是否開啟,如果開啟則會記錄持久化信息; ④ 如果有其它從伺服器正在復制當前伺服器,則會將剛剛執行的命令傳播給其他從伺服器。
步驟七:返回結果給客戶端 命令執行完之後,伺服器會通過 socket 的方式把執行結果發送給客戶端,客戶端再把結果展示給用戶,至此一條命令的執行就結束了。
小結
當用戶輸入一條命令之後,客戶端會以 socket 的方式把數據轉換成 Redis 協議,並發送至伺服器端,伺服器端在接受到數據之後,會先將協議轉換為真正的執行命令,在經過各種驗證以保證命令能夠正確並安全的執行,但驗證處理完之後,會調用具體的方法執行此條命令,執行完成之後會進行相關的統計和記錄,然後再把執行結果返回給客戶端。
③ 常用的監控協議有哪些
一、監控系統
1、監控系統概念
監控系統應用在監控硬體、軟體和業務上,並及時獲取相應的數據並分析保存數據,發送報警通知管理者,並自動做出相應的處理,通過介面展示以利於運維人員分析,保證業務的正常運行。
2、運維監控系統具備以下幾個模塊:
采樣:從被監控主機上周期性地獲取某個關注指標相關的數據,常見獲取數據通道有:ssh/telnet、agent、IPMI、SNMP、JMX等等
存儲:用於存儲被監控主機采樣的數據和分析的數據,利於調用和分析,常用的有mysql、mariadb等資料庫
數據:分析被監控主機采樣數據,計算出歷史數據、趨勢數據、速率、最大最小值等等。
展示:將被監控主機的數據通過圖表方式展現出來,利於觀察比對,常見的展示介面有:webGUI、GUI、APP等等。
報警:當被監控主機發生異常時,系統用於通知相關人員的報警媒介。常用的報警媒介有:郵件、簡訊、微信或通過腳本實施。
3、被監控對象: 主機、伺服器、交換機、路由器、ups等
nms:網路監控主機NMS是移動通信網中的網路管理系統,它的管理對象可以包括網路中所有的實體,如:網路設備、應用程序、伺服器系統、路由器、交換機、HUB、輔助設備(如UPS電源)等,給網路系統管理員提供一個全系統的網路視圖。
4、監控系統採取的數據通道
ssh/telnet:安全傳輸協議
agent方式:代理方式,由監控主機(master)和安裝代理進程的被監控主機(agent)組成
ipmi:因特爾智慧平台,硬體監控介面
snmp:簡單網路管理協議,版本有 v1,v2(community ,pulic)v3
JMX:java管理擴展
jvm:監控java虛擬機
5、儲存系統
歷史數據 :每次采樣的結果。保存時長較短
趨勢數據: 聚合數據,保存時長較長周期內的數據
存儲系統:
關系型資料庫: mysql pgsql oracle
rrd: roudrobin database
nosql:redis、mongo、時間序列資料庫
二、常見的開源監控項目
1、cacti
Cacti是一套基於PHP,MySQL,SNMP及RRDTool開發的網路流量監測圖形分析工具。
2、nagios
Nagios是一款開源的免費網路監視工具,能有效監控Windows、linux和Unix的主機狀態,交換機路由器等網路設備,列印機等。在系統或服務狀態異常時發出郵件或簡訊報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或簡訊通知。
cacti和nagios這兩個功能上有所欠缺
3、ganglia
Ganglia是UC Berkeley發起的一個開源集群監視項目,設計用於測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要是用來監控系統性能,如:cpu 、mem、硬碟利用率, I/O負載、網路流量情況等,通過曲線很容易見到每個節點的工作狀態,對合理調整、分配系統資源,提高系統整體性能起到重要作用。
4、zebbix
功能齊備且好用
zabbix是一個基於WEB界面的提供分布式系統監視以及網路監視功能的企業級的開源解決方案。
zabbix能監視各種網路參數,保證伺服器系統的安全運營;並提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。
zabbix由2部分構成,zabbix server與可選組件zabbix agent。
zabbix server可以通過SNMP,zabbix agent,ping,埠監視等方法提供對遠程伺服器/網路狀態的監視,數據收集等功能,它可以運行在Linux等多種平台上。
三、SNMP協議
1、SNMP概念
SNMP是基於TCP/IP協議族的網路管理標准,是一種在IP網路中管理網路節點(如伺服器、工作站、路由器、交換機等)的標准協議。SNMP能夠使網路管理員提高網路管理效能,及時發現並解決網路問題以及規劃網路的增長。網路管理員還可以通過SNMP接收網路節點的通知消息以及告警事件報告等來獲知網路出現的問題。
2、SNMP版本
SNMP主要有三個版本,SNMPv1,SNMPv2,SNMPv3。
SNMPv1是最初始的版本,實現簡單,存在較多安全缺陷。
SNMPv2本質上與SNMPv1相同,只是在前一個版本功能上做了加強,並增加了getbulk操作,還增加了一些更加直觀的錯誤響應
SNMPv3解決了兩個版本在安全上的問題,採用了USM和VACM技術,增加了更強的認證機制。
目前使用最多的依然是SNMPv1版。有些廠家的IT設備中,還不支持SNMPv3
3、 術語
縮略語 -------------英文全稱-------------- 中文解釋
MIB ----Management Information Base ------管理信息庫
NMS ------Network Managerment Station -------網路管理站
OID ------Object Identifier -------對象標識符
SNMP ------Simple Network Management Protocol-------- 簡單網路管理協議
SMI -----Structure of Management Information ------管理信息機構
USM -----User-based Security Model -----基於用戶的安全模型
VACM ------View-based Access Control Model ------基於視圖的訪問控制模型
PDU ------Protocol data unit -------協議數據單元
4、SNMP管理的網路主要由三部分組成:
被管理的設備
SNMP代理
網路管理系統(NMS)
網路結構
網路中被管理的每一個設備都存在一個管理信息庫(MIB)用於收集並儲存管理信息。通過SNMP協議,NMS能獲取這些信息。被管理設備,又稱為網路單元或網路節點,可以是支持SNMP協議的路由器、交換機、伺服器或者主機等等。
SNMP代理是被管理設備上的一個網路管理軟體模塊,擁有本地設備的相關管理信息,並用於將它們轉換成與SNMP兼容的格式,傳遞給NMS。
NMS運行應用程序來實現監控被管理設備的功能。另外,NMS還為網路管理提供大量的處理程序及必須的儲存資源。
5、MIB管理信息庫
IETF規定的管理信息庫MIB(由中定義了可訪問的網路設備及其屬性,由對象識別符(OID:Object Identifier)唯一指定。MIB是一個樹形結構,SNMP協議消息通過遍歷MIB樹形目錄中的節點來訪問網路中的設備。下圖給出了NMS系統中SNMP可訪問網路設備的對象識別樹(OID:Object Identifier)結構。
網路設備的對象識別樹
對一個線路狀態進行查詢的OID設置例子
④ zabbix的自定義KEY(linux)
謝謝你的回答。問題已經解決了,不過解決的方法和你的有所不同。
第一個KEY是正常的;
第二個KEY監控的是新安裝的redis,redis-cli
info的絕對路徑是/usr/local/bin/,而zabbix客戶端默認的腳本的PATH不存在此路徑。因此KEY中的命令應該是/usr/local/bin/redis-cli
info;
第三個KEY沒有值返回,因此報ZBX_NOTSUPPORTED
⑤ 如何部署高可用的Redis集群架構
1、准備redis鏡像Redis官方已經提供了Redis 3.2和3.3的鏡像,都可以用來作為Redis集群的鏡像,3.2是穩定版本。目前官方推出了alpine版本的Redis鏡像,alpine鏡像的優勢是體積小。此次分享是採用官方的redis:3.2-alpine的鏡像來做集群。2、准備初始化腳本的執行環境redis官方提供了一個ruby的腳本redis-trib.rb,這個腳本可以用來初始化集群、resharding集群、rebalance集群等。
⑥ redis什麼時候要用事務
Redis事務使用總結:
Redis的事務機制允許同時執行多條指令,它是原子性操作,事務中的命令要麼全部執行,要麼全部不執行,另外,事務中的所有指令都會被序列化,而且其開始執行過程中,不回被即時過來的指令所打斷,其需要經歷三個過程,分別為開始事務、命令入隊以及執行事務。
·相關命令
·如何使用
·腳本事務
·遇到問題
·例子演示
一、相關命令
1、MULTI
該命令用來開啟事務,它總是返回ok結果,當其執行之後,客戶端可以繼續發送任意條數量的指令,這些指令不會立即被執行,而是被放到了隊列中,直到EXEC被調用之後,所有命令才會被序列化執行。
2、EXEC
該命令負責觸發並執行隊列中所有的命令。
NOTE:
如果MULTI開啟之後,因為某些原因沒有成功執行EXEC,那麼事務中所有的命令都不會被執行的。
3、DISCARD
該命令用來刷新事務中所有排隊等待執行的指令,它總是返回ok結果,並且將服務連接狀態恢復到正常。如果已經使用WATCH,那麼其會將釋放所有被WATCH的key。
4、WATCH
標記所有指定的key被監控起來,使其在事務中有條件的執行(樂觀鎖)。
NOTE:
A、WATCH使得EXEC命令需要有條件的執行,也就是事務只能在所有被監視的鍵沒有被修改的前提下才能執行。另外,在EXEC被執行之後,所有的WATCH都會被取消。
B、UNWATCH手動取消對所有鍵的WATCH,如果執行了EXEC或者DISCARD,則不需要手動執行UNWATCH命令。
二、如何使用
Redis原生使用(Redis-cli):
127.0.0.1:6379> multi // 事務開始的動作標志下面即為入隊
OK
127.0.0.1:6379> set book-name "Thinking in Java"
QUEUED
127.0.0.1:6379> get book-name
QUEUED
127.0.0.1:6379> sadd tag "java" "Programming""Thinking"
QUEUED
127.0.0.1:6379> smembers tag
QUEUED
127.0.0.1:6379> exec // 執行事務
1) OK
2) "Thinking in Java"
3) (integer) 3
4) 1) "Thinking"
2) "Programming"
3) "java"
127.0.0.1:6379> discard // 事務已執行完畢 已經自動取消
(error) ERR DISCARD without MULTI
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set book-name "Patterns in Java"
QUEUED
127.0.0.1:6379> get book-name
QUEUED
127.0.0.1:6379> sadd tag "Java" "Thinking""Programming"
QUEUED
127.0.0.1:6379> smembers tag
QUEUED
127.0.0.1:6379> discard // 事務未執行 可以刷新隊列指令狀態 取消執行
OK
127.0.0.1:6379> exec // 事務已經被取消不能再執行
(error) ERR EXEC without MULTI
三、腳本事務
Redis 2.6開始支持了腳本,而該腳本本身就是一種事務機制,所以任何在事務里可以完成的事,在腳本裡面也能完成,並且使用腳本更簡單些,並且速度也更快。不過因為事務提供了一種即使不使用腳本,也可以避免競爭條件的方法,並且事務本身的實現並不復雜,所以現在的使用也比較多,但不排除日後可能被替代或是占據主要地位的可能。
NOTE:
Redis為什麼引入兩種處理事務的方式?腳本功能是 Redis 2.6 才引入的,而事務功能則在更早之前就存在,所以 Redis 才會同時存在兩種處理事務的方法。另外,事務腳本會在後續文章中總結介紹。
四、遇到問題
1、樂觀鎖實現
舉個例子,假設我們需要原子性為某個鍵加1操作(假設INCR不存在),那麼應該是這樣的執行語句:
SET mykey 1
val = GET mykey
val = val + 1
SET mykey ${val}
單個客戶端訪問操作沒有任何問題,如果是多個客戶端同時訪問mykey,就會產生資源共享訪問問題,比如:現在有個兩個客戶端訪問同一個鍵mykey,那麼mykey的可能是2,但是我們期望的值應該是3才對,這個類似於高並發下的sync鎖機制,所以我們需要使用WATCH來監控被共享的鍵mykey,如下:
WATCH mykey(可監控多個鍵)
val = GET mykey
val = val + 1
MULTI
SET mykey ${val}
EXEC
NOTE:
雖然大多情況下,多個客戶端訪問操作同一個鍵的情況很少或沒有,但是不能排除這個特殊情況,所以建議在有可能產生鍵共享的指令中使用WATCH在EXEC執行前對其監管。
2、Redis不支持回滾(Roll Back)
Redis的事務不支持回滾,這點不同於關系資料庫中的事務,所以它的內部保持了簡單且快速的特點。另外,Redis不支持回滾是這樣考慮的:Redis事務中命令之所以會失敗,是由於錯誤的編程所造成,通過事務回滾是不能迴避這個根本問題。
NOTE:
Redis事務中命令執行失敗,仍會繼續執行後面的執行,在沒有特殊干預前提下,直到執行完隊列中所有指令為止。
3、使用事務可能遇到的問題
A、事務在執行EXEC之前,入隊的命令可能會出錯,舉個例子:命令可能會產生語法錯誤(參數數量錯誤,參數名錯誤等),或者其他更嚴重的錯誤,比如內存不足(如果伺服器使用maxmemory 設置了最大內存限制的話)。
B、事務在執行EXEC之前,舉個例子:事務中的命令可能處理了錯誤類型的鍵,比如將列表命令用在了字元串鍵上面等。
對於發生在EXEC執行之前的錯誤,客戶端以前的做法是檢查命令入隊所得的返回值:如果命令入隊時返回QUEUED ,那麼入隊成功;否則,就是入隊失敗。如果有命令在入隊時失敗,那麼大部分客戶端都會停止並取消這個事務。
從 Redis 2.6.5 開始,伺服器會對命令入隊失敗的情況進行記錄,並在客戶端調用EXEC命令時,拒絕執行並自動放棄這個事務。
在 Redis 2.6.5 以前, Redis 只執行事務中那些入隊成功的命令,而忽略那些入隊失敗的命令。而新的處理方式則使得在管道技術中包含事務變得簡單,因為發送事務和讀取事務的回復都只需要和伺服器進行一次通訊即可。
至於那些在EXEC命令執行之後所產生的錯誤,並沒有對它們進行特別處理: 即使事務中有某個/某些命令在執行時產生了錯誤, 事務中的其他命令仍然會繼續執行。
五、例子演示
<?php
$redis =newRedis();
$redis->connect('127.0.0.1',6379);
$result =array();
// 開啟事務
$redis->multi();
// 添加指令到隊列
$redis->set('book-name','Thinking in PHP!');
$redis->sAdd('tags','PHP','Programming','Thinking');
$bookname = $redis->get('book-name');
$tags = $redis->sMembers('tags');
// 執行事務
$redis->exec();
// 顯示結果
echo'書名:'.$bookname.' 標簽:'.$tags;
?>
結果:
⑦ 查看redis哪些key設置了ttl
使用Redis的腳本功能實現Redis中數據簡單查詢,有需要的朋友可以參考下。 在Redis的設計中,key是一切,對於Redis是可見的,而value對於Redis來說就是一個位元組數組,Redis並不知道你的value中存儲的是什麼
⑧ redis 是線程安全嗎
redis 是線程安全
Redis是一個開源,先進的key-value存儲,並用於構建高性能,可擴展的Web應用程序的完美解決方案,是線程安全的。
Redis三個主要特點:
Redis資料庫完全在內存中,使用磁碟僅用於持久性。
相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。
Redis可以將數據復制到任意數量的從伺服器。