Mysql: Làm việc với 192 nghìn tỷ bản ghi (Có, 192 nghìn tỷ)


39

Đây là câu hỏi ...

Xem xét 192 nghìn tỷ hồ sơ, những cân nhắc của tôi nên là gì?

Mối quan tâm chính của tôi là tốc độ.

Đây là cái bàn ...

    CREATE TABLE `ref` (
  `id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL,
  `rel_id` INTEGER(13) NOT NULL,
  `p1` INTEGER(13) NOT NULL,
  `p2` INTEGER(13) DEFAULT NULL,
  `p3` INTEGER(13) DEFAULT NULL,
  `s` INTEGER(13) NOT NULL,
  `p4` INTEGER(13) DEFAULT NULL,
  `p5` INTEGER(13) DEFAULT NULL,
  `p6` INTEGER(13) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY (`s`),
  KEY (`rel_id`),
  KEY (`p3`),
  KEY (`p4`)
    );

Đây là các truy vấn ...

SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4"

SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id"

INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6)
VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")

Đây là một số lưu ý ...

  • Các CHỌN sẽ được thực hiện thường xuyên hơn nhiều so với CHERTN. Tuy nhiên, đôi khi tôi muốn thêm vài trăm hồ sơ cùng một lúc.
  • Tải thông minh, sẽ không có gì trong nhiều giờ sau đó có thể vài nghìn truy vấn cùng một lúc.
  • Đừng nghĩ rằng tôi có thể bình thường hóa nữa (cần các giá trị p trong một kết hợp)
  • Các cơ sở dữ liệu nói chung là rất quan hệ.
  • Đây sẽ là bảng lớn nhất cho đến nay (lớn nhất tiếp theo là khoảng 900k)

CẬP NHẬT (08/11/2010)

Thật thú vị, tôi đã được cung cấp một lựa chọn thứ hai ...

Thay vì 192 nghìn tỷ, tôi có thể lưu trữ 2,6 * 10 ^ 16 (15 số không, nghĩa là 26 triệu) ...

Nhưng trong tùy chọn thứ hai này, tôi chỉ cần lưu trữ một bigint (18) làm chỉ mục trong một bảng. Đó là nó - chỉ một cột. Vì vậy, tôi sẽ chỉ kiểm tra sự tồn tại của một giá trị. Thỉnh thoảng thêm hồ sơ, không bao giờ xóa chúng.

Vì vậy, điều đó khiến tôi nghĩ rằng phải có một giải pháp tốt hơn sau đó là mysql chỉ đơn giản là lưu trữ số ...

Đưa ra tùy chọn thứ hai này, tôi nên dùng nó hay gắn bó với ...

[sửa] Chỉ cần nhận được tin tức về một số thử nghiệm đã được thực hiện - 100 triệu hàng với thiết lập này trả về truy vấn sau 0,0004 giây [/ chỉnh sửa]


7
Làm thế nào thiết lập bạn đang sử dụng MySQL cho điều này? Bạn có thể bị thuyết phục để chuyển sang một dbms khác nếu ai đó cung cấp các đối số vững chắc để làm như vậy không?
WheresAlice

3
Trillion như trong 10 ^ 12 hay như trong 10 ^ 18?
andol

15
Tại 192 nghìn tỷ bản ghi, bạn nên có ngân sách cho phép bạn đặt câu hỏi cho những người ủy quyền MySQL, chứ không phải một số diễn đàn thảo luận.
Remus Rusanu

5
Với một cơ sở dữ liệu lớn như vậy (và rõ ràng là một ngân sách kha khá), tại sao không đi cùng với giải pháp serer orory hoặc sql serer đã được chứng minh là dễ dàng xử lý các DB lớn?
Jim B

5
Hãy chắc chắn để giữ cho chúng tôi cập nhật khi bạn thực hiện điều này. Tôi chắc chắn sẽ quan tâm. Bạn cũng có thể muốn viết nó lên cho highscalability.com
Tom O'Connor

Câu trả lời:


30

Ước tính 7PB của pQd có vẻ hợp lý và đó là rất nhiều dữ liệu cho RDBMS. Tôi không chắc chắn tôi đã từng nghe nói về ai đó làm 7PB với bất kỳ hệ thống đĩa được chia sẻ nào chứ đừng nói đến MySQL. Truy vấn khối lượng dữ liệu này với bất kỳ hệ thống đĩa chia sẻ nào sẽ chậm một cách bất thường. Phần cứng SAN nhanh nhất đạt tối đa 20GB / giây ngay cả khi được điều chỉnh cho các truy vấn truyền phát lớn. Nếu bạn có thể mua phần cứng SAN của thông số kỹ thuật này, bạn có thể sử dụng thứ gì đó phù hợp với công việc hơn MySQL.

Trên thực tế, tôi đang vật lộn để nghĩ ra một kịch bản mà bạn có thể có ngân sách cho một hệ thống con đĩa của thông số này nhưng không phải cho một nền tảng DBMS tốt hơn. Ngay cả khi sử dụng các ổ đĩa 600 GB (ổ đĩa 15K 'doanh nghiệp' lớn nhất hiện có trên thị trường), bạn sẽ có thứ gì đó như 12.000 ổ đĩa vật lý để lưu trữ 7PB. Đĩa SATA sẽ rẻ hơn (và với đĩa 2TB bạn sẽ cần khoảng 1/3 số lượng), nhưng chậm hơn một chút.

Một SAN của thông số kỹ thuật này từ một nhà cung cấp lớn như EMC hoặc Hitachi sẽ chạy đến nhiều triệu đô la. Lần trước tôi đã làm việc với thiết bị SAN từ một nhà cung cấp lớn, chi phí chuyển đổi không gian trên IBM DS8000 là hơn 10 nghìn bảng / TB, không bao gồm bất kỳ khoản trợ cấp vốn nào cho các bộ điều khiển.

Bạn thực sự cần một hệ thống không có gì được chia sẻ như Teradata hoặc Netezza cho nhiều dữ liệu này. Bảo vệ cơ sở dữ liệu MySQL có thể hoạt động nhưng tôi khuyên bạn nên sử dụng nền tảng VLDB được xây dựng có mục đích. Một hệ thống không có gì được chia sẻ cũng cho phép bạn sử dụng đĩa đính kèm trực tiếp rẻ hơn nhiều trên các nút - hãy xem nền tảng X4550 (máy xúc lật) của Sun để biết một khả năng.

Bạn cũng cần phải nghĩ về yêu cầu hiệu suất của bạn.

  • Thời gian chạy chấp nhận được cho một truy vấn là gì?
  • Tần suất bạn sẽ truy vấn dữ liệu của bạn?
  • Phần lớn các truy vấn có thể được giải quyết bằng cách sử dụng một chỉ mục (nghĩa là chúng sẽ xem xét một phần nhỏ - giả sử: dưới 1% - dữ liệu), hoặc chúng có cần thực hiện quét toàn bộ bảng không?
  • Làm thế nào nhanh chóng dữ liệu sẽ được tải vào cơ sở dữ liệu?
  • Các truy vấn của bạn có cần dữ liệu cập nhật hoặc bạn có thể sống với bảng báo cáo được làm mới định kỳ không?

Nói tóm lại, lập luận mạnh mẽ nhất đối với MySQL là bạn sẽ thực hiện các bước lùi để có được hiệu năng truy vấn tốt trên 7PB dữ liệu, nếu có thể. Khối dữ liệu này thực sự đưa bạn vào lãnh thổ không chia sẻ để tạo ra thứ gì đó sẽ truy vấn nó một cách hợp lý nhanh chóng và có thể bạn sẽ cần một nền tảng được thiết kế cho hoạt động không chia sẻ ngay từ đầu. Các đĩa đơn lẻ sẽ làm giảm chi phí của bất kỳ nền tảng DBMS hợp lý nào.

Lưu ý: Nếu bạn phân chia cơ sở dữ liệu hoạt động và báo cáo, bạn không nhất thiết phải sử dụng cùng một nền tảng DBMS cho cả hai. Nhận các chèn nhanh và báo cáo phụ thứ hai từ cùng một bảng 7PB sẽ là một thách thức kỹ thuật ít nhất.

Dựa trên nhận xét của bạn rằng bạn có thể sống với độ trễ trong báo cáo, bạn có thể xem xét các hệ thống thu thập và báo cáo riêng biệt và bạn có thể không cần giữ tất cả 7PB dữ liệu trong hệ thống chụp hoạt động của mình. Hãy xem xét một nền tảng hoạt động như Oracle (MySQL có thể làm điều này với InnoDB) để thu thập dữ liệu (một lần nữa, chi phí của các đĩa sẽ làm giảm chi phí của DBMS trừ khi bạn có nhiều người dùng) và nền tảng VLDB như Teradata, Sybase IQ, RedBrick, Netezza (lưu ý: phần cứng độc quyền) hoặc Greenplum để báo cáo


1
@ConcernedOfTunbridgeW - họ luôn có thể đi theo cách này: blog.backblaze.com/2009/09/01/ Khăn - vui hơn nhiều so với SAN, chỉ cần ~ 120-130 hộp 4U ... nhưng tôi không chắc nếu ' kinh doanh 'sẽ rất vui ....
pQd

Về cơ bản, Sun Thumper với ngân sách và thực sự là một ví dụ về tùy chọn cho một nút trong hệ thống không chia sẻ. Tôi chắc chắn tôi cũng đã thấy các tùy chọn khác cho việc này, nhưng tôi không thể nghĩ đến đâu. Câu hỏi không phải là quá nhiều phần cứng mà là nền tảng cơ sở dữ liệu gì.
Mối quan tâmOfTunbridgeWells

Tuy nhiên, các nhà quan sát sắc sảo sẽ lưu ý rằng bất kỳ loại hộp dựa trên tệp đính kèm trực tiếp nào như thế này đều rẻ hơn nhiều so với bất kỳ thứ gì dựa trên SAN, đó là ít nhất một đối số quan trọng ủng hộ thứ gì đó được thiết kế để hoạt động trên nền tảng không chia sẻ .
Mối quan tâmOfTunbridgeWells

@ConcernedOfTunbridgeWells và bạn có thể chạy tất cả các truy vấn / bảo trì đó và bất kỳ thứ gì khác song song trên nhiều hộp [nếu không đói điện].
pQd

1
@ConcernedOfTunbridgeWells - để trả lời câu hỏi của bạn ... Tôi cần khoảng 500 truy vấn để quay lại trong một giây, nếu có thể. Tôi sẽ làm việc này chỉ vài trăm lần một ngày. Khi một truy vấn chạy, mặc dù toàn bộ bảng cần phải được quét. Ngoài ra, các INSERT là một ưu tiên thấp hơn so với các CHỌN, do đó, nó không phải ở bất cứ đâu gần ngay lập tức. Tôi có thể đợi vài giờ để dữ liệu "mới" được vào cơ sở dữ liệu.
Sarah

16

bảo vệ nó ở kích thước này, có một trường hợp lớn là tự sát - hãy nghĩ về khả năng khôi phục sao lưu, hỏng hóc không gian bảng, thêm cột mới hoặc bất kỳ quy trình 'giữ nhà' nào khác - tất cả những điều đó không thể thực hiện được trong thời gian hợp lý ở quy mô này.

mặt sau đơn giản của các phép tính đường bao - giả sử số nguyên 32 bit cho tất cả các cột trừ id 64 bit; không có chỉ số bao gồm:

8 * 4B + 8B = 40B mỗi hàng [và điều này rất lạc quan]

192 nghìn tỷ hàng 40B mỗi hàng cung cấp cho chúng tôi gần 7 PB

có lẽ bạn có thể suy nghĩ lại toàn bộ, tóm tắt thông tin để báo cáo nhanh và lưu trữ các bản ghi nén trong khoảng thời gian nhất định khi ai đó cần tìm hiểu chi tiết sâu hơn.

câu hỏi để trả lời:

  • thời gian chết chấp nhận được trong trường hợp hệ thống gặp sự cố / được khởi động lại là gì?
  • thời gian chết có thể truy cập khi bạn cần khôi phục sao lưu hoặc rút máy chủ ra khỏi sản xuất để bảo trì theo kế hoạch.
  • bao lâu và bạn muốn sao lưu ở đâu?

liên kết ngẫu nhiên - tốc độ chèn:


Tôi đồng ý- 7PB khá nặng. Tôi thích suy nghĩ lại và tìm một giải pháp nhẹ hơn, nhưng tôi cần tìm sự tồn tại (hoặc không tồn tại) của một sự kết hợp cụ thể của các trường p. Tách ra các bảng vượt qua tâm trí tôi - điều đó hợp lý hơn, nhưng điều đó chỉ có nghĩa là tôi đã lần lượt truy vấn từng bảng. Không quan tâm, bạn muốn chia bao nhiêu bảng ở đây?
Sarah

5
@Sarah - tôi không chỉ khuyên bạn nên chia thành các bảng mà còn cả máy móc. bạn có thể chạy các truy vấn của mình song song để đạt được hiệu suất [tôi thực hiện ở quy mô nhỏ hơn]. Điều gì về lỗi hệ thống tập tin hoặc thậm chí kiểm tra thường xuyên sau khi khởi động lại máy chủ? Tôi không chắc ý của bạn là gì khi tìm kiếm sự kết hợp cụ thể ... có lẽ cửa hàng khóa-giá trị đơn giản sẽ giúp ích? kích thước bảng - không quá vài chục GB; dữ liệu trên một máy chủ - không quá vài TB. nhìn vào stackoverflow.com/questions/654594 để biết những gì đau đầu mong đợi ở quy mô nhỏ hơn nhiều; sử dụng innodb_file_per_table
pQd


2

Có thể có một cách khác, thay vì lưu trữ bốn triệu số nếu tất cả những gì bạn muốn làm là xem chúng có trong tập hợp không. Bộ lọc Bloom là một phương pháp xác suất, bằng cách băm theo nhiều cách. Ngoài ra, dương tính giả là có thể, nhưng phủ định sai thì không. (Vì vậy, nó có thể nói số nằm trong tập hợp - và sai, nhưng nó sẽ không nói rằng nó không ở đó, nếu nó thực sự là vậy). Vẫn còn vấn đề về số lượng lớn các mặt hàng để lưu trữ, nhưng ít nhất nó có thể làm giảm kích thước tập dữ liệu đang hoạt động.


Nghe có vẻ thú vị, mặc dù tôi có thể sống với âm tính giả - nhưng không phải là dương tính giả :)
Sarah

2

Chỉnh sửa: Trên thực tế nếu đó chỉ là sự tồn tại hay không của "bản ghi" tại vị trí X trong một phạm vi số nguyên, bạn có thể loại bỏ kho dữ liệu và chỉ cần sử dụng bitmap ... Vì vậy, 10 hoặc hơn các máy có không gian đĩa 100 TB (vì vậy bạn có 10 bản sao bitmap để thực hiện và sao lưu) và nếu bạn đã có 128GB RAM cho mỗi máy chủ, bạn có thể điều chỉnh chỉ số nhóm cấp cao nhất có độ phân giải cao trong bộ nhớ để thực hiện kiểm tra đầu tiên trước khi đánh vào đĩa cho bit X là 26 Quadrillion .

Tôi sẽ chọn tùy chọn # 2 Nếu bạn chọn:

375 máy với 64TB (32 ổ 2TB) mỗi máy (thực tế là 400 máy bị lỗi) sau đó chỉ cần ánh xạ các bản ghi vào ZVOL mỗi ổ 2TB. Sau đó, trên một hoặc nhiều máy chủ chỉ mục, lưu trữ trong một mảng Judy hoặc mảng critbit hoặc chỉ là bitmap đơn giản, ánh xạ nếu bạn đã thêm một bản ghi vào 1 trong 26 vị trí Quadrillion đó. Chỉ mục sẽ nằm trong khoảng từ 50 đến 100TB và bạn thậm chí có thể có chỉ số cấp độ thứ hai nếu có bất kỳ bản ghi nào được ghi vào một khối địa chỉ 64k nhất định phù hợp với ít hơn 64 GB RAM và sẽ cung cấp mức kiểm tra ban đầu nhanh chóng nếu một "khu phố" nào đó trống rỗng hay không.

Sau đó, để đọc bản ghi đó, trước tiên bạn sẽ kiểm tra xem có bản ghi nào cần tìm hay không bằng cách xem chỉ mục. Nếu có, hãy chuyển đến máy # (X) / ZOL # (Y) trên máy đó / vị trí ghi # (Z) trong blob 2TB đó dựa trên tính toán chỉ số đơn giản. Việc tìm kiếm bản ghi sẽ cực kỳ nhanh và bạn có thể kiểm tra tải một số phần của kho dữ liệu vào các dbs khác nhau (trong khi bạn sử dụng kho dữ liệu cho công việc thực tế) và thực hiện kiểm tra hiệu năng để xem liệu chúng có khả năng hỗ trợ toàn bộ cơ sở dữ liệu của bạn hay không, Chỉ cần sử dụng lưu trữ dữ liệu theo cách đó.

ZOL là một thứ ZFS có thể được coi là một tệp thưa thớt trong các hệ thống tệp khác, vì vậy những điều tương tự sẽ được áp dụng. Hoặc bạn chỉ có thể lập chỉ mục cho một số byte nhất định trên đĩa nhưng điều này trở nên khó khăn nếu các đĩa có kích thước khác nhau nếu bạn không giới hạn số byte được sử dụng cho mỗi đĩa ở mức hoạt động cho tất cả các đĩa - tức là 1,75TB mỗi đĩa 2TB . Hoặc tạo các siêu dữ liệu có kích thước cố định, v.v.


Xin chào Sarah - không chắc bạn có còn làm việc này không, nhưng nếu bạn cần trợ giúp tôi có thể tạo nguyên mẫu ý tưởng của tôi cho bạn trên máy 100TB và cũng sẵn sàng lưu trữ (tại một trung tâm dữ liệu lớn của Hoa Kỳ) và quản lý toàn bộ cụm sản xuất 400-500 máy theo yêu cầu. BTW, bạn đã từng làm việc tại CNET ở SF chưa?

1

Ngoài việc điều chỉnh các thông số DB của bạn như điên (sử dụng mysqltuner để trợ giúp) để thử và giữ các CHỌN của bạn được lưu trong bộ nhớ càng nhiều càng tốt, một điều bạn có thể điều tra là BẮT ĐẦU GIAO DỊCH / CoMMIT (giả sử InnoDB) khi chèn vài trăm bản ghi của bạn để tránh hàng theo hàng khóa trên đầu và giảm thời gian chèn của bạn bởi một yếu tố rất lớn. Tôi cũng sẽ tạo bảng khi cả MyISAM và InnoDB và chạy thử nghiệm trên đó để xem cái nào thực sự nhanh hơn một khi bạn đã siết chặt bộ nhớ đệm - không phải lúc nào MyISAM cũng sẽ nhanh hơn để đọc - hãy xem điều này:

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmark-part-1/

Trong quá trình thử nghiệm của bạn, số lượng luồng đồng thời cũng nên được thay đổi lên xuống cho đến khi bạn thấy anh ta có thể sử dụng bao nhiêu RAM trên máy chủ để dành cho việc điều chỉnh bộ đệm; bạn có thể thấy rằng trong khi bạn có thể hỗ trợ nhiều luồng hơn bằng toán học, thì chính DB thực sự có thể hoạt động kém hơn nếu số lượng luồng quá cao.

Ngoài ra, nếu bạn sử dụng tệp MyISAM và / hoặc InnoDB trên mỗi bảng, bạn có thể điều tra việc tạo một điểm gắn kết hệ thống tệp khác cho / var / lib / mysql được điều chỉnh theo kích thước khối nhỏ hơn và điều chỉnh các tham số loại fs - tức là ext3 / ext4 / resiserfs bạn có thể sử dụng data = writBack cho tạp chí và vô hiệu hóa cập nhật thời gian truy cập trên hệ thống tệp cho tốc độ I / O.


1
myisam dường như không còn nghi ngờ do yêu cầu giao dịch.
pQd

0

Đối với tùy chọn thứ hai, có bao nhiêu số có khả năng thực sự được đặt?

Nếu sẽ chỉ có một trong một nghìn, hoặc 10K, 100K, v.v., thì việc lưu trữ các phạm vi số đã sử dụng (hoặc không sử dụng) có thể tiết kiệm hàng nghìn tỷ mục. ví dụ: lưu trữ ('miễn phí', 0,100000), ('lấy', 100000,100003), ('miễn phí', 100004,584234) - chia hàng thành hai hoặc ba hàng theo yêu cầu và lập chỉ mục cho số đầu tiên, tìm kiếm x <= {kim} để xem phạm vi chứa số tìm kiếm được lấy hay miễn phí.

Bạn thậm chí có thể không cần cả hai trạng thái. Chỉ cần lưu trữ bất kỳ trạng thái nào là ít có khả năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.