精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL Proxy:底層實現篇

數據庫 MySQL
glib2提供了config-file 解析和command-line option 解析功能。 其提供了將option 以相同方式暴露給調用者的方法,以及從Configfile 和Commandline獲取option 的功能。

底層實現篇(chassis)

【Configfile and Commandline Options】

glib2提供了config-file 解析和command-line option 解析功能。 其提供了將option 以相同方式暴露給調用者的方法,以及從Configfile 和Commandline獲取option 的功能。

所有option的解析過程都可以分為三步:

1. 提取 command-line 上的 basic option

  • --help
  • --version
  • --defaults-file

2. 處理 defaults-file 文件

3. 處理其余 command-line option 并覆蓋 defaults-file 文件中的相同內容

【 Plugin Interface 】

chassis 為 plugin 接口調用提供了基礎結構。值得注意的是,其不是專門用于 MySQL 的,而是可以用于任何符合其接口要求的 plugin 。提供的功能包括:

  1. 解析 plugin 所在路徑
  2. 對 plugin 的加載
  3. 對 plugin 進行版本檢查
  4. 提供 init 和 shutdown 函數
  5. 向 plugin 暴露配置選項
  6. 基于線程的 i/o

由于 chassis 不是僅針對于 MySQL 設計的,所以其可以用于加載任何種類的 plugin ,只要該 plugin 提供了符合 chassis 要求的 init 和 shutdown 函數。

就 MySQL Proxy 本身而言,一般情況下加載的 plugin 為:

  1. plugin-proxy  
  2. plugin-admin 

【Threaded IO 】

從 MySQL Proxy 0.8 版本開始,已經添加了基于線程的 network-io 以使 proxy 能夠按照可用 CPU 和網卡的數量進行線性擴展。

使能 network-threading 功能只需要在啟動 proxy 時加入下面的參數:

  1. --event-threads={2 * no-of-cores} (default: 0) 

每一個 event-thread 都通過 "event_base_dispatch()" 進行 loop ,并針對 network-event 或者 time-event 執行相關函數。這些線程只具有兩種狀態:執行函數狀態和 idle 狀態。如果其處于 idle 狀態,則其能夠從 event-queue 中獲取要進行等待的新 event ,然后將其添加到自身的等待列表中。

connection 是可以在多個 event-thread 之間“跳躍”的:因為只要是 idle 狀態的 event-thread 就能夠獲取到 wait-for-event request - 即具體的事件 - 并進行等待,觸發后執行相關代碼。無論何時,只要當前 connection 需要重新等待事件(也就是之前事件所對應的操作已經完成),其就會將自身從所在線程中 unregister ,之后重新向全局 event-queue 發送 wait-for-event request 以獲取新事件。

一直到 MySQL Proxy 0.8 版本,腳本代碼的執行都是單線程方式:通過一個全局 mutex 來保護 plugin 的接口操作。因為 connection 或者是處于發送包的狀態,或者是處于調用 plugin 函數的狀態,所以網絡事件將會按照并行方式被處理,僅在多個 connection 需要調用同一個 plugin 函數的時候才會無法并行。

chassis_event_thread_loop() 函數就是 event-thread 的主循環實體(其中調用 event_base_dispatch() 函數),而函數 chassis_event_threads_init_thread() 用于設置要監聽的事件和對應的回調。

下面的描述的是一種典型控制流(不包含連接池的情況)

涉及到的實體:EventRequestQueue, MainThread, WorkerThread1, WorkerThread2;

  1. --- [ label = "Accepting new connection "];   
  2.  
  3.     MainThread -> MainThread [ label = "network_mysqld_con_accept()" ];   
  4.     MainThread -> MainThread [ label = "network_mysqld_con_handle()" ];   
  5.  
  6.     MainThread -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  7.     WorkerThread1 <- EventRequestQueue [ label = "Retrieve Event request" ];   
  8.     WorkerThread1 -> WorkerThread1 [ label = "event_base_dispatch()" ];   
  9.     ...;   
  10.     WorkerThread1 -> WorkerThread1 [ label = "network_mysqld_con_handle()" ];   
  11.        
  12.     WorkerThread1 -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  13.        
  14.     WorkerThread2 <- EventRequestQueue [ label = "Retrieve Event request" ];   
  15.     WorkerThread2 -> WorkerThread2 [ label = "event_base_dispatch()" ];   
  16.     ...;   
  17.     WorkerThread2 -> WorkerThread2 [ label = "network_mysqld_con_handle()" ];   
  18.        
  19.     WorkerThread2 -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  20.     ...; 

在上面的例子中,存在兩個用于處理 event 的工作線程(設置 --event-threads=2 ),每個線程都有自己的 event_base 。以 Proxy plugin 為例,首先將 network_mysqld_con_accept() 函數設置為被監聽 socket 的回調,當有新連接發生時被觸發。該回調函數是注冊在主線程的 event_base 上的(同時也是全局 chassis 的 event_base)。在設置了連接相關結構 network_mysqld_con 后,程序將進入到狀態機處理函數 network_mysqld_con_handle() 中,此時仍然處于主線程中。

狀態機將進行入起始狀態:CON_STATE_INIT ,在當前代碼實現中該狀態是主線程所必進入的***個狀態。接下來 MySQL Proxy 要做的事,要么是和 client 交互,要么是和 server 進行交互(即或者等待 socket 可讀,或者主動向 backend server 建立連接),而狀態機函數 network_mysqld_con_handle() 將設置等待處理事件(對應結構體為 chassis_event_op_t)。簡單來說就是將 event 結構添加到異步隊列中,具體講,就是通過向之前創建的 wakeup-pipe 的寫文件描述符寫入一個字節,以產生一個文件描述符事件。這樣就可以向所有線程通知有新事件請求需要處理。

該 pipe 的實現是 libevent 對應實現的一個翻版,其將各種事件與基于文件描述符的 event-handler 建立了對應關系,采用的輪詢方式進行處理:

  1. 工作線程中的 event_base_dispatch() 函數在其監聽的 fd 被觸發前處于阻塞監聽狀態(在具體實現中是有定時喚醒機制的)。
  2. 定時器事件,信號事件等都不能直接中斷 event_base_dispatch() 的運行。
  3. 上述事件均是通過 write(pipe_fd, ".", 1); 來觸發 fd-event 的可讀,從而通過回調來進行處理。


在文件 chassis-event-thread.c 中可以看到,通過 pipe 實現了向工作線程通知:在全局 event-queue 中有東東需要處理。從函數 chassis_event_handle() 可以看出,所有處于 idle 狀態的線程都有平等機會進行事件處理,所以這些線程就能夠“并行的”從全局事件隊列中拉取 event ,并將其添加到自身的監聽事件列表中。

通過調用 chassis_event_add() 或者 chassis_event_add_local() 函數可以將 event 添加到 event-queue 中。一般情況下,所有事件都由全局 event_base 負責處理。只有在使用 connection pool 的情況下,才會強制將與特定 server connection 對應的 events 投遞到特定線程,即將當前 connection 加入到 connection pool 中的那個線程。

如果event 被投遞到全局 event_base 中,那么不同的線程都可以獲取這個事件,并可以對無保護的 connection pool 數據結構進行修改,可能會導致競爭冒險和崩潰。令這個內部數據結構成為具有線程安全性質是 0.9 release 版本的工作,當前只提供了最小限度的線程安全性。

典型情況是,某個線程會從 event queue 中獲取 request 信息(理論上,發送 wait request 的線程很可能也是處理這個 request 的線程),并將其添加到自身以 thread-local-store 方式保存的event_base 中,并在對應 fd 有事件觸發時獲得通知。

該處理過程將一直持續到當前 connection 被 client 或者 server 關閉,或者發生了導致的 socket 關閉的網絡錯誤。此后將無法處理任何新的 request 。

單獨一個線程就足以處理任何添加到其 thread-local 的 event_base 上面的 event 。只有在一個新的 blocking I/O 操作發生時(一般來說也就是重新進入 event_base_dispatch() 阻塞時),event 才會在不同線程間被“跳躍著”處理,除此外沒有其他例外。所以理論上講,可能會出現一個線程處理了所有活躍的 socket 事件,而另一個線程一直處于 idle 狀態。

然而,由于等待網絡事件的發生的狀態是常態(意思就是實際處理的速度都很快),所以(從概率上講)活躍 connection 在所有線程中的分布必定是很均勻的,也就會減輕單個線程處理活躍 connection 的壓力。

值得注意的是,盡管在下面的說明中沒有具體指出,主線程當前會在 accept 狀態后參與到對后續 event 的處理中。這不是一個非常理想的實現方式,因為所有 accept 動作本身就需要在主線程中完成。但從另一方面講,這個問題暫時也沒成為實際工作中的瓶頸顯現出來:

涉及到的實體:Plugin, MainThread, MainThreadEventBase, EventRequestQueue, WorkerThread1, WorkerThread1EventBase, WorkerThread2, WorkerThread2EventBase;

  1. --- [ label = "Accepting new connection "];   
  2.  
  3.     Plugin -> MainThread [ label = "network_mysqld_con_accept()" ];   
  4.     MainThread -> MainThread [ label = "network_mysqld_con_handle()" ];   
  5.  
  6.     MainThread -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  7.     WorkerThread1 <- EventRequestQueue [ label = "Retrieve Event request" ];   
  8.     WorkerThread1 -> WorkerThread1EventBase [ label = "Wait for event on local event base" ];   
  9.     ...;   
  10.     WorkerThread1EventBase >> WorkerThread1 [ label = "Process event" ];   
  11.        
  12.     WorkerThread1 -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  13.        
  14.     WorkerThread2 <- EventRequestQueue [ label = "Retrieve Event request" ];   
  15.     WorkerThread2 -> WorkerThread2EventBase [ label = "Wait for event on local event base" ];   
  16.     ...;   
  17.     WorkerThread2EventBase >> WorkerThread2 [ label = "Process event" ];   
  18.        
  19.     WorkerThread2 -> EventRequestQueue [ label = "Add wait-for-event request" ];   
  20.     ...; 

原文鏈接:http://my.oschina.net/u/617889/blog/114247

責任編輯:林師授 來源: OSChina
相關推薦

2020-05-27 20:45:31

Redis底層數據

2011-08-30 09:59:47

Mysql ProxyLUA

2025-03-27 04:00:00

2020-05-14 11:19:19

降序索引子集

2023-01-04 07:54:03

HashMap底層JDK

2015-09-09 10:34:58

底層網絡技術網絡技術

2022-12-19 08:00:00

SpringBootWeb開發

2010-05-17 11:19:44

MySQL proxy

2014-11-26 10:44:33

DockerOpenStack云計算

2021-07-23 13:34:50

MySQL存儲InnoDB

2025-04-02 01:22:44

MySQL樂觀鎖數據

2021-01-04 08:55:07

ZabbixProxy分布式部署

2021-01-08 08:34:09

Synchronize線程開發技術

2021-06-09 11:41:10

RateLimiterJava代碼

2011-09-01 17:46:22

MySQL ProxyLua腳本

2011-08-30 10:28:11

MySQL ProxyLUA

2011-08-30 12:49:59

Mysql ProxyLua分離

2011-08-30 11:00:10

MySQL ProxyLua

2023-07-11 08:00:00

2021-01-21 10:25:16

總線CAN
點贊
收藏

51CTO技術棧公眾號

成人在线视频免费| 国产精品麻豆免费版| 宅男噜噜99国产精品观看免费| 国产精品久久久久野外| 免费人成黄页在线观看忧物| 亚洲1区在线观看| 欧美激情在线一区二区| 538国产精品一区二区免费视频| 国产福利精品一区二区三区| 韩日在线视频| 亚洲综合二区| 日韩毛片在线观看| 日韩国产一级片| 国产成人三级一区二区在线观看一| 欧美久久精品一级c片| 狠狠躁夜夜躁久久躁别揉| 亚洲bt欧美bt日本bt| 手机看片国产日韩| 日韩欧美2区| 国产人成一区二区三区影院| 成人免费在线视频网站| 亚洲天堂av中文字幕| 综合中文字幕| 亚洲一级二级三级在线免费观看| 96久久精品| 一区二区视频免费看| 久久免费精品| 亚洲综合在线观看视频| ts人妖另类在线| 精品无码m3u8在线观看| 激情亚洲另类图片区小说区| 亚洲国产日韩a在线播放性色| 97国产超碰| 最近中文字幕在线观看视频| 日韩电影一区| 欧美精品1区2区3区| 五月天综合婷婷| 午夜精品久久久久久久96蜜桃| 欧美日韩精选| 亚洲精品久久视频| 国产又黄又猛视频| 1769视频在线播放免费观看| 激情六月婷婷久久| 欧美成人免费全部| 免费不卡的av| 亚洲校园激情春色| 国产精品天干天干在观线| 91精品久久久久久久久青青| www五月天com| 国产精品99一区二区三| 精品美女被调教视频大全网站| 国产素人在线观看| 国产日本在线视频| 国产在线观看免费一区| 午夜精品福利在线观看| 亚洲女优在线观看| 日韩在线成人| 日韩一区二区三免费高清| 国产乱子伦农村叉叉叉| av网站无病毒在线| 亚洲国产精品av| 亚洲精品一区二区三区樱花 | 麻豆传媒免费在线观看| 国产成a人无v码亚洲福利| 国产91|九色| 性无码专区无码| 国产二区精品| 欧美床上激情在线观看| 久草资源在线视频| 日韩精品欧美激情一区二区| 色婷婷综合成人| 91视频啊啊啊| 国产精品国产三级在线观看| 日韩欧中文字幕| 欧洲美女和动交zoz0z| 色视频在线观看免费| 国内精品写真在线观看| 51国偷自产一区二区三区的来源| 精品国产伦一区二区三区| 成人精品视频一区二区三区尤物| 国产欧美 在线欧美| 日本一级片免费看| 欧美在线亚洲综合一区| 中文字幕日韩精品在线观看| www.日本高清| 精品日韩毛片| 久久九九全国免费精品观看| 免费黄色片网站| 91精品在线观看国产| 在线成人激情视频| 18禁裸乳无遮挡啪啪无码免费| 日本高清久久| 日韩精品视频在线观看免费| 麻豆视频免费在线播放| 韩国欧美一区| 欧美成人精品不卡视频在线观看| 久久精品这里有| 你懂的成人av| 欧美最猛性xxxxx亚洲精品| 久久综合亚洲色hezyo国产| 国产一区二区你懂的| 日本综合视频| 欧美粗暴jizz性欧美20| 韩国国内大量揄拍精品视频| 亚洲av无码不卡| 国产精品porn| 日韩av电影手机在线| 97超碰人人干| 久久国产欧美日韩精品| 国产精品亚发布| 免费看黄色一级视频| 福利视频网站一区二区三区| 日韩欧美电影一区二区| 国产高清在线看| 亚洲主播在线播放| 国产男女激情视频| 草草视频在线一区二区| 精品福利av导航| 无码人妻一区二区三区免费n鬼沢| 高清一区二区三区av| 日韩精品在线免费观看| 国产女片a归国片aa| 欧美二区不卡| 国产精品人成电影| 国产精品久久久久久无人区 | 狠狠久久伊人| 精品精品国产国产自在线| 蜜臀精品一区二区三区| 久久亚洲国产精品一区二区| 日本久久久久久久久久久| 成人免费视频国产| av午夜一区麻豆| 蜜桃视频成人| 亚洲s色大片| 亚洲免费av观看| 激情五月婷婷六月| 色老头在线一区二区三区| 91久久精品日日躁夜夜躁欧美| 亚洲乱码国产一区三区| 欧洲亚洲精品久久久久| 欧美大片一区二区| 欧美 日本 国产| 色欧美自拍视频| 国产激情综合五月久久| 国产欧美第一页| 91在线国内视频| 一区二区三区四区欧美日韩| 四虎亚洲精品| 欧美午夜片欧美片在线观看| 亚洲 欧美 日韩系列| 欧美中文高清| 久久亚洲综合国产精品99麻豆精品福利| 日本妇女毛茸茸| 国产一区二区三区四区五区美女| 亚洲一区二区三区加勒比| 成人国产激情在线| 中日韩午夜理伦电影免费| www.久久网| 国产精品美女一区二区在线观看| 穿情趣内衣被c到高潮视频| 亚洲三级在线| 亚洲精品狠狠操| 国产美女久久久久久| 夜夜嗨av一区二区三区网站四季av| 国产福利视频一区| 国产区在线视频| 欧美日韩日日骚| 激情综合丁香五月| 乱人伦精品视频在线观看| 亚洲综合视频1区| 肉肉视频在线观看| 日韩风俗一区 二区| 国产精品suv一区| 国产精品人成在线观看免费| 亚洲天堂伊人网| 国语精品一区| 欧美日韩在线精品| 2018av在线| 欧美一激情一区二区三区| 久久人人爽人人爽人人| 久久综合九色综合欧美亚洲| 中文字幕日韩精品无码内射| 欧洲亚洲精品久久久久| 色综合久综合久久综合久鬼88| 中文在线字幕免费观| 91蝌蚪porny| bt天堂新版中文在线地址| 日韩免费电影在线观看| 久久久视频精品| 国产人妖在线播放| 五月综合激情日本mⅴ| 日本人妻一区二区三区| 久久动漫亚洲| 青青草视频国产| 国产精品一区2区3区| 欧美在线一区二区视频| 三级外国片在线观看视频| 欧美精品一区二区三区很污很色的| 久久中文字幕免费| 亚洲免费色视频| 色无极影院亚洲| 欧美一级网站| 91xxx视频| 欧美热在线视频精品999| 3344国产精品免费看| 免费日本一区二区三区视频| 亚洲国产精品一区二区三区| 国产一区二区麻豆| 国产精品区一区二区三区| 日本一级大毛片a一| 国产精品激情电影| 天堂社区 天堂综合网 天堂资源最新版| 欧美xxxxxx| 国产小视频国产精品| 波多野结衣一区二区三区四区| 亚洲美女在线国产| 中字幕一区二区三区乱码| 成人黄色一级视频| 伊人五月天婷婷| 欧美三级网页| 亚洲一区二区在线免费观看| 天堂俺去俺来也www久久婷婷| 亚洲一区二区久久久久久| 99亚洲伊人久久精品影院| 26uuu另类亚洲欧美日本老年| 亚洲wwwww| 久久视频国产精品免费视频在线| 国产在线高清| 亚洲精品天天看| 少妇精品高潮欲妇又嫩中文字幕| 精品久久香蕉国产线看观看亚洲| 泷泽萝拉在线播放| 成人一二三区视频| 人妻熟女一二三区夜夜爱| 欧美日韩亚洲在线观看| 日本欧洲国产一区二区| 亚洲精品一区av| 热草久综合在线| 在线黄色的网站| 伊人久久免费视频| 深夜福利在线看| 欧美日韩精品一二三区| 波多野结衣激情视频| 色哟哟一区二区三区| 五月激情六月丁香| 亚洲午夜影视影院在线观看| 亚洲av无码一区二区三区在线| 亚洲日本在线视频观看| 亚洲欧美色图视频| 99久久精品国产一区| 日本少妇毛茸茸| 91美女在线观看| 蜜桃传媒一区二区亚洲av| 91麻豆国产自产在线观看| 亚洲熟妇无码av| 国产清纯美女被跳蛋高潮一区二区久久w| 男女黄床上色视频| 国产欧美久久久精品影院| www亚洲色图| 中文字幕一区二区三区乱码在线| 超碰caoprom| 99天天综合性| wwwwxxxx国产| 日本一区二区三区久久久久久久久不 | 福利成人导航| 色偷偷av一区二区三区乱| 日本不卡不卡| 欧美高清在线视频观看不卡| h片在线观看下载| 亚洲区中文字幕| 精品人妻一区二区三区麻豆91| 日韩女优电影在线观看| 婷婷丁香花五月天| 亚洲色图av在线| 久久bbxx| 一区二区日韩精品| 91短视频版在线观看www免费| 久久天天躁狠狠躁老女人| 欧美hdxxx| 伦理中文字幕亚洲| ririsao久久精品一区| 国产成+人+综合+亚洲欧洲 | 五月婷婷婷婷婷| 亚洲激情在线激情| 波兰性xxxxx极品hd| 久久久精品国产99久久精品芒果| 人妻精品久久久久中文字幕69| 成人激情黄色小说| 影音先锋制服丝袜| 亚洲黄一区二区三区| 国产精品视频123| 欧美一区二区三区公司| 中文字幕乱码人妻二区三区| 日韩欧美在线123| 久草视频视频在线播放| 大胆欧美人体视频| 亚洲精品福利电影| 91在线观看免费观看| 亚洲欧美在线人成swag| 国产精品日韩二区| 欧美综合一区| 亚洲.欧美.日本.国产综合在线| 91精品久久久久久久久久不卡| 精品久久一二三| 精品亚洲国产成人av制服丝袜| 国产又黄又粗又猛又爽的视频 | 欧洲亚洲两性| www.久久艹| 天堂美国久久| 日本xxxxxxx免费视频| 高清不卡一区二区| 午夜三级在线观看| 亚洲三级在线播放| 毛片毛片女人毛片毛片| 欧美v日韩v国产v| 欧美另类极品| 国产精品27p| 欧美亚视频在线中文字幕免费| 国产区一区二区| 日本三级久久| 成人免费看片'免费看| 久久精品国产99国产| 国产熟妇久久777777| 亚洲五月六月丁香激情| 国产视频一二三四区| 中文字幕9999| 欧美aaa视频| 成人观看高清在线观看免费| 日韩在线你懂的| 九色自拍视频在线观看| 国产精品456| 一二三不卡视频| 一区二区高清在线| 国产一区二区在线播放视频| 中文字幕欧美日韩va免费视频| 欧美xxx网站| 日本成人黄色| 日韩电影在线观看网站| 日韩 国产 一区| 亚洲欧洲精品成人久久奇米网| 久久久久久国产精品免费播放| 欧美精品亚洲二区| 婷婷五月在线视频| 国产精品香蕉在线观看| 日韩在线欧美| 久久国产这里只有精品| 成人美女视频在线看| 欧美日韩三级在线观看| 日韩欧美色综合| 欧美6一10sex性hd| 国产精品乱码一区二区三区| 国模 一区 二区 三区| 日本50路肥熟bbw| 午夜精品久久久久影视| 亚洲三级黄色片| 久久精品国产亚洲精品| 97精品资源在线观看| 一级特黄妇女高潮| 懂色av噜噜一区二区三区av| 黄色小视频在线免费看| 亚洲美女av在线播放| a视频在线播放| 日产精品99久久久久久| 国产亚洲精品美女久久久久久久久久| 苍井空浴缸大战猛男120分钟| 久久精品日产第一区二区三区高清版 | 亚洲欧洲性图库| 国产视频www| 97久久精品视频| 欧美色女视频| 人妻换人妻仑乱| 中文字幕成人av| 国产三级视频在线播放| 久久久久久91香蕉国产| 四虎国产精品永久在线国在线| 99久久久无码国产精品性色戒| 成人丝袜18视频在线观看| 成年人视频在线免费看| 中文字幕欧美在线| 视频在线一区| 欧美日韩中文在线视频| 亚洲欧美一区二区三区久本道91 | 国产亚洲视频在线观看| 午夜精品久久久久久毛片| 99国产精品白浆在线观看免费| 91欧美激情一区二区三区成人| 中文字幕av片| 欧美精品九九久久| 国产一区二区三区电影在线观看| 精品亚洲视频在线| 精品二区三区线观看| 三级外国片在线观看视频| 国产精品日韩二区| 另类中文字幕网| 日韩av电影网| 亚洲精品一区二区三区99| 国模一区二区| 轻点好疼好大好爽视频| 国产日产欧美精品一区二区三区| 国产三级第一页|