집 >데이터 베이스 >MySQL 튜토리얼 >mysql 읽기와 쓰기 분리 (실용)
MySQL 프록시의 가장 강력한 기능 중 하나는 "읽기/쓰기 분할"을 달성하는 것입니다. 기본 원칙은 마스터 데이터베이스가 트랜잭션 쿼리를 처리하고 슬레이브 데이터베이스가 SELECT 쿼리를 처리하도록 하는 것입니다. 데이터베이스 복제는 클러스터의 슬레이브 데이터베이스에 대한 트랜잭션 쿼리로 인한 변경 사항을 동기화하는 데 사용됩니다.
Jan Kneschke는 "MySQL 프록시가 R/W 분할을 학습합니다"에서 이 기술과 연결 풀 문제를 자세히 소개했습니다.
읽기 및 쓰기 분리를 달성하기 위해 우리는 연결 풀이 필요합니다. 해당 백엔드에 대해 인증된 연결이 열려 있는 경우에만 백엔드로 전환합니다. MySQL 프로토콜은 핸드셰이크로 시작됩니다. 쿼리/반환 결과 단계에 진입하면 새로운 연결을 인증하기에는 너무 늦습니다. 모든 것이 제대로 작동하도록 하려면 연결이 충분히 열려 있는지 확인해야 합니다.
LUA 스크립트 읽기-쓰기 분리 구현:
- 读写分离 -- -- 发送所有的非事务性Select到一个从数据库 if is_in_transaction == 0 and packet:byte() == proxy.COM_QUERY and packet:sub(2, 7) == "SELECT" then local max_conns = -1 local max_conns_ndx = 0 for i = 1, #proxy.servers do local s = proxy.servers[i] -- 需要选择一个拥有空闲连接的从数据库 if s.type == proxy.BACKEND_TYPE_RO and s.idling_connections > 0 then if max_conns == -1 or s.connected_clients < max_conns then max_conns = s.connected_clients max_conns_ndx = i end end end -- 至此,我们找到了一个拥有空闲连接的从数据库 if max_conns_ndx > 0 then proxy.connection.backend_ndx = max_conns_ndx end else -- 发送到主数据库 end return proxy.PROXY_SEND_QUERY
참고: 이 기술은 샤딩과 같은 다른 데이터 배포 전략을 구현하는 데에도 사용할 수 있습니다.
위 내용은 mysql 읽기 쓰기 분리(실기) 내용입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!