>  기사  >  데이터 베이스  >  mysql 읽기와 쓰기 분리 (실용)

mysql 읽기와 쓰기 분리 (실용)

黄舟
黄舟원래의
2016-12-17 14:20:53914검색

MySQL 프록시의 가장 강력한 기능 중 하나는 "읽기/쓰기 분할"을 달성하는 것입니다. 기본 원칙은 마스터 데이터베이스가 트랜잭션 쿼리를 처리하고 슬레이브 데이터베이스가 SELECT 쿼리를 처리하도록 하는 것입니다. 데이터베이스 복제는 클러스터의 슬레이브 데이터베이스에 대한 트랜잭션 쿼리로 인한 변경 사항을 동기화하는 데 사용됩니다.

mysql 읽기와 쓰기 분리 (실용)

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)를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.