MySQL : 192 조 레코드 작업… (예, 192 조)


39

질문은 ...

192 조 개의 레코드를 고려할 때 고려해야 할 사항은 무엇입니까?

나의 주요 관심사는 속도입니다.

여기 테이블이 있습니다 ...

    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`)
    );

검색어는 다음과 같습니다.

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")

여기 몇 가지 메모가 있습니다 ...

  • SELECT는 INSERT보다 훨씬 자주 수행됩니다. 그러나 때때로 한 번에 수백 개의 레코드를 추가하고 싶습니다.
  • 로드 방식으로 몇 시간 동안 아무 것도 없을 것입니다.
  • 더 이상 정규화 할 수 없다고 생각하십시오 (p 값 조합 필요)
  • 데이터베이스 전체는 매우 관계가 있습니다.
  • 이것은 지금까지 가장 큰 테이블이 될 것입니다

업데이트 (08/11/2010)

흥미롭게도 나는 두 번째 옵션을 받았다.

192 조 대신에 2.6 * 10 ^ 16 (15 0, 26 조를 의미)을 저장할 수 있습니다 ...

그러나이 두 번째 옵션에서는 하나의 bigint (18) 만 테이블에 인덱스로 저장하면됩니다. 그게 다야-단 하나의 열. 그래서 나는 값의 존재를 확인하고 있습니다. 때때로 레코드를 추가하고 삭제하지는 않습니다.

그래서 단순히 숫자를 저장하는 mysql보다 더 나은 솔루션이 있어야한다고 생각하게합니다 ...

이 두 번째 옵션이 주어지면 첫 번째 옵션을 사용하거나 고수해야합니다 ...

[편집] 방금 수행 된 일부 테스트에 대한 소식을 얻었습니다.이 설정으로 1 억 개의 행이 0.0004 초 내에 쿼리를 반환합니다. [/ edit]


7
MySQL을 어떻게 사용하고 있습니까? 누군가가 확실한 주장을 제공한다면 다른 dbms로 전환하도록 확신 할 수 있습니까?
WheresAlice

3
10 ^ 12 또는 10 ^ 18에서와 같은 조?
andol

15
192 Trillion 레코드에는 토론 포럼이 아닌 MySQL 커미터에게 질문을 할 수있는 예산이 있어야합니다.
Remus Rusanu

5
이 큰 데이터베이스 (그리고 예산이 적당 한 예산)를 사용하면 큰 DB를 쉽게 처리 할 수있는 것으로 입증 된 Oracle 또는 SQL Serer 솔루션을 사용하는 것이 어떻습니까?
Jim B

5
이를 구현할 때 항상 최신 정보를 유지하십시오. 나는 확실히 관심이 있습니다. 당신은 또한 highscalability.com
Tom O'Connor

답변:


30

pQd의 7PB 추정치는 합리적이며 RDBMS에 대한 많은 데이터입니다. MySQL은 물론 공유 디스크 시스템으로 7PB를 수행하는 사람에 대해 들어 본 적이 없습니다. 공유 디스크 시스템으로이 볼륨의 데이터를 쿼리하면 속도가 느려질 수 있습니다. 대규모 스트리밍 쿼리에 맞게 조정하더라도 가장 빠른 SAN 하드웨어는 20GB / 초로 최대가됩니다. 이 사양의 SAN 하드웨어를 감당할 수 있다면 MySQL보다 작업에 더 적합한 것을 사용하는 것이 좋습니다.

사실, 나는 당신이이 스펙의 디스크 서브 시스템을위한 예산을 가질 수 있지만 더 나은 DBMS 플랫폼을위한 예산을 가질 수없는 시나리오를 생각하기 위해 고심하고 있습니다. 600GB 디스크 (현재 시중에 나와있는 가장 큰 15K '엔터프라이즈'드라이브)를 사용하더라도 7PB를 저장하기 위해 12,000 개의 물리적 디스크 드라이브가 필요합니다. SATA 디스크는 저렴하지만 (2TB 디스크의 경우 1/3의 숫자가 필요함) 상당히 느립니다.

EMC 또는 Hitachi와 같은 주요 공급 업체의이 사양 SAN은 수백만 달러에 달합니다. 지난 한 주요 공급 업체의 SAN 장비로 작업 할 때 IBM DS8000의 공간 전송 비용은 TB 당 £ 10k 이상이며 컨트롤러에 대한 자본 적 여유는 포함되지 않았습니다.

이 많은 데이터를 위해서는 Teradata 또는 Netezza와 같은 공유 시스템이 필요합니다. MySQL 데이터베이스 샤딩이 작동 할 수 있지만 VLDB 플랫폼을 구축하는 것이 좋습니다. 또한 무 공유 시스템을 사용하면 노드에서 훨씬 저렴한 직접 연결 디스크를 사용할 수 있습니다. 한 가지 가능성에 대해서는 Sun의 X4550 (Thumper) 플랫폼을 살펴보십시오.

성능 요구 사항도 고려해야합니다.

  • 쿼리에 허용되는 런타임은 무엇입니까?
  • 얼마나 자주 데이터 세트를 쿼리 하시겠습니까?
  • 대부분의 쿼리는 인덱스를 사용하여 해결 될 수 있습니까 (즉, 데이터의 1 % 미만)-전체 테이블 스캔을 수행해야합니까?
  • 데이터베이스에 데이터가 얼마나 빨리로드됩니까?
  • 쿼리에 최신 데이터가 필요합니까? 아니면 정기적으로 새로 고쳐진보고 테이블을 사용하여 살 수 있습니까?

요컨대, MySQL에 대한 가장 강력한 주장은 가능하다면 7PB의 데이터에 대해 적절한 쿼리 성능을 얻기 위해 백 플립을 수행한다는 것입니다. 이 대량의 데이터는 합리적으로 빠르게 쿼리 할 수있는 무언가를 만들기 위해 아무것도없는 공유 영역에 놓이게되며 처음부터 아무 것도 공유하지 않는 작업을 위해 설계된 플랫폼이 필요할 것입니다. 디스크만으로도 합리적인 DBMS 플랫폼의 비용이 줄어 듭니다.

참고 : 운영 및보고 데이터베이스를 분리 한 경우 반드시 동일한 DBMS 플랫폼을 사용할 필요는 없습니다. 동일한 7PB 테이블에서 빠른 삽입 및 1 초 미만의 보고서를 얻는 것은 최소한 기술적 인 문제가 될 것입니다.

보고에서 약간의 대기 시간으로 살아갈 수 있다는 의견을 감안할 때 별도의 캡처 및보고 시스템을 고려할 수 있으며 7PB의 모든 데이터를 운영 캡처 시스템에 유지하지 않아도됩니다. 데이터 캡처를 위해 Oracle과 같은 운영 플랫폼 (MySQL이 InnoDB와 함께이 작업을 수행 할 수 있음) ( 다수 의 사용자 가없는 한 디스크 비용만으로도 DBMS 비용이 줄어 듭니다 )과 Teradata, Sybase 와 같은 VLDB 플랫폼을 고려하십시오. IQ, 붉은 벽돌, 네티 또는 (전용 하드웨어 주) 그린 플럼 보고


1
@ConcernedOfTunbridgeW-그들은 항상 이런 식으로 갈 수 있습니다 : blog.backblaze.com/2009/09/01/…-SAN 보다 훨씬 더 재미 있고 ~ 120-130 4U 상자 만 필요했습니다 ...하지만 확실하지 않은지 사업 '은 행복 할 것입니다 ....
pQd

기본적으로 예산에 따른 Sun Thumper이며 실제로는 비공유 시스템의 노드 옵션의 예입니다. 나는 이것에 대한 다른 옵션을 보았을 것이라고 확신하지만 where는 생각할 수 없다. 문제는 하드웨어가 아니라 데이터베이스 플랫폼입니다.
ConcernedOfTunbridgeWells

그러나 날카로운 관찰자들은 이와 같은 모든 종류의 직접 연결 기반 상자는 SAN 기반의 것보다 TB 당 훨씬 저렴하며 공유 플랫폼이 아닌 플랫폼에서 작동하도록 설계된 것을 선호하는 적어도 하나의 중요한 주장입니다. .
ConcernedOfTunbridgeWells

@ConcernedOfTunbridgeWells 그리고 여러 [기타 전력 배고픈] 상자에서 모든 쿼리 / 유지 보수 및 기타 모든 것을 병렬로 실행할 수 있습니다.
pQd

1
@ConcernedOfTunbridgeWells-질문에 대답하려면 가능하다면 1 초 안에 약 500 개의 쿼리가 필요합니다. 나는 하루에 몇 백 번만 할 것입니다. 그러나 쿼리가 실행되면 전체 테이블을 스캔해야합니다. 또한 INSERT는 SELECT보다 우선 순위가 낮기 때문에 즉각적인 위치에있을 필요는 없습니다. "새"데이터가 데이터베이스에 들어갈 때까지 몇 시간 동안 기다릴 수 있습니다.
Sarah

16

파편. 이 크기에서 하나의 큰 인스턴스를 갖는 것은 자살입니다. 가능한 백업 복원, 테이블 스페이스 손상, 새 열 추가 또는 기타 '하우스 유지'프로세스를 고려하십시오.이 규모에서 합리적인 시간 내에 모든 작업을 수행하는 것은 불가능합니다.

봉투 계산의 간단한 뒷면-64 비트 id를 제외한 모든 열에 대해 32 비트 정수를 가정합니다. 포함 된 인덱스가 없습니다 :

8 * 4B + 8B = 행당 40B [이것은 매우 낙관적입니다]

192 조 행 40B 각각 우리에게 거의 7 PB

아마도 전체 내용을 다시 생각하고, 빠른보고를 위해 정보를 요약하고, 누군가가 더 자세한 내용을 조사해야 할 때 주어진 시간 간격 동안 압축 된 레코드를 저장할 수 있습니다.

답변해야 할 질문 :

  • 시스템 충돌 / 재부팅시 허용되는 다운 타임은 무엇입니까?
  • 계획된 유지 관리를 위해 백업을 복구하거나 서버를 프로덕션에서 꺼내야 할 때 액세스 가능한 가동 중지 시간
  • 얼마나 자주 그리고 어디에서 백업을 하시겠습니까?

랜덤 링크-인서트 속도 :


동의합니다-7PB는 꽤 무겁습니다. 다시 생각하고 더 가벼운 솔루션을 찾고 싶지만 p 필드의 특정 조합의 존재 (또는 존재하지 않음)를 찾아야합니다. 테이블을 나누는 것이 내 마음을 넘어 섰습니다. 더 합리적이지만 각 테이블에 차례대로 쿼리가 있음을 의미합니다. 관심이 없다면 여기에 몇 개의 테이블을 나누는 것이 좋습니다?
Sarah

5
@Sarah-나는 테이블뿐만 아니라 기계로 나누는 것이 좋습니다. 쿼리를 병렬로 실행하여 성능을 얻을 수 있습니다 [더 작은 규모로 수행]. 서버 재부팅 후 파일 시스템 손상 또는 일상적인 점검은 어떻습니까? 특정 조합을 찾아서 무슨 의미인지 잘 모르겠습니다. 간단한 키-값 저장소가 도움이 될까요? 테이블 크기-수십 GB를 넘지 않아야합니다. 단일 서버의 데이터-몇 TB 이하. 봐 stackoverflow.com/questions/654594는 두통이 훨씬 작은 규모에서 무엇을 기대 알고; innodb_file_per_table 사용
pQd


2

당신이하고 싶은 모든 것이 그것들이 세트 안에 있는지 보는 것이라면 수십억의 숫자를 저장하는 것보다 다른 방법이있을 수 있습니다. 블룸 필터 는 여러 가지 방법으로 해싱함으로써 확률적인 방법입니다. 또한 거짓 긍정은 가능하지만 거짓 긍정은 불가능합니다. (따라서 숫자가 세트에 있다고 잘못 말할 수 있지만 실제로는 그렇지 않다고 말할 수는 없습니다). 저장해야 할 항목 수가 여전히 많지만 최소한 작업 데이터 세트 크기를 다소 줄일 수 있습니다.


내가 거짓 부정과 함께 살 수는 있지만 재미있는 말은 들리지만 거짓 긍정은 아닙니다 :)
Sarah

2

편집 : 실제로 정수 범위의 X 위치에 "레코드"가 존재하거나 존재하지 않는 경우 데이터 저장소를 제거하고 비트 맵을 사용할 수 있습니다 ... 100TB의 디스크 공간이있는 10 대 정도의 시스템 (따라서 성능 및 백업을 위해 비트 맵 사본 10 개를 보유하고 있음) 서버 당 128GB의 RAM을 수행 한 경우 메모리에 고해상도 최상위 레벨 블록 그룹 인덱스를 맞추면 디스크의 비트 X 26 쿼드 릴리 온을 확인하기 전에 첫 번째 점검을 수행 할 수 있습니다. .

옵션 2를 선택하겠습니다.

각각 64TB (32 2TB 드라이브)가있는 375 대의 시스템 (실제로 400 개의 장애가 발생하는 시스템)은 레코드를 각각 2TB 인 ZVOL에 매핑하면됩니다. 그런 다음 하나 이상의 인덱스 서버에서 Judy 배열 또는 critbit 배열 또는 평범한 비트 맵에 저장합니다 (26 개의 4 중 위치 중 하나에 레코드를 추가 한 경우의 맵핑). 인덱스는 50에서 100TB 사이이며 64GB 미만의 RAM에 맞는 특정 64k 주소 블록에 기록 된 레코드가 있고 빠른 초기 검사 수준을 제공하는 경우 두 번째 수준의 인덱스를 숨길 수도 있습니다. 특정 "이웃"이 비어 있는지 여부.

그런 다음 해당 레코드를 읽으려면 먼저 색인을보고 찾을 레코드가 있는지 확인하십시오. 있는 경우 간단한 인덱스 계산을 기반으로 해당 2TB Blob 내의 해당 머신 / 레코드 위치 # (Z)에서 머신 # (X) / ZOL # (Y)로 이동하십시오. 단일 레코드 조회는 매우 빠르며 데이터 스토어의 일부를 다른 데이터베이스에로드 (실제 작업에 데이터 스토어를 사용하는 동안)하고 전체 데이터베이스를 지원할 수 있는지 여부를 확인하기 위해 성능 테스트를 수행 할 수 있습니다. 그런 식으로 데이터 저장소를 사용하십시오.

ZOL은 다른 파일 시스템에서 드문 파일로 생각할 수있는 ZFS이므로 유사한 것이 적용됩니다. 또는 디스크의 특정 바이트 번호로 색인을 생성 할 수 있지만 모든 디스크에 대해 작동하는 수준에서 디스크 당 사용 된 바이트 수를 제한하지 않으면 (예 : 2TB 디스크 당 1.75TB) 디스크 크기가 다른 경우 까다로워집니다. . 또는 고정 크기 등의 메타 장치를 만드십시오.


안녕 사라-당신이 여전히이 작업을하고 있는지 확실하지 않지만 도움이 필요하면 100TB 머신에서 내 아이디어를 프로토 타입 할 수 있으며 주요 미국 데이터 센터에서 호스트하고 전체 프로덕션 클러스터를 기꺼이 관리하려고합니다. 필요에 따라 400-500 대의 기계. BTW, SF의 CNET에서 일한 적이 있습니까?

1

미친 듯이 (mysqltuner를 사용하여) DB를 매개 변수를 조정하여 SELECT를 인간적으로 가능한 많이 캐시하려고 시도하는 것 외에도 조사 할 수있는 한 가지 방법은 수백 개의 레코드를 삽입 할 때 START TRANSACTION / CoMMIT (InnoDB 가정)입니다. 행 단위 잠금 오버 헤드가 발생하고 삽입 시간이 크게 줄어 듭니다. 또한 테이블을 MyISAM과 InnoDB로 만들고 테이블에 테스트를 실행하여 캐싱이 강화되면 실제로 어떤 것이 더 빠른지 확인합니다. 항상 MyISAM이 읽기에 더 빠르지는 않습니다.

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

테스트하는 동안 동시 스레드 수는 캐시 튜닝에만 사용할 수있는 서버의 RAM 용량을 알 수있을 때까지 위아래로 다양해야합니다. 수학으로 더 많은 스레드를 지원할 수 있지만 스레드 수가 너무 많으면 DB 자체가 실제로 더 나빠질 수 있습니다.

또한 MyISAM 및 / 또는 InnoDB 테이블 당 파일을 사용하는 경우 / var / lib / mysql에 대해 더 작은 블록 크기로 조정되고 fs- 유형 매개 변수 (예 : ext3 /)를 조정하는 다른 파일 시스템 마운트 지점 작성을 조사 할 수 있습니다. ext4 / resiserfs 저널에 대해 data = writeback을 사용하고 I / O 속도를 위해 파일 시스템에서 액세스 시간 업데이트를 비활성화 할 수 있습니다.


1
트랜잭션 요구 사항으로 인해 myisam에 문제가없는 것 같습니다.
pQd

0

두 번째 옵션의 경우 실제로 몇 개의 숫자가 배치 될 가능성이 있습니까?

천 또는 10K, 100K 등 중 하나만있는 경우 사용 된 (또는 사용되지 않은) 숫자 범위를 저장하면 수조 개의 항목을 저장할 수 있습니다. 예 : 저장 ( 'free', 0,100000), ( 'taken', 100000,100003), ( 'free', 100004,584234)-필요에 따라 행을 2 ~ 3 개의 행으로 분할하고 첫 번째 숫자에 대한 색인 생성, x <= {needle}을 검색하여 검색된 숫자가 포함 된 범위가 사용되는지 또는 비어 있는지 확인합니다.

두 상태가 모두 필요하지 않을 수도 있습니다. 가장 낮은 상태를 저장하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.