2009-06-16 6 views
2

현재 10 개의 노드가있는 클러스터에서 mysql에 대해 java 프로젝트를 작성하고 있습니다. 이 프로그램은 데이터베이스에서 일부 정보를 가져 와서 계산을 한 다음 일부 데이터를 다시 데이터베이스로 푸시합니다. 그러나 테이블에는 수백만 개의 행이 있습니다. 작업을 분할하고 클러스터 아키텍처를 활용할 수있는 방법이 있습니까? 다른 노드에서 멀티 스레딩을 수행하는 방법은 무엇입니까?mysql에서 작업 속도 향상

답변

0

데이터베이스 서버의 저장 프로 시저에서 계산을 수행하고 중간 계층에 수백만 개의 행을 전달하는 방법을 생각해 봅니다. 당신은 많은 바이트를 유선에 저장할 것입니다. 계산의 본질, 스키마, 인덱싱 등에 따라 데이터베이스 서버가 멀티 스레딩에 의존하지 않고도 계산을 수행 할 수있는 능력을 갖추고 있음을 알 수 있습니다.

내가 틀릴 수도 있지만 프로토 타입을 볼 가치가 있습니다.

+0

그는 단지 하나의 mysql 서버를 가지고있는 것처럼 들리므로 문제를 분산시키기 위해 클러스터를 사용하는 대신 단일 리소스에 병목 현상이 발생합니다. – NeuroScr

1

Gearman을 사용하여 mysql 데이터베이스의 Map/Reduce 스타일 작업에 흥미로운 프레젠테이션을 보았습니다. 그것은 당신이 찾고있는 것일 수도 있습니다 : here을보십시오. mysql 웹 페이지 here에 기록이 있습니다 (mysql.com에 등록해야합니다).

+0

gearman과 UDF를 사용하면 MySQL에서 다른 머신으로 문제를 배포 할 수 있습니다. – NeuroScr

0

처리하려는 테이블 (A)에 1,000 만 개의 행이 있다고 가정합니다. 데이터베이스에 테이블 B를 작성하여 노드가 처리하는 행 세트를 저장하십시오. 따라서 Java 프로그램을 다른 노드가 처리 한 마지막 행을 먼저 가져 오는 것과 같은 방식으로 작성한 다음 다른 노드에 처리 할 행의 범위를 알리는 동일한 테이블의 항목을 추가합니다 (이를 결정할 수 있습니다 번호). 여기서는 각 노드가 한 번에 1000 개의 행을 처리 할 수 ​​있다고 가정합니다. 노드 1은 테이블 B를 가져와 비어있는 것으로 판별합니다. 그런 다음 노드 1은 A의 기본 키가 < = 1000이 될 때까지 처리 중임을 알리는 행 ('Node1', 1000)을 삽입합니다 (테이블 A의 기본 키가 숫자이고 오름차순 임). 노드 2가 오면 1000 개의 기본 키가 다른 노드에서 처리됩니다. 따라서 다른 사람에게 1001에서 2000 사이의 행을 처리 중임을 알리는 행 ('Node2', 2000)을 삽입합니다. 표 B에 대한 액세스는 동기화되어야합니다. 즉 한 번에 하나만 작업 할 수 있습니다.

+0

가능한 경우 두 테이블을 피할 것이므로 현재 테이블에 몇 가지 추가 추적 필드를 사용하는 것이 좋습니다. 그럴 수 없다면 임시 테이블이 있습니다. – NeuroScr

0

mysql 서버가 하나 뿐이므로 innodb 엔진을 사용하여 업데이트시 테이블 잠금을 줄이십시오.

또한 더 많은 쿼리를 실행해야하는 경우에도 가능한 한 간단하게 쿼리를 유지하려고합니다. 이렇게하면 쿼리 캐시 적중 가능성이 높아질뿐만 아니라 백엔드의 모든 작업 부하를 줄이고 쿼리 일치를 줄이고 프론트 엔드 (리소스가 많은 곳)로 작업 할 수 있습니다. 또한 행 잠금이 유지되는 시간을 줄이므로 경쟁이 줄어 듭니다.

제안 된 Gearman 솔루션이이 작업에 적합한 도구 일 것입니다. mysql에서 클러스터로 일괄 처리를 투명하게 다시 오프로드 할 수있게 해줍니다.

각 컴퓨터에서 mysql을 사용하여 샤딩을 설정할 수 있지만 설정 시간, 유지 관리 및 데이터베이스 액세스 레이어 변경은 기어 솔루션에 비해 많은 작업 일 수 있습니다. 실험적인 스파이더 엔진을 보면서 여러 개의 mysqls를 조화롭게 사용할 수도 있습니다.

0

계산이 매우 복잡한 경우가 아니라면 대부분의 시간은 MySql에서 데이터를 검색하고 그 결과를 MySQl로 다시 보냅니다.

단일 데이터베이스를 보유하고 있으므로 응용 프로그램 측면에서 병렬 처리 나 클러스터링을 수행 할 수 없습니다.

그렇다면 모든 것이 가능한 경우 순수한 SQL에서 업데이트를 수행하거나 저장 프로 시저를 사용하여 모든 처리가 MySql 서버 내에서 이루어지며 데이터 이동이 필요하지 않도록하는 것이 가장 좋습니다.

이 속도가 충분히 빠르지 않으면 데이터베이스를 여러 인스턴스로 분할하고 일부 애플리케이션 키를 기반으로 데이터를 분할하는 스키마가 필요합니다.