博主工作的一個項目裏用了elk來存儲用戶操作日誌,日誌量大概是每天一千萬左右的數據,最近服務器的磁盤被塞滿了 本想將時間較長的數據刪除掉 但當時刪除總是出現版本衝突的錯誤
並且es在單個索引數據達到 億級以上的時候查詢時間也是不樂觀的
於是乎博主花了點時間將es的日誌數據全部查詢出來 準備將這些數據包括以後的日誌數據都存儲到mysql中 博主的日誌都是先全部存入kafka然後再通過logstash消費到es中,現改成用java程序消費日誌數據存儲mysql中
由於mysql單表的數據查詢極限在一千萬左右,所以博主做的分表方式如下:
第一.每個月用三十張表存儲數據 三十張表的數據存儲位置規劃是根據用戶帳號的信息的hash得來,並且根據用戶帳號和查詢條件字段做了索引 這樣的話 查詢時可以大大提高效率 並且查詢一個用戶的操作記錄也只需要查詢一張表即可,不過由於是根據年月分表,那麼如果跨月查詢的話還是需要結合多張表查詢 不過根據業務情況 大多出查詢情況都是查詢月份數據 所以這樣做問題不大
當然有些朋友會說 爲什麼不用hive和hadoop呢?
由於業務上的需求 不適合用非實時性的存儲方式 並且查詢效率方面並不是很出色
總結來說 es和mysql 存儲日誌各有各的好處 es的缺點就是比較喫系統配置 語法相對sql而言較複雜(7.x以後或可以用sql插件使用sql查詢) 分頁查詢相對而言比較麻煩, 優點就是查詢速度較快,支持分詞,性能較好 有比較多的周邊組件
mysql的優缺點也很明顯:免費 輕巧 當然啦 性能方面肯定不如大型數據庫
所以呢 解決問題的辦法很多 根據不同的情況去選擇合適的,如果公司不缺錢 服務器有的是,可以考慮用elk弄一套日誌收集系統 如果怕坑 怕麻煩 還是選擇mysql分表 分庫存儲比較好 ,畢竟博主是掉了elk的坑裏