2010-12-21 3 views
3

EC2에서 쓰기가 많은 쓰기 어플리케이션이 있습니다. MySQL DB에서 수천 개의 동시 쓰기 작업을 수행 할 수 있도록 최적화하는 방법에 대한 의견이 있으십니까?MySQL 데이터베이스를 쓰기 위해 어떻게 최적화합니까?

+0

너무 소수의 데이터입니다. 최적화해야하는 이유는 무엇입니까? 병목 현상은 어디에 있습니까? EC2의 유형은 무엇입니까? EBS 볼륨을 사용하지 않는 이유는 무엇입니까? – Lex

+0

어디에서 병목 현상을 최적화 할 것인가? : 동시에 수천 개의 등록을 동시에 작성해야합니다. 우리는 웹 서버에 EBS를 사용하지만 DB 용 RDS는 – user449914

+0

입니다. hmm .. 등록 요청을 대기열에 넣지 않고 RDS에 삽입 할 백그라운드 프로세스가 있습니까? –

답변

4

쓰기 스케일링은 어려운 문제입니다. 아마도 스케일링을 작성하는 비밀은 읽기 스케일링에 있습니다. 즉, 캐시는 가능한 한 많이 읽으므로 쓰기가 모든 처리량을 얻습니다.

1) 데이터 모델로 시작 :

는 하나가 할 수있는 일의 무리가 있음을 가졌어요. 테이블을 삭제하거나 업데이트하지 않도록 데이터 모델을 설계하십시오. 조작 만 삽입입니다. 유효 날짜, 유효 순서 및 유효 상태를 사용하여 삽입 명령 만 사용하여 삽입, 업데이트 및 삭제 작업을 구현하십시오. 이 개념을 Append Only 모델이라고합니다. Checkout RethinkDB ..

2) 동시 삽입 플래그를 1로 설정하십시오. 그러면 읽기가 진행되는 동안 테이블이 계속 삽입됩니다.

3) 꼬리 부분에 삽입 만있는 경우 행 수준의 잠금이 필요하지 않을 수 있습니다. 그래서, MyISAM을 사용하십시오 (이것은 나중에 InnoDB에서 벗어나지 않습니다).

4)이 모든 작업이 많지 않으면 메모리 엔진에 복제본 테이블을 만듭니다. MY_DATA 테이블이 있으면 메모리 테이블에 MY_DATA_MEM이라는 테이블을 작성하십시오.

5) 모든 삽입물을 MEM 테이블로 리디렉션하십시오. 두 테이블 모두를 UNIONS하는 뷰를 만들고 해당 뷰를 읽기 소스로 사용하십시오.

6) 정기적으로 MEM 내용을 Main 테이블로 이동하고 Mem 테이블에서 삭제하는 데몬을 작성하십시오. Mem 테이블에 Delete 트리거로 MOVE 연산을 구현하는 것이 이상적 일 수 있습니다 (메모리 엔진에서 트리거가 가능할 것으로 기대됩니다.).

7) MEM 테이블에서 삭제하거나 업데이트하지 마십시오 (속도가 느림). 또한 테이블의 키의 카디널리티에주의를 기울여야합니다 (해시 대 B 트리 : 로우 카드 -> 해시, 하이 카드 - > B- 트리)

8) 위의 모든 것이 작동하지 않는 경우에도 jdbc/odbc를 제거하십시오. InnoDB로 이동하고 Handler Socket 인터페이스를 사용하여 직접 삽입 (Yoshinori-San MySQL 용 Google)

나는 HS를 직접 사용하지 않았지만 벤치 마크는 인상적이다. Google Code에는 심지어 Java HS Project가 있습니다. 도움이

희망 ..

관련 문제