Phiên bản ngắnTìm kiếm trên phân đoạn?
Nếu tôi chia người dùng thành phân đoạn, làm cách nào để cung cấp "tìm kiếm người dùng"? Rõ ràng, tôi không muốn mọi tìm kiếm đánh trúng mọi mảnh vỡ.
Long phiên bản
By mảnh vỡ, tôi có nghĩa là có nhiều cơ sở dữ liệu trong đó mỗi chứa một phần nhỏ trong tổng số dữ liệu. Ví dụ, một cơ sở dữ liệu UserA, UserB, vv có thể chứa những người dùng có tên bắt đầu bằng "A", "B", v.v. Khi người dùng mới đăng ký, tôi đơn giản kiểm tra tên của anh ta và đưa anh ta vào đúng cơ sở dữ liệu. Khi người dùng quay trở lại đăng nhập, tôi lại nhìn vào tên của anh ấy để xác định cơ sở dữ liệu chính xác để lấy thông tin của anh ấy.
Lợi thế của sharding vs đọc nhân rộng là sao chép đọc không quy mô viết của bạn. Tất cả các bài viết mà đi tới thầy đều phải đi tới từng nô lệ. Trong một nghĩa nào đó, tất cả chúng đều mang cùng tải ghi, mặc dù tải đọc được phân phối.
Trong khi đó, phân đoạn không quan tâm đến việc viết của nhau. Nếu Brian đăng ký trên phân đoạn UserB, phân đoạn UserA không cần phải nghe về nó. Nếu Brian gửi một tin nhắn cho Alex, tôi có thể ghi lại sự thật đó trên cả hai phân đoạn UserA và UserB. Bằng cách này, khi một trong hai Alex hoặc Brian đăng nhập, anh ta có thể truy xuất tất cả các tin nhắn đã gửi và nhận của mình từ phân đoạn của chính mình mà không truy vấn tất cả các mảnh vỡ.
Cho đến nay, rất tốt. Điều gì về tìm kiếm? Trong ví dụ này, nếu Brian tìm kiếm "Alex", tôi có thể kiểm tra UserA. Nhưng nếu anh ta tìm Alex bằng họ của mình, "Smith" thì sao? Có Smiths trong mọi phân đoạn. Từ đây, tôi thấy hai tùy chọn:
- Yêu cầu ứng dụng tìm kiếm Smith trên mỗi phân đoạn. Điều này có thể được thực hiện chậm (truy vấn từng phân đoạn liên tiếp) hoặc nhanh chóng (truy vấn từng phân đoạn song song), nhưng theo một trong hai cách, mọi phân đoạn cần phải được tham gia vào mọi tìm kiếm. Trong cùng một cách mà đọc sao chép không quy mô viết, có tìm kiếm nhấn mỗi phân đoạn không quy mô tìm kiếm của bạn. Bạn có thể đạt được thời gian khi khối lượng tìm kiếm của bạn đủ cao để áp đảo từng phân đoạn và việc thêm phân đoạn không giúp bạn, vì tất cả chúng đều có cùng khối lượng.
- Một số loại lập chỉ mục mà chính nó có khả năng chịu được sharding. Ví dụ, giả sử tôi có một số trường liên tục mà tôi muốn tìm kiếm: họ và tên. Ngoài UserA, UserB, vv Tôi cũng có IndexA, IndexB, vv Khi một người dùng mới đăng ký, tôi đính kèm anh ta vào từng chỉ mục mà tôi muốn anh ta được tìm thấy trên đó. Vì vậy, tôi đặt Alex Smith vào cả IndexA và IndexS, và anh ta có thể được tìm thấy trên một trong hai "Alex" hoặc "Smith", nhưng không có chất nền. Bằng cách này, bạn không cần truy vấn từng phân đoạn, vì vậy tìm kiếm có thể mở rộng được.
Vì vậy, có thể tìm kiếm được chia tỷ lệ? Nếu vậy, cách tiếp cận này có lập chỉ mục đúng không? Có cái nào khác không?
Cảm ơn. Tôi đã thực sự đọc trang web đó một cách rộng rãi. Tôi đã cố làm sáng tỏ câu hỏi của mình ở trên; mà hy vọng là vượt ra ngoài bài viết bạn đã liên kết một cách hữu ích. –