筆記:MMM監控端啟動流程
====================== /etc/init.d/mysql-mmm-monitor
呼叫:/etc/sbin/mmm_mond
注意: 啟動後,mmm_control 不能馬上使用,需要等幾秒之後才能使用
配置檔案路徑優先順序:/etc, /etc/mmm, /etc/mysql-mmm
改進:
引數MMM_AGENTD_PIDFILE在檔案中寫死的,不會使用配置mmm_mon.conf中的定義
MMM_MOND_BIN 啟動是呼叫的指令碼/usr/sbin/mmm_mond
MMM_MOND_PIDFILE 生成的PID檔案 /var/run/mmm_mond.pid,不改動沒啥影響
rep_backlog 代表從庫的延遲讀取 Seconds_Behind_Master值,不夠準確
====================================== /etc/sbin/mmm_mond
初始化日誌檔案,呼叫 lib\Common\Log.pm :: init("mmm_mon_log.conf", "mmm_mond")
查詢 mmm_agent_log.conf 配置檔案; 若找不到則預設為/var/log/mysql-mmm/mmm_mond.log
讀取並檢查配置檔案,呼叫 lib\Common\Config.pm :: read("mmm_mon"),check('MONITOR');
查詢 mmm_mon.conf 配置檔案; 若找不到,則退出
如果未開啟debug,使用 Daemon 模式,並且重新做一次"初始化日誌"
生成PID(pid = fork();),如果嘗試10次未成功,則退出。呼叫 lib\Common\Angel.pm 中Init方法
監測系統訊號:
$SIG{INT} ,$SIG{TERM},$SIG{QUIT}。這3種訊號都會使agent結束
$SIG{CHLD} 。建立childhandler??my $pid = waitpid(-1, WNOHANG)
初始化 Monitor, 呼叫 \lib\Monitor\Monitor.pm 中 init 方法
檢查所有IP(mmm_mon.conf中配置的ping_ips)的網路狀態。Net::Ping->(icmp)
初始化佇列(new Thread::Queue::):checker_queue,command_queue,result_queue
進行一次檢查['ping', 'mysql', 'rep_backlog', 'rep_threads']。呼叫 lib\Monitor\Checker.pm 中對應的方法
rep_backlog 代表從庫的延遲讀取 Seconds_Behind_Master值,不夠準確
設定monitor mode:預設是active。共4種 'passive', 'active', 'manual', 'wait',mmm_mon.conf中配置mode模式
各種值的意思?
設定 kill_host_bin,預設情況下不用關心
檢查master的配置
若只有1個master,則直接跳過
若多餘2個master,則報錯退出
主要檢查內容:是否能連線,是否互主,自增設定
建立agent物件。 呼叫 lib\Monitor\Agents.pm :: _new_instance 方法
從status檔案中讀取agent的狀態資訊,第一次啟動時檔案為空。status檔案路徑 mmm_mon.conf中 status_path 配置
迴圈檢測所有agent的狀態,並存入status檔案中。狀態包含內容:本機host,state,role,master
呼叫 lib\Monitor\StartupStatus.pm :: set_agent_status 方法進行設定
透過傳送命令進行收集agent的狀態。呼叫 lib\Monitor\Agent.pm --> lib\Common\Socket.pm :: create_sender 方法
GET_AGENT_STATUS 收集 host, state, roles, master
GET_SYSTEM_STATUS 收集 host, writable, roles, master
收整合功,則重新設定agent 狀態資料;
若收集失敗,並且返回的state 不等於ADMIN_OFFLINE,當ping|mysql|agent這3中check中有1個失敗, 則設定該agent的agent_down=1
設定每個agent的state和role。呼叫 lib\Monitor\StartupStatus.pm :: determine_status 方法
根據agent返回的select @@read_only值來記錄此host是否writable。疑問:agent的read_only何時設定?
並且設定state為online,除了下面幾種情況
if ($state eq 'ADMIN_OFFLINE' || (!$is_manual && $state ne 'ONLINE' && $state ne 'AWAITING_RECOVERY'))
檢測是否有ip衝突
若monitor mode不是passive,則通知client清除自己的role(VIP)
呼叫 cleanup_and_send_status 方法
通知順序:passive_master, slave, active_master
如果不按此順序會有什麼問題?
個人理解:必須保證 passiveM在activeM之前就可以,防止activeM停止時切換到passiveM
啟動 Monitor 主函式, 呼叫 main 方法
建立check相關內容執行緒。即init時建立的那4個
檢查週期為 check_period,預設為 5s
主迴圈
處理check結果
_process_check_results --> lib\Monitor\ChecksStatus.pm :: handle_result 方法
儲存最新的 message, state, last_change. state和last_change不是每次都會更新
檢查host狀態
_check_host_states 方法,根據當前host的不同狀態做相應處理
ONLINE
若無法ping通或mysql連不上
則從ONLINE 轉為 HARD_OFFLINE
若是非manual模式, 則清除對應的role, 並且將最新狀態發給agent
進行下一個host檢查
若host是activeM,則不再進行檢查
若上一次檢查距離當前時間小於 60 (peer_online_since 配置) 秒
檢查複製執行緒與複製延遲,若有異常則更新最新狀態,併傳送到 agent
AWAITING_RECOVERY
若無法ping通或mysql連不上
則轉為 HARD_OFFLINE
進行下一個host檢查
若所有check都正常, 並配置了auto_set_online,間隔時間大於auto_set_online
則轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
HARD_OFFLINE
若ping通 並且mysql可以連線
若activeM不為空
若replication失敗
轉為 REPLICATION_FAIL, 併傳送到 agent
進行下一個host檢查
若replication 延遲
轉為 REPLICATION_DELAY, 併傳送到 agent
進行下一個host檢查
轉為 AWAITING_RECOVERY, 併傳送到 agent
進行下一個host檢查
REPLICATION_FAIL
若存在replication 延遲
轉為 REPLICATION_DELAY
進行下一個host檢查
若所有check都正常
轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
若無法ping通或mysql連不上
轉為 HARD_OFFLINE, 併傳送到 agent
進行下一個host檢查
REPLICATION_DELAY
若存在replication 失敗
轉為 REPLICATION_FAIL
進行下一個host檢查
若所有check都正常
轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
若無法ping通或mysql連不上
轉為 HARD_OFFLINE, 併傳送到 agent
進行下一個host檢查
若mode是wait模式
如果兩個M中有一個正常,則設定activeM,優先順序按配置中順序
若mode此時改為active,則清除role,比傳送給agent
非passive模式下,儲存agent狀態
處理命令列
_process_commands 處理cmd執行緒獲取的命令(儲存在佇列中)
每個命令對應的方法在 lib\Monitor\Commands.pm 可以找到
重新分佈roles
_distribute_roles 方法
按配置的role,ips順序一次給role分配相應的ip
如果new activeM不等於old activeM,則通知agent
傳送最新狀態到agent。 send_status_to_agents 方法
鎖定cmd佇列
lock($command_queue);
3秒後或者收到 cond_signal or cond_broadcast 訊號,解除鎖定
cond_timedwait($command_queue, time() + 3);
$command_queue 必須先被lock,才能被此方法使用
參見:~jdhedden/threads-shared-1.46/lib/threads/shared.pm
如果沒有shutdown命令,則繼續下一迴圈
回收執行緒。使用join方式
呼叫:/etc/sbin/mmm_mond
注意: 啟動後,mmm_control 不能馬上使用,需要等幾秒之後才能使用
配置檔案路徑優先順序:/etc, /etc/mmm, /etc/mysql-mmm
改進:
引數MMM_AGENTD_PIDFILE在檔案中寫死的,不會使用配置mmm_mon.conf中的定義
MMM_MOND_BIN 啟動是呼叫的指令碼/usr/sbin/mmm_mond
MMM_MOND_PIDFILE 生成的PID檔案 /var/run/mmm_mond.pid,不改動沒啥影響
rep_backlog 代表從庫的延遲讀取 Seconds_Behind_Master值,不夠準確
====================================== /etc/sbin/mmm_mond
初始化日誌檔案,呼叫 lib\Common\Log.pm :: init("mmm_mon_log.conf", "mmm_mond")
查詢 mmm_agent_log.conf 配置檔案; 若找不到則預設為/var/log/mysql-mmm/mmm_mond.log
讀取並檢查配置檔案,呼叫 lib\Common\Config.pm :: read("mmm_mon"),check('MONITOR');
查詢 mmm_mon.conf 配置檔案; 若找不到,則退出
如果未開啟debug,使用 Daemon 模式,並且重新做一次"初始化日誌"
生成PID(pid = fork();),如果嘗試10次未成功,則退出。呼叫 lib\Common\Angel.pm 中Init方法
監測系統訊號:
$SIG{INT} ,$SIG{TERM},$SIG{QUIT}。這3種訊號都會使agent結束
$SIG{CHLD} 。建立childhandler??my $pid = waitpid(-1, WNOHANG)
初始化 Monitor, 呼叫 \lib\Monitor\Monitor.pm 中 init 方法
檢查所有IP(mmm_mon.conf中配置的ping_ips)的網路狀態。Net::Ping->(icmp)
初始化佇列(new Thread::Queue::):checker_queue,command_queue,result_queue
進行一次檢查['ping', 'mysql', 'rep_backlog', 'rep_threads']。呼叫 lib\Monitor\Checker.pm 中對應的方法
rep_backlog 代表從庫的延遲讀取 Seconds_Behind_Master值,不夠準確
設定monitor mode:預設是active。共4種 'passive', 'active', 'manual', 'wait',mmm_mon.conf中
各種值的意思?
設定 kill_host_bin,預設情況下不用關心
檢查master的配置
若只有1個master,則直接跳過
若多餘2個master,則報錯退出
主要檢查內容:是否能連線,是否互主,自增設定
建立agent物件。 呼叫 lib\Monitor\Agents.pm :: _new_instance 方法
從status檔案中讀取agent的狀態資訊,第一次啟動時檔案為空。status檔案路徑 mmm_mon.conf中 status_path 配置
迴圈檢測所有agent的狀態,並存入status檔案中。狀態包含內容:本機host,state,role,master
呼叫 lib\Monitor\StartupStatus.pm :: set_agent_status 方法進行設定
透過傳送命令進行收集agent的狀態。呼叫 lib\Monitor\Agent.pm --> lib\Common\Socket.pm :: create_sender 方法
GET_AGENT_STATUS 收集 host, state, roles, master
GET_SYSTEM_STATUS 收集 host, writable, roles, master
收整合功,則重新設定agent 狀態資料;
若收集失敗,並且返回的state 不等於ADMIN_OFFLINE,當ping|mysql|agent這3中check中有1個失敗, 則設定該agent的agent_down=1
設定每個agent的state和role。呼叫 lib\Monitor\StartupStatus.pm :: determine_status 方法
根據agent返回的select @@read_only值來記錄此host是否writable。疑問:agent的read_only何時設定?
並且設定state為online,除了下面幾種情況
if ($state eq 'ADMIN_OFFLINE' || (!$is_manual && $state ne 'ONLINE' && $state ne 'AWAITING_RECOVERY'))
檢測是否有ip衝突
若monitor mode不是passive,則通知client清除自己的role(VIP)
呼叫 cleanup_and_send_status 方法
通知順序:passive_master, slave, active_master
如果不按此順序會有什麼問題?
個人理解:必須保證 passiveM在activeM之前就可以,防止activeM停止時切換到passiveM
啟動 Monitor 主函式, 呼叫 main 方法
建立check相關內容執行緒。即init時建立的那4個
檢查週期為 check_period,預設為 5s
主迴圈
處理check結果
_process_check_results --> lib\Monitor\ChecksStatus.pm :: handle_result 方法
儲存最新的 message, state, last_change. state和last_change不是每次都會更新
檢查host狀態
_check_host_states 方法,根據當前host的不同狀態做相應處理
ONLINE
若無法ping通或mysql連不上
則從ONLINE 轉為 HARD_OFFLINE
若是非manual模式, 則清除對應的role, 並且將最新狀態發給agent
進行下一個host檢查
若host是activeM,則不再進行檢查
若上一次檢查距離當前時間小於 60 (peer_online_since 配置) 秒
檢查複製執行緒與複製延遲,若有異常則更新最新狀態,併傳送到 agent
AWAITING_RECOVERY
若無法ping通或mysql連不上
則轉為 HARD_OFFLINE
進行下一個host檢查
若所有check都正常, 並配置了auto_set_online,間隔時間大於auto_set_online
則轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
HARD_OFFLINE
若ping通 並且mysql可以連線
若activeM不為空
若replication失敗
轉為 REPLICATION_FAIL, 併傳送到 agent
進行下一個host檢查
若replication 延遲
轉為 REPLICATION_DELAY, 併傳送到 agent
進行下一個host檢查
轉為 AWAITING_RECOVERY, 併傳送到 agent
進行下一個host檢查
REPLICATION_FAIL
若存在replication 延遲
轉為 REPLICATION_DELAY
進行下一個host檢查
若所有check都正常
轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
若無法ping通或mysql連不上
轉為 HARD_OFFLINE, 併傳送到 agent
進行下一個host檢查
REPLICATION_DELAY
若存在replication 失敗
轉為 REPLICATION_FAIL
進行下一個host檢查
若所有check都正常
轉為 ONLINE, 併傳送到 agent
進行下一個host檢查
若無法ping通或mysql連不上
轉為 HARD_OFFLINE, 併傳送到 agent
進行下一個host檢查
若mode是wait模式
如果兩個M中有一個正常,則設定activeM,優先順序按配置中順序
若mode此時改為active,則清除role,比傳送給agent
非passive模式下,儲存agent狀態
處理命令列
_process_commands 處理cmd執行緒獲取的命令(儲存在佇列中)
每個命令對應的方法在 lib\Monitor\Commands.pm 可以找到
重新分佈roles
_distribute_roles 方法
按配置的role,ips順序一次給role分配相應的ip
如果new activeM不等於old activeM,則通知agent
傳送最新狀態到agent。 send_status_to_agents 方法
鎖定cmd佇列
lock($command_queue);
3秒後或者收到 cond_signal or cond_broadcast 訊號,解除鎖定
cond_timedwait($command_queue, time() + 3);
$command_queue 必須先被lock,才能被此方法使用
參見:~jdhedden/threads-shared-1.46/lib/threads/shared.pm
如果沒有shutdown命令,則繼續下一迴圈
回收執行緒。使用join方式
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1094480/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 筆記:MMM客戶端啟動流程筆記客戶端
- 解決MMM啟動監控報錯的問題
- Spring筆記——SpringBoot啟動流程筆記Spring Boot
- 筆記:MMM注意事項筆記
- STREAMS筆記(12) 效能監控筆記
- 關於linux的啟動流程的筆記(轉)Linux筆記
- nagios的配置(監控端和被監控端)iOS
- php-status監控流程PHP
- shell監控服務程式是否啟動
- APM效能監控軟體的監控型別服務及監控流程型別
- Flutter Android 端啟動流程淺析FlutterAndroid
- 分散式監控系統Zabbix3.4-針對MongoDB效能監控操作筆記分散式MongoDB筆記
- 分支資料監測終端(啟動)
- 交換機統一監控和遠端控制:自動發現、自動監控、自動告警、自動修復
- 業務流程監控:讓多維度監控有了靈魂
- Arthas原理系列(三):服務端啟動流程服務端
- ORACLE EXPDP IMPDP 的停止和啟動及監控Oracle
- 移動端監控體系之技術原理剖析
- 資料庫重啟,TSM不能備份,需要在TSM的客戶端(ORACLE)啟動TSM監控程式資料庫客戶端Oracle
- 【Prometheus學習筆記】主機監控 -node_exporterPrometheus筆記Export
- Memcached筆記——(一)安裝&常規錯誤&監控筆記
- shell指令碼監控啟動停止weblogic服務指令碼Web
- 監控Activity的啟動等狀態--- 原始碼級原始碼
- 監控java程式啟動時的CPU使用情況Java
- junkman 遠端堆疊監控
- Ganglia+Hadoop+Hbase監控搭建流程Hadoop
- 動態監控程式
- 教你打造一套移動端 APM 監控系統
- Activity啟動流程分析記錄(Api26)API
- tomcat8.5服務開啟zabbix遠端監控配置修改Tomcat
- JVM學習筆記---伺服器,JVM效能監控工具JVM筆記伺服器
- flutter在android端啟動流程和熱修復FlutterAndroid
- Flutter啟動流程Flutter
- AMS啟動流程
- App啟動流程APP
- Service啟動流程
- zygote啟動流程Go
- kernel 啟動流程