2. DBMS이야기/02. MySQL

MySQL 클러스터 퍼포먼스 최적화 방법

OSSW(Open Source System SoftWare 2014. 9. 15. 11:24


액세스 패턴 

당신은 MySQL 클러스터 배포 중 최대의 성능을 기대하는 바와 같이, 데이터베이스의 구조를 아는 것이 중요합니다. 여기에 일이 - MySQL 클러스터 테이블에 대한 데이터는 MySQL 서버에 저장되지 않습니다. 다음 그림과 같이이 실제로 데이터 노드 풀에 걸쳐 분할됩니다. 

테이블 행은 파티션으로 분할되어 있습니다. 각 데이터 노드는 하나의 파티션에 대한 기타 보조 단편에 대한 기본 단편을 보유하고있다. 

쿼리가 데이터 노드 또는 데이터 서버 노드 사이에서 다수의 네트워크 홉 (hop)을 필요로하는 경우 다음의 성능이 저하 될 수 있고, 확장 성이 영향을 미친다.


 

 

 

 

그래서, MySQL 클러스터로부터 최상의 성능을 달성하는 것은 네트워크 홉의 총 수를 감소시키는 것을 포함한다. 


파티션은 기본 키의 해시 기반으로하지만 그 성능 향상을 위해 오버라이드 (override) 할 수 있습니다. 간단한 액세스 패턴은 확장 가능한 고성능 솔루션을 구축하는 열쇠다. 


필요한 네트워크 트립의 수는 가입의 각 단계와 깊이에서 결과 집합의 크기에 의해 결정된다.가입에 관련된 테이블이 큰 경우에 더 많은 시간이 데이터 노드에 각각의 여행에 소모 될 것이다. 


데이터베이스 크기와 데이터 노드의 수에 상관없이 일정한 시간에 수행 될 수 기본 키 조회를 사용하면서 최적의 성능을 알 수있다. 





AQL 사용 


AQL (적응 쿼리 지역화)를 사용하여, 성능 향상이 더 크게 될 수있다. 


AQL 기능은 모든 데이터 노드에 MySQL 서버의 쿼리를 전달한다. 쿼리는 데이터의 로컬 복사본에서 실행된다. 나중에는 MySQL 서버로 다시 설정 병합 된 결과를 반환한다. 이러한 과정은 결국 네트워크 트립을 최소화하여 성능을 향상시킬 수있다.

 

 

 

 

AQL은 MySQL 클러스터 효과적으로 복잡한 쿼리를 포함하는 사용 사례를 제공 할 수 있다. 


더 나은 결과를 얻으려면, 당신은 당신이, 테이블 스키마를 변경, 추가 또는 인덱스를 제거하거나 큰 변화를 수행 할 때마다 MySQL의 서버 중 하나에 OPTIMIZE 표 <탭 이름>을 실행할 수 있다.


 

 

 

실제 테스트는 쿼리의 범위에 걸쳐 70X의 좋은 성능 향상을 보여 주었다. 예를 들어, 온라인 컨텐츠 저장 관리 시스템 (11)은 테이블을 조인 복잡한 쿼리를 갖는다. 이 쿼리는 일반적으로 완료하는 데 87초 인수했다. AQL 가입을하지만 그것은 단지 약 1.26 초 걸렸다. 


AQL은 기본적으로 설정되어 전역 변수 ndb_join_pushdown 제어 할 수 있다.이 AQL을 이용할 수 있도록 조인 위해, 아래에 언급 된 규칙을 따라야한다 : 


열 VARCHAR 컬럼의 길이를 포함하여 정확히 동일한 데이터 형식을 사용, 접합한다.

그것은 조인 참조 BLOB 또는 TEXT 열을 아래로 밀 수 없다. 

명시 적 잠금 실제로 지원되지 않습니다. 이것은 NDB 스토리지 엔진의 내재적 행 기반 잠금을 사용하여 성취 될 수있다. 

명시 적으로 HASH 또는 범위를 분할 된 테이블을 참조 조인 푸시 다운 할 수 없다.


배포 인식 응용 프로그램 


MySQL 클러스터를 사용하는 테이블에 행을 추가 할 때, 각 행은 파티션에 할당됩니다. 각 파티션은 클러스터 내의 특정 데이터 노드에서 마스터된다.트랜잭션을 제공하기 위해 필요한 모든 데이터가 단일 파티션 내의 파지 될 때 최적의 성능을 달성 할 수있다. 이것은 대신에 지연을 증가시킬 수있는 다수의 노드들 사이에서 앞뒤로 튀는 단일 데이터 노드 내에 제공 될 수 있다는 것을 의미한다. 


MySQL 클러스터는 기본적으로 기본 키를 해싱하여 데이터를 분할. 우리는 해시 알고리즘에 공급 될 위해 할 수있는 기본 키에서 해당 필드를 지정하여 기본 동작을 재정의 할 수 있습니다. 


또한 파티션 전정 방법을 사용할 수 있습니다. 파티션 치기 인덱스 스캔은 하나의 데이터 노드에 의해 수행 될 수 있도록하는 과정이다. 파티션 정이에서 레이턴시 이점 데이터 노드의 수 및 결과 집합의 크기에 의존한다. 당신은 검색 할 더 많은 데이터 노드와 적은 기록이 가장 향상을 달성 할 수있다. 


다음 그림은 파티션 가지 치기의 효과를 보여준다.


 

 


파티션 치기는 작은 결과 집합에 대한 대기 시간을 줄일 수 있으며, 그것은 더 큰 결과 세트에 대한 증가 할 수 있습니다. 아래의 그림에서 파티션 치기는 빨간색 막대에 표시됩니다. 


이러한 방식으로, 인식 응용 프로그램 배포를 만드는 것은 별도의 노드가 추가됨에 따라 선형 적으로 확장 할 수 처리량을 가능하게 중요 할 수 있습니다. 


연결 풀을 사용하여 


데이터 노드가 동시에 여러 작업을 함께 제공하는 경우 MySQL 클러스터는 특히 최고의 처리량을 제공 할 수 있습니다. 당신은 여러 응용 프로그램 스레드가 그 MySQL의 각 서버에 액세스하는 여러 MySQL의 서버를 함께 사용해야합니다. 


데이터 노드에 액세스하려면 mysqld를 프로세스는 기본적으로 하나의 NDB의 API 연결을 사용합니다. 그 하나의 연결을 위해 경쟁하는 여러 응용 프로그램 스레드가 같이, 스케일링에서 처리량을 방지하는 뮤텍스에 충돌이 있습니다. 


하나의 해결책은 각 응용 프로그램 스레드가 전용의 mysqld 프로세스를 사용하게하는 것입니다,하지만 자원의 낭비입니다 및 응용 프로그램의 복잡성을 증가시킬 수있다.


 

 

 


더 효율적인 솔루션은 상기 도면에 도시 된 바와 같이 데이터 노드의 mysqld 프로세스에서 여러 NDB API를 연결하는 것이다. 


연결 풀링 (mysqld를부터) 각 연결을 사용하려면 config.ini 파일에서 자신의 [mysqld를] 또는 [API] 섹션을 가질 필요가 다음의 my.cnf 파일에 1보다 큰 값으로 NDBCLUSTER - 연결 풀을 설정 .


 

 

 


mysqld가 프로세스를 시작하는 동안 또한, 명령 행 옵션으로 NDB 노드-ID를 지정하지 않아야합니다. 다음은 본 실시 예에서, 단일의 mysqld 프로세스는 4 NDB API의 연결을 갖는다. 


위의 그림은 연결 풀링을 사용할 때의 성능 향상을 보여준다. 애플리케이션은 일반적으로 70 %의 개선을 경험하지만, 어떤 경우에는 심지어 150 %를 초과 할 수있다. 


노드를 추가하여 확장 

MySQL 클러스터는 수평으로 확장 할 수 있도록 설계되었다. 그냥 MySQL의 서버 또는 데이터 노드 추가를 추가하면 성능을 향상시킬 수 있다. 


그것은 실행중인 MySQL 클러스터에 MySQL의 서버 또는 노드 그룹 새를 추가하는 것도 가능하다. 즉, 당신은 종료하고 클러스터를 다시로드 할 필요가 없다.기존의 테이블 데이터는 모든 데이터 노드에 다시 분할 될 수있다. 


가장 안전한 방법은 MySQL 클러스터 관리자를 사용하는 것이다.클러스터 관리자는 실행중인 클러스터에 추가 노드를 추가하는 프로세스를 자동화하고이 과정에서 서비스의 손실이 없음을 확인 할 수 있다. 


결론 

지난 9 년 동안 (2004 년 이후), MySQL 클러스터 성능과 99.99 %의 가동 시간의 극단적 인 수준을 요구하는 워크로드의 요구를 충족하기 위해 등장했다. 


위의 절에서 설명한 바와 같이 적응 쿼리 현지화, 조정 매개 변수 및 활용 유통에 대한 인식을 사용하여 응용 프로그램 요구 사항의 적 광범위한 포트폴리오를 제공하기 위해 MySQL 클러스터를 활성화 할 수 있다. 


실시간 모니터링 및보고 기능과 함께 두 핵심 데이터베이스 기술의 확장은 MySQL 클러스터에 대한 자신의 사용 사례를 확장하기 위해 데이터베이스 개발자와 관리자를 활성화 할 수 있다.


by lee ji eun