背景
現在mongodb有一張日誌表,保留每天的系統訪問信息,由於每天的數量非常大,導致長時間之後表變得非常大,影響插入效率,並且導致無法查詢,現在我們需要制定方案來解決這個問題,需求是實現表的按時清理和歸檔。要求是儘量不修改項目現有的業務代碼。並且現在數據庫的大概每天產生30至60萬條數據,能夠平穩的處理。
解決方案
方案一:
集中清除:
假設在2019年的11月1號開始增加ttl設置爲30天后的凌晨1點進行自動刪除,然後我們每30天也就是2019年12月1號凌晨0點開始第一次備份數據,這是我們的數據庫中會有一個月的數據,備份完成一小時後,開始刪除當天數據,當下個月備份的時候,也就是1月1號,我們11月的數據已經自動刪除完,這時進行備份,只有12月的數據。
方案二:
分散清除:
備份方案與方案一相同,ttl設置爲在日誌生成後2592000秒(30天)後刪除。
兩種方案的區別:
- 第二種方案將刪除分散到一天,將壓力分散開;不需要更改原有代碼只需要數據庫設置索引
- 第一種方案將刪除放在凌晨,在服務器低峯刪除;需要增加刪除字段,並自定義刪除時間
最終選擇實施方案一
原因:1. 不需要更改業務代碼
2. 按照 mongodb設計如果刪除數據時處於數據庫高峯,會延後刪除,(更改方案:將刪除時間設爲整天的時間加減某些量如5小時等,會生成錯峯)
操作步驟
- 設置mongodb的ttl索引,在一個選中的類型爲date的字段上加上ttl索引,參考代碼如下,具體實現參照百度。
參照實現:ttl
- 數據庫備份,參照百度,使用shell腳本定時備份。
參照實現:備份