首先說明下memcached存在以下問題java
自己沒有內置分佈式功能,沒法實現使用多臺Memcache服務器來存儲不一樣的數據,最大程度的使用相同的資源;沒法同步數據,容易形成單點故障。(memagent代理實現集羣)算法
在 Memcached中能夠保存的item數據量是沒有限制的,只要內存足夠 。
Memcached單進程最大使用內存爲2G,要使用更多內存,能夠分多個端口開啓多個Memcached進程
最大30天的數據過時時間,設置爲永久的也會在這個時間過時,常量REALTIME_MAXDELTA
60*60*24*30控制
最大鍵長爲250字節,大於該長度沒法存儲,常量KEY_MAX_LENGTH 250控制
單個item最大數據是1MB,超過1MB數據不予存儲,常量POWER_BLOCK 1048576進行控制,
它是默認的slab大小
最大同時鏈接數是200,經過 conn_init()中的freetotal進行控制,最大軟鏈接數是1024,經過
settings.maxconns=1024 進行控制
跟空間佔用相關的參數:settings.factor=1.25, settings.chunk_size=48, 影響slab的數據佔用和步進方式數據庫
memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,因爲無阻塞通訊,對內存讀寫速度很是之快。
memcached分服務器端和客戶端,能夠配置多個服務器端和客戶端,應用於分佈式的服務很是普遍。
memcached做爲小規模的數據分佈式平臺是十分有效果的。緩存
memcached是鍵值一一對應,key默認最大不能超過128個字 節,value默認大小是1M,也就是一個slabs,若是要存2M的值(連續的),不能用兩個slabs,由於兩個slabs不是連續的,沒法在內存中 存儲,故須要修改slabs的大小,多個key和value進行存儲時,即便這個slabs沒有利用完,那麼也不會存放別的數據。服務器
集羣配置併發
因爲Memcached服務器與服務器之間沒有任何通信,而且不進行任何數據複製備份,因此當任何服務器節點出現故障時,會出現單點故障,若是須要實現HA,則須要經過另外的方式來解決。異步
經過Magent緩存代理,防止單點現象,緩存代理也能夠作備份,經過客戶端鏈接到緩存代理服務器,緩存代理服務器鏈接緩存鏈接服務器,緩存代理服務器能夠鏈接多臺Memcached機器能夠將每臺Memcached機器進行數據同步。若是其中一臺緩存服務器down機,系統依然能夠繼續工做,若是其中一臺Memcached機器down掉,數據不會丟失而且能夠保證數據的完整性。具體能夠參考:http://code.google.com/p/memagent/socket
memcache集羣的實現tcp
memcached儘管是「分佈式」緩存服務器,但服務器端並無分佈式功能。各個memcached不會互相通訊以共享信息。那麼,怎樣進行分佈式呢?這徹底取決於客戶端的實現。分佈式
memcached的分佈式
Memcached做爲集中式Cache,就存在着集中式的致命問題:單點問題,Memcached支持多Instance分佈在多臺機器上,僅僅只是解決了數據所有丟失的問題,可是當其中一臺機器出錯之後,仍是會致使部分數據的丟失,一個籃子掉在地上仍是會把部分的雞蛋打破。
所以就須要實現一個備份機制,可以保證Memcached在部分失效之後,數據還可以依然使用,固然你們不少時候都用Cache不命中就去數據源獲取的策略,可是在SIP的場景中,若是部分信息找不到就去數據庫查找,那麼要把SIP弄垮真的是很容易,所以SIP對於Memcached中的數據認爲是可信的,所以作Cluster也是必要的。
1.應用傳入須要操做的key,經過CacheManager獲取配置在Cluster中的客戶端。
2.當得到Cache Client之後,執行Cache操做。
3. A.若是是讀取操做,當不能命中時去集羣其餘Cache客戶端獲取數據,若是獲取到數據,嘗試寫入到本次得到的Cache客戶端,並返回結果。(達到數據恢復的做用)
B.若是是更新操做,在本次獲取得Cache客戶端執行更新操做之後,當即返回,將更新集羣其餘機器命令提交給客戶端的異步更新線程對列去異步執行。(因爲若是是根據key來獲取Cache,那麼異步執行不會影響到此主鍵的查詢操做)
存在的問題:若是是設置了Timeout的數據,那麼在丟失之後被複制的過程當中就會變成永久有效的內容。
愈來愈感受到DB力不從心,在面對千萬級用戶量的應用時,DB面對平凡的curd,特別是查詢的時候,早已不堪重負!如何解決高併發下數據的查詢效率,在應用中顯的愈來愈重要,好了廢話很少說,首先介紹下magent與memcached
1、 magent
magent是一款開源的Memcached代理服務器軟件,其項目網址爲:http://code.google.com/p/memagent/
1. 安裝:
1.mkdir magent
2.cd magent/
3.wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
4.tar zxvf magent-0.5.tar.gz
5./sbin/ldconfig
6.sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
7.make
8.cp magent /usr/bin/magent
9.cd ../
2. magent 命令參數說明:
1.-h this message
2.-u uid
3.-g gid
4.-p port, default is 11211. (0 to disable tcp support)
5.-s ip:port, set memcached server ip and port
6.-b ip:port, set backup memcached server ip and port
7.-l ip, local bind ip address, default is 0.0.0.0
8.-n number, set max connections, default is 4096
9.-D do not go to background
10.-k use ketama key allocation algorithm
11.-f file, unix socket path to listen on. default is off
12.-i number, max keep alive connections for one memcached server, default is 20
13.-v verbose
2、memcached http://memcached.org/
1. 安裝libevent
2. 安裝memcached
configure 須要加 libevent的安裝路徑
啓動: /usr/local/bin/memcached -d -m 512 -u root -p 11211 -c 10000 -M -f 1.1 -P /tmp/memcached.pid
3、配置memcached 與 magent,無圖無真相,一圖抵千言:
magent與memcached 是能夠混搭的,沒必要死板的一個magent s-memcached s-memcached b-memcached
上圖此模型已經可以很好的解決一個節點,一組服務器的緩存數據服務,可是若是在北方網通架設了一組服務器,同時在南方電信又架設了另一組服務器,那麼這兩組相對獨立的節點之間如何作到數據的同步與共享,基於magent與memcached的解決方案以下:
須要注意的是,兩組magent的配置最好徹底一致,好比:
北方的magent配置爲:magent s-memcached1 s-memcached2 b-memcached3
那麼南方的magent配置也爲:magent s-memcached1 s-memcached2 b-memcached3
其順序都是一致的,由於magent在分配key到memcached上時只是簡單的使用散列餘數算法。
固然若是你夠懶,那麼你能夠直接鏈接備份magent,由於全部的數據上面都有。
有個特別要注意的地方是:
1:其中一臺Memcached死掉,從magent取數據,數據會從備份的Memcached取出,保證用戶不受影響.
2:Memcached重啓復活,因爲這兩臺Memcached重啓後無數據,所以magent取得的將是空值,儘管備份Memcached還有數據。可採用定時維護服務器,恢復memcached。
3。若是Memcached死掉,備份機同時死掉,那麼只能說明你夠倒黴,此時此刻你或許能見到上帝。
4、java客戶端
推薦使用:xmemcached
http://code.google.com/p/xmemcached/
5、緩存與DB的同步
比較保險的作法是:查詢的時候從緩存中取,add、updae、delete的時候同時操做緩存與DB。
固然你也能夠定時同步緩存與DB的數據,我的認爲不一樣的業務應該有不一樣的選擇!
我在實際的應用中是同時使用這兩種方式,好比用戶我的信息之類的內容,就用定時同步的方式。
6、搜索引擎+緩存+DB
這個主題比較大,能夠分爲:
1。文件結構的存儲代替DB持久化存儲。
2。緩存在搜索引擎中的使用--文本庫與索引庫的緩存實現。
3。使用搜索引擎進行統一的數據查詢。
4。文件同步讀寫。