2017-03-10 1 views
0

에없는 연결을 쓰기 :Laravel 읽고 내가 읽고 내 Laravel 5.2 응용 프로그램에서 MySQL의 연결 설정을 쓰기 사용하고 동기화

'mysql' => [ 
    'write' => ['host' => env('DB_HOST_WRITE', 'localhost'),], 
    'read' => ['host' => env('DB_HOST_READ', 'localhost'),], 
    'driver' => 'mysql', 
    'port' => env('DB_PORT', '3306'), 
    'database' => env('DB_DATABASE', 'forge'), 
    'username' => env('DB_USERNAME', 'forge'), 
    'password' => env('DB_PASSWORD', ''), 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
    'engine' => null 
] 

웹 사이트는 부하 분산 장치를 사용하여 여러 서버에서 실행됩니다.

이제 응용 프로그램에서 읽기 및 쓰기 작업이 순차적으로 수행되는 경우가 있습니다 (예 :

  1. 현재 연결 설정으로 새로 삽입 된 기록의 일부

을 선택하고 데이터베이스에 새 레코드를 삽입, 선택이 레코드가 삽입 된 경우에도, 아무것도 돌려주지 않는 것 발생할 수 바르게.

이유는 무엇입니까?

+0

, 당신이 사용하는 방법 많은 데이터베이스 노드, 어떤 알고리즘 또는 동기화에 사용하는 소프트웨어 .. 데이터베이스 동기화 때문에 의도적으로 네트워크 지연, 처리 지연 또는 즉시되지 않을 수 있습니다. –

+0

두 개의 노드가 있습니다. 소프트웨어는 아마존 오로라를 사용합니다. 안정적인 동기화가 이루어 지도록하려면 어떻게해야합니까? – lesssugar

+0

글쎄, 나는 오로라의 전문가는 아니지만 그들의 웹 사이트에 따르면 복제를위한 100ms의 레이턴시가있다. 삽입과 선택 작업 사이에 약 200ms의 지연을 넣고이 문제가 해결되는지 확인한다. 그렇다면 당신은 오로라 그 자체에서 더 깊게 파고 들어야 만합니다. –

답변

2

이것은 Laravel과 관련된 문제는 아닙니다. 이를 마스터 슬레이브 복제 지연이라고합니다. 피 읽기, 쓰기 콤보 :

(즉시 삽입 후 선택 작업을 수행하지 마십시오

여러 방지 기술 그러나 "치료"문제

먼저 치료를하는 것이 하나 개의 방법이있다 읽기 - 쓰기 콤보). 이것은 처음에는 미칠지도 모르지만 피할 수 있다면 피하십시오!

이 작업을 수행하지 못할하지만, 읽기 - 쓰기 콤보 단지 (치료가 가능하지 않은 경우)

방지 기술 작전을 읽기 및 쓰기 모두에 대해 마스터를 사용하여 코드에서 일어날 위치를 식별 할 수있는 경우

  1. (예 등, 인덱스를 추가)
  2. 슬레이브 slave compressed protocol
  3. 안 바이너리 로깅
  4. 최적화 MySQL의 쿼리를 사용개
  5. 다른 방법 : 삽입을 선택 쿼리 사이 매뉴얼 수면, 단일 트랜잭션에 모두 삽입 및 선택 포장은
+0

두 가지 모두에 마스터를 사용하는 것이 유일한 방법입니다. 노예를 폴링하면 가치보다 많은 읽기 트래픽이 발생하고 예방 기법을 사용하면 읽기 복제본이 항상 빠를 필요가 없기 때문에 더 많은 문제가 발생할 수 있습니다. 다단계 데이터베이스 작업이 완료되면 디버깅 문제가 끔찍할 것입니다. –

2

Laravel 5.5에서 내가 했어 (다시 노예 무료 동안 마스터 연결을 사용하여 수행 할 것) 이것에 대한 PR은 "sticky"옵션을 소개합니다.

가능한 경우 응용 프로그램에서 "읽기"연결을 사용하지만 "쓰기"를 수행하면 동일한 요청주기의 후속 "읽기"도 쓰기 연결에서 발생합니다.

이렇게하면 데이터 무결성이 보장됩니다. 좋아

https://github.com/laravel/framework/pull/20445

+0

유망 해 보인다. 5.5로 업그레이드하자마자 테스트 해 보겠습니다. 소중한 홍보를 보내 주셔서 감사합니다. – lesssugar

+2

감사합니다. 이것이 config 옵션이고 기본값이 아닌 이유는 작은 "write"다음에 길고 큰 "read"를하면 간단합니다. 큰 읽기가 쓰기 데이터베이스에 있음을 의미합니다. 그것은 균형 잡힌 행동이며, 대부분의 상황에서는 괜찮을 것입니다. 그러나 그것의 조심하십시오. – Laurence

+0

환상적인 아이디어입니다. –