MySQL 데이터베이스 그룹 복제는 IP 주소를 밟는 함정을 만듭니다.

黄舟
풀어 주다: 2017-02-07 11:42:35
원래의
3025명이 탐색했습니다.

소개

MySQL 버전 5.7.17의 복제 기능에는 빛나는 별 기능 그룹 복제라는 새로운 기능이 도입되었습니다. 당연히 구축과 테스트에 대한 경험이 어느 정도 있어야 하는데, 구축 과정에서 호스트 이름과 관련된 함정에 부딪혔습니다. 다음에서는 이를 구축하는 방법과 이러한 함정에 직면하는 과정을 설명합니다.

2

가상 머신 192.168.56.102에 두 개의 인스턴스 3306 및 3307을 빌드하고 192.168.56.105에 하나의 인스턴스 3308을 빌드할 것으로 예상

합니다. 특성에 따라 그룹 복제를 시작하려면 노드를 노드로 선택해야 합니다. 이 문서에서는 3306을 시작 노드로 선택합니다.

3

빌드

인스턴스 192.168.56.102:3306

my.cnf 주요 내용:

[mysqld3306]
gtid-mode=on
enforce-gtid-consistency=on
 
master-info-repository=table
relay-log-info-repository=table
 
binlog-checksum=none
log-slave-updates=on
binlog-format=row
 
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="2dc52aec-cfea-11e6-95f3-080027264cfa"
loose-group_replication_start_on_boot=off # 开机启动OFF
loose-group_replication_local_address="192.168.56.102:33061"
loose-group_replication_group_seeds="192.168.56.102:33061,192.168.56.102:33071,192.168.56.105:33081"
loose-group_replication_bootstrap_group=off # 作为首个启动OFF
로그인 후 복사

참고:

1. 구성에 나열된 포트는 필수이며 사용되지 않습니다.

2. group_name의 형식은 UUID이며 MySQL에서 select uuid()를 실행하여 얻을 수 있습니다.

복사 계정 만들기:

mysql> set sql_log_bin=0;
mysql> create user 'group_repl'@'%' identified by 'group_repl';
mysql> grant replication slave on *.* to 'group_repl'@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;
로그인 후 복사

복사 채널 만들기:

mysql> change master to master_user='group_repl',master_password='group_repl' for channel 'group_replication_recovery';
로그인 후 복사


플러그인 로드:

mysql> install plugin group_replication soname 'group_replication.so';
로그인 후 복사

첫 번째 노드로 그룹 복제 시작:

mysql> set @@global.group_replication_bootstrap_group=1;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=0;
mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
로그인 후 복사

인스턴스 192.168.56.102:3307 및 192.168.56.105:3308

나머지 인스턴스에는 대규모 작업이 있습니다. 해당 부분은 102:3306과 동일합니다. 아래에는 다른 부분만 나열되어 있습니다.

1 my.cnf에서 102:3307의 매개 변수:

loose-group_replication_local_address="192.168.56.102:33071",105:3308的参数:loose-group_replication_local_address="192.168.56.105:33081";
로그인 후 복사

2. 복사 계정을 생성할 때 채널을 복사하고 플러그인을 로드한 후 102:3307 및 105:3308 모두 다음을 실행해야 합니다: start group_replication;.

4

확인

그룹 복제 참여 ​​여부를 확인하려면performance_schema.replication_group_members 테이블을 쿼리하면 됩니다. 102:3307이 그룹에 합류한 상황은 다음과 같습니다.

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE
로그인 후 복사

이미 102:3306과 102:3307이라는 두 개의 노드가 그룹을 형성하고 있는 것을 볼 수 있습니다.

5

문제

105:3308에 가입하기 시작했는데 뭔가 문제가 있어서 3308이 그룹에 가입하지 못한 것을 알 수 있습니다.

mysql> select * from performance_schema.replication_group_members;
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: localhost
 MEMBER_PORT: 3308
MEMBER_STATE: RECOVERING
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE
로그인 후 복사

오류 로그에서:

...
2017-01-02T17:35:02.123501Z 32 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. 
Previous state master_host=&#39;<NULL>&#39;, master_port= 0, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;. 
New state master_host=&#39;localhost&#39;, master_port= 3306, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;.
...
2017-01-02T17:35:02.133661Z 34 [ERROR] Slave I/O for channel &#39;group_replication_recovery&#39;: error connecting to master &#39;group_repl@localhost:3306&#39; - retry-time: 60
  retries: 1, Error_code: 2003
...
로그인 후 복사

MEMBER_HOST에 문제가 있는 것으로 추측할 수 있으므로 호스트 이름을 IP 주소로 변경합니다. 테스트 결과

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: 192.168.56.105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE
로그인 후 복사

가 가능한 것으로 확인되었습니다. 그러나 실제 상황에서는 호스트 이름을 IP로 설정하는 것이 불가능합니다. 그래서 여러 번 시도한 끝에 다음과 같은 방법으로 이 문제를 해결할 수 있다는 것을 알았습니다.

1. 서로 다른 물리적 머신(가상 머신)에 대해 서로 다른 호스트 이름을 설정합니다.

2. / 호스트는 호스트 이름을 통해 물리적 머신(가상 머신) 간의 ping을 활성화합니다.

위 작업을 완료한 후 마지막으로 그룹 구성원을 확인하세요.

mysql> select * from performance_schema.replication_group_members
\G*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: local-105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE
로그인 후 복사

문제가 해결되었습니다. 또 한 가지 주의할 점은 물리적 머신(가상 머신) 아래의 인스턴스라도 그룹을 구성하려면 호스트 이름과 IP 간의 매핑 관계가 있어야 한다는 점입니다. 위의 localhost 상황에서 동일한 물리적 머신 하에 그룹이 형성될 수 있는 이유는 시스템이 기본적으로 127.0.0.1에서 localhost로 매핑 관계를 갖고 있기 때문이다.

6

요약

위 문제는 MySQL이 복제 구성 시 흔히 사용하는 IP 주소 대신 운영체제의 호스트 이름을 직접 사용하기 때문에 발생한다. 버그가 있었는데, 나보다 며칠 전에 누군가가 공식 담당자에게 버그 요청을 제출했습니다. 그룹 복제를 구성할 때 버그가 수정되기 전에 호스트 이름과 IP 주소 간의 매핑 관계가 설정되어 있는지 확인하는 것이 가장 좋습니다.


위 내용은 MySQL 데이터베이스 그룹 복제 설정 및 IP 주소 밟기의 함정입니다. 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿