約 1億條記錄, 每條1k左右,key =>value形式,用於前台查詢,選擇什麼作為存儲方案比較合適呢,要求效率比較高並且相對穩定可靠?
每天需要從文件導入一次,目前想到使用mysql分表存儲,不知道有沒有更好的辦法。
對於這個小問題, 如果 key 比較小, 可以將所有 key-pos 放內存, pos 為文件中 value 的偏移, 每次訪問只需要一次磁碟seek.
用 protocol-buf 或 thrift 架成網路服務, 還可以加一層proxy, 按 key hash 分發到不同的伺服器來減小壓力.
嗯, 好像這些, beansdb 都已經做好了.1.總元數據量是100G不到,加上主鍵索引的話,預計100G-120G
2.每天需要從文件導入一次,目前想到使用mysql分表存儲,不知道有沒有更好的辦法 ?這個不太清楚,是當下已經有1億條記錄,還是每天累加在一起之後,可能為1億條記錄
這個非常關鍵,若是每天累計在一起是1億條記錄,且是按PK查詢查詢的話,沒有必要分表
3.非常關鍵的一點,只有查詢 還是可能也提供其他的操作,比如UPDATE,INSERT,一定要確認清楚
4.查詢的話是按PK單條的方式,還是大批量的讀出,關鍵點是否需要GROUP BY 統計,ORDER BY 分頁
5.主鍵是否簡單比如1個或2個整型欄位的模式
6.採用MySQL的話,若是非常簡單的查詢,且按PK,可以考慮採用Handlersocket的模式,對於複雜的建議走SQL協議...
推薦handlersocket的技術文章資料:
HandlerSocket的原理等系列篇章
http://www.mysqlops.com/2011/10/19/handlersocket-principle.html
使用 nark 資料庫 ,顛覆傳統,比 bizp2 更高的壓縮率,同時還能高效查找,還支持的前綴搜索。
1. mongodb+redis
更酷,且對於你的場景來說,沒有風險(即使丟失1天數據,也可以重新導入),成熟可靠.
mongodb存儲數據(須使用主從or replication set),redis做cache.
2. mysql+memcached.
毫無疑問可以實現你的需求.
如果只有單台伺服器,不推薦使用redis,這麼大數據量需要全部載入到物理內存中,你的硬體成本會非常高,如果開啟vm,性能會有損失。資料庫分表是最簡單快捷,且能保證系統穩定性和可擴展性的手段之一,想嘗試新技術可考慮MySQL handlesocket或MySQL5.6 memcached API for InnoDB。
數據之間沒有強關聯,這種情況下用mongo+redis是比較合適的,熱點數據保留在redis里,其他數據md5分散到若干台mongodb. 然後請求分散到不同的mongodb上.
擴展也方便
推薦用redis,它把k-v數據緩存在內存裡面,性能很高,技術成熟穩定好,支持主從同步
http://www.thuir.org/thuirdb/
剛在微博上看到的,非常符合你的需求。
mark
mysql用來存數據,redis用來查詢,純內存操作,速度絕對快!
缺點是硬體投入較大,1億條數據全得存到redis伺服器的內存里,redis里用不上的功能,全部不用。
非常感謝 @Neaton 的回答。之前考慮的是常規的用MC做緩存。對redis雖然想嘗試,但因為不太熟悉,一直沒有在生產環境中使用。在這個量級的情況下,使用redis ,@Neaton 有沒有建議呢?
倒入之後只讀的?用 java 隨便寫一個就可以了吧。index 放在內存,數據放在硬碟。如果訪問有冗餘,加個 cache 就好了。
可以嘗試Mysql+Memcache緩存~理論上可以支持較大負荷的查詢~
使用Redis+Mysql吧,Mysql作磁帶,Redis做前台的查詢,比較合適。穩定,快速。
推薦閱讀:
※資料庫的選擇?
※SQLite 的讀寫效率很高,有哪些使用其他資料庫的理由?
※怎麼看待王津THU的海量事務高速處理系統?
※關係型資料庫會在 web 開發中消失嗎?
※什麼工具可以把Sqlite里所有的表,導出建表的SQL語句?