2016-08-02 3 views
0

매일 cron 작업을 실행하는 서버를 유지 관리하여 개인용 Ruby on Rails 응용 프로그램에서 액세스 할 수있는 데이터 소스를 집계하고 보고서를 생성합니다.라이브 원격 MySQL 데이터베이스의 로컬 읽기 전용 복사본을 유지 관리하는 효율적인 방법은 무엇입니까?

Google 데이터 소스 중 하나는 파트너 데이터베이스 중 일부를 부분적으로 덤프하는 것입니다. 파트너는 활성 응용 프로그램을 실행하고 MySQL DB에는 수백 개의 테이블이 있습니다. 그들은 우리에게 응용 프로그램 DB에 대한 읽기 권한이없는 상대적으로 낮은 권한의 슬레이브에게 읽기 전용 액세스 권한을 부여했습니다.

슬레이브 DB에서 레이턴시 문제와 성능 병목 현상으로 인해 DB의 제한된 로컬 복사본을 유지 관리하고 있습니다. 보고서에는 약 20 개의 테이블 만 필요하므로 테이블을 덤프합니다. 또한 데이터를 매일 세분화해야하기 때문에 실시간 동기화가 필요하지 않습니다.

몇 달 동안 필자는 필요한 테이블의 덤프를 로컬 production_tmp 데이터베이스로 스트리밍하는 야간 cron을 구현했습니다. 그런 다음 모든 테이블을 가져 오면 production을 놓고 production_tmpproduction으로 바 꾸었습니다. DB가 25GB 이상으로 커질 때까지이 작업이 진행되어 디스크 공간 제한에 부딪히기 시작했습니다.

지금은 중복 단계를 제거하고 로컬 서버의 production으로 덤프를 스트리밍하고 있습니다. 이것은 나에게 조금 어색한 느낌이며, 나는 더 안전한 접근법을 구현하고 싶다. 또한 현재 전체 덤프 /로드를 수행하는 데 2 ​​시간 이상 걸립니다. 그리 오래 걸리지 않는 방법을 구현하고 싶습니다. 데이터베이스는 계속 성장할 것이므로 미래의 무언가를 구현하고 싶습니다.

의견을 보내 주시면 감사하겠습니다.

+0

당신이 MySQL을의'뜨거운 backup' 기능을 사용하여 시도 유무 :

  • 다음날 당신은 (수입) 데이터 만 델타를 다운로드? 이 전송을하기 위해 전체 DB를 버리는 것처럼 들리지만 실제로는 변경 사항 만 이동해야합니다. 추가 정보 : [증분 백업] (http://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_incremental_backup) –

  • +0

    @SusannahPotts가 MySQL Enterprise Edition에서이를 수행하는 유일한 방법입니까? –

    +0

    나는 그렇게 믿는다 ... MySQL은 유료 버전의 기능에 대해 매우 엄격하다. 나는 MySQL 라이센스가 상업적 사용을 허용하지 않기 때문에 당신이 EE 버전을 사용하고 있다고 생각했다. 적어도 내가 읽은 라이센스의 비트부터. –

    답변

    2

    들어 본 적이 없거나 MySQL Replication으로 간주됩니까?

    백업은 & 번 복원 한 다음 복제본을 기본 MySQL 인스턴스에서 수행되는 변경 사항의 연속 스트림에 "가입"하도록 구성하는 것이 좋습니다. 기본에 적용된 모든 변경 사항이 자동으로 복제본에 적용됩니다. 복제본이 손상되지 않는 한 백업 & 복원 절차를 다시 수행 할 필요가 없습니다.

    설정하고 계속 작동하도록주의를 기울이지 만 두 인스턴스를 동기화 상태로 유지하는 훨씬 효율적인 방법입니다.


    @SusannahPotts는 핫 백업 및/또는 증분 백업에 대해 언급합니다. Percona XtraBackup을 사용하여 MySQL Enterprise에 비용을 지불하지 않고도이 두 가지 기능을 무료로 이용할 수 있습니다.

    MySQL Transportable Tablespaces을 사용해 볼 수도 있습니다.


    Percona XtraBackup 또는 MySQL Enterprise Backup을 실행하려면 파일 시스템 액세스가 필요합니다. 예를 들어, Amazon RDS에 이러한 물리적 백업 도구를 사용할 수 없습니다.

    하나의 대안은 라이브 시스템과 동일한 네트워크에 복제 슬레이브를 만들고 파일 시스템에 액세스 할 수있는 해당 슬레이브에서 Percona XtraBackup을 실행하는 것입니다.

    또 다른 옵션은 바이너리 로그를 다른 호스트로 스트리밍하고 (https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html 참조) 주기적으로 로컬 인스턴스로 전송하여 재생하는 것입니다.

    이러한 각 솔루션에는 장단점이 있습니다. 요구 사항에 대한 전체 세부 정보를 공유하지 않기 때문에 어느 솔루션이 가장 적합한 지 권장하기가 어렵습니다.

    +0

    condescending 필요가 없습니다. 나는 복제에 익숙하지만, 그것이 이미 노예 인 원격 DB의 sync'ing을위한 최선의 선택인지는 확실하지 않다. 아마도 내가 제거해야하는 슬레이브에 대한 유일한 액세스는 MySQL 전용 SSH 터널을 통한다는 점에 유의해야합니다. –

    +1

    제 응답을 겸손한 것으로 생각하지 마십시오. 그건 내 의도가 아니야. 귀하의 질문에 귀하가 복제 옵션에 대해 알고 있음을 나타내는 것은 없습니다. 많은 사람들이하지 않습니다. –

    +0

    Percona XtraBackup은 탐색하기 좋은 옵션입니다. 원격 서버에서 파일 시스템에 액세스 할 수 있다면 Transportable Tablespaces가 좋겠지 만 우리는 그렇지 않습니다. –

    1

    DB가 25GB 이상으로 커질 때까지 작업 중이며 디스크 공간 제한으로 실행되기 시작했습니다.

    일부 물음표 "여기"

    • 왜 당신은 당신의 데이터베이스에 사용 가능한 디스크 공간을 증가하지? 25GB는 디스크 공간을 차지할 때 아무런 문제가되지 않습니다.
    • 왜 스크립트를 수정하지 마십시오 : table1 다운로드, table1_tmp 가져 오기, table1_prod 삭제, table1_tmp의 이름을 table1_prod로 변경하십시오. 헹구고 반복하십시오. 그 외에는

    :

    +1

    좋습니다. 처음 두 점을 살펴보면 DB를 유연한 블록 스토리지 볼륨으로 옮겼습니다.또한 스크립트를 테이블 당 동기화하도록 변경하여 동기화에 필요한 디스크 오버 헤드를 크게 줄입니다. 제안 해 주셔서 감사합니다! –

    +0

    @HunterBridges 당신을 진심으로 환영합니다. – dognose