Bối cảnh :
Tôi đã tạo một ứng dụng web mà tôi muốn có khả năng mở rộng hợp lý. Tôi biết tôi không phải Google hay Twitter, nhưng ứng dụng của tôi sử dụng một lượng dữ liệu khá lớn cho mỗi người dùng và do đó có yêu cầu dữ liệu khá cao. Tôi muốn sẵn sàng mở rộng quy mô hợp lý mà không phải tái kiến trúc mọi thứ sau này.
Tôi coi mình là một nhà phát triển phần mềm, không phải là một chuyên gia cơ sở dữ liệu. Đó là lý do tại sao tôi đăng bài ở đây. Hy vọng ai đó có nhiều chuyên môn về cơ sở dữ liệu có thể cho tôi lời khuyên.
Với số lượng người dùng tương đối lớn, nhưng không có gì giống như số Facebook, tôi hy vọng sẽ có một DB trông như thế này:
Một "Bàn lớn":
- 250 triệu hồ sơ
- 20 cột
- Khoảng 100 GB dữ liệu
- Có khóa ngoại được lập chỉ mục (20)
- Có một cột var_id (500) được lập chỉ mục
- Có cột "giá trị" int (11)
4 bảng khác:
- 10 triệu hồ sơ mỗi
- Khoảng 2 - 4 GB dữ liệu mỗi
- mỗi bảng có 4 - 8 cột
- một cột là datetime date_created
- một cột là cột varar (500)
- một hoặc hai cột từ mỗi bảng này sẽ được chọn trong một liên kết
Một trong những bảng này được sử dụng để lưu trữ trung bình - lược đồ của nó là bigint (20) id, varchar (20) string_id, datetime date_created, float Average_value
Những gì tôi muốn làm - hai truy vấn tương đối đắt tiền:
Tính giá trị trung bình mới:
- Sử dụng khóa ngoại, chọn tối đa vài triệu bản ghi riêng biệt từ bảng lớn.
- Tính trung bình mới, nhóm theo chuỗi_id.
- Chèn kết quả vào bảng trung bình.
- Như hiện tại được xây dựng, truy vấn này sử dụng hai tham gia.
Tạo các bản ghi không chuẩn hóa, chỉ đọc để phục vụ người dùng:
- Sử dụng khóa ngoại để chọn bất kỳ nơi nào từ 1.000-40.000 bản ghi từ bảng lớn.
- Tham gia với bốn bảng khác trong bản ghi mới nhất với cột id chuỗi.
- Chèn kết quả vào bảng khử chuẩn.
- Những bản ghi này được sử dụng bởi front-end để hiển thị thông tin cho người dùng.
- Như hiện tại được xây dựng, truy vấn này sử dụng bốn tham gia.
Tôi dự định chạy từng truy vấn đắt tiền này trên cơ sở dữ liệu back-end hàng loạt sẽ đẩy kết quả của nó đến máy chủ DB mặt trước thời gian thực xử lý các yêu cầu từ người dùng. Các truy vấn này sẽ được chạy trong khoảng thời gian thường xuyên. Tôi đã không quyết định mức độ thường xuyên. Truy vấn trung bình có thể được thực hiện có lẽ một lần mỗi ngày. Truy vấn không chuẩn hóa sẽ cần thường xuyên hơn - có lẽ cứ sau vài phút.
Mỗi truy vấn này hiện đang chạy trong vài giây trong MySQL trên một máy rất cấp thấp với bộ dữ liệu có bản ghi 100K trong bảng lớn. Tôi lo ngại về cả khả năng mở rộng quy mô và chi phí nhân rộng.
Câu hỏi :
- Liệu cách tiếp cận này có vẻ âm thanh? Có bất cứ điều gì rõ ràng sai với nó từ một quan điểm bức tranh lớn?
- RDBMS có phải là công cụ phù hợp hay tôi nên xem xét các giải pháp "dữ liệu lớn" khác giống như một cái gì đó trong gia đình Hadoop? Xu hướng của tôi là sử dụng RDBMS vì dữ liệu được cấu trúc và phù hợp với mô hình quan hệ. Tuy nhiên, tại một thời điểm nhất định, tôi hiểu rằng tôi có thể không còn có thể sử dụng RDBMS nữa. Điều đó có đúng không? Khi nào thì công tắc này sẽ cần thiết?
- Nó sẽ làm việc chứ? Những truy vấn này có thể được chạy trong một khoảng thời gian hợp lý không? Tôi có thể đợi hàng giờ để truy vấn # 1, nhưng truy vấn # 2 sẽ kết thúc sau vài phút.
- Tôi nên xem xét gì từ góc độ phần cứng? RAM và CPU bị nghẽn cổ chai của tôi có khả năng là gì? Tôi cho rằng việc giữ các chỉ số trong RAM là quan trọng. Có điều gì khác tôi nên xem xét?
- Tại một số điểm tôi có thể sẽ phải phân vùng dữ liệu của mình và sử dụng nhiều máy chủ. Liệu trường hợp sử dụng của tôi có vẻ như đã có trong danh mục đó hay tôi sẽ có thể mở rộng một máy theo chiều dọc trong một thời gian? Điều này sẽ làm việc với 10 lần dữ liệu? 100x?