筆記:MMM監控端啟動流程

G8bao7發表於2014-02-27
====================== /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 --&gt 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  --&gt 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章