配置文件路径优先级:/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
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;