MySQL 마스터-슬레이브 지연 및 읽기-쓰기 분리에 대한 솔루션 요약
이 기사는 마스터-슬레이브 지연 및 읽기-쓰기 분리에 대한 솔루션을 주로 소개하는 mysql에 대한 관련 지식을 제공하고 여러 가지 방법을 살펴보고 요약해 보겠습니다.
추천 학습: mysql 비디오 튜토리얼
우리 모두는 인터넷 데이터에 특성이 있다는 것을 알고 있습니다. 대부분의 시나리오는 Weibo, WeChat, Taobao Business와 같이 더 많이 읽고 덜 씁니다
입니다. , 28원칙
에 따르면 읽기 트래픽 비율은 90%에 도달할 수도 있습니다读多写少
,比如:微博、微信、淘宝电商,按照 二八原则
,读流量占比甚至能达到 90%
结合这个特性,我们对底层的数据库架构也会做相应调整。采用 读写分离
处理过程:
客户端会集成 SDK,每次执行 SQL 时,会判断是
写
或读
操作如果是
写
SQL,请求会发到主库
主数据库执行SQL,事务提交后,会生成
binlog
,并同步给从库
从库
通过 SQL 线程回放binlog
,并在从库表中生成相应数据如果是
读
SQL,请求会通过负载均衡
策略,挑选一个从库
处理用户请求
看似非常合理,细想却不是那么回事
主库
与 从库
是采用异步复制数据,如果这两者之间数据还没有同步怎么办?
主库刚写完数据,从库还没来得及拉取最新数据,读
请求就来了,给用户的感觉,数据丢了???
针对这个问题,今天,我们就来探讨下有什么解决方案?
一、强制走主库
针对不用的业务诉求,区别性对待
场景一:
如果是对数据的 实时性
要求不是很高,比如:大V有千万粉丝,发布一条微博,粉丝晚几秒钟收到这条信息,并不会有特别大的影响。这时,可以走 从库
。
场景二:
如果对数据的 实时性
要求非常高,比如金融类业务。我们可以在客户端代码标记下,让查询强制走主库。
二、从库延迟查询
由于主从库之间数据同步需要一定的时间间隔,那么有一种策略是延迟从从库查询数据。
比如:
select sleep(1) select * from order where order_id=11111;
在正式的业务查询时,先执行一个sleep 语句,给从库预留一定的数据同步缓冲期。
因为是采用一刀切,当面对高并发业务场景时,性能会下降的非常厉害,一般不推荐这个方案。
三、判断主从是否延迟?决定选主库还是从库
方案一:
在从库 执行 命令 show slave status
查看 seconds_behind_master
的值,单位为秒,如果为 0,表示主备库之间无延迟
方案二:
比较主从库的文件点位
还是执行 show slave status
,响应结果里有截个关键参数
Master_Log_File 读到的主库最新文件
Read_Master_Log_Pos 读到的主库最新文件的坐标位置
Relay_Master_Log_File 从库执行到的最新文件
Exec_Master_Log_Pos 从库执行到的最新文件的坐标位置
两两比较,上面的参数是否相等
方案三:
比较 GTID 集合
Auto_Position=1 主从之间使用 GTID 协议
Retrieved_Gtid_Set 从库收到的所有binlog日志的 GTID 集合
Executed_Gtid_Set 从库已经执行完成的 GTID 集合
比较 Retrieved_Gtid_Set
和 Executed_Gtid_Set
읽기-쓰기 분리
를 사용하세요
처리과정 :
클라이언트는 SDK를 통합하게 되며, SQL이 실행될 때마다
write
또는read
작업으로 판단됩니다- 🎜
write
SQL인 경우 요청이 다음으로 전송됩니다.메인 라이브러리
🎜 - 🎜마스터 데이터베이스는 트랜잭션이 제출된 후
binlog
가 생성되어슬레이브에 동기화됩니다. library
🎜 - 🎜
슬레이브 라이브러리
는 SQL 스레드를 통해binlog
를 재생하고 슬레이브 라이브러리 테이블에 해당 데이터를 생성합니다🎜 - 🎜
읽기
SQL인 경우 요청은로드 밸런싱
전략을 거치며슬레이브 라이브러리
가 선택됩니다. 사용자 요청을 처리하세요🎜
메인 라이브러리
및 슬레이브 라이브러리
는 데이터의 비동기 복제를 사용합니다. 둘 사이의 데이터가 아직 동기화되지 않은 경우 어떻게 되나요? 🎜🎜메인 라이브러리는 방금 데이터 쓰기를 마쳤고 슬레이브 라이브러리가 최신 데이터를 가져올 시간이 되기 전에 읽기
요청이 와서 사용자에게 데이터가 손실된 느낌을 줍니다. ? ? ?
🎜🎜이 문제에 대한 대응으로 오늘은 어떤 해결책이 있는지 논의해 볼까요? 🎜🎜1. 기본 데이터베이스 강제 사용🎜🎜사용하지 않는 비즈니스 요구 사항에 대해 다른 비즈니스 요구 사항 처리🎜🎜🎜시나리오 1: 🎜🎜🎜데이터에 대한 실시간
요구 사항이 그다지 높지 않은 경우 예를 들어, 대형 뷔는 수천만 명의 팬을 보유하고 있으며 웨이보 메시지를 게시하고 몇 초 후에 팬이 해당 메시지를 받는다면 그다지 큰 영향을 미치지는 않을 것입니다. 이때 도서관에서
로 이동할 수 있습니다. 🎜🎜🎜시나리오 2: 🎜🎜🎜금융 서비스와 같이 데이터의 실시간
에 대한 요구 사항이 매우 높은 경우. 쿼리가 클라이언트 코드 태그 아래의 기본 데이터베이스로 이동하도록 강제할 수 있습니다. 🎜🎜2. 슬레이브 데이터베이스의 쿼리 지연🎜🎜마스터 데이터베이스와 슬레이브 데이터베이스 간의 데이터 동기화에는 일정한 시간 간격이 필요하므로 슬레이브 데이터베이스의 데이터 쿼리를 지연시키는 전략이 있습니다. 🎜🎜예: 🎜select master_pos_wait(file, pos[, timeout]);
showslave status
🎜🎜 명령을 실행하여 seconds_behind_master의 값을 확인합니다. code>, 단위는 초이며, 0이면 마스터 데이터베이스와 슬레이브 데이터베이스 사이에 지연이 없음을 의미합니다🎜🎜🎜옵션 2: 🎜🎜🎜마스터 데이터베이스와 슬레이브 데이터베이스의 파일 포인트를 비교🎜🎜또는 <code>showslave status
, 응답 결과에 키가 있습니다 Parameter🎜- 🎜Master_Log_File 메인 라이브러리에서 읽은 최신 파일🎜
- 🎜Read_Master_Log_Pos 메인 라이브러리에서 읽은 최신 파일🎜
- 🎜Relay_Master_Log_File 라이브러리에서 실행된 최신 파일🎜
- 🎜Exec_Master_Log_Pos 라이브러리에서 실행된 최신 파일의 좌표 위치🎜
- 🎜Auto_Position=1 마스터와 슬레이브 간에 GTID 프로토콜을 사용하세요🎜
- 🎜Retrieved_Gtid_Set 라이브러리에서 받은 모든 binlog 로그의 GTID 세트🎜 🎜Executed_Gtid_Set 라이브러리에서 실행된 GTID 세트🎜
Retrieved_Gtid_Set
과 Executed_Gtid_Set
의 값이 동일합니다🎜🎜비즈니스 SQL 실행 시 먼저 슬레이브 데이터베이스가 최신 데이터를 동기화했는지 확인합니다. 마스터 데이터베이스를 운영할지, 슬레이브 데이터베이스를 운영할지 결정합니다. 🎜🎜🎜단점: 🎜🎜🎜위 솔루션 중 어떤 솔루션을 채택하더라도 메인 라이브러리에 쓰기 작업이 자주 발생하면 슬레이브 라이브러리의 값이 메인 라이브러리의 값을 따라잡지 못하고 읽기 트래픽이 늘어나게 됩니다. 항상 메인 라이브러리를 방문하세요. 🎜针对这个问题,有什么解决方案?
这个问题跟 MQ消息队列 既要求高吞吐量又要保证顺序是一样的,从全局来看确实无解,但是缩小范围就容易多了,我们可以保证一个分区内的消息有序。
回到 主从库
之间的数据同步问题,从库查询哪条记录,我们只要保证之前对应的写binglog已经同步完数据即可,可以不用管主从库的所有的事务binlog 是否同步。
问题是不是一下简单多了
四、从库节点判断主库位点
在从库执行下面命令,返回是一个正整数 M,表示从库从参数节点开始执行了多少个事务
select master_pos_wait(file, pos[, timeout]);
file 和 pos 表示主库上的文件名和位置
timeout 可选, 表示这个函数最多等待 N 秒
缺点:
master_pos_wait
返回结果无法与具体操作的数据行做关联,所以每次接收读请求
时,从库还是无法确认是否已经同步数据,方案实用性不高。
五、比较 GTID
执行下面查询命令
阻塞等待,直到从库执行的事务中包含 gtid_set,返回 0
超时,返回 1
select wait_for_executed_gtid_set(gtid_set, 1);
MySQL 5.7.6 版本开始,允许在执行完更新类事务后,把这个事务的 GTID 返回给客户端。具体操作,将参数
session_track_gtids
设置为OWN_GTID
,调用 API 接口mysql_session_track_get_first
返回结果解析出 GTID
处理流程:
发起
写
SQL 操作,在主库成功执行后,返回这个事务的 GTID发起
读
SQL 操作时,先在从库执行select wait_for_executed_gtid_set (gtid_set, 1)
如果返回 0,表示已经从库已经同步了数据,可以在从库执行
查询
操作否则,在主库执行
查询
操作
缺点:
跟上面的 master_pos_wait
类似,如果 写操作
与 读操作
没有上下文关联,那么 GTID 无法传递 。方案实用性不高。
六、引入缓存中间件
高并发系统,缓存作为性能优化利器,应用广泛。我们可以考虑引入缓存作为缓冲介质
处理过程:
客户端
写
SQL ,操作主库同步将缓存中的数据删除
当客户端读数据时,优先从缓存加载
如果 缓存中没有,会强制查询主库预热数据
缺点:
K-V 存储,适用一些简单的查询条件场景。如果复杂的查询,还是要查询从库。
七、数据分片
参考 Redis Cluster 模式, 集群网络拓扑通常是 3主 3从,主节点既负责写,也负责读。
通过水平分片,支持数据的横向扩展。由于每个节点都是独立的服务器,可以提高整体集群的吞吐量。
转换到数据库方面
常见的解决方式,是分库分表,每次读写
都是操作主库的一个分表,从库只用来做数据备份。当主库发生故障时,主从切换,保证集群的高可用性。
推荐学习:mysql视频教程
위 내용은 MySQL 마스터-슬레이브 지연 및 읽기-쓰기 분리에 대한 솔루션 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치.

Navicat 자체는 데이터베이스 비밀번호를 저장하지 않으며 암호화 된 암호 만 검색 할 수 있습니다. 솔루션 : 1. 비밀번호 관리자를 확인하십시오. 2. Navicat의 "비밀번호 기억"기능을 확인하십시오. 3. 데이터베이스 비밀번호를 재설정합니다. 4. 데이터베이스 관리자에게 문의하십시오.

Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오.

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

MariaDB 용 Navicat은 암호가 암호화 된 양식으로 저장되므로 데이터베이스 비밀번호를 직접 볼 수 없습니다. 데이터베이스 보안을 보장하려면 비밀번호를 재설정하는 세 가지 방법이 있습니다. Navicat을 통해 비밀번호를 재설정하고 복잡한 비밀번호를 설정하십시오. 구성 파일을 봅니다 (권장되지 않음, 위험이 높음). 시스템 명령 줄 도구를 사용하십시오 (권장되지 않으면 명령 줄 도구에 능숙해야 함).

응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오.

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.
