mysql 슬레이브 연결 끊어졌을때 자동으로 마스터 연결시켜 주는 프로그램
이 프로그램은 마스터를 하나를 두고 슬레이브를 여러개 둔 다음 분산 처리를 하는경우 간혹 마스터와 싱크가 끊어져서 슬레이브가 작동을 멈추는 경우 사용하는 프로그램 입니다.
마스터 락을 걸어주는 것 때문에 확인 및 테스트 충분히 한 다음 적용하는것이 중요합니다.
대략적인 흐름을 알고 있는 것이 중요합니다.
그래야 아래 프로그램이 왜? 있는지 이해를 하기 편하기 때문입니다.
순서는 다음과 같습니다.
1. 마스터에 락을 걸어 줍니다.
2. 마스터의 로그파일 위치 정보를 가져 옵니다.
3. 슬레이브 접속하여 로그를 가져오지 못하는 상태이면
4. 슬레이브를 멈춤니다. (이것이 안되면 아래 5번 실행 할때 오류발생)
5. 마스터의 로그파일 위치를 재 설정 합니다.
6. 슬레이브를 시작 합니다
7. 마스터 락 걸어 줬던것 풀어 줍니다..
위에서 더 추가 되어야할것은 슬레이브가 오류가 있었을때만 아래를 함수로 만들어 실행하는 기능이 추가 되면 되는데 응용해서 프로그램 약간만 수정하면 됩니다.
슬레이브에 대한 호스트명은 자신의 환경에 맞게 추가를 해줘야 합니다.
배열형태로 되어 넣고 싶은 만큼 넣을 수 있습니다.
$db_id = 'root';
$db_pw = '12354';
$masterHost = '';
$aSlave[''] = '';
# show status like '%Table_locks_immediate%' 횟수를 알 수 있고 이것을 기반으로 처리가 되었는지 알 수 있다.
$oDbconM = mysqli_connect($masterHost, $db_id, $db_pw, '', $port);
# 마스터에서 갱신이 되지 않도록 락을 걸어 준다.
$dbResult = mysqli_db_query("FLUSH TABLES WITH READ LOCK", 'result', $oDbconM );
# 마스터의 현재 상태를 가져온다. 포지션
$Query_sql = "SHOW MASTER STATUS";
$aRs = mysqli_db_query($Query_sql,'assoc',$oDbconM);
$aTemp = explode('.', $aRs['File']);
$masterIdxNo = (int)$aTemp[1];
$masterFile = $aRs['File'];
$masterPos = $aRs['Position'];
// $masterFile = 'binlog.000001';
// $masterPos = 0;
# 슬레이브에 접속해서 마스터와 맞춰 준다.
foreach( $aSlave as $slaveHost => $port )
{
$oDbconS = mysqli_connect($slaveHost, $db_id, $db_pw, '', $port);
$Query_sql = "SHOW SLAVE STATUS";
$aRs = mysql_db_query($Query_sql, 'assoc', $oDbconS);
if ( $aRs['Slave_IO_Running'] == 'No' )
{
$dbResult = mysqli_db_query("stop slave", 'result', $oDbconS);
$dbResult = mysqli_db_query("CHANGE MASTER TO MASTER_LOG_FILE='$masterFile', MASTER_LOG_POS=$masterPos", 'result', $oDbconS);
$dbResult = mysqli_db_query("start slave", 'result', $oDbconS);
}
}
$dbResult = mysqli_db_query("UNLOCK tables", 'result', $oDbconM );
필요한 경우 디비쿼리용 사용자 함수는 아래 보시면 됩니다.
공통으로 사용하는 php Mysql 함수 > PHP (pabburi.co.kr)