MySQL의 데이터베이스 클러스터 전투 --- MySQL의 반 동기식 복제, 완전 동기식 복제 (복제 단위)

A, MySQL의 복제

1.1 MySQL의 몇 가지 동기 패턴 개념 :

1, 비동기 복제 (비동기 복제)

즉, 기본 MySQL의 복제가 비동기 메인 즉시 클라이언트에 결과를 반환합니다 클라이언트에 의해 제출 된 트랜잭션 실행 완료 후 도서관,이 라이브러리에서 치료를 받았는지 상관하지 않는다, 그래서, 문제가있을 것입니다 주요 충돌하는 경우 밖으로,이 때, 주요 도서관 향상시키기 위해 라이브러리를 강제하는 경우, 라이브러리에서 양도 할 수 없습니다 제출 된 주요 라이브러리에 현재 트랜잭션이, 새 기본 데이터베이스의 데이터으로 이어질 수는 불완전하다.

2,전체 복제 (완전 동기식 복제)

이 트랜잭션을 실행하는 클라이언트에 중앙 도서관을 돌아 왔을 때, 라이브러리의 모든 트랜잭션을 실행하는 것을 의미한다. 때문에 전체 동기식 복제 성능이 심각한 영향을받을 수밖에 없다, 그래서 반환에 라이브러리에서 실행되는 트랜잭션의 완료를 기다릴 필요의 모든.

삼,일부 동기 복제 (일부 동기 복제)

반환에 노드의 복수의 모든 기다리지 않고 다중 마스터 모드, 노드에서 성공적인 리턴, 즉 성공에서. 비동기 복제 및 완전 동기식 복제 사이, 클라이언트에 의해 제출 된 트랜잭션을 즉시 클라이언트에 반환하고 있지 않습니다 만의 릴레이 로그에 라이브러리로부터 적어도 하나를 기다렸다가 다시 클라이언트로 쓰기 후 마스터 데이터베이스. 비동기 복제에 대해, 지연은 적어도 TCP / IP 왕복 시간, 반 동기식 복제는 데이터 보안을 향상시킬뿐만 아니라 약간의 지연이 발생합니다. 따라서, 세미 동기는 바람직하게 낮은 지연 네트워크에서 사용된다.

그림 삽입 설명 여기

반 동기식 복제 기술 1.2 MySQL의

일반적으로, 보통의 복제, 즉 MySQL의 비동기 복제, 바이너리 로그 데이터 복제 MySQL을 바이너리 로그에 의존하고 있습니다. 예를 들어 두 개의 시스템 호스트 (마스터)의 경우, 다른 하나는 슬레이브 (노예)입니다.

  • 일반 복제 있습니다 :스레드 통지는 새로운 트랜잭션 T1 슬레이브 덤퍼; 바이너리 로그 버퍼 실시 검문소, 트랜잭션 (T1)은 바이너리 로그 버퍼 기록 IO 스레드 슬레이브 (T1)를 수신하고, 중계 로그를 보유하는 기록 슬레이브 로컬 SQL 쓰레드에 기록 데이터베이스. 이 때, 마스터와 슬레이브는 마스터 매달려은, 슬레이브 새 마스터로 승격 할 수있다하더라도,이 새로운 트랜잭션을 볼 수 있습니다.

  • 이상 사본 :덤퍼 스레드의 통지는 새로운 트랜잭션 T1 슬레이브; 바이너리 로그 트랜잭션 (T1)는 바이너리 로그 버퍼를 작성
    버퍼 실시 체크 포인트, 네트워크가 불안정 슬레이브 때문에, 우리는 T1을받지 못한, 주인이 전화를 끊고, 새로운 슬레이브 마스터, T1 손실로 승진 .

  • 큰 질문은 : 그리고 서비스 동시 최대 슬레이브 마스터 배치는 상당한 지연의 결과로, 트랜잭션 시퀀스 이후 실행되는 다른 네트워크 또는 시스템 이상이없는 경우에도 기계 거래에서 동기화 업데이트의 호스트.

이상의 몇 장면의 부족을 보상하기 위해서, MySQL은 5.5 반 동기식 복제에서 시작했다. 알고 분명하기 때문에 비교 비동기 복제, 반 동기식 복제, 데이터 무결성을 향상성공적인 트랜잭션 커밋 후, 트랜잭션은 적어도 두 곳에서 존재한다. 즉, 스레드에 통지 마스터 슬레이브 온보드 후 T1이 성공적 슬레이브 덤퍼 스레드 (T1)을 전송하는 외에있는 플래그 코드를 수신 여부 인 ACK (확인 응답 메시지)를 추가하고, 또한 슬레이브 수신 작업 ACK를 가정 하였다.예외가 발생하면, ACK 수신하지 않습니다, 그것은 자동으로 일반 사본으로 다운 그레이드 할 것이다, 그때까지 이상 수리가 자동으로 반 동기식 복제 될 것이다. 오직 하나의 리턴 정보를 수신 SLAVE MASTER 수단은 저지한다 그렇지 않으면, 타임 아웃까지 대기 후 비동기에게 제출로 전환된다.

반 동기 1.3의 특정 속성

라이브러리 확산 릴레이 로그에서 데이터베이스 응용 프로그램에서 생산 마스터 바이너리 로그 바이너리 로그 파일 주 도서관 도서관, 전송하는 응용 프로그램 비동기 비동기입니다. 반 동기식 복제 전송의 동기, 비동기 또는 응용 프로그램을 말한다!

  • 도서관은 중앙 도서관에서 주요 라이브러리에 연결했을 때, 그것은 반 동기에 구성되어 알려드립니다.
  • 마스터 측의 반 동기식 복제가 열려, 적어도 반 동기식 복제, 라이브러리 노드에서 다음 트랜잭션 스레드 중앙 도서관 차단 및 결과 제출시 기다리고있을 것입니다이 경우, 적어도 하나, 두 가지 가능성이 있습니다 그것은 특정 시점 이상의 구성 될 때까지 라이브러리 노드 바이너리 로그에서 모든 사건이 트랜잭션 또는 대기 통지를받은,하지만 이번에는 반 동기식 복제가 자동으로 비동기 복제로 변환 종료됩니다.
  • 모든 바이너리 로그가 하나의 트랜잭션을받은 후에 만,이 릴레이 로그 파일의 라이브러리 노드와 세척에서 작성, 대응은 중앙 도서관 위의 스레드를 대기 통지합니다.
  • 대기 경우, 대기 시간은 적어도 반 동기 노드, 주요 라이브러리에서 올 때, 현재의 트랜잭션 (transaction) 노드, 다음 주 라이브러리가 자동으로 비동기식 복제로 변환됩니다에서 예고없이, 타임 아웃 시간을 초과했습니다 자동 반 동기식 복제 모드로 변환됩니다.
  • 반 동기식 복제 및 작업이 라이브러리의 양쪽 끝에서 열어야합니다 메인 도서관, 주요 라이브러리 또는 기본 비동기 복제를 사용합니다.

둘째, 반 동기식 복제 구성

데이터베이스에 설치된 플러그인 임시 출구가 다시 로그인 실패, 영구 쓰기가 구성 파일에서 구성 할 수 있습니다 것입니다
실험 환경 : 비동기 복제의 기준을 바탕으로

1, 서버 1 (마스터 노드)

1 | INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安装半同步模块
2 |	SELECT PLUGIN_NAME, PLUGIN_STATUS 
		   FROM INFORMATION_SCHEMA.PLUGINS 
		   WHERE PLUGIN_NAME LIKE '%semi%'; 查看插件
3 | SET GLOBAL rpl_semi_sync_master_enabled = 1; 开启半同步,也就是激活插件

그림 삽입 설명 여기

2,서버 2 (슬레이브 노드)

1 | INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  安装半同步插件
2 | SET GLOBAL rpl_semi_sync_slave_enabled =1; 激活插件
3 | STOP SLAVE IO_THREAD; 重启IO线程使半同步生效
4 | START SLAVE IO_THREAD;
  • 이오 후 활성화 라이브러리에서 프로세스를 다시 시작 플러그인 IO, 그렇지 않은 다시 시작하면, 다음이 데이터를 통해 동기화되지 않음을 의미, 적용되지 않습니다 프로세스를 다시 시작해야합니다

그림 삽입 설명 여기

3 Server1의 (마스터 노드)은 변수 값의 상태를 볼 수 :

mysql> show status like '%rpl%'; 查看变量的状态
mysql> show variables like '%rpl%'; 查看变量的值
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
		### 是否开启半同步
| rpl_semi_sync_master_timeout              | 10000      | 
		###切换复制的timeout
| rpl_semi_sync_master_trace_level          | 32         | 
		###用于开启半同步复制模式时的调试级别,默认是32
| rpl_semi_sync_master_wait_for_slave_count | 1          |
		###至少有N个slave接收到日志
| rpl_semi_sync_master_wait_no_slave        | ON         |
		###是否允许master 每个事物提交后都要等待slave的receipt信号。默认为on 
| rpl_semi_sync_master_wait_point           | AFTER_SYNC | 
		###等待的point
| rpl_stop_slave_timeout                    | 31536000   |
+-------------------------------------------+------------+    
		###控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave,命令 
		###stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能


그림 삽입 설명 여기

그림 삽입 설명 여기

도 4를 참조하면, 슬레이브 노드에서,

mysql> show variables like '%rpl%'; 查看变量的值

그림 삽입 설명 여기

5,테스트 :
1)서버 2 가까운 IO 과정 : STOP SLAVE IO_THREAD;
2) SERVER1에

use ranran;
insert into usertb values ('user00','123');

마스터 저장소 10 초 대기, 요청이 ACK 슬레이브 수신되지 10S는 마스터 데이터베이스가 자동으로 비동기식 복제로 변환됩니다.
그림 삽입 설명 여기
반 동기 상태가 꺼져 확인, 거래는 1을 동기화하는 것입니다
그림 삽입 설명 여기
십초 아직까지 라이브러리에서 중앙 도서관 후 대기, 주요 도서관에 직접 더 이상 쓰기를 기다릴; 라이브러리에서 IO 프로세스의 폐쇄로 인한 아니라 쓰기 데이터가 할 수있는 10 초 지연,

이때 비동기되어 있으며, (3)에서) 데이터를 삽입 또, 특히 빠른 것으로 밝혀 마스터 상관되지 않은 후 라이브러리에서 비동기 라이브러리로 전환된다 .
그림 삽입 설명 여기

4)server2开启io进程:START SLAVE IO_THREAD;
5)输出结果显示了有哪些线程在运行:show processlist;

id列:一个标识
user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句
host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户
db列:显示这个进程目前连接的是哪个数据库
command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)
time列:此这个状态持续的时间,单位是秒
state列:显示使用当前连接的sql语句的状态

그림 삽입 설명 여기
6)查看表信息,已经复制过来,只要从库的io进程恢复工作就会立即同步没有同步的数据

그림 삽입 설명 여기

三、全同步复制(组复制)

1、全同步复制(组复制)的基本概念

  • 组复制模型:
    它支持单主模型和多主模型两种工作方式(默认是单主模型)
    单主模型: 从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
    多主模型: 复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用
  • 组复制原理:
    组复制由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务,但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。

2、配置组复制

实验环境

主机名 IP 功能
server1 172.25.7.1 master节点
server2 172.25.7.2 slave节点
server3 172.25.7.3 slave节点

在server1上
1、关闭mysqld :systemctl stop mysqld
2、查看UUID:cat /var/lib/mysql/auto.cnf
3、删除mysql数据:rm -fr /var/lib/mysql/*

  • 注意:删除数据之前先复制uuid,三个节点的uuid使用同一个值,而且不能与三个节点自身的uuid相同
    그림 삽입 설명 여기

4、修改配置文件 vim /etc/my.cnf

  • binlog_checksum=NONE :关闭binlog校验
  • binlog_format=ROW :组复制依赖基于行的复制格式
  • loose-group_replication_bootstrap_group=off :插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生脑裂
  • 开启多主模式的参数
    loose-group_replication_enforce_update_everywhere_checks=ON
    loose-group_replication_single_primary_mode=OFF

그림 삽입 설명 여기
5、 开启数据库 systemctl start mysqld ,再次安全初始化:mysql_secure_installation그림 삽입 설명 여기
6、登录数据库并配置组复制


mysql> SET SQL_LOG_BIN=0;
	##关闭二进制日志
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos==123';
	##创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
	##用户授权
mysql> FLUSH PRIVILEGES;
	##刷新用户授权表
mysql> SET SQL_LOG_BIN=1;
	##开启二进制日志

그림 삽입 설명 여기

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', 
	MASTER_PASSWORD='Westos==123', 
	FOR CHANNEL 'group_replication_recovery';
	##配置用户
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
	##安装组复制插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
	##在第一个节点上要先打开一次
mysql> START GROUP_REPLICATION;
	##开启组复制
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
	##关闭组复制激活
mysql> SELECT * FROM performance_schema.replication_group_members;
	##查看当前组的状态,是否为online

그림 삽입 설명 여기

그림 삽입 설명 여기

그림 삽입 설명 여기

그림 삽입 설명 여기

在server2和server3上配置
7、关闭mysql服务: systemctl stop mysqld
8、删除数据目录的内容:rm -fr /var/lib/mysql/*
9、编辑配置文件vim /etc/my.cnf,重启服务systemctl start mysqld

  • 변경에만 서버 ID와 느슨한 group_replication_local_address

그림 삽입 설명 여기

그림 삽입 설명 여기

10, 임시 비밀번호를 참조 그렙 암호 /var/log/mysqld.log보안 초기화 mysql_secure_installation그림 삽입 설명 여기
(11), 로그 데이터베이스 : MySQL은 -uroot -pWestos == (123)


CREATE USER rpl_user@'%' IDENTIFIED BY 'Westos==123';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yan+123kou' FOR CHANNEL 'group_replication_recovery';
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;

그림 삽입 설명 여기
그림 삽입 설명 여기
이 공개 그룹 복제에서, 우리는 오류를 발견 로그보기 : 고양이 /var/log/mysqld.log을

그림 삽입 설명 여기

그림 삽입 설명 여기

(12)는 다시 한번 데이터베이스에 로그인

STOP GROUP_REPLICATION;
set global group_replication_allow_local_disjoint_gtids_join=on;
START GROUP_REPLICATION;

그림 삽입 설명 여기

13으로 설정 한 후에 서버 1에 보기,
performance_schema.replication_group_members SELECT * FROM;
그림 삽입 설명 여기
14 같은 변형 서버 3 프로필
그림 삽입 설명 여기

그림 삽입 설명 여기

그림 삽입 설명 여기

(14)와 서버 2 서버 3 이후 구성된 서버 1에 보기
performance_schema.replication_group_members SELECT * FROM;
온라인 학습은 정상, 다음 노드에 쓰기 데이터를, 다른 노드가 볼 수 나타내는 볼 수 있습니다.

그림 삽입 설명 여기

15 일테스트
서버 1에 데이터를 삽입 :

그림 삽입 설명 여기

그것은 SERVER1 서버 3에 삽입 된 데이터를 볼 수 있고, 데이터가 삽입 될 수있다.

그림 삽입 설명 여기

그림 삽입 설명 여기
당신이 볼 수는 복제 세트를 달성했다, 모든 노드에서 쓰기 데이터는 다른 두 노드는 사본으로 설정됩니다

게시 된 102 개 원래 기사 · 원의 찬양 (21) · 전망 5329

추천

출처blog.csdn.net/ranrancc_/article/details/102899646