기본 원칙은 기본 데이터베이스가 트랜잭션 쿼리를 처리하고 슬레이브 데이터베이스가 SELECT 쿼리를 처리하도록 하는 것입니다. 데이터베이스 복제는 클러스터의 슬레이브 데이터베이스에 대한 트랜잭션 쿼리로 인한 변경 사항을 동기화하는 데 사용됩니다.
Jan Kneschke는 "MySQL 프록시가 R/W 분할을 학습합니다"에서 이 기술과 연결 풀 문제를 자세히 소개했습니다.
읽기 및 쓰기 분리를 달성하려면 연결 풀. 해당 백엔드에 대해 인증된 연결이 열려 있는 경우에만 백엔드로 전환합니다. MySQL 프로토콜은 핸드셰이크로 시작됩니다. 쿼리/결과 반환 단계에 진입하면 새로운 연결을 인증하기에는 너무 늦습니다. 모든 것이 제대로 작동하도록 하려면 연결이 충분히 열려 있는지 확인해야 합니다.
읽기-쓰기 분리를 구현하기 위한 LUA 스크립트:
--읽기-쓰기 분리
--
--모든 비트랜잭션 선택 항목을 슬레이브 데이터베이스로 보내기
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)를 참고해주세요!