소개
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='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='localhost', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. ... 2017-01-02T17:35:02.133661Z 34 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'group_repl@localhost:3306' - 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)!