mysql proxy学习(一)启动过程

mysql proxy学习(一)启动过程

mysql-proxy依赖的库较多包括:libevent,glib2,lua;所以代码阅读起来还是需要一些的相应的一些知识。

1. Libevent主要接口
event_base_new:初始化一个event_base
event_set:设置event事件;即初始化struct event结构:类型,文件描述符,回调函数以及参数
event_base_set:将上面设置的event绑定到指定的event_base;每个event都必须指定所属的event_base
event_add:注册event事件
event_base_dispatch:阻塞在某个event_base上,监视绑定在它上面的所有fd

2. mysql proxy启动
/u01/xiangzhong/mysql-proxy/bin/mysql-proxy --daemon --pid-file=/u01/xiangzhong/mysql-proxy/proxy.pid --plugins=proxy --proxy-address=:4040 --log-level=debug --log-file=/u01/xiangzhong/mysql-proxy/proxy.log --proxy-backend-addresses=127.0.0.1:4312 --proxy-lua-script=/u01/xiangzhong/mysql-proxy/proxy.lua --event-threads=5
这是我们的一个启动方式,可见它的启动参数非常的多;其中最重要的包括proxy-backend-addresses:表示mysql-proxy代理的后台服务器
proxy-lua-script:表示在proxy运行过程中它所hook的位置的callback函数,包括connect_server,read_handshake,read_auth,read_auth_result,read_query,read_query_result。相应的使用说明可见http://dev.mysql.com/doc/refman/5.1/en/mysql-proxy-scripting.html。下面我们讲解一下mysql-proxy的启动过程。

3. Mysql-proxy启动过程
简单的说mysql-proxy是支持多线程的libevent模型。
1. Mysql-proxy启动后进入main_cmdline,初始化各种结构,解析启动参数等;
2.chassis_mainloop,它首先初始化主线程的相应结构;
3.加载启动所有的plugins(mysql-proxy可由多个插件组成:admin,proxy,这里就是加载各个组件,即调用相应组件的apply_config函数,如对于proxy-plugin这个函数为network_mysqld_proxy_plugin_apply_config,这个函数又通过network_mysqld_proxy_connection_init(con)来初始化proxy的各个状态对应的处理函数【这些函数是以NETWORK_MYSQLD_PLUGIN_PROTO(***)开头的函数名,其中***值如proxy_init,proxy_read_auth】;以及加载lua script及设置相应的global tables,network_mysqld_lua_setup_global(chas->priv->sc->L, g);最后监视listen_sock->fd,event_set(&(listen_sock->event), listen_sock->fd, EV_READ|EV_PERSIST, network_mysqld_con_accept, con);【可见listen fd是由主线程监听的】)
4.接下来创建其它的event_threads及启动(由启动参数指定个数),chassis_event_threads_init_thread用于初始化线程结构,包括创建每个线程的event_base,然后将chassis_event_threads_t->event_notify_fds[0]复制到每个线程的chassis_event_thread_t->notify_fd,即[0]是可读的,[1]是可写,当前线程负责写,所有线程监听[0]的可读事件event_set(&(event_thread->notify_fd_event), event_thread->notify_fd, EV_READ | EV_PERSIST, chassis_event_handle, event_thread);
5.所有线程进入主循环chassis_event_thread_loop,然后调用event_base_dispatch,监听他们自己的event_base

也就是说此时主线程监听两个fd:listen fd,chassis_event_thread_t->notify_fd;其它线程监听:chassis_event_thread_t->notify_fd。

你可能感兴趣的:(thread,mysql,query,callback,NetWork,plugins)