
LAN을 통해 MySQL에 연결하는 100개의 PC 클라이언트가 있습니다.
특정 기간 없이 INSERT 쿼리를 실행하고 있습니다. 통계적으로 동시에 INSERT 쿼리를 실행하려는 PC는 10대 미만입니다. 이는 설계상의 제한이 아니며 쿼리 실행이 각 PC 사용자 활동에 따라 다르다는 것입니다.
각 클라이언트는 INSERT 쿼리(연결 - 삽입 - 연결 해제)를 실행해야 할 때마다 연결하고 연결을 끊습니다.
몇 달 동안 모든 것이 잘 작동했지만 며칠 전부터 클라이언트 연결이 실패하기 시작했습니다.
하루에 두 번 정도, 5~10분 동안 클라이언트가 연결되지 않습니다. 시간 초과 오류가 발생합니다. 이 기간 동안 모든 PC 클라이언트 연결에 실패합니다. 그 중 누구도 연결할 수 없습니다.
실패 시간은 무작위입니다. 때로는 09:00, 때로는 13:00 등으로 발생합니다. 각 사용자의 활동은 상당히 규칙적이므로 날마다 큰 차이가 없습니다. 즉, 시간은 중요하지 않은 것 같습니다.
서버 측을 보면 mysql 로그에 오류가 없고, 서비스 충돌도 없고, 서버 재부팅도 없습니다. 오류 로그만 활성화했습니다(쿼리 로그 없음, 느린 쿼리 로그 없음).
그러다가 네트워크 문제를 찾고 있었는데 PC에서 서버로, 서버에서 PC로의 추적이 옳았습니다.
서버에서 (wireshark를 사용하여) 네트워크 캡처를 수행하여 거기에서 오류를 찾을 수 있는지 확인했습니다.
오류 기간(5~10분) 동안 PC 클라이언트의 연결이 "인사말" 메시지에 멈춰 있는 것을 볼 수 있습니다. 클라이언트 PC는 이에 대한 응답으로 "로그인" 요청을 보내지 않습니다.
답변1
네트워크 추적을 조사한 결과 몇 가지 이름 확인 문제가 발견되었습니다.
저는 MySQL Community Edition 5.1.41 버전을 실행하고 있습니다. 실제 릴리스에서도 이것이 사실인지는 모르겠지만, 이 버전에서는 "이름 확인" 기능이 기본적으로 활성화되어 있습니다.
이름 확인이 활성화되면 네트워크 연결이 시작될 때마다 MySQL은 IP에서 클라이언트의 PC 이름을 확인하려고 시도합니다.
이 이름 확인이 실패하거나 지연되면 연결 문제가 발생할 수 있습니다.
이름 확인이 중단되면 클라이언트 PC가 재시도할 때마다 더 많은 연결 실패 및 지연이 발생하고 결국에는 네트워크 연결이 성공하지 못합니다.
해결 방법은 이름 확인을 비활성화하는 것입니다. 클라이언트 호스트 이름에 의존하는 일부 MySQL 사용자에 대해 정의된 권한이 있는 경우 이 기능이 중요합니다. 그러나 클라이언트의 호스트 이름에 기반한 권한이 없기 때문에(대신 IP 주소를 사용함) "이름 확인" 기능을 안전하게 비활성화할 수 있습니다.
다음은 이를 설명하고 네트워크 캡처에서 검색할 항목과 올바른 방향을 알려주는 링크입니다.