自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

挨踢部落直播課堂第三期:國內(nèi)首例談MySQL InnoDB memcached plugin實(shí)踐

原創(chuàng)
移動(dòng)開發(fā)
遠(yuǎn)程控制技術(shù)背后有哪些數(shù)據(jù)需求?如何用緩存技術(shù)存儲(chǔ)實(shí)時(shí)數(shù)據(jù)?新緩存體系不穩(wěn)定怎么辦?MySQL InnoDB memcached plugin出來挺久的了,網(wǎng)上還沒見到國內(nèi)有把它用到生產(chǎn)環(huán)境的實(shí)例,我們特此邀請(qǐng)到向日葵技術(shù)總監(jiān)張小峰老師做直播分享。

【51CTO.com原創(chuàng)稿件】遠(yuǎn)程控制技術(shù)背后有哪些數(shù)據(jù)需求?如何用緩存技術(shù)存儲(chǔ)實(shí)時(shí)數(shù)據(jù)?新緩存體系不穩(wěn)定怎么辦?MySQL InnoDB memcached plugin出來挺久的了,網(wǎng)上還沒見到國內(nèi)有把它用到生產(chǎn)環(huán)境的實(shí)例,我們特此邀請(qǐng)到向日葵技術(shù)總監(jiān)張小峰老師做直播分享。

直播間:QQ群370892523、②群312724475、③群542270018、④群627843829

內(nèi)容簡(jiǎn)介:應(yīng)用背景介紹、向日葵遠(yuǎn)程控制技術(shù)的數(shù)據(jù)需求、緩存優(yōu)化史、從memcached到ttserver、memcached、Ttserver、MySQL InnoDB memcached plugin等。

昨天看到群里有人說運(yùn)維就是把程序員的代碼copy到服務(wù)器上,我覺得完全不是這樣的,至少在我們這里不是;只會(huì)上程序的運(yùn)維是不合格的,他要能在現(xiàn)有程序上優(yōu)化系統(tǒng)結(jié)構(gòu),能對(duì)開發(fā)提出當(dāng)前的不足以及優(yōu)化方案和為運(yùn)維服務(wù)的開發(fā)需求。

(一)應(yīng)用背景介紹

作為提供各種互聯(lián)網(wǎng)服務(wù)且具有海量用戶的的Oray,我們也一直在實(shí)踐各種新技術(shù)新架構(gòu);緩存方面我們從memcached、ttserver、redis等都有較多應(yīng)用,其中redis我們的dns體系中有著很深度的集成使用;MySQL InnoDB memcached plugin出來挺久的了,網(wǎng)上還沒見到國內(nèi)有把它用到生產(chǎn)環(huán)境的實(shí)例,我今天就給大家說下小白鼠體驗(yàn)。

創(chuàng)始產(chǎn)品花生殼是個(gè)簡(jiǎn)單的動(dòng)態(tài)域名產(chǎn)品,用戶可以用它發(fā)布自己的各類服務(wù),從網(wǎng)站到各類專用數(shù)據(jù)連接;就算在中國互聯(lián)網(wǎng)環(huán)境如此殘酷同時(shí)IPv4資源在不斷萎縮的今天,這個(gè)產(chǎn)品還在不斷的發(fā)展壯大。雖然表面看起來是個(gè)簡(jiǎn)單的工具軟件,但它為中國一代代的互聯(lián)網(wǎng)人解決了很多基礎(chǔ)的連接問題!

但很大一部分用戶使用我們的花生殼也就是為了遠(yuǎn)程操作電腦,所以2010年,在我們埋頭苦干了1年多后推出了向日葵遠(yuǎn)程控制產(chǎn)品,這個(gè)產(chǎn)品的基本功能就是讓用戶不需要關(guān)心IP端口等技術(shù)知識(shí)就可以遠(yuǎn)程管理控制他的所有電腦,這個(gè)產(chǎn)品主要依賴以下技術(shù):

通過關(guān)系型數(shù)據(jù)庫管理用戶主機(jī)清單;

使用長連接維持被控在線狀態(tài);

P2P通信技術(shù)傳輸控制信號(hào)以及圖像信號(hào);

優(yōu)化的算法盡可能的降低用戶帶寬占用以及提高圖像質(zhì)量;

其他周邊技術(shù),如HTML5免插件遠(yuǎn)程控制、遠(yuǎn)程開機(jī)等。

客戶端、操作系統(tǒng)以及相關(guān)遠(yuǎn)控技術(shù)問題我們今天先不探討,向日葵也不是一個(gè)簡(jiǎn)單的C/S結(jié)構(gòu)軟件,我們需要像聊天服務(wù)器那樣與客戶端進(jìn)行實(shí)時(shí)交互,而客戶端在線量一直在兇猛的增長中,我們的系統(tǒng)以及運(yùn)維和開發(fā)團(tuán)隊(duì)也就不停的迭代并成長。

(二)向日葵遠(yuǎn)程控制技術(shù)的數(shù)據(jù)需求

上面提到,向日葵使用關(guān)系型數(shù)據(jù)庫存貯某一個(gè)用戶擁有哪些主機(jī),以及這些主機(jī)的具體相關(guān)信息;在此同時(shí),我們也需要臨時(shí)存儲(chǔ)一些關(guān)鍵的實(shí)時(shí)數(shù)據(jù):

主機(jī)鑒權(quán)信息

主機(jī)在線狀態(tài)

如何連接主機(jī)

其實(shí)剛發(fā)布向日葵的幾個(gè)月我們是把它們同時(shí)放在關(guān)系數(shù)據(jù)庫里的,那個(gè)時(shí)候主要考慮的也不是服務(wù)端的性能問題,而是整個(gè)系統(tǒng)跑通,只是我們的數(shù)據(jù)庫后來吃不消了,這一段經(jīng)歷不長,說真的也沒啥好講的。

(三)緩存優(yōu)化史

既然存在關(guān)系數(shù)據(jù)庫中不合適,我們就開始用各種緩存技術(shù)來存儲(chǔ)這種實(shí)時(shí)數(shù)據(jù)。

(三.1)從memcached到ttserver

(三.1.1)memcached

***代的主機(jī)狀態(tài)數(shù)據(jù)緩存化,我們把它放在了memcached,整個(gè)客戶端的登陸過程是這樣的(里頭略去了各種錯(cuò)誤處理及異常以及各種附屬架構(gòu),比如負(fù)載均衡或者備份等):

登錄過程

把狀態(tài)等需要頻繁訪問的數(shù)據(jù)放到緩存后,這個(gè)大框架到現(xiàn)在也還基本上是這樣,API負(fù)責(zé)所有跟持久化DB的交互操作,長連接只負(fù)責(zé)跟memcached的通信,這樣也避免了我們的DB有過多角色參與讀寫;另外這個(gè)時(shí)候我們只有一臺(tái)memcached服務(wù)器,因?yàn)槲覀兯氵^16G內(nèi)存大約可以放上億的主機(jī)信息。但這些數(shù)據(jù)跑memcached真的合適嗎?

在經(jīng)歷了兩次memcached崩潰后我們也崩潰了,memcached的數(shù)據(jù)是完全放在內(nèi)存里的,崩潰后所有主機(jī)全部會(huì)變成不在線且只能通過重啟所有服務(wù)器解決,而重啟所有服務(wù)器意味著所有原先在線客戶端都得全部重新登陸一次,這個(gè)過程會(huì)極其漫長,以小時(shí)計(jì)的。

(三.1.2)ttserver

我們要改進(jìn)了,順其自然的,我們想到了ttserver,ttserver可以在崩潰重啟后恢復(fù)數(shù)據(jù)且具備主備同步功能,而丟失那部分?jǐn)?shù)據(jù)我們可以在客戶端登陸時(shí)從DB里自動(dòng)恢復(fù)出來;

由于ttserver跟memcached通信協(xié)議上完全兼容,但為了避免全局性的災(zāi)難,我們?cè)谕瓿啥郼ache服務(wù)優(yōu)化后,新系統(tǒng)很快就上線了。

新緩存體系的結(jié)構(gòu)長這樣的:

ttserver

完全堆疊式的設(shè)計(jì),理論上也是可以***擴(kuò)容的,但我們沒意識(shí)到ttserver幾個(gè)大問題:

ttserver不支持key過期的,需要開啟table database模式,并通過lua腳本的方式來實(shí)現(xiàn),但該模式ttserver的運(yùn)行性能相當(dāng)差,并且在數(shù)據(jù)很大的時(shí)候出現(xiàn)不穩(wěn)定的現(xiàn)象。

這個(gè)不穩(wěn)定現(xiàn)象我們不湊巧也遇到了:由于它會(huì)自動(dòng)把不頻繁讀寫的數(shù)據(jù)swap到磁盤,它倒不會(huì)像memcached那樣容易崩潰,但它會(huì)偶爾神經(jīng)質(zhì)似的卡;卡到什么程度呢:手工上去敲個(gè)get,大概要幾百ms才會(huì)得到結(jié)果;而我們對(duì)ttserver做了很多優(yōu)化依舊于事無補(bǔ)。前兩次卡死,重啟能解決,但后來,我們不得不把它保存的文件徹底刪除才能恢復(fù)性能,這不又回到了memcached時(shí)代嗎?怎么辦?

(三.2)MySQL InnoDB memcached plugin

在我們出現(xiàn)ttserver危機(jī)的時(shí)候,已經(jīng)沒有什么能讓我更絞盡腦汁的事情了,天天到各社區(qū)調(diào)研,某個(gè)偶然的機(jī)會(huì),我看到了MySQL居然支持memcached插件,這真是個(gè)神奇的組合:

傳統(tǒng)關(guān)系型數(shù)據(jù)庫在大數(shù)據(jù)時(shí)代的性能與擴(kuò)展,離不開內(nèi)存與分布式這兩大主題。

在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中,Oracle的Timesten,SQL Server的Hekaton,都是選擇與內(nèi)存數(shù)據(jù)庫相集合,但實(shí)際上卻少有突出的應(yīng)用場(chǎng)景。而MySQL嵌入nosql ,在性能與管理、分析上達(dá)到互補(bǔ),則是更為有意義的結(jié)合。

MySQL5.6.6后開始內(nèi)嵌 memcached 的支持,在MySQL 5.7較新的版本性能大幅提升,有測(cè)試表明在48核只讀環(huán)境下QPS可以達(dá)到百萬以上。

借用下MySQL官方的結(jié)構(gòu)圖:

結(jié)構(gòu)圖

我們先來看一下memcached plugin的安裝:

下載mysql5.7.17 源碼包 wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-5.7.17-1.el6.src.rpm

因?yàn)槭且粋€(gè)插件,開啟memcached plugin功能,需要在編譯安裝時(shí)添加:

-DWITH_INNODB_MEMCACHED=ON

安裝

安裝啟動(dòng)后執(zhí)行配置:

5

6

 

memcached plugin相關(guān)配置表:
innodb_memcache.config_options --配置分割符、引用符
innodb_memcache.cache_policies --根據(jù)需要設(shè)置緩存策略
innodb_memcache.containers --設(shè)置表結(jié)構(gòu):key、value大小,過期時(shí)間等

在mysql的配置文件my.cnf中通常需要設(shè)置以下參數(shù)(注意在啟動(dòng)插件后配置,否則mysqld啟動(dòng)報(bào)錯(cuò)),主要是配置分配給memcached 的內(nèi)存大小以及開啟寫binlog,如果需要指定其他端口,如11212 在loose-daemon_memcached_option參數(shù)添加 ' -p11212' 

而daemon_memcached_r_batch_size、daemon_memcached_w_batch_size 默認(rèn)為1,這里也建議設(shè)置為1:

7

MySQL memcached plugin 特點(diǎn):

1.數(shù)據(jù)直接讀寫請(qǐng)求innodb存儲(chǔ)引擎,不需要經(jīng)過SQL層,不需要進(jìn)行解析編譯。

2.由MySQL buffer pool 管理內(nèi)存緩存數(shù)據(jù)。

3.可以把數(shù)據(jù)存入多個(gè)表,可進(jìn)行多列數(shù)據(jù)合并為一個(gè)value。

4.可以通過SQL對(duì)數(shù)據(jù)進(jìn)行查詢、分析、維護(hù)。(在過期時(shí)間字段添加索引,通過mysql job進(jìn)行過期數(shù)據(jù)刪除)

5.可以利用MySQL靈活的主從架構(gòu)。

性能測(cè)試對(duì)比:

我們采用4核進(jìn)行測(cè)試對(duì)比,MySQL memcached plugin 與 ttserver (hash模式)性能相當(dāng),QPS可以達(dá)到7萬/秒。比 ttserver (btree模式)高出3倍以上。

memaslap的測(cè)試存在一些缺陷,這里僅供大致參考:

8

實(shí)際上,在網(wǎng)絡(luò)延遲上,QPS性能將大打折扣,所以要將應(yīng)用部署在同個(gè)內(nèi)網(wǎng)以降低網(wǎng)絡(luò)延遲瓶頸,輕松應(yīng)對(duì)每天上億次的QPS請(qǐng)求,在接近1萬/s的QPS并發(fā)訪問下依舊表現(xiàn)穩(wěn)定。

以下是其中一個(gè)MySQL Memcahced 運(yùn)行情況:

運(yùn)行

在我們一個(gè)很NB的DBA的設(shè)計(jì)和操控下,新架構(gòu)上線還是比較順利的:

10

大家注意到,圖中多了一個(gè)角色,magent,在這次架構(gòu)優(yōu)化中,我們?cè)趹?yīng)用和MySQL memcached中間加了一層magent,這東西大家百度下到處都有介紹,但原版其實(shí)是有不少bug的,比如buffer大小問題;加上這東西的好處:

1、通過對(duì)magent的改造,實(shí)現(xiàn)HA,當(dāng)ma后端cache某一臺(tái)down掉后ma可以自動(dòng)切換;系統(tǒng)管理員晚上終于可以安心的睡覺了。

2、MySQL memcached plugin 不支持multi get/set (在未來的版本中會(huì)支持)。通過magent解決。

3、由于mysql memcached plugin 存在一些bug,5.7.18做了一些修復(fù),但不夠完善。借助magent便于控制和維護(hù)。

此架構(gòu)優(yōu)勢(shì):

擴(kuò)展性強(qiáng)。逐步提升應(yīng)對(duì)高并發(fā),采取多主架構(gòu),配合magent實(shí)現(xiàn)高可用。

我們做的優(yōu)化:

MySQL 5.7.17 前的版本,不建議設(shè)置 daemon_memcached_r_batch_size 大于1,容易遭遇 bug 導(dǎo)致 MySQL Crashed。同時(shí)建議innodb_api_bk_commit_interval設(shè)置為稍大一點(diǎn)的值。默認(rèn)為5。存在get會(huì)話的情況下,對(duì) daemon_memcached 插件進(jìn)行重啟,也會(huì)導(dǎo)致MySQL Crashed,重啟插件時(shí)要確保沒有其他會(huì)話。

禁止flush_all權(quán)限操作:

 update cache_policies set flush_policy='disabled';

尾聲

其實(shí)上面說了那么多細(xì)節(jié)抑或還不夠細(xì)節(jié)的東西,都是圍繞著緩存架構(gòu)的優(yōu)化。在這么多年從事軟硬開發(fā)與架構(gòu)設(shè)計(jì)的實(shí)際工作中,我深刻的體會(huì)到架構(gòu)的重要性,不管多NB的代碼和算法,多NB的硬件,系統(tǒng)架構(gòu)不好的話你的運(yùn)行結(jié)果一樣糟糕。這里的架構(gòu)不僅僅包含服務(wù)器層面以及系統(tǒng)運(yùn)維上的,架構(gòu)無處不在,從軟件架構(gòu)到硬件架構(gòu),從網(wǎng)站架構(gòu)到數(shù)據(jù)庫架構(gòu),從通信架構(gòu)到服務(wù)整體架構(gòu),包括本文提到的緩存架構(gòu),甚至細(xì)化到C++開發(fā)層的class封裝與相互調(diào)用,都有著架構(gòu)及其優(yōu)化的存在。做任何一件部署與實(shí)際的開發(fā)前,我們都要有做好架構(gòu)這個(gè)潛在意識(shí),去考慮一個(gè)好的架構(gòu)再動(dòng)手構(gòu)建,當(dāng)然我們都不可避免的會(huì)踩到坑,不要害怕,持續(xù)改進(jìn)就好。

正是這樣的態(tài)度下,我們又相繼推出無網(wǎng)遠(yuǎn)控的硬件“向日葵控控”這樣創(chuàng)新性的產(chǎn)品。有了這一路走來的經(jīng)驗(yàn),不管產(chǎn)品從軟件延伸硬件,我們也有自己的一套優(yōu)化方案,有機(jī)會(huì)我們繼續(xù)分享。

11

Q&A

1、Q:PHP-watson-廣州::現(xiàn)有的架構(gòu)與redis對(duì)比起來,有什么優(yōu)勢(shì)和不足?

A:向日葵-技術(shù)總監(jiān)-上海redis不是個(gè)架構(gòu),包括今天說的mysql memcached plugin也不是架構(gòu)。它們只是個(gè)組件,系統(tǒng)關(guān)鍵組件而已。我們dns、花生殼后端確實(shí)是redis。

redis單線程設(shè)計(jì)機(jī)制只能利用一個(gè)核,CPU利用度有限,我認(rèn)為在高并發(fā)上比不上memcached,并且對(duì)數(shù)據(jù)比較大的情況性能不是很好,內(nèi)存使用率管理上也沒有memcached優(yōu)秀,value在大于1k之后性能下降明顯。

Q:python運(yùn)維開發(fā)_howhy假如后端一個(gè)mysqlmemcach  master down了 slave會(huì)自動(dòng)切換嗎?如果服務(wù)器重啟了呢?緩存還會(huì)在嗎?緩存都存進(jìn)數(shù)據(jù)庫了?其實(shí)也是存在數(shù)據(jù)庫一個(gè)表里了。

A:向日葵-技術(shù)總監(jiān)-上海會(huì)在,我們用magent實(shí)現(xiàn)了mha類似功能。目前運(yùn)行狀況還不錯(cuò)。

Q:python運(yùn)維開發(fā)_howhy主從自動(dòng)切換用的什么?

A:向日葵-技術(shù)總監(jiān)-上海也是magent。我們用magent實(shí)現(xiàn)了mha類似功能。目前運(yùn)行狀況還不錯(cuò)。

Q:數(shù)據(jù)庫管理-矢神-廣州在mysql里還可以對(duì)數(shù)據(jù)進(jìn)行分析,這也是其他緩存數(shù)據(jù)庫難以做到的?

A:向日葵-技術(shù)總監(jiān)-上海對(duì)。

歡迎掃描加群學(xué)習(xí)

51CTO開發(fā)者交流群④群 627843829

 

【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】

責(zé)任編輯:何星 來源: 51CTO
相關(guān)推薦

2017-03-15 15:11:52

開發(fā)者

2017-09-01 11:26:51

開發(fā)者管理員招募

2017-07-19 16:13:45

開發(fā)者故事IT技能職場(chǎng)經(jīng)驗(yàn)

2017-08-16 16:58:38

運(yùn)維直播遠(yuǎn)程控制

2017-02-15 17:12:52

2018-04-18 10:46:29

AI

2017-01-17 14:01:18

大數(shù)據(jù)框架結(jié)構(gòu) 數(shù)據(jù)源

2017-11-30 09:20:06

2018-03-07 16:52:50

編程函數(shù)

2017-12-13 17:34:06

人機(jī)交互

2017-09-11 14:08:50

技術(shù)坐診

2017-07-12 14:21:41

技術(shù)坐診

2020-03-02 17:17:15

戴爾

2017-05-09 10:49:49

政府 CIO

2017-04-25 15:39:30

開發(fā)者故事

2017-04-07 16:44:43

開發(fā)者

2017-05-10 15:43:53

開發(fā)者

2017-06-08 14:43:00

開發(fā)者

2017-08-11 16:20:36

技術(shù)坐診

2017-09-28 17:46:44

技術(shù)坐診
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)