笔记:MMM客户端启动流程

注意:
配置文件路径优先级:/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 --> bin\agent\clear_ip --> lib\Agent\Helpers\Action.pm --> 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(会重新检测配置) --> bin\agent\set_active_master --> 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 --> bin\agent\sync_with_master --> lib\Agent\Helpers\Action.pm :: sync_with_master
                                select MASTER_POS_WATI(binlogfile, pos);
                        开启本机写
                            调用 lib\Agent\Helpers.pm --> bin\agent\mysql_allow_write --> lib\Agent\Helpers\Action.pm中 mysql_allow_write
                                set global read_only=1;
                    配置VIP
                del:
                    若 role = writer
                        关闭本机写
                            调用 lib\Agent\Helpers.pm --> bin\agent\mysql_allow_write --> 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;

请使用浏览器的分享功能分享到微信等