2013-04-04 24 views
6

Tôi có một số phần mềm thu thập dữ liệu trong một khoảng thời gian dài, xấp xỉ 200 lần đọc mỗi giây. Nó sử dụng một cơ sở dữ liệu SQL cho việc này. Tôi đang tìm cách sử dụng Azure để di chuyển rất nhiều dữ liệu cũ "đã lưu trữ" của tôi sang.Thiết kế phân vùng để lưu trữ bảng Azure

Phần mềm sử dụng kiến ​​trúc kiểu nhiều người thuê, vì vậy tôi định sử dụng một Bảng Azure cho mỗi Người thuê. Mỗi người thuê nhà có lẽ đang theo dõi 10-20 chỉ số khác nhau, vì vậy tôi định sử dụng ID chỉ số (int) làm Khóa phân vùng.

Vì mỗi chỉ số sẽ chỉ có một lần đọc mỗi phút (tối đa), tôi định sử dụng DateTime.Ticks.ToString ("d19") làm RowKey của tôi.

Tôi thiếu kiến ​​thức nhỏ về cách quy mô này sẽ được thực hiện; vì vậy hy vọng ai đó có thể làm rõ điều này:

Để thực hiện Azure sẽ/có thể chia bảng của tôi bằng phân vùng để giữ mọi thứ đẹp và nhanh chóng. Điều này sẽ dẫn đến một phân vùng cho mỗi số liệu trong trường hợp này.

Tuy nhiên, khóa hàng của tôi có khả năng thể hiện dữ liệu trong khoảng 5 năm, vì vậy tôi ước tính khoảng 2,5 triệu hàng.

Azure có đủ thông minh để sau đó phân chia dựa trên khóa hàng không, hoặc tôi đang thiết kế trong một nút cổ chai trong tương lai? Tôi biết bình thường không sớm tối ưu hóa, nhưng với một cái gì đó như Azure mà không có vẻ là hợp lý như bình thường!

Tìm kiếm chuyên gia Azure để cho tôi biết nếu tôi đang đi đúng hướng hoặc liệu tôi có nên phân đoạn dữ liệu của mình thành nhiều bảng hơn không.

Trả lời

16

Vài nhận xét:

Ngoài việc lưu trữ dữ liệu, bạn cũng có thể muốn xem xét làm thế nào bạn muốn lấy dữ liệu như có thể thay đổi thiết kế của bạn đáng kể. Một số câu hỏi bạn có thể muốn tự hỏi mình:

  • Khi tôi truy xuất dữ liệu, liệu tôi có luôn truy xuất dữ liệu cho một chỉ số cụ thể và cho phạm vi ngày/giờ không?
  • Hoặc tôi cần truy xuất dữ liệu cho tất cả chỉ số cho một phạm vi ngày/giờ cụ thể? Nếu đây là trường hợp thì bạn đang xem xét quét toàn bộ bảng. Rõ ràng bạn có thể tránh điều này bằng cách thực hiện nhiều truy vấn (một truy vấn/PartitionKey)
  • Tôi có cần xem kết quả mới nhất trước hay không thực sự quan tâm. Nếu trước đây, chiến lược RowKey của bạn phải giống như (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString("d19").

Cũng kể từ PartitionKey là một giá trị chuỗi, bạn có thể muốn chuyển đổi int giá trị cho một giá trị string với một số "0" prepadding để tất cả id của bạn xuất hiện theo thứ tự nếu không bạn sẽ nhận được 1, 10, 11, .., 19, 2, ... v.v.

Theo sự hiểu biết tốt nhất của tôi, Windows Azure phân vùng dữ liệu dựa trên chỉ PartitionKey và không phải là RowKey. Trong Phân vùng, RowKey đóng vai trò là khóa duy nhất. Windows Azure sẽ thử và giữ dữ liệu với cùng một nút PartitionKey trong cùng một nút nhưng vì mỗi nút là một thiết bị vật lý (và do đó có giới hạn kích thước), dữ liệu cũng có thể chuyển sang nút khác.

Bạn có thể muốn đọc bài đăng trên blog này từ Nhóm lưu trữ Windows Azure: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx.

CẬP NHẬT Dựa trên nhận xét của bạn bên dưới và một số thông tin ở trên, hãy thử và thực hiện một số phép tính. Điều này dựa trên các mục tiêu khả năng mở rộng mới nhất được xuất bản tại đây: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/11/04/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx. Các tài liệu nói rằng:

Độc Bảng Partition- một bảng phân vùng là tất cả các đối tượng trong một bảng với cùng giá trị then chốt phân vùng, và thường có nhiều bảng phân vùng. Mục tiêu thông cho một phân vùng bảng duy nhất là:

  • Lên đến 2.000 đơn vị mỗi giây
  • Lưu ý, đây là một phân vùng duy nhất, và không phải là một bảng duy nhất. Do đó, một bảng có phân đoạn tốt, có thể xử lý tối đa 20.000 thực thể/giây, là mục tiêu tổng thể của tài khoản được mô tả ở trên.

Bây giờ bạn nói rằng bạn đã 10-20 điểm số liệu khác nhau và cho cho mỗi điểm số mà bạn sẽ viết tối đa là 1 kỷ lục cho mỗi phút có nghĩa là bạn sẽ được viết tối đa là 20 đơn vị/phút/bảng cũng nằm trong mục tiêu khả năng mở rộng của 2000 thực thể/giây.

Bây giờ câu hỏi vẫn còn là đọc. Giả sử người dùng sẽ đọc tối đa 24 giờ dữ liệu (tức là 24 * 60 = 1440 điểm) cho mỗi phân vùng. Bây giờ giả định rằng người dùng nhận dữ liệu cho tất cả 20 chỉ số trong 1 ngày, thì mỗi người dùng (do đó mỗi bảng) sẽ tìm nạp tối đa 28.800 điểm dữ liệu. Câu hỏi còn lại dành cho bạn tôi đoán là có bao nhiêu yêu cầu như thế này bạn có thể nhận được mỗi giây để đáp ứng ngưỡng đó. Nếu bạn bằng cách nào đó có thể ngoại suy thông tin này, tôi nghĩ bạn có thể đạt được một số kết luận về khả năng mở rộng của kiến ​​trúc của bạn.

Tôi cũng khuyên bạn nên xem video này: http://channel9.msdn.com/Events/Build/2012/4-004.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã bình luận. Trường hợp sử dụng có khả năng là để người dùng yêu cầu một dải dữ liệu cho chỉ số riêng lẻ. Phạm vi này sẽ nhỏ (có thể là một cửa sổ 24 giờ). Nếu nhiều số liệu được yêu cầu, điều này sẽ được thực hiện qua nhiều truy vấn. – KingCronus

+0

Ngoài ra, trong trường hợp này là không cần thiết, vì các số liệu không cần phải theo thứ tự cụ thể, nhưng cảm ơn bạn cho các headup. – KingCronus

+0

Đã cập nhật câu trả lời của tôi ở trên. Hi vọng điêu nay co ich. –