筆記: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;
配置檔案路徑優先順序:/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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1094385/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 客戶端筆記客戶端筆記
- Redis學習筆記(十) 客戶端Redis筆記客戶端
- Spring筆記——SpringBoot啟動流程筆記Spring Boot
- 青芒 for Mac客戶端開發筆記Mac客戶端筆記
- 支付寶客戶端架構解析:iOS 客戶端啟動效能優化初探客戶端架構iOS優化
- Netty原始碼分析(三):客戶端啟動Netty原始碼客戶端
- LightDB/Postgresql 記錄客戶端啟動版本問題導致啟動失敗問題SQL客戶端
- 支付寶客戶端架構解析:Android 客戶端啟動速度優化之「垃圾回收」客戶端架構Android優化
- 《golang筆記》第四篇-網路客戶端Golang筆記客戶端
- 比特幣學習筆記——————3、比特幣客戶端比特幣筆記客戶端
- Golang 學習筆記(一) - HTTP 客戶端 - 基礎Golang筆記HTTP客戶端
- Presto學習筆記——Go客戶端連線PrestoREST筆記Go客戶端
- python socketserver處理客戶端的流程PythonServer客戶端
- gRPC 客戶端和服務端一次互動的全流程(九)RPC客戶端服務端
- 有道雲筆記 Windows 客戶端,複製貼上 BUG筆記Windows客戶端
- OS開發筆記(2)——GRUB啟動流程筆記
- 如何開啟客戶端加密特性客戶端加密
- 愛奇藝Android客戶端啟動優化與分析Android客戶端優化
- EVE-NG初次啟動及WEB客戶端訪問Web客戶端
- 記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】筆記C#客戶端伺服器
- Golang 學習筆記(二) - HTTP 客戶端 - 使用 Client 型別Golang筆記HTTP客戶端client型別
- Dubbo-go 原始碼筆記(二)客戶端呼叫過程Go原始碼筆記客戶端
- Neeto-Vue:我為了記筆記,手寫了一個為知筆記客戶端Vue筆記客戶端
- python 實現 TCP、UDP 客戶端最簡流程PythonTCPUDP客戶端
- php與ethereum客戶端互動PHP客戶端
- RMAN之客戶端互動(一)客戶端
- RMAN之客戶端互動(二)客戶端
- windows tftp客戶端,5步掌握win7開啟tftp客戶端的方法教程WindowsFTP客戶端Win7
- SSH客戶端:Termius mac中文啟用版客戶端Mac
- CAS學習筆記三:SpringBoot自動配置與手動配置過濾器方式整合CAS客戶端筆記Spring Boot過濾器客戶端
- docker筆記45-客戶端對映ceph的rbd塊裝置Docker筆記客戶端
- docker筆記46-調整客戶端rbd塊裝置的大小Docker筆記客戶端
- Angular Universal 學習筆記 - 客戶端渲染和伺服器端渲染的區別Angular筆記客戶端伺服器
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端
- 客戶端動態化系列之——URLRoute客戶端
- 自己動手寫個 Android客戶端Android客戶端
- 客戶管理系統如何使流程自動化