로드 밸런서가없는로드 밸런싱 MySQL 클러스터


10

다른 장애 지점이나 복잡성을 추가하지 않기 위해 실제로드 밸런서가없는로드 밸런싱 MySQL 클러스터를 만들려고합니다.

내가 생각한 것은 다음과 같습니다.

  1. MySQL을위한 마스터-마스터 셋업

  2. 모든 클라이언트에서 서버간에 요청을 순환시키는 간단한 라운드 로빈 프록시를 배치하십시오.

이것이 가능한가? 아니면 이것을 달성하는 더 좋은 방법이 있습니까?

mysql 

궁금합니다. 무엇을 사용 하시겠습니까?

로드 밸런서 및 이와 유사한 것을 포함하지 않고 솔루션에 HA를 추가하려고했습니다.

답변:


3

제발 실제로 어떤 종류의 MySQL의 프록시를 사용하기 전에이 질문에 대한 내 다른 대답을 참조하십시오. CMS가 작성하는 마스터 마스터 서버가 2 개 있고 그 서버에서만 읽을 수있는 10 개의 httpd가 있다면 괜찮습니다 (그러나 다른 답변에서 지적했듯이). 경고를 받았습니다.

MySQL 프록시 는 클라이언트와 MySQL 서버 사이에있어 통신을 모니터링, 분석 또는 변형 할 수있는 간단한 프로그램입니다. 유연성으로 무제한 사용이 가능합니다. 일반적인 것들에는 다음이 포함됩니다 :로드 밸런싱; 장애 조치; 쿼리 분석; 쿼리 필터링 및 수정; 그리고 더 많은.

.

HAProxy 는 TCP 및 HTTP 기반 응용 프로그램을위한 고 가용성,로드 밸런싱 및 프록시를 제공하는 매우 빠르고 안정적인 무료 솔루션입니다.

TCP 모드에서 실행하면 Wackamole보다 더 나을 수 있습니다. 둘 중 하나를 선택해야한다면 HAProxy를 사용합니다. 또한 HAProxy는 많은 백엔드를 가질 수 있으며 Waclamole은 2 개만 가질 수 있습니다. HAProxy는 "dumb"이며 스트림 내부의 내용을 보지 않고 소켓을 연결합니다. 전용 MySQL 프록시는 지정된 서버에 다양한 요청을 지시 할 수 있습니다. .


확인하기 위해 : 1) HAProxy는 HA에 추가 머신 / 2 대가 필요합니다. 2) Wackamole은 설정 당 2 대의 서버 만 지원할 수 있습니까? 문안 인사.

Wackamole의 표준 사용 패턴 (실제로 내가 아는 유일한 것)은 serverA와 serverB가 서로를 감시하고 죽으면 다른 쪽의 IP를 가져 오는 것입니다. Wackamole 웹 사이트는 IP 풀을 보호하는 데 사용할 수 있다고 말합니다 ...하지만 Wackamole은 원하는대로 안정성을 제공하지 않으므로 권장하지 않습니다. HAProxy에 관해서는 이중화를 위해 2 대의 전용 시스템에 2 대를 배치하거나 질문에서 언급 한대로 각 노드에 1 대를 배치 할 수도 있습니다. 귀하의 검색어가 대부분 읽고 있다면, 잘 작동한다고 생각합니다.

안녕 암초. Wackamole에 대한 마지막 부분-경험상 두 시스템에서 충분히 안정적이지 않습니까?

2 대의 컴퓨터가 서로 ping을 수행하지만 그 중 하나는 200을로드하고 모든 CPU는 100 % 사용되며 모든 램이 사용됩니다. MySQL이 추락했습니다. <-wackamole은 작동하지 않습니다. HAProxy는 원격 APPLICATION이 작동 중인지, 서버가 작동하고 application_uptime <server_uptime 인 경우에만 Wackamole을 확인할 수 있습니다. 우리는 wackamole에 의존하는 많은 경우를 가지고 있었고 그것은 우리를 실망 시켰습니다.

4

진정한 다중 마스터 MySQL 설정을위한 MySQL 용 Galera Replication을 언급 할 가치가 있습니다. Galera는 동기식 복제 프로토콜이므로 응용 프로그램은 모든 MySQL 서버에서 읽고 쓸 수 있습니다. 다음은 간단한 자습서입니다. http://www.severalnines.com/clustercontrol-mysql-galera-tutorial

MySQL 서버 앞의로드 밸런서에 대해서는이 기능을 지원하는 MySQL 커넥터를 사용하십시오 (예 : Connector / J for Java 또는 Mysqlnd for php)

이를 수행 할 수있는 커넥터가없는 경우 HA 프록시와 같은 것을 사용하십시오. 이 스크립트는 HA 프록시를 자동으로 설정하고 좋은 MySQL 서버 목록을 유지 관리합니다. https://github.com/severalnines/haproxy

친애하는,

비나이

www.severalnines.com


권장하는 제품과의 연관성을 공개하는 것이 중요합니다. 또한이 사이트는 자체 홍보용이 아닙니다. 게시 된 문제를 해결하는 제품이 있다면 좋습니다! 모든 답변이 제품과 관련이있는 경우 답변을 게시하는 대신 광고 공간을 확보하는 방법에 대해 다른 사람과 이야기 할 수 있습니다. FAQ를 참조하십시오 .
JNK

3

마스터-마스터 복제는 생각보다 좋지 않습니다. 라운드 로빈 프록시와 비슷한 '쉬운'솔루션도 마찬가지입니다. 충돌하는 데이터를 서버를 충분히 빨리 분리 (프로덕션 서버에서 최대 1 초까지 걸리는 서버 간의 지연보다 빠름 *)로 지정하면 둘 다 데이터를 승인합니다. 경매 서버가있는 경우 동일한 자동차를 두 번 판매 했습니다 . 누가 샀어요? 어떤 DB를 요청할 것인지에 따라 다릅니다.

응용 프로그램에는 실제로 2 개의 데이터베이스가 있으며 두 IP 주소를 모두 알고 있어야합니다. "판매"하고 싶다면 fe

DB_number = `auction_number` % `number_of_databases`

( %입니다 modulo)

... 그리고 DB_number 데이터베이스에 커밋하십시오. 연결 오류가 발생하면 다른 오류로 연결 오류가 발생할 수 있습니다 (그러나 경매 서버의 경우 오류가 표시됩니다).

또한 두 서버간에 IP 주소가 wackamole -d 여야 합니다. 최대 사용 시간으로 두 시간 동안 하나의 데이터베이스 서버가 다운되는 재해 시나리오에서는 애플리케이션이 부재 서버에 연결하려고 시도하고 TIMEOUT (예 : 3 초)까지 정지 함을 알게됩니다. 갑자기 쿼리의 절반이 3 초 이상 실행됩니다 (그리고 모두 동일한 데이터베이스로 이동하여 재난 이전보다 빠르게 실행되지 않습니다). 동시 요청 처리기 스레드의 제한된 연결 풀이 있기 때문에 httpd를 기쁘게하지 않습니다 ...

* 프로덕션 서버의 복제 지연 시간은 최대 1 초 입니다. 원격 코 로케이션과 데이터 센터에서이 시간을 99 % 정도 0으로 테스트했지만 때로는 mysql에 1이 표시됩니다. 대량의 트래픽에서 클라이언트 응용 프로그램으로 인해 두 개의 요청, 삽입 및 선택이라는 두 가지 쿼리가 발생하여 충돌이 많이 발생했습니다. 경우에 따라 행이 아직 없었 으므로 userID의 해시를 사용하여 문제를 해결했습니다.

나는 당신이 내 실수로부터 배울 수 있기를 바랍니다 ;-)


안녕. 공유해 주셔서 감사합니다. 나는 실제로 HA에 좋은 Wackamole에 대해 생각했습니다. 내 문제는 모든로드가 마스터 서버 중 하나에있을 것이고, 두 번째는 유휴 상태 일 때 기본적으로 활성 / 비활성을 만드는 동안 활성 / 활성을 찾고 있습니다. 서버간에 요청을 전환 할 수 있도록 각 클라이언트에 가벼운 LB 솔루션을 배치하는 것이 더 낫습니까? 그러한 도구가 존재하는지 아십니까?

이중화가 필요한 경우 "하나의 작동, 하나의 유휴"가 좋습니다. 두 서버 중 하나가 죽었다고 가정 해 봅시다 (다른 서버를 구입 했으므로 첫 번째 서버가 고장 나더라도 여전히 작동 할 수 있음을 상기시킵니다). 두 번째 서버가 모든 트래픽을 처리 할 수없는 경우 HA가 아닌 확장을위한 것입니다! 또한 : Wackamole에만 의존하는 것은 나쁜 해결책입니다 (ping ok! = mysqld ok).

3

로드 밸런싱 된 MySQL (또는 다른 데이터베이스) 데이터베이스 클러스터는 쓸모가 없습니다. 둘 이상의 서버에 쓰는 경우 문제가 발생하거나 동기 복제 (MySQL에서 지원하지 않는)를 사용하면 잠금을 동기화해야하므로 성능이 크게 저하됩니다.

읽기 / 쓰기로드를 분할하고 mysql 슬레이브간에 읽기로드를 조정하고 쓰기를위한 단일 마스터를 갖거나 마스터에 대해 액티브 / 패시브 페일 오버 쌍을 사용하는 것이 좋습니다.

기본적으로 데이터베이스에 더 많은 서버를 슬레이브로 넣어서 쓰기를 확장 할 수는 없습니다. 각 서버는 여전히 애플리케이션의 전체 쓰기로드를 작성해야하기 때문입니다.

쓰기를 확장하려면 파티셔닝 또는 "샤딩"등을 통해 여러 서버에 걸쳐 데이터를 논리적으로 분할해야합니다. 일반적으로 응용 프로그램에 대한 사소한 (테스트하기가 매우 어렵다고 생각) 변경이 필요하므로, 실제로는 그렇지 않으면이 작업을 수행하지 마십시오 필요해.


물론 원하는 경우 MySQL 클러스터를 사용할 수 있지만 자체 기능과 단점이있는 완전히 다른 엔진입니다. 설정하기가 약간 복잡하지만 실제로는 하드웨어에 HA로드 균형 조정 데이터베이스를 제공합니다. 여전히 동기식 복제를 사용하면 쓰기 성능이 저하되지만 서버 전체에 파티션 기능이 내장되어 있으므로 쓰기를 확장 할 수 있습니다.


3

내가 찾은이 주제에 대한 또 다른 훌륭한 가이드 ...

http://www.dancryer.com/2010/01/mysql-circular-replication

다음은 3 개의 게시물 시리즈 중 일부입니다.

  • MySQL로드 균형 조정 클러스터 안내서 – 1 부 – 서버 자체 설정 및 MySQL 복제 구성.

  • MySQL Load-Balanced Cluster Guide – Part 2 – MySQL 클러스터 노드의 상태를 모니터링하는 스크립트를 설정합니다. 다음 가이드에서 프록시 설정에 사용할 것입니다.

  • MySQL로드 균형 조정 클러스터 안내서 – 3 부-모니터링 스크립트를 사용하여 HAProxy를 사용하여로드 밸런서 설정


2

개인적으로 더 나은 방법은로드 밸런서를 사용하는 것입니다!

그렇습니다. 또 다른 장애 지점이 추가되지만 모든 클라이언트에 설치하거나 모든 클라이언트에 설치하는 루틴은 표준로드 밸런서보다 훨씬 더 복잡합니다 ....


이해가 되겠지만, 문제는 단일 장애 지점입니다. 2 개의 LB에서도 마찬가지입니다. 클라이언트 중 하나가 다운되는 경우에만 영향을 미치며 다른 사람은 없습니다.

모든 노드에서 LB를 유지 관리하는 것은 어렵습니다. 12 개의 서버에 LB를 설치 한 후 무언가 (DB 중 하나의 주소 또는 DB 추가 등)를 변경하려는 경우 문제가 있음을 알 수 있습니다. 나는했다.

1

Connector / J는 여러 서버에서 쿼리를로드 밸런싱 할 수 있습니다. 이것은 주로 모든 SQL 노드가 일관된 데이터를 볼 수있는 MySQL NDB 클러스터를위한 것이지만 두 마스터 데이터베이스가이 두 마스터간에 합리적으로 일관성을 유지할 수 있다면 애플리케이션에 안전 할 수 있습니다.

연결 문자열은 다음과 같습니다.

jdbc : mysql : loadbalance : // host-1, host-2, ... host-n / dbname? loadBalanceStrategy = "random"& loadBalanceBlacklistTimeout = 5000


0

쓰기를 계속 복제해야하므로 쓰기를 분할해도 서버에서로드가 제거되지 않습니다.

2 대의 서버 만 사용하는 경우 drbd와 함께 하트 비트를 사용하고 drbd가 복제를 처리하게하십시오. 첫 번째 서버가 실패하면 두 번째 서버가 대신합니다. 두 번째 서버를 사용하려면 drbd에서 gfs를 사용한 다음 두 번째 서버를 읽기 전용으로 실행하고 읽기 서버로 사용할 수 있습니다. 장애 조치가 발생하면 서버를 읽기 / 쓰기로 변경하십시오.

다시 : wackamole-wackamole는 2 서버로 제한되지 않습니다

이것을 다루는 튜토리얼 시리즈를 만들고 있지만 실제로 설정하는 것은 간단합니다.


예, 이론적으로 wackamole은 2 대 이상의 서버를 지원할 수 있지만 프로덕션 환경에서이 기능을 사용해 보셨습니까? 우리는했다. 우리는 지금 후회합니다.

지금까지 나는 그것이 CentOS는 아래 5 64 비트 컴파일 얻을 수없는 사실 이외의 문제 했어

0

MySQL 5.6 버전에서이 질문에 대한 최신 답변을 제공하기 위해 비동기 복제를보다 강력하게하고 MySQL을 HA (High Availability) 경쟁에 다시 놓이게하는 GTID (Global Transaction Identifieres)를 도입 했습니다.

이 섹션에서는 GTID (Global Transaction Identifier)를 사용한 트랜잭션 기반 복제에 대해 설명합니다. GTID를 사용할 때 각 트랜잭션은 원래 서버에서 커밋되고 슬레이브에 의해 적용될 때 식별되고 추적 될 수 있습니다. 이는 새 슬레이브를 시작하거나 새 마스터로 장애 조치 할 때 GTID를 사용하여 해당 파일 내에서 로그 파일 또는 위치를 참조 할 때 필요하지 않으므로 이러한 작업을 크게 단순화합니다. GTID 기반 복제는 완전히 트랜잭션 기반이기 때문에 마스터와 슬레이브가 일치하는지 간단하게 판단 할 수 있습니다. 마스터에서 커밋 된 모든 트랜잭션이 슬레이브에서도 커밋되는 경우이 둘 사이의 일관성이 보장됩니다. GTID와 함께 명령문 기반 또는 행 기반 복제를 사용할 수 있습니다 (16.2.1 절“복제 형식”참조). 그러나 최상의 결과를 얻으려면

참조 : 16.1.3 전역 트랜잭션 식별자를 사용한 복제 (MySQL 설명서)

HAProxy를 사용하여 쿼리를로드 밸런싱하는 데 SPOF (Single Point Of Failure)가 도입되고 하트 비트를 추가하면이 솔루션이 번거로워집니다.

보다 간단한 해결책은 모든 MySQL 노드와 함께 jdbc url을 통해 쿼리를로드 밸런싱하는 것을 목표로 하는 Java 커넥터 JConnector 를 통해 연결 하는 것 입니다. 마스터 / 슬레이브 또는 마스터 / 마스터 설정을 처리 할 수 ​​있습니다 .

따라서 MySQL을 사용하여 즉시 HA 클러스터 솔루션을 설정할 수 있습니다.

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