精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国模娜娜一区二区三区| 亚洲精品观看| 成人网在线播放| 久久久精品久久久久| 88av.com| 经典三级在线| 国产精品久久久久久久免费软件| 日韩女优av电影| 中文字幕一区二区三区四区五区人| 中文字幕手机在线视频| 五月天亚洲色图| 五月婷婷激情综合网| 国产精品久久久久av福利动漫| 蜜臀久久精品久久久用户群体| 91麻豆精品国产综合久久久| 国产精品久久久久一区二区三区| 国产精品久久久久久久久久| 欧美波霸videosex极品| 日本另类视频| 国产精品久久久久久久浪潮网站 | 国产在线视频二区| 国产精品22p| 亚洲一区二区三区四区在线观看| 成人一区二区在线| 久久精品人妻一区二区三区| 精品国产一区二区三区不卡蜜臂 | 日韩在线观看视频免费| 一区二区免费av| 黄色av免费在线| 国产麻豆91精品| 欧美日本中文字幕| 日本少妇xxxx| 亚洲精品88| 亚洲国产成人在线| 成人情趣片在线观看免费| 一区二区成人免费视频| 亚洲电影一区| 欧美日韩国产一中文字不卡| 欧美一区2区三区4区公司二百| 中文字幕免费高清在线观看| 91tv官网精品成人亚洲| 欧美成人福利视频| 免费一级特黄毛片| 精品视频二区| 国产精品资源在线看| 久久久女人电视剧免费播放下载 | 亚洲免费一级视频| 中文字幕免费高清电视剧网站在线观看| 成人激情免费电影网址| 国产精品成人国产乱一区| 成人性生活毛片| 偷拍自拍一区| 91精品欧美综合在线观看最新 | 欧美成人免费网站| 美女福利视频在线| 国产盗摄在线观看| 91色porny在线视频| 国产精品影片在线观看| 久久午夜无码鲁丝片午夜精品| 天堂资源在线亚洲| 6080午夜不卡| 青青青在线播放| 在线电影福利片| 中文字幕成人av| 狠狠色综合一区二区| 一级片视频播放| 午夜亚洲福利在线老司机| 麻豆乱码国产一区二区三区| 性高潮久久久久久久| 亚洲啊v在线免费视频| 欧美日韩一区二区三区高清| 好吊色视频988gao在线观看| 黄色网址在线播放| 成人av电影在线网| 成人黄色av网站| 无码免费一区二区三区| 亚洲视频碰碰| 久久精品视频网站| 欧美18—19性高清hd4k| 国产人妖ts一区二区| 91精品国产入口在线| 超碰在线97免费| 欧美91看片特黄aaaa| 亚洲午夜久久久久中文字幕久| 影音先锋欧美在线| a黄色在线观看| 久久久国产午夜精品| 好吊色欧美一区二区三区| 不卡视频免费在线观看| 激情六月婷婷久久| 国产精选久久久久久| 中文字幕一区二区三区四区欧美| 亚洲日本激情| 欧美激情亚洲国产| 久操免费在线视频| 欧美精品入口| 欧美放荡办公室videos4k| 紧身裙女教师波多野结衣| 欧美电影免费| 日韩视频第一页| 91香蕉视频在线播放| 成人区精品一区二区婷婷| 亚洲人成电影在线| 一区二区精品免费| 久久99视频| 国产丝袜一区二区三区| 亚洲av成人精品一区二区三区| 欧美2区3区4区| 欧美日韩久久一区| 中文字幕线观看| 国产成年精品| 91精品国产高清一区二区三区蜜臀 | 久久久久久高清| 天堂成人在线观看| 99精品偷自拍| 日韩欧美三级电影| 欧美三级电影一区二区三区| 亚洲日穴在线视频| 91午夜在线观看| 九色porny丨首页入口在线| 欧美日韩一区二区三区在线免费观看| 97成人在线观看视频| 97精品国产综合久久久动漫日韩| 欧美私人免费视频| 亚洲综合123| 99精品国产一区二区三区2021| 精品国产精品网麻豆系列| 中文字幕第3页| 国产麻豆精品久久| 三级精品视频久久久久| 破处女黄色一级片| 亚洲欧洲日本一区二区三区| 日本免费久久高清视频| 一区精品在线观看| 国产成人精品免费| 久久视频在线观看中文字幕| a天堂中文在线| 一区二区三区日韩欧美精品| 国产乱子伦农村叉叉叉| 日本少妇一区| 欧美成人猛片aaaaaaa| 狠狠人妻久久久久久综合蜜桃| 国产亚洲电影| 久久成人国产精品| 国产伦精品一区二区三区视频网站| 蜜臀久久久久久久| 国内精品二区| 免费黄色在线观看| 五月婷婷色综合| 奇米视频888| 欧美91在线| 久久久999国产精品| 香蕉免费毛片视频| 久久精品久久综合| 精品国产免费人成电影在线观...| 99re在线视频| 精品日韩中文字幕| 又黄又爽又色的视频| 国产一区二区观看| 国外成人在线视频| 国产精品久久无码一三区| 99久久精品国产毛片| 一道本在线观看视频| 国产精品粉嫩| 亚洲第一天堂av| 免费中文字幕在线| 蜜芽一区二区三区| 欧美一级日本a级v片| 草草在线视频| 日韩精品最新网址| 婷婷国产成人精品视频| 午夜综合激情| 国产欧美丝袜| 日韩激情av| 91精品麻豆日日躁夜夜躁| 国产成人精品无码免费看夜聊软件| 好看的日韩av电影| 92福利视频午夜1000合集在线观看| 国内av一区二区三区| 偷拍一区二区三区四区| 国产ts在线观看| 亚洲字幕久久| 91免费看片在线| 免费av在线网址| 欧美日韩亚洲综合一区二区三区 | 亚洲国产精品成人综合色在线婷婷 | **亚洲第一综合导航网站| av电影在线观看网址| 在线精品亚洲一区二区不卡| 国产成人无码一区二区在线观看| 精品白丝av| 国产精品.com| 国产理论电影在线| 精品国产伦一区二区三区免费| 91 在线视频| 狠狠色伊人亚洲综合成人| 影音先锋欧美资源| 成人污版视频| 欧美大奶子在线| 国产丰满美女做爰| 亚洲愉拍自拍另类高清精品| 无码人妻久久一区二区三区蜜桃| 欧美日韩亚洲一区二区三区在线| 亚洲a区在线视频| 97超碰资源站在线观看| 欧美不卡在线视频| 国产成人精品av久久| caoporm超碰国产精品| 欧美精品久久久久久久免费| 欧洲在线一区| 国产ts一区二区| 成人h小游戏| 3d动漫精品啪啪一区二区竹菊 | 一区二区在线| 99久久无色码| av在线最新| 亚洲午夜小视频| 97人妻精品一区二区三区| 一区二区三区中文在线观看| 国产乱国产乱老熟300部视频| 亚洲精品美女91| 欧美成人免费在线| 欧美成a人片免费观看久久五月天| www日韩欧美| 亚洲精品国产suv一区| 精品久久久一区二区| 在线观看国产精品一区| 国产在线视视频有精品| 日韩伦理在线免费观看| 久久不见久久见免费视频7| 国产精品一区二区电影| 影院在线观看全集免费观看| 亚洲加勒比久久88色综合| 中文字幕精品无| 亚洲精品久久久久久国产精华液| av av在线| 日本不卡123| 成人区一区二区| 国产日产一区| 91pron在线| 亚洲欧美一区二区三区| 俺也去精品视频在线观看| 黄色小视频免费观看| 色88888久久久久久影院野外| 欧美手机在线观看| 91麻豆123| 免费高清视频在线观看| 午夜一级在线看亚洲| 亚洲成人动漫在线| 亚洲小说图片视频| 春色成人在线视频| se69色成人网wwwsex| 欧美极品美女电影一区| av电影在线观看| 国产视频一区在线| 成 人片 黄 色 大 片| 在线免费一区三区| 国产一级大片在线观看| 国产精品视频一二三| 小毛片在线观看| 韩国三级中文字幕hd久久精品| 国产精品裸体瑜伽视频| 一本一道久久综合狠狠老| 欧美日韩天天操| 99久久人爽人人添人人澡| 国产色婷婷国产综合在线理论片a| h片在线观看视频免费| 久久国内精品一国内精品| 毛片免费在线播放| 亚洲国产精品99| av中文字幕免费在线观看| 欧美影片第一页| 最新中文字幕一区| 亚洲成人免费在线| 极品颜值美女露脸啪啪| 一区视频在线播放| 中字幕一区二区三区乱码| wwwwww.欧美系列| xfplay5566色资源网站| 国产精品88av| 四虎成人在线播放| 国产一区在线看| 亚洲精品20p| 久久国产麻豆精品| 日韩欧美黄色大片| 久色成人在线| 国产av无码专区亚洲精品| 亚洲乱码视频| 日日摸日日碰夜夜爽无码| 亚洲欧美亚洲| 一本二本三本亚洲码 | 韩国无码av片在线观看网站| 久久伦理在线| 亚洲欧美国产不卡| blacked蜜桃精品一区| 欧美一区二区视频17c| 国产91久久精品一区二区| 久久久久se| 亚洲精品国产动漫| 欧美日本韩国国产| 国产永久精品大片wwwapp| 欧美在线激情| 成人a'v在线播放| 亚洲欧美日韩另类精品一区二区三区 | 中文字幕在线有码| 伊人一区二区三区| www青青草原| 亚洲一区二区在线播放相泽| 久久久久无码精品国产| 五月综合激情网| 人人草在线观看| 欧美视频日韩视频在线观看| 中文在线最新版天堂| 91精品国产综合久久婷婷香蕉| 99国产成人精品| 精品人在线二区三区| 天堂在线资源网| 亚洲欧美综合区自拍另类| 狠狠狠综合7777久夜色撩人| 中文字幕最新精品| 最新日本在线观看| 性欧美xxxx交| 免费观看成人性生生活片 | 黄色福利在线观看| 精品呦交小u女在线| 成年人在线免费观看| 久久久精品一区二区三区| 欧美日韩在线视频免费观看| 97久久精品国产| 性欧美videohd高精| 91在线免费看网站| 台湾佬综合网| 懂色av一区二区三区四区五区| 精品av久久久久电影| 91蝌蚪视频在线观看| 国产成人自拍网| 在线免费观看麻豆| 亚洲视频在线一区观看| 中文字幕第15页| 欧美一区二区三区视频免费| 天堂网在线观看视频| 日韩中文字幕国产精品| wwww在线观看免费视频| 国产精品第一视频| 久久综合偷偷噜噜噜色| 欧美一级爱爱| 一区免费在线| 污污的视频免费| 99这里只有精品| 日本精品人妻无码77777| 欧美日韩亚洲网| 国内精品久久久久久久久久久| 亚洲男人av在线| 天堂亚洲精品| 国产精品视频区| 香蕉久久夜色精品国产使用方法 | 亚洲第一福利网| 视频三区在线| 欧美孕妇毛茸茸xxxx| 日本99精品| 永久久久久久| 日本最新不卡在线| 黄色片视频免费观看| 亚洲精品国产品国语在线app| 高潮毛片又色又爽免费| 精品对白一区国产伦| 蜜桃av在线免费观看| 日韩av电影免费观看高清| 成人三级av在线| 浴室偷拍美女洗澡456在线| 青青草97国产精品免费观看无弹窗版| 无码人妻一区二区三区在线| 亚洲视频一二三区| 中日韩在线观看视频| 国产丝袜高跟一区| 极品在线视频| 国产九区一区在线| 欧美日韩亚洲一区二区三区在线| 99精品999| 136国产福利精品导航| 中文人妻熟女乱又乱精品| 亚洲一区www| 新片速递亚洲合集欧美合集| 蜜桃视频成人| 国产欧美短视频| 国产日韩视频一区| 夜夜夜精品看看| 超碰福利在线观看| 久久99久久久久久久噜噜| 成年永久一区二区三区免费视频 | 成年人视频在线免费观看| 欧美一区深夜视频| 日韩影视高清在线观看| 97成人在线免费视频| 不卡免费追剧大全电视剧网站| 久久人人爽人人爽人人| 欧美va日韩va| 91福利在线免费| 久久精品国产美女| 男女精品网站|