TTL trong MongoDB là gì?

Chỉ mục #TTL là chỉ mục trường đơn đặc biệt mà #MongoDB có thể sử dụng để tự động xóa tài liệu khỏi bộ sưu tập sau một khoảng thời gian nhất định hoặc tại một thời điểm đồng hồ cụ thể. Hết hạn dữ liệu hữu ích đối với một số loại thông tin như dữ liệu sự kiện do máy tạo, nhật ký và thông tin phiên chỉ cần tồn tại trong cơ sở dữ liệu trong một khoảng thời gian hữu hạn

TTL Monitor là một chuỗi riêng biệt chạy định kỳ [1 phút] và quét một bộ sưu tập có #TTLIndex được xác định, để tìm mọi tài liệu đã hết hạn và xóa chúng trong nền. Theo mặc định, luồng #TTLMonitor cứ sau 60 giây sẽ chạy một lần nhưng theo yêu cầu, luồng này có thể được sửa đổi

Quá trình chỉ số TTL đi kèm với chi phí. Mỗi khi Mongodb chạy chuỗi Màn hình TTL, nó sẽ tiêu tốn tài nguyên và do đó hiệu suất hệ thống sẽ bị suy giảm trong giờ cao điểm. Hơn nữa, do tải, tài liệu có thể không bị xóa sau một khoảng thời gian nhất định. Tóm lại, hãy cẩn thận trước khi thực hiện TTL Index

Dưới đây là một số tình huống khi nào và cách sử dụng Chỉ số TTL để sử dụng tối ưu--

Trường hợp1> Ngăn màn hình TTL chạy trong khoảng thời gian nhất định [như Giờ cao điểm] -

Bạn có thể tắt hoặc bật TTL Monitor trong Crontab Job theo giờ tải cao điểm của bạn. Khi Màn hình TTL bị tắt, tài liệu sẽ không bị xóa

db.adminCommand[{setParameter:1, ttlMonitorEnabled:false}];
db.adminCommand[{setParameter:1, ttlMonitorEnabled:true}];

Trường hợp2> Sửa đổi tần số Màn hình TTL-

Nếu bạn cảm thấy tài liệu bị xóa quá thường xuyên và doanh nghiệp của bạn có thể chịu được tần suất thấp thì bạn có thể sửa đổi tham số TTL Monitor Sleep frequency. Theo mặc định, nó chạy cứ sau 1 phút nhưng ở đây tôi đã giảm tần suất và đặt nó thành 2 phút để luồng Màn hình TTL sẽ chạy cứ sau 2 phút

db.adminCommand[{getParameter:1, ttlMonitorSleepSecs: 120}];

Trường hợp3> TTL động-

Có nhiều trường hợp chúng tôi muốn có các tài liệu khác nhau để có thời gian hết hạn khác nhau thay vì khoảng thời gian cố định. Đây là mẹo để chúng ta có thể lập chỉ mục TTL ở cấp độ tài liệu. Để đạt được điều này, bạn có thể thao tác trường ngày có chỉ số TTL. mẫu dưới đây là thực hiện. Bạn có thể thấy sự khác biệt về số lượng tài liệu sau mỗi 5 giây

db.ttlCol.createIndex[{created_at: 1}, {expireAfterSeconds: 0}];

db.adminCommand[{setParameter:1, ttlMonitorSleepSecs: 5}]; // run TTL monitor in every 5 seconds
sleep[60000]; 

db.ttlCol.drop[];
db.ttlCol.createIndex[{created_at: 1}, {expireAfterSeconds: 0}];

// Documents with random future expiry date
for[var i=0; i< 1000; i++]{
    db.ttlCol.insert[{
        created_at: new Date[Date.now[] + Math.floor[Math.random[]*60000]]
    }]
}
for[var i=0; i Chỉ mục TTL trên một số tài liệu-

Trong một số trường hợp bạn không muốn TTL Index xóa hết tài liệu. Đối với điều này, bạn có thể có một vài tài liệu với dấu thời gian BSON và phần còn lại với dấu thời gian số nguyên. TTL Index sẽ xóa các tài liệu có dấu thời gian BSON trong khi các tài liệu có dấu thời gian số nguyên sẽ vẫn còn nguyên

Tôi muốn gọi ra một tính năng tuyệt vời trong Mongo. chỉ số TTL. Trước đây, tôi đã chỉ trích cơ sở dữ liệu này, nhưng tôi phải công nhận khi đến hạn và các chỉ mục TTL là một ý tưởng phi thường – dễ dàng trở thành một trong những tính năng cơ sở dữ liệu mới tốt nhất trong nhiều năm

Chỉ mục TTL không được sử dụng cho các chức năng lập chỉ mục truyền thống như tối ưu hóa tra cứu hoặc thực thi tính duy nhất. Đó là một loại chỉ mục rất cụ thể tồn tại trên một trường duy nhất và có một mục đích. xóa các tài liệu đã hết thời gian tồn tại được xác định trước [TTL]. Chúng được tạo bằng cách chuyển tùy chọn expireAfterSeconds đặc biệt trên các bản dựng chỉ mục

db.eventlog.createIndex[
    { "createdTime": 1 },
    { expireAfterSeconds: 3600 }
]

Cứ sau 60 giây, Mongo chạy một tác vụ nền để xóa mọi tài liệu trong bộ sưu tập có createdTime + expiresAfterSeconds nhỏ hơn thời gian hiện tại

Lý do chúng rất hữu ích là việc dọn sạch dữ liệu cũ là một trong những mẫu phổ biến nhất trong thiết kế dữ liệu. Bất kỳ ứng dụng nào đạt đến một kích thước nhất định cuối cùng sẽ muốn thực hiện nó ở đâu đó. Một số ví dụ sử dụng tại Stripe

  • Xóa khóa idempotency sau 24 giờ
  • Xóa các bản ghi đại diện cho webhook và các cuộc hội thoại HTTP mà chúng tôi đã có với các máy chủ nhận webhook sau một vài tuần 1

Trong những năm qua, họ đã chứng minh khả năng mở rộng và đáng tin cậy. Số lượng hồ sơ mà họ dọn dẹp trong những bộ sưu tập lớn này thật khó tin, nhưng cho đến nay tôi không thể nhớ ra một vấn đề sản xuất nào. Trước khi lập chỉ mục TTL, chúng tôi đã xóa các khóa idempotency cũ theo cách thủ công [nghĩ rằng DELETE FROM .. WHERE createdTime < X] và điều đó thật tồi tệ. Ngay cả với sơ đồ sharding để phân vùng công việc, quá trình này không đáng tin cậy và liên tục bị chậm. Chúng tôi đã chuyển sang chỉ mục TTL và chưa nghĩ về điều đó kể từ đó. Chúng là loại tính năng chỉ thực hiện công việc của nó, biến mất trong nền đến mức bạn quên mất nó thậm chí còn ở đó. Loại tính năng tốt nhất

Sử dụng `expireAfterSeconds` = 1

Một điều chỉnh đối với cách sử dụng được đề xuất trong sách hướng dẫn mà tôi khuyên là chỉ luôn sử dụng giá trị expireAfterSeconds bằng 1, sau đó đặt dấu thời gian của bạn thành thời gian trong tương lai khi bạn muốn xóa chúng

db.eventlog.createIndex[
    { "createdTime": 1 },
    { expireAfterSeconds: 1 }
]

Điều này hoạt động tốt hơn bởi vì

  • Không có gì lạ khi muốn định cấu hình lại thời gian hết hạn [giả sử tăng thời gian lưu giữ từ 3 tháng lên 6]. Giá trị 1 cho phép bạn thực hiện thay đổi đó trong mã ứng dụng, tránh phải đưa ra các lệnh Mongo chuyên biệt để sửa đổi giá trị expireAfterSeconds hoặc xây dựng lại chỉ mục
  • Nó cho phép thời gian hết hạn động. Ví dụ, giả sử rằng các tài liệu quan trọng cao nên được lưu giữ trong một năm, nhưng những tài liệu ít quan trọng hơn có thể hết hạn sau một tháng

Động cơ thầm kín của tôi khi gọi ra các chỉ mục TTL là gieo ý tưởng vào tâm trí các nhà phát triển cơ sở dữ liệu khác vì tính năng này sẽ tồn tại ở mọi nơi. Tôi không biết tương đương với chỉ mục TTL trông như thế nào trong RDMS/SQL, nhưng tôi muốn nó

1 bản ghi Webhook được lưu giữ trong một khoảng thời gian để cho phép lập lịch thử lại và cung cấp thông tin yêu cầu/phản hồi cho người dùng để trợ giúp gỡ lỗi

Làm cách nào để hết hạn dữ liệu trong MongoDB?

Tài liệu hết hạn vào một thời điểm đồng hồ cụ thể . Nếu trường ngày được lập chỉ mục chứa một ngày trong quá khứ, MongoDB coi tài liệu đã hết hạn. set the indexed date field to a value corresponding to the time the document should expire. If the indexed date field contains a date in the past, MongoDB considers the document expired.

Làm cách nào để kiểm tra các chỉ mục trong MongoDB?

Bạn có thể tìm thấy tất cả các chỉ mục có sẵn trong bộ sưu tập MongoDB bằng cách sử dụng phương thức getIndexes . Điều này sẽ trả về tất cả các chỉ mục trong một bộ sưu tập cụ thể. Kết quả. Đầu ra chứa chỉ mục _id mặc định và chỉ mục tên sinh viên do người dùng tạo chỉ mục.

Làm cách nào để xóa chỉ mục khỏi MongoDB?

Bắt đầu từ MongoDB 5. 2, bạn có thể sử dụng db. bộ sưu tập. dropIndex[] để xóa các chỉ mục hiện có trên cùng một bộ sưu tập ngay cả khi có một bản dựng đang được tiến hành trên một chỉ mục khác.

Chủ Đề