Main流程图
初始化全局变量,proxysql的main库里面的global_variables里面可查看变量 daemon_fork,这里fork两次(感兴趣可找资料看下),创建守护进程,proxysql宕机可自动拉起。 阶段2-not_started–初始化Main模块,主要就是new来各种全局对象,包括GloQC(query cache)、GloQPro(query processor)、授权、GloMyMon(mysql monitor)、日志、GloMTH(mysql thread handler)、GloMyStmt、MyHGM(host group manager)等 MyHGM启动两个线程,一个用来管理连接,一个用来采集服务器的gtid(后面用来判断延迟之列的,选择从库的时候使用) 阶段2-not_started–初始化Admin模块,主要用来初始化admin、stats、cluster对象,admin最重要,管理请求、配置变更等都是这里做的;Stats是核心的统计库,统计的内容在后面的库表分析中会说明;cluser对象主要就是用来管理proxysql集群的,同步配置。 阶段3-start_all,这个阶段的核心工作就是将库表里面的信息加载到全局对象中,比如server信息、user信息、mysql集群信息等。其中初始化MySQL线程处理模块会启动2类线程,这2类线程是处理用户请求,最核心,后面会分析。初始化MySQL监控模块会启动monitor监控线程,这块只负责处理mysql serve相关的监控,比如:ping、delay、read_only等。 接着main会使用watchdog来监控worker线程、idle线程的heartbeat,这里可能会造成proxysql的重启。 如果给进程发送shutdown指令,就到阶段4了。
源码
int main_test ( int argc, const char * argv[ ] )
{
ProxySQL_Main_process_global_variables ( argc, argv) ;
ProxySQL_Main_init_SSL_module ( ) ;
if ( GloVars. global. foreground == false )
{
ProxySQL_daemonize_phase1 ( ( char * ) argv[ 0 ] ) ;
if ( ( pid = daemon_fork ( ) ) < 0 )
{
daemon_retval_done ( ) ;
exit ( EXIT_FAILURE) ;
}
else if ( pid)
{
ProxySQL_daemonize_wait_daemon ( ) ;
}
else
{
cpu_timer t;
GloVars. global. start_time = monotonic_time ( ) ;
GloVars. install_signal_handler ( ) ;
if ( ProxySQL_daemonize_phase2 ( ) == false )
{
goto finish;
}
}
}
__start_label:
ProxySQL_Main_init_phase2___not_started ( ) ;
ProxySQL_Main_init_phase3___start_all ( ) ;
{
while ( glovars. shutdown == 0 )
{
if ( GloMTH)
{
if ( GloMTH-> mysql_threads)
{
for ( i = 0 ; i < GloMTH-> num_threads; i++ )
{
if ( GloMTH-> mysql_threads[ i] . worker)
{
atomic_curtime = GloMTH-> mysql_threads[ i] . worker-> atomic_curtime;
if ( curtime > atomic_curtime + poll_timeout)
{
threads_missing_heartbeat++ ;
}
}
}
}
if ( threads_missing_heartbeat)
{
missed_heartbeats++ ;
if ( missed_heartbeats >= ( unsigned int ) GloVars. restart_on_missing_heartbeats)
{
if ( GloVars. restart_on_missing_heartbeats)
{
proxy_error ( "Watchdog: reached %u missed heartbeats. Aborting!\n" , missed_heartbeats) ;
proxy_error ( "Watchdog: see details at https://github.com/sysown/proxysql/wiki/Watchdog\n" ) ;
assert ( 0 ) ;
}
}
}
}
}
}
__shutdown:
UnloadPlugins ( ) ;
ProxySQL_Main_init_phase4___shutdown ( ) ;
return 0 ;
}
void ProxySQL_Main_init_phase2___not_started ( )
{
LoadPlugins ( ) ;
ProxySQL_Main_init_main_modules ( ) ;
ProxySQL_Main_init_Admin_module ( ) ;
ProxySQL_Main_init_Auth_module ( ) ;
}
void ProxySQL_Main_init_phase3___start_all ( )
{
GloMyMon = new MySQL_Monitor ( ) ;
{
GloAdmin-> init_mysql_servers ( ) ;
GloAdmin-> init_proxysql_servers ( ) ;
GloAdmin-> load_scheduler_to_runtime ( ) ;
GloAdmin-> proxysql_restapi ( ) . load_restapi_to_runtime ( ) ;
}
ProxySQL_Main_init_Query_module ( ) ;
ProxySQL_Main_init_MySQL_Threads_Handler_module ( ) ;
ProxySQL_Main_init_Query_Cache_module ( ) ;
GloMTH-> start_listeners ( ) ;
ProxySQL_Main_init_MySQL_Monitor_module ( ) ;
}