筆記:MMM客戶端啟動流程

G8bao7發表於2014-02-27
注意:
配置檔案路徑優先順序:/etc, /etc/mmm, /etc/mysql-mmm

=============/etc/init.d/mysql-mmm-agent
呼叫:/etc/sbin/mmm_agentd

改進:
引數MMM_AGENTD_PIDFILE在檔案中寫死的,不會使用配置mmm_common.conf中的定義
MMM_AGENTD_BIN 啟動是呼叫的指令碼/etc/sbin/mmm_agentd
MMM_AGENTD_PIDFILE 生成的PID檔案

============== /etc/sbin/mmm_agentd
初始化日誌檔案,呼叫 lib\Common\Log.pm :: init("mmm_agent_log.conf", "mmm_agentd")
    查詢mmm_agent_log.conf配置檔案; 若找不到則預設為/var/log/mysql-mmm/mmm_agentd.log

讀取並檢查配置檔案,呼叫 lib\Common\Config.pm :: read("mmm_agent"),check('AGENT');
    查詢mmm_agent.conf配置檔案; 若找不到,則退出

建立Agent並初始化配置,呼叫 lib\Agent\Agent.pm :: from_config 方法

檢查PID是否可用,否則推出

如果未開啟debug,使用 Daemon 模式,並且重新做一次"初始化日誌"

生成PID(pid = fork();),如果嘗試10次未成功,則退出。呼叫 lib\Common\Angel.pm :: Init 方法

監測系統訊號.
    $SIG{INT} ,$SIG{TERM},$SIG{QUIT}。這3種訊號 都會使agent結束

初始化Agent,呼叫 lib\Agent\Agent.pm 中main方法
    建立socket,監聽埠9989(預設)。呼叫 lib\Common\Socket.pm :: create_listener 方法
    然後迴圈監測,等待monitor傳送命令,具體包含下面5種命令,使用 lib\Agent\Agent.pm :: handle_command 方法處理
        PING 監測存活
        GET_AGENT_STATUS 監測 mmm_agentd 狀態
        GET_SYSTEM_STATUS 監測agent上mysql是否可用
        CLEAR_BAD_ROLES 清除錯誤配置的vip
            錯誤配置: 與配置檔案role->ips中給本機分配的vip不同
            呼叫 lib\Agent\Helpers.pm --&gt bin\agent\clear_ip --&gt lib\Agent\Helpers\Action.pm --&gt lib\Agent\Helpers\Network.pm :: clear_ip方法
            最終的shell: /sbin/ip addr del /32 dev
        SET_STATUS 設定新狀態傳入3個引數: $new_state, $new_roles_str, $new_master
            # new_state 包含幾種狀態值: ONLINE、ADMIN_OFFLINE 。還會有其他狀態?與mmm_control命令相對應
            # new_roles_str 的格式: reader|writer(ip)
            如果本機是slave,new_state=ONLINE, 本機active_master與new_master不同,則切換master
                呼叫 lib\Agent\Helpers.pm(會重新檢測配置) --&gt bin\agent\set_active_master --&gt lib\Agent\Helpers\Action.pm :: set_active_master 方法
                如果本機master與new_master相同則直接返回
                如果無法連上old_master的mysql,則直接報錯返回,不進行切換
                追趕old_master的binlog的postion。使用 select MASTER_POS_WATI(binlogfile, pos);
                停止slave。stop slave;
                切換 new_master。change master to master_host='xx',master_port='xx', \
                            master_user='xx',master_password='xx',master_log_file='xx',master_log_pos=xx;
                開啟slave. start slave;
            處理Role的變化。
                呼叫 lib\Agent\Role.pm 中  add | del 方法
                add:
                    若 role = writer
                        追趕 master 的binlog。
                            呼叫 lib\Agent\Helpers.pm --&gt bin\agent\sync_with_master --&gt lib\Agent\Helpers\Action.pm :: sync_with_master
                                select MASTER_POS_WATI(binlogfile, pos);
                        開啟本機寫
                            呼叫 lib\Agent\Helpers.pm --&gt bin\agent\mysql_allow_write --&gt lib\Agent\Helpers\Action.pm中 mysql_allow_write
                                set global read_only=1;
                    配置VIP
                del:
                    若 role = writer
                        關閉本機寫
                            呼叫 lib\Agent\Helpers.pm --&gt bin\agent\mysql_allow_write --&gt lib\Agent\Helpers\Action.pm :: mysql_deny_write
                                set global read_only=1;
                        關閉連線的sessioin, show processlist 中除了 User 等於'system user' 和  Command 等於 'Binlog Dump' 兩種執行緒
                            kill
                            注意:如果kill失敗,預設嘗試10次。透過 max_kill_retries 配置
                    清除VIP
            如果本機state 與 new_state 不同
                若 new_state 等於 'ADMIN_OFFLINE',則執行 STOP SLAVE;
                若 本機state 等於 'ADMIN_OFFLINE', 則執行 START SLAVE;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1094385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章