모든 데이터베이스의 MySQL 마스터-마스터 복제. 어떻게?


16

배경 : 이 훌륭한 안내서에 따라 마스터-마스터 행 기반 복제 (RBR)에 두 개의 MySQL 5.1 서버를 설정했습니다 . 모든 데이터베이스를 복제하고 정기적으로 새 데이터베이스를 추가하려고합니다.

목표 : 서버 중 하나에 DB를 추가하여 새로운 데이터베이스를 복제에 추가하고 싶습니다. 두 슬레이브를 중지 하지 않고 구성 파일을 변경하고 MySQL 서버를 다시 시작한 후 슬레이브를 다시 시작하십시오.

질문 : 내가 읽은 것을, 나는에서 생각 나는 간단히 생략하여이 작업을 수행 할 수 있습니다 binlog-do-db, binlog-ignore-db, replicate-do-db, 및 replicate-ignore-db각 서버의 구성 설정을하지만 난 확신 할 수 없다. 데이터베이스테이블 수준 복제 옵션을 평가 하는 방법에 대한 MySQL의 문서 를 통해이를 수행 할 수있는 방법이 없을 것이라고 생각합니다.

/etc/mysql/my.cnf파일 의 관련 부분이 아래에 복사됩니다. 내가 올바른 길을 가고 있습니까? 내가 원하는 것도 가능합니까?

마스터 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

마스터 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

1
쓰기를 지시하는 머신에서 DB를 작성하십시오.
Martin

전체 구성은 무엇입니까? 나는 아래의 답변을 시도했지만 작동하지 않았습니다 :-(
zx1986

답변:


17

이것은 내가 두 주인을 위해 그것을 한 방법입니다

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin

데이터베이스를 마스터에 추가하고 자동으로 다른 데이터베이스에 복제 할 수 있습니까?
앤드류 Ensley

네, 했어요 .. 그냥 무시할 것을 설정했습니다
Mike

1
두 가지 질문 : 둘 다 같은 말을하도록해야합니다. # 1 두 마스터 중 하나에 데이터베이스를 추가 할 수 있고 다른 마스터에 자동으로 생성 된 다음 구성을 변경하거나 서버를 다시 시작하지 않고도 새 데이터베이스에 삽입 된 모든 데이터가 복제됩니까? # 2 문 또는 행 기반 복제를 사용하고 있습니까? 복제 된 모든 데이터베이스에서 모든 변경이 필요합니다. 심지어 "use"문 없이도 실행됩니다. 이러한 설정이 행 기반 복제에 적합합니까?
앤드류 Ensley

3
예 예 예 예 예 :)
Mike

1
네, 어제 밤에이 설정을 사용하여 서버를 설정했습니다. log-slave-updates필요가 없어서 설정을 건너 뛰었 습니다. 모든 것이 완벽하게 작동합니다. 데이터베이스를 추가하고 삭제할 수 있으며 변경 사항이 복제됩니다. 감사합니다! 현상금이 수여되었습니다.
Andrew Ensley

4

데이터베이스 작성과 관련하여 행 기반 복제에서 CREATE DATABASE를 사용하는 것에 대한 버그 보고서가 여전히 있습니다.

이 보고서는 닫혀 있지만 MySQL 5.1.47에서 버그가 다시 나타났습니다.
이 보고서는 MySQL 클러스터 (NDB 스토리지 엔진)
를 기반으로합니다.이 보고서는 복제 야생 무시 무시 테이블 여전히 복제를 기반으로합니다.

행 기반 복제로 인해 이진 로그가 놀라운 속도로 커져 이진 로그 데이터를 슬레이브의 릴레이 로그로 전달하는 네트워크 트래픽이 급증 할 수 있습니다.

@Mike는 데이터베이스 생성이 제대로 작동하고 복제 할 수 있다고 말합니다. 나는 그것을 의심하지 않습니다. 내가 가진 것은 데이터베이스가 인스턴스화되면 행 기반 복제에서 모든 문제를 해결하지 못한 MySQL (eh Oracle)의 작은 기능입니다.

이진 로그에 행 기반 항목을 계속 원하면 row_format MIXED로 전환 할 수 있습니다. 내부적으로 바이너리 로그 형식은 명령문과 고정 사이에 떠있는 경향이 있습니다 ( http://bugs.mysql.com/bug.php?id=40146 참조 ). 행 기반 ( http://bugs.mysql.com/bug.php?id=39701 ) 에서 혼합 및 수줍음을 사용하여 더 많은 버그 보고서가 닫히지 만 여전히 간헐적으로 문제가 지속됩니다.

최종 노트

자신의 정신을 유지하기 위해 명령문 기반 복제로 되돌려 서 CREATE DATABASE (SQL 문)를 작성된 데이터베이스에 대한 후속 SQL에 대해 안정적이고 일관성있게 만드십시오. 실제로 가장 최근의 버그 보고서에 따르면 데이터베이스 수준 및 테이블 수준 옵션에 대한 설명서의 내용에 관계없이 명령문 기반 복제를 사용하는 것이 가장 좋습니다.


모든 정보에 감사드립니다. 명령문 기반 복제의 유일한 문제점은 데이터베이스를 사용중인 현재 데이터베이스가 아니면 데이터베이스를 지정하는 변경 (예 : "INSERT INTO db1.table1 (col1) VALUES ( 'hi');")이 작동하지 않는다는 것입니다. 문 기반 복제로 전환하고 코드를 정리할 때가
왔다고 생각

필요한 코드를 수정하는 것이 그렇게 어렵지 않은 것으로 나타났습니다. 지금은 문장 기반 복제를 사용하고 있습니다. 충고 감사합니다.
Andrew Ensley

0

흠 ... 또한 자동 증가 키와 필드를 처리 / 차별화하는 방법을 찾아야합니다. 이것은 흥미로워 보인다 .. http://mysql-mmm.org/


이것은 내 구성 파일의 auto-increment-incrementauto-increment-offset설정에서 처리됩니다 . 이 페이지를보십시오 : dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley

당신이 오해하는 것 같아요 @Andrew는 새 데이터베이스 서버를 추가하지 않고 새 데이터베이스를 추가하는 것에 대해 이야기하고 있습니다. @Andrew가 새로운 데이터베이스 서버를 도입했다면 3 개 이상의 DB 서버간에 데이터를 재배포 할 때 주요 충돌로 인해 답변이 해결 될 수 있습니다. 귀하의 노력에 +1하지만 모든 질문을주의 깊게 읽으십시오. 나도 같은 방식으로 화상을 입었다.
RolandoMySQLDBA

@all : 죄송합니다. 죄송합니다. 나는 그것을 읽었다 고 맹세 할 수 있었다. 그러나 그 대신에 대충 훑어 보아서는 안된다 ...
Nandhini Anand

-1

cmiiw conf를 변경하거나 슬레이브를 중지하지 않고 master1 및 master2에서 데이터베이스를 만들 수 있어야한다고 생각했지만 master-master 복제가 실행 중인지 확인하십시오. 어떤 데이터베이스를 복제해야하는지 정의하지 않기 때문에 my.cnf에서 정의하지 않으면 모든 데이터베이스가 복제됩니다.


바로 내가 여기서 묻는 것입니다. 지금까지 이것에 대한 확실한 대답을 찾을 수 없습니다.
Andrew Ensley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.