이 기사에서는 주로 반동기 복제 구성과 관련된 문제를 정리하는 mysql에 대한 관련 지식을 제공합니다. 반동기 모드에서 기본 데이터베이스 트랜잭션은 완료되기 전에 하나 이상의 슬레이브 데이터베이스가 로그를 수신하는지 확인해야 합니다. 따라서 메인 데이터베이스가 다운되면 제출된 트랜잭션이 슬레이브 데이터베이스로 전송되어 데이터가 손실되지 않도록 보장할 수 있습니다. 모두에게 도움이 되기를 바랍니다. .
권장 학습: mysql 비디오 튜토리얼
머리말:
MySQL의 기본 마스터-슬레이브 복제는 비동기 모드를 사용합니다. 마스터 데이터베이스는 트랜잭션이 슬레이브 데이터베이스로 전송되었는지 확인할 필요가 없습니다. 데이터베이스가 다운되어 마스터와 백업 간에 전환되면 마스터 데이터베이스에서 제출한 트랜잭션이 슬레이브 데이터베이스에서 손실될 수 있습니다.
MySQL 5.7에서는 플러그인을 통해 반 동기 복제 모드가 지원됩니다. 반 동기 모드에서는 기본 데이터베이스 트랜잭션이 제출을 완료하기 위해 최소한 하나의 슬레이브 데이터베이스에서 로그를 수신하도록 해야 합니다. 메인 데이터베이스가 다운되면 제출된 트랜잭션이 완료된다는 것을 보장할 수 있습니다. 트랜잭션은 데이터가 손실되지 않도록 슬레이브 데이터베이스로 전송되었습니다.
반동기화:
비동기식 복제에 비해 반동기식 복제가 성능에 미치는 영향은 주로 데이터 무결성의 균형입니다. 이는 슬레이브 라이브러리에 제출을 보내기 위한 TCP/IP 왕복 시간을 늘리고 반동기 복제는 전송률이 높은 네트워크와 마스터와 슬레이브 간의 거리가 가까워야 하며, 네트워크 전송이 느리거나 마스터와 슬레이브 간의 거리가 너무 멀면 마스터 데이터베이스의 성능이 저하될 수 있습니다. 감소하고 반동기 복제 시간이 초과됩니다.主 메인 라이브러리와 반동기 복제 라이브러리는 아래와 같이 수행됩니다. 메인 라이브러리에 연결되면 복사본은 반동기 복제를 위해 메인 라이브러리가 열려 있는지 확인하고, 트랜잭션 제출을 실행할 때, 스레드는 트랜잭션 수신을 확인하기 위해 하나 이상의 반동기 슬레이브 라이브러리를 기다려야 하거나 트랜잭션 대기 시간이 초과될 때까지 기다려야 합니다. 트랜잭션이 수신되었다는 확인을 메인 라이브러리에 보낼 수 있습니다.
라이브러리가 지정된 시간 내에 기본 라이브러리에 확인 정보를 보내면 기본 라이브러리의 반동기 복제 시간이 초과되고 하나 이상의 반동기 슬레이브 라이브러리가 마스터 라이브러리에 확인 정보를 보낼 수 있으면 비동기 복제로 다운그레이드됩니다. 마스터 라이브러리는 자동으로 반동기 모드로 업그레이드됩니다.
반동기 모드를 활성화하지 않는 마스터 라이브러리가 있는 경우 마스터 라이브러리와 슬레이브 라이브러리 모두에서 동시에 반동기 복제를 활성화해야 합니다. 또는 기본 라이브러리가 반동기화 모드를 열지만 라이브러리에서 반동기화 모드를 열지 않으면 기본 복사본의 기본 복사본이 여전히 비동기 모드를 채택하고 차단이 끝날 때까지 세션이 반환되지 않습니다. 그리고 메인 데이터베이스 트랜잭션의 제출은 적어도 하나의 슬레이브 데이터베이스가 승인을 확인할 때까지 기다려야 합니다. rpl_semi_sync_master_wait_for_slave_count 매개변수는 마스터 라이브러리에서 확인해야 하는 슬레이브 수를 제어하는 데 사용할 수 있습니다. 기본값은 1입니다. 재카드는 Rollback의 비트랜잭션 테이블에서도 발생합니다. 비트랜잭션 테이블은 롤백되지 않기 때문에 여전히 비트랜잭션 테이블의 롤백에 로그를 작성하여 웨어하우스에 동기화해야 합니다. M RPL_SEMI_SYNC_MASTER_WAIT_POINT 매개변수는 반동기 모드에서 메인 라이브러리 트랜잭션의 binlog를 디스크로 제어하는 데 사용되며, 메인 라이브러리가 동기화된 후 슬레이브 라이브러리가 트랜잭션 확인을 받을 때까지 기다립니다. 라이브러리의 확인을 받으면 메인 라이브러리는 트랜잭션을 스토리지 엔진에 제출하고 클라이언트에게 반환합니다. + 메인 라이브러리는 트랜잭션을 binlog에 기록하고 슬레이브 라이브러리를 동기화하고 binlog를 동기화한 후 트랜잭션을 스토리지 엔진에 제출합니다. 제출 후 메인 라이브러리는 슬레이브 라이브러리가 트랜잭션 확인을 받을 때까지 기다립니다. 확인하면 소스가 클라이언트에 제출 완료됩니다.
두 동기화 시점은 주로 다음과 같은 차이점이 있습니다
S after_sync에서는 모든 클라이언트가 동시에 제출된 트랜잭션을 볼 수 있는데, 라이브러리로부터 트랜잭션을 받았음을 확인한 후 스토리지 엔진에 제출하기 때문이다. 동시에 트랜잭션, 장애 조치가 발생하면 기본 데이터베이스에 제출된 모든 트랜잭션이 슬레이브 데이터베이스의 릴레이 로그에 동기화되고 슬레이브 데이터베이스의 데이터는 손실되지 않습니다. client-->MySQLSQL 구문 분석-->Storage Involve-->바이너리 로그 작성-->wait ACK-->storagecommit-->client(OK) after_commit에서 트랜잭션을 커밋합니다. 클라이언트는 슬레이브 데이터베이스가 트랜잭션을 수신했다는 확인을 기다렸다가 반환해야 하지만, 슬레이브 데이터베이스를 확인하기 전에 스토리지 엔진에 대한 제출이 완료되므로 다른 클라이언트는 제출된 트랜잭션의 데이터를 클라이언트가 제출한 클라이언트보다 먼저 보게 됩니다. 트랜잭션 장애 조치가 발생하는 경우 다른 클라이언트는 스토리지 엔진에 커밋되었지만 아직 슬레이브에 의해 커밋된 것으로 확인되지 않은 트랜잭션의 소스에서 볼 수 있는 데이터와 관련된 데이터 손실을 경험할 수 있습니다. client-->MySQLSQL 구문 분석-->Storage Involve-->바이너리 로그 작성-->storagecommit-->wait ACK-->client(OK) 요약하면 다음을 수행하는 것이 좋습니다. 기본 after_sync를 사용하세요.반동기 설치 단계:
환경 정보:
MySQL 버전: 5.7.32 아키텍처: 마스터 1개(192.168.1.110:3306) 슬레이브 2개(192.168.1.11 1:3306,1) 92.168. 1.111: 3307) binlog:on반동기 복제는 비동기 복제를 기반으로 하므로 마스터와 슬레이브를 미리 구성해야 합니다. 비동기 복제(여기에서는 단계 생략).
반동기 복제는 다중 소스 복제(다중 채널)를 지원하지 않으며, 반동기 복제는 기본 채널만 사용할 수 있습니다.令 구성 관리 명령 Installplugin, Set Global, Stop Slave, Start Slave 및 Super Permanent Super Privilege. Y 설치 플러그인에는 MySQLServer가 동적 로딩을 지원해야 합니다. 올바른 플러그인을 확인하려면 yes
show global variables like'%have_dynamic_loading%';
에 대한 플러그인 경로 구성을 확인해야 합니다. 기본값은 install_home/lib/plugin에 있습니다.
show global variables like '%plugin_dir%';
반동기 복제 플러그인 semisync_master 및 semisync_slave가 플러그인 경로plugin_dir 아래에 있는지 확인하세요. 파일 이름 접미사는 플랫폼에 따라 다릅니다. 예를 들어 .so는 Unix 및 Unix 계열 시스템에 사용됩니다. .dll은 Windows의 경우 사용됩니다).
반동기화 구성:
마스터-슬레이브 전환을 방지하려면 마스터와 슬레이브를 모두 설치하세요.
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
참고: 다음과 같이 설치에 실패할 경우 먼저 libimf를 설치해야 합니다.
mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126(HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22libimf.so: cannot open shared object file: No such fileor directory)
컴포넌트가 로드되었는지 확인하세요.
show plugins; +----------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+ SELECT PLUGIN_NAME, PLUGIN_STATUS -> FROM INFORMATION_SCHEMA.PLUGINS -> WHERE PLUGIN_NAME LIKE '%semi%'; +----------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | | rpl_semi_sync_slave | ACTIVE | +----------------------+---------------+
플러그인을 설치한 후 반동기화 관련 매개변수를 볼 수 있습니다.
show global variables like 'rpl_semi%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | OFF | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +-------------------------------------------+------------+
매개변수에 대한 자세한 설명:
rpl_semi_sync_master_enabled: 마스터 라이브러리가 반동기화를 켤지 여부입니다.
rpl_semi_sync_master_wait_point: 동기화 시점 after_commit, after_sync. rpl_semi_sync_master_wait_for_slave_count: 마스터 라이브러리 트랜잭션이 제출된 후 슬레이브 라이브러리에서 필요한 확인 횟수입니다. ㅋㅋㅋ ' ' out through out through out through out through out through out together through togetherole together out through out to 100's-to-be-a-sync 비동기 모드 비동기 모드 반동기 비동기 방법. M RPL_SEMI_SYNC_MATER_WAIT_NO_SLAVE:
기본 라이브러리(RPL_SEMI_SYNC_MASTER_CLIENTS)가 (RPL_SEMI_MATER_WAIT_SLAVE_COUNT)보다 작을 때 비동기 모드로 전환합니다. 켜져 있으면 제출되지 않는 여유 시간에 기본 라이브러리(Rpl_semi_sync_master_clients)가 발견되더라도 (rpl_semi_sync_master_wait_for_slave_count)보다 작으며 조정이 이루어지지 않습니다.
트랜잭션 시간이 초과되기 전에 기본 라이브러리가 (rpl_semi_sync_master_wait_for_slave_count)보다 크거나 같은 수의 ACK 응답을 수신하는 한 기본 라이브러리는 반동기 상태로 유지됩니다. 모드입니다. 트랜잭션 커밋 단계(메인 라이브러리가 ACK를 기다림)가 시간 초과되면 반동기화는 비동기 모드로 전환됩니다.
无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。
主库开启半同步功能
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;
从库开启半同步功能
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
主库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
从库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_slave_enabled=1
查看主从是否启用了半同步复制:
主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+-------+
从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+
半同步状态检查:
show global status like 'rpl%'; +--------------------------------------------+---------+ | Variable_name | Value | +--------------------------------------------+---------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 12463 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 2739 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 1030 | | Rpl_semi_sync_master_tx_wait_time | 5075616 | | Rpl_semi_sync_master_tx_waits | 4926 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 5595 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+---------+
Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_waits:主库等待从库的总次数。
Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。
Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。
Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。
Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。
Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。
Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。
Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。
推荐学习:mysql视频教程
위 내용은 MySQL 반동기 복제 구성 요약 및 구성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!