posts - 3, comments - 0, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2011年12月9日

             原文地址
              這次是Fotolog的經(jīng)驗,傳說中比Flickr更大的網(wǎng)站,F(xiàn)otolog在21臺服務器上部署了51個memcached實例,總計有254G緩存空間可用,緩存了多達175G的內容,這個數(shù)量比很多網(wǎng)站的數(shù)據(jù)庫都要大的多,原文是A Bunch of Great Strategies for Using Memcached and MySQL Better Together,我這里還是選擇性的翻譯以及按照我的理解補充,感謝Todd Hoff,總能給我們一些學習的案例,從這里也能看出國外技術的開放態(tài)度,不似我們,其實就那么點小九九還藏著掖著,好了,進入正題。

              
          一、關于memcached

            還不知道這個?那你去面試的時候要吃虧了,趕緊去官方網(wǎng)站看一下http://www.danga.com/memcached/,另外google一下用法,硬盤總是太慢,把數(shù)據(jù)存在內存里面吧,如果你只有一臺服務器,推薦用一下APC(Facebook在用)或者eaccelerator或者Xcache(國人開發(fā)的),這些產(chǎn)品單機效果更好,如果你需要分布式的緩存方案,那么用memcached吧。

              二、memcached如何與mysql并肩作戰(zhàn)?
              
              «  通過數(shù)據(jù)庫分片來解決數(shù)據(jù)庫寫擴展的問題把數(shù)據(jù)庫分片,部署到不同的服務器上,免得只有一個主服務器,寫操作成為瓶頸以及可能有的“單點故障”,一般的數(shù)據(jù)庫分片主要是按照業(yè)務          來 分,盡可能的拆分業(yè)務,不相干的都獨立起來做成服務也好
              «  前端mysql和一堆memcached服務器來應付讀的問題應用程序首先從memcached中獲取數(shù)據(jù),獲取不到再從數(shù)據(jù)庫中獲得并保存在memcached中,以前看過一篇文章說好的應用95%的數(shù)          據(jù)從memcache的中獲得,3%的數(shù)據(jù)從mysql的query cache中獲得,剩下2%才去查表,對比一下你的應用,差距有多遠?
              «  通過mysql復制(master-slave)來解決讀的問題
                  首先mysql數(shù)據(jù)庫通過master-slave讀寫分離,多個slave來應對應用程序讀的操作。
              三、為什么不用mysql的query cache?

           我們都知道m(xù)ysql有個query cache,可以緩存上次查詢的結果,可實際上幫不上太多的忙,下面是mysql quety cache的不足:
              « 只能有一個實例,
                 意味著你能存儲內容的上限就是你服務器的可用內存,一臺服務器能有多少內存?你又能存多少呢?
              « 只要有寫操作,mysql的query cache就失效
              « 只要數(shù)據(jù)庫內容稍有改變,那怕改變的是其他行,mysql的query cache也會失效
              « mysql的query cache只能緩存數(shù)據(jù)庫數(shù)據(jù)行
                 意味著其他內容都不行,比如數(shù)組,比如對象,而memcached理論上可以緩存任何內容,甚至文件^_^

              四、Fotolog的緩存技術
              
          非確定性緩存你不確定你要的數(shù)據(jù)緩存中有沒有,你也不知道是不是過期了,于是你就試探性的問memcached,我要的什么什么數(shù)據(jù)你那有嗎?我可不要過期的數(shù)據(jù)啊,memcached告訴你說有并且給       你,你就開心了,如果沒有呢,你就要從數(shù)據(jù)庫或者別的地方去獲取了,這是memcached典型的應用。
              主要應用在:
                  1.復雜的數(shù)據(jù)需要多次讀取,你的數(shù)據(jù)庫做了分片處理,從多個數(shù)據(jù)庫中獲取數(shù)據(jù)并組合起來是一個非常大的開銷,你大可以把這些數(shù)據(jù)取出來之后存到memcached中

                  2.mysql query cache的一個好的替代方案,這樣數(shù)據(jù)庫其他部門改變了,只要自己沒改變就沒問題(注意數(shù)據(jù)庫更新的問題,后面會提到)

                  3.把關系或者列表緩存起來,比如某個欄目下的多篇文章列表

                  4.被多個頁面調用并且獲取起來很慢的數(shù)據(jù),或者是更新很慢的數(shù)據(jù),比如文章瀏覽排行榜

                  5.如果cache的開銷超過重新獲取的開銷,那么不要緩存它吧

                  6.標簽云和自動建議(類似google sugest)

                  例如:當一個用戶上傳一個圖片,這個用戶的好友頁面上都要列出這張圖片來,那么把它緩存起來吧。

              潛在問題:
              
          memcached消耗的主要是服務器內存,對CPU消耗很小,所以Fotolog把memcached部署在他們的應用服務器上(貌似我們也是這樣),他們遇到了CPU搞到90%的使用率(怎么會那么高?哪出問題了       吧)、內存回收(這是個大問題)等等問題。
              狀態(tài)緩存把應用服務的當前狀態(tài)存在memcached中主要應用在:
              1.“昂貴”的操作,開銷大的操作

               2.sessions會話,F(xiàn)lickr把session存在數(shù)據(jù)庫中,個人感覺還是存memcached比較“便宜”些,如果memecached服務器down掉了,那么重新登錄吧。

               3.記錄用戶在線信息(我們也是這樣做的)

          • 確定性緩存對于某些特定數(shù)據(jù)庫的全部內容,都緩存到memcached,有一個專門的應用服務來保障你要的數(shù)據(jù)都在memcached中,其他應用服務直接從memcached中獲取數(shù)據(jù)而不去取數(shù)據(jù)庫,因為數(shù)據(jù)庫已經(jīng)全部保存到memcached中并保持同步。主要應用在:

                  1.讀取伸展,所有的讀取都從memcached中獲得,數(shù)據(jù)庫沒有負載

                  2.”永不過期“(相對的)的數(shù)據(jù),比如行政規(guī)劃數(shù)據(jù),變動很小吧

                  3.經(jīng)常調用的內容

                  4.用戶的認證信息

                  5.用戶的概要信息

                  6.用戶的參數(shù)設置

                  7.用戶當前常用的媒體文件列表,比如用戶的圖片

                  8.用戶登錄,不走數(shù)據(jù)庫,只走memcached(個人覺得這個不太好,登錄信息還是需要持久化的,用類似BDB這樣效果也不錯)

          使用方式:

              1.多個專門的緩存池而不是一個大的緩存服務器,多個緩存池保障了高可用性,一個緩存實例掛掉了走其他的緩存實例,所有的緩存實例掛掉了,走數(shù)據(jù)庫(估計數(shù)據(jù)庫抗不住^_^)

              2.所有的緩存池都用程序來維護,比如數(shù)據(jù)庫有更新時,程序自動把更新后的內容同步到多個緩存實例中

              3.服務器重啟之后,緩存要比網(wǎng)站先啟動,這就意味著當網(wǎng)站已經(jīng)啟動了,所有的緩存都可用

              4.讀取的請求可以負載均衡到多個緩存實例中去,高性能,高可靠性

              潛在的問題:

              1.你需要足夠多的內存來存儲那么多的數(shù)據(jù)

              2.數(shù)據(jù)以行記錄數(shù)據(jù),而memcached以對象來存儲數(shù)據(jù),你的邏輯要把行列的數(shù)據(jù)轉換成緩存對象

              3.要維護多個緩存實例非常麻煩,Fotolog用Java/Hibernate,他們自己寫了個客戶端來輪詢

              4.管理多個緩存實例會增加應用程序的許多開銷,但這些開銷相對于多個緩存得到的好處來說算不了什么

          • «主動緩存數(shù)據(jù)魔法般的出現(xiàn)在緩存中,當數(shù)據(jù)庫中有更新的時候,緩存立馬填充,更新的數(shù)據(jù)被調用的可能性更高(比如一篇新文章,看的的人當然多),是非確定性緩存的一種變形(原文是It’s non-deterministic caching with a twist.我覺得這樣翻譯怪怪的)。主要應用在:1.預填充緩存:讓memcached盡可能的少調用mysql如果內容不展現(xiàn)的話。2.“預熱”緩存:當你需要跨數(shù)據(jù)中心復制的時候使用步驟:1.解析數(shù)據(jù)庫更新的二進制日志,發(fā)現(xiàn)數(shù)據(jù)庫更新時對memcached也進行同樣的更新

            2.執(zhí)行用戶自定義函數(shù),設置觸發(fā)器調用UDF更新,具體參考http://tangent.org/586/Memcached_Functions_for_MySQL.html

            3.使用BLACKHOLE策略,傳說中Facebook也用mysql的Blackhole存儲引擎來填充緩存,寫到Blackhole的數(shù)據(jù)復制到緩存中,F(xiàn)acebook用這來設置數(shù)據(jù)作廢以及跨國界的復制,好處是數(shù)據(jù)庫的復制不走mysql,這就意味著沒有二進制日志以及對CPU使用不那么多(啊?難道通過memcached存儲二進制日志,然后復制到不同的數(shù)據(jù)庫?有經(jīng)驗的同志在這個話題上可以補充。)


            « 文件系統(tǒng)緩存把文件直接緩存在memcached中,哇,夠BT的,減輕NFS的負擔,估計只緩存那些過于熱門的圖片吧。

          • « 部分頁面內容緩存如果頁面的某些部分獲取起來非常費勁,以其緩存頁面的原始數(shù)據(jù)還不如把頁面的部分內容直接緩存起來直接調用
          • « 應用程序級別的復制通過API來更新緩存,API的執(zhí)行細節(jié)如下:1.一個應用把數(shù)據(jù)寫到某個緩存實例,這個緩存實例把內容復制到其他緩存實例(memcached同步)2.自動獲得緩存池地址以及實例個數(shù)3.同時對多個緩存實例更新4.如果某個緩存實例down掉了,跳到下一個實例,直到更新成功整個過程非常高效以及低開銷 
          • 其他技巧

                  1.多節(jié)點以應對”單點故障”

                  2.使用熱備技術,當某個節(jié)點down掉了,另外一臺服務自動替換成它的IP,這樣客戶端不用更新memcached的IP地址

                  3.memcached可以通過TCP/UDP訪問,持續(xù)連接可以減輕負載,系統(tǒng)設計成可同時承受1000個連接

                  4.不同的應用服務,不同的緩存服務器群5.檢查一下你的數(shù)據(jù)大小是否匹配你分配的緩存,更多請參考http://download.tangent.org/talks/Memcached%20Study.pdf

                  6.不要考慮數(shù)據(jù)行緩存,緩存復雜的對象

                  7.不要在你的數(shù)據(jù)庫服務器上跑memcached,兩個都是吃內存的怪獸

                  8.不要被TCP延遲困擾,本地的TCP/IP對內存復制是做了優(yōu)化的

                  9.盡可能的并行處理數(shù)據(jù)

                  10.并不是所有的memcached的客戶端都是一樣的,仔細研究你用的語言所對應的(好像php和memcached配合的不錯)

                  11.盡可能的是數(shù)據(jù)過期而不是使數(shù)據(jù)無效,memcached可以設定過期時間

                  12.選擇一個好的緩存標識key,比如更新的時候加上版本號

                  13.把版本號存儲在memcached中

            作者最后的感言我就不翻譯了,貌似mysql proxy正在做一個項目,自動同步mysql以及memcached,更多參考http://jan.kneschke.de/2008/5/18/mysql-proxy-replicating-into-memcache

            后記:前幾天,把Flickr架構(一)這篇文章發(fā)在PHPChina那的原創(chuàng)板塊,居然被管理員當成軟文給刪掉了,難道就因為我保留了版權信息?匪夷所思。

              

           

          posted @ 2011-12-09 20:02 javavaj 閱讀(192) | 評論 (0)編輯 收藏

          2009年5月20日

          原創(chuàng)作者: sdcyst
          原址: http://www.javaeye.com/wiki/Object_Oriented_JavaScript

          posted @ 2009-05-20 10:51 javavaj 閱讀(128) | 評論 (0)編輯 收藏

          2009年4月1日

          1.    windows->preference->myeclipse->files and editors -> xml -> xmlcatalog
          2.    點擊“add”,在新出現(xiàn)窗口中的key type中選擇uri,在location中選擇“File System”
          3.    在本地目錄中選擇相應的xsd(比如spring-benas-2.0.xsd)
          4.    返回設置窗口把設置窗口中的key type改為schemaLocation,
                  key設置為相應的xsd
                  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

          posted @ 2009-04-01 23:50 javavaj 閱讀(104) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 孟津县| 上高县| 紫阳县| 井研县| 潢川县| 泰州市| 连云港市| 寿阳县| 炉霍县| 平定县| 恩施市| 玛纳斯县| 泸溪县| 绥德县| 封开县| 布拖县| 奎屯市| 平凉市| 临江市| 葫芦岛市| 南阳市| 焦作市| 灵宝市| 宣汉县| 越西县| 江门市| 华坪县| 郓城县| 定南县| 马鞍山市| 兴和县| 合江县| 丹棱县| 二连浩特市| 开化县| 罗平县| 页游| 青海省| 柘荣县| 嘉义市| 隆子县|