CockRoach 백업을 사용하여 데이터 보호
게시 됨: 2019-07-24회사가 확장을 시작함에 따라 훨씬 더 빠른 속도로 데이터를 수집하기 시작할 것입니다. 이 데이터에 대한 적절한 백업 및 복원 절차를 통해 비상 사태에 대비하는 것이 중요합니다.
실행 가능한 상태로 복원하는 방법에 대한 계획 없이 모든 사용자 데이터가 지워지는 것이 얼마나 비참한지 상상해 보십시오.
오늘 저는 여기 Justuno에서 사용하는 몇 가지 기술을 활용한 간단한 백업 및 복원 계획을 안내해 드리겠습니다. CockRoachDB, Google Cloud Storage, Golang a Google이 프로그래밍 언어를 만들었습니다.
CockRoachDB에 대해 들어본 적이 없지만 Postgres 또는 MySQL과 같은 다른 데이터베이스 시스템을 사용해 본 적이 있다면 집에 있는 것처럼 편안할 것입니다. CockRoach는 GitHub에 따르면 "트랜잭션 및 강력하게 일관된 키-값 저장소를 기반으로 구축된 분산 시스템"이라는 추가 이점이 있습니다. 수평으로 확장되고 디스크, 머신, 랙, 심지어 데이터 센터 장애에도 최소한의 대기 시간 중단과 수동 개입 없이 생존하며 강력하게 일관된 ACID 트랜잭션을 지원합니다.”
따라하고 싶다면 CockRoach 설치 가이드로 이동하여 로컬에서 Enterprise Edition의 30일 무료 평가판을 설정하십시오. 또한 Google Cloud Storage 계정에 가입하고 시스템에 Golang을 설치해야 합니다.
설정이 완료되면 GCS 콘솔로 이동하여 프로젝트를 생성하여 시작합니다.

그런 다음 버킷을 만들고 해당 옵션을 클릭하라는 화면이 표시됩니다.

고유한 이름, 지역, 위치를 선택하고 객체 수준 및 버킷 수준 권한 설정을 선택해야 합니다. 성공하면 아래 나와 비슷한 이미지가 표시됩니다. 다시 설정은 사용 사례에 따라 다르지만 기본값을 사용하는 것이 좋습니다.

다음으로, CockRoach 백업을 Google 클라우드 스토리지에 직접 업로드할 수 있도록 하는 일부 데이터베이스 구성 설정을 해결해야 합니다. GCS 활용에 관심이 없다면. CockRoach는 Amazon, Azure, Http 및 NFS/Local 백업 파일 URL도 지원합니다. 더 많은 정보는 여기에서 찾을 수 있습니다.
화면 왼쪽에 있는 메뉴를 열고 API 및 서비스와 자격 증명 옵션을 선택합니다. 이제 Create Credentials라는 화면이 표시되어야 합니다. 이를 위해 서비스 계정 키에 관심이 있습니다.

다음 화면에서 새 서비스 계정을 선택합니다. 서비스 계정 이름을 만듭니다. 역할 유형을 선택하고 JSON을 키 유형으로 선택했는지 확인하십시오. 이 특정 자습서에서는 프로젝트 및 소유자를 선택하겠습니다. 프로덕션 환경에서는 더 제한적인 역할을 원할 것입니다.

완료되면 아래 그림과 유사한 JSON 콘텐츠로 자동 다운로드가 시작됩니다.

다음으로, 선택한 도구를 사용하여 바퀴벌레 인스턴스에 연결하고 Postgres용 SQLPro를 선호합니다. 대부분의 Psql 드라이버를 사용하여 Cockroach 인스턴스에 연결할 수 있습니다. 로컬 인스턴스를 실행하는 경우 터미널을 통해 연결하려면 다음을 실행할 수 있습니다.
=> 바퀴벌레 SQL –insecure –host=localhost
가장 먼저 하고 싶은 일은 JSON 파일의 내용으로 cloudstorage.gs.default.key를 업데이트하는 것입니다.

위의 이미지와 같이 현재 설정을 먼저 확인하십시오.
클러스터 설정 표시 cloudstorage.gs.default.key;
다음으로 gs.default.key를 JSON 파일의 내용으로 설정합니다.
클러스터 설정 설정 cloudstorage.gs.default.key = 'Json 콘텐츠'
이제 설정 및 구성을 완료했으므로 재미있는 내용인 실제 코드로 들어갈 차례입니다.
Go 프로젝트를 생성하여 시작하십시오. 내 이름을 백업 관리자로 지정했습니다. 다음으로 루트 디렉터리에 main.go 파일을 만들고 관리자 디렉터리에 crdb.go라는 파일을 만듭니다. 관리자 디렉토리는 애플리케이션 로직의 핵심을 담고 있으며 파일 구조는 내 것과 유사해야 합니다.

다음으로 몇 가지 패키지를 설치하고 터미널을 열고 프로젝트의 루트로 이동해야 합니다. 다음을 실행합니다.
"github.com/lib/pq"로 이동하십시오.
"database/sql"을 가져오십시오.
github.com/lib/pq로 이동
"cloud.google.com/go/storage"로 이동
"github.com/snabb/isoweek"로 이동하십시오.
이것들을 설치한 후, 우리는 데이터베이스 연결을 설정하기 위해 파일 맨 위에 몇 가지 상수를 설정할 것입니다. 이러한 상수는 호스트, 포트, 사용자, 암호 및 dbname입니다.

main 내부에서 우리는 방금 설정한 상수를 사용하여 psql 연결 문자열을 만들고 데이터베이스에 대한 연결을 설정하려고 합니다. 오류가 발생하면 패닉 상태가 됩니다.

파일은 내 것과 유사하지만 설정과 일치하는 상수가 있어야 합니다. 터미널에서 다음을 실행하여 애플리케이션을 실행하십시오.
"main.go 실행"
오류가 발생하지 않으면 연결이 잘 된 것입니다.

main.go를 잠시 남겨두고 이전에 만든 crdb.go 파일로 이동합니다. 무슨 일이 일어나고 있는지 살펴보기 전에 아래 이미지에서 볼 수 있는 것을 복사하세요.

먼저 패키지 이름과 파일 상단을 선언합니다.
패키지 관리자
CrdbManager라는 인터페이스를 생성하여 시작합니다. 인터페이스에 익숙하지 않은 경우 필요한 동작을 지정할 수 있습니다. 이 경우 데이터 백업, 증분 백업 수행 및 복원 수행에 중점을 둡니다.

다음으로 crdbManagerStruct{}를 생성합니다.

구조체를 다른 언어의 객체와 같이 생각할 수 있습니다. 일반적으로 클래스를 생성한 다음 클래스가 생성된 인터페이스를 구현한다고 명시적으로 명시합니다. 그러나 Go에서는 아래 구문으로 메서드를 적용하고 Go는 구조체가 인터페이스 유형이라고 추론합니다.

백업 코드를 시작하기 전에, 바퀴벌레를 다룰 때 염두에 두어야 할 몇 가지 단점이 있습니다. Cockroach는 전체 및 증분 백업의 두 가지 형태를 제공합니다. 전체 백업은 간단하며 데이터베이스 이름과 Google 클라우드 저장 위치를 전달해야 합니다.
예: BACKUP DATABASE bank TO 'gs://acme-co-backup/database-bank-2017-03-27-weekly' AS OF SYSTEM TIME '-10s';
증분 백업은 이전의 전체 및 증분 백업을 모두 나열해야 하기 때문에 조금 더 까다로울 수 있습니다. 먼저 백업이 저장될 위치를 선언한 다음 전체 백업부터 시작하여 다음 증분 백업까지 모든 이전 백업을 나열해야 합니다.

예: BACKUP DATABASE bank TO 'gs://acme-co-backup/db/bank/2017-03-29-nightly' AS OF SYSTEM TIME '-10s' 증분 'gs://acme-co-backup/ database-bank-2017-03-27-weekly', 'gs://acme-co-backup/database-bank-2017-03-28-nightly';
즉, 위의 명령을 동적으로 생성할 수 있는 스토리지 스키마를 생성하는 것은 사용자에게 달려 있습니다. 이 예에서는 매일 백업을 수행하는 스키마를 생성하고 주의 첫 번째 백업은 전체 백업이며 년-월-일의 명명 스키마를 사용합니다. 예를 들어 첫 번째 백업의 이름은 2019-7-8-full이고 다음 날은 2019-7-9-nightly입니다. 해당 주의 모든 백업은 해당 데이터베이스 이름 아래 "weekly"로 끝나는 Weekly dir 디렉토리에 저장됩니다. 예를 들어:
2019-7-8-weekly/dbName/2019-7-8-전체 및 야간 위치
될 것이다
2019-7-8-weekly/dbName/2019-7-9-nightly.
이제 util이라는 프로젝트의 루트에 새 디렉토리를 만들고 util.go라는 파일을 만듭니다. 디렉토리 구조는 아래 내 것과 같아야 합니다.

util.go 파일에는 주간, 야간 및 전체 값을 자동 생성하는 도우미가 포함됩니다. util.go는 아래 스크린샷과 같아야 합니다.

crdb.go 파일로 돌아가자. 몇 가지 가져오기를 추가하고 코드를 아래 이미지와 유사하게 조정해야 합니다.

이제 DB 인스턴스와 데이터베이스 이름을 제외하고 CrdManager 인터페이스 서명을 업데이트했습니다. 또한 이전에 만든 util 메서드와 Google 클라우드 백업 이름을 저장할 const를 호출하여 varsweek,weeklyFull 및 nightly를 만들었습니다.

이제 백업 방법으로 넘어갈 수 있습니다.

백업 방법은 db 인스턴스 값과 백업할 데이터베이스를 매개변수로 사용합니다. 그런 다음 앞에서 설명한 대로 백업을 위한 저장 위치를 생성합니다. Weekly dir은 주의 시작 이름을 사용하며 이후의 모든 전체 및 증분은 해당 주의 해당 디렉토리 아래에 저장됩니다. 생성된 gsStorage 위치는 다음과 같아야 합니다.
gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-8-full
실행할 전체 쿼리를 생성하고 실행하고 쿼리가 실패하면 패닉 상태가 됩니다. 쿼리는 다음으로 끝납니다.
`'시스템 시간 기준 '-10S';`
바퀴벌레는 10초 전부터 백업을 시작할 것을 권장합니다. 이제 증분 백업 방법으로 넘어갈 수 있습니다.

증분 백업은 방금 했던 것처럼 gcs 증분 저장 위치를 생성하여 시작됩니다. 이번에는 쿼리를 생성한 후 전체 쿼리를 생성하기 위해 이전 백업 목록이 필요합니다. 이것은 listDir 메소드를 호출하여 수행되며 마지막으로 검사됩니다.
백업 목록을 살펴본 후 쿼리 생성을 완료하고 실행합니다. 패닉에 실패하고 결국 쿼리가 아래와 유사하게 표시되어야 합니다.
백업 데이터베이스 뱅크 TO 'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-10-nightly' AS OF
'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-8-full'의 시스템 시간 '-10s' 증분,
'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-9-nightly;
복원 방법은 다음과 같습니다.

복원은 증분 백업과 유사합니다. 쿼리를 생성한 다음 디렉터리 목록을 호출하고 원래 쿼리에 데이터베이스 목록을 추가합니다. 그런 다음 쿼리를 실행하고 쿼리가 실패하면 패닉 상태가 됩니다.
증분 및 복원의 경우 백업 목록의 순서가 중요합니다. 전체 백업으로 시작한 다음 다음 증분 백업으로 시작한 다음 증분 백업을 따르십시오. 올바르게 주문하지 않으면 복원 및 증분 백업이 실패합니다. 복원 기능에 대한 자세한 내용을 보려면 여기를 클릭하십시오.
이제 List listDir 메서드로 이동합니다.

Go에서 소문자 메소드가 비공개이기 때문에 listDir이 대문자로 표시되지 않는다는 것을 가장 먼저 알 수 있습니다. listDir은 인터페이스 메서드의 도우미이므로 메서드를 공개할 필요가 없습니다.
먼저 스토리지 객체를 쿼리하는 데 사용할 버킷 객체를 생성하여 시작하겠습니다. 다음으로 해당 특정 데이터베이스 인스턴스에 대한 주간 백업을 가리키는 쿼리를 구성합니다. 거기에서 Dirs 조각을 생성하십시오. 그런 다음 검사를 실행하여 전체 백업이 슬라이스에 첫 번째로 나열되는지 확인하고 그렇지 않은 경우 슬라이스를 되돌립니다.
Google 클라우드 스토리지에 Dirs를 나열할 때 이상한 동작을 보았습니다. 때때로 호출은 목록을 오름차순으로 반환한 다음 내림차순으로 반환합니다. 올바른 순서로 dirs 반환 목록을 다시 확인하는 데 중점을 두고 이 방법을 사용하는 데 시간을 할애해야 합니다.
또 다른 접근 방식은 명명 스키마를 변경하고 dir 이름의 일부로 타임스탬프를 추가하는 것입니다. 이 상황에서 디렉토리 목록을 반복하고 파일이 시간 오름차순으로 올바르게 정렬되었는지 확인할 수 있습니다. listDir 메소드는 스키마 스토리지 디자인에 크게 의존합니다. 다시 말하지만, listDir이 올바르게 정렬되지 않으면 복원 및 증분 백업이 실패합니다!
마지막으로 main.go 파일을 살펴보겠습니다.

가져오기 목록을 업데이트하고 상수가 모두 적절하게 채워졌는지 확인하십시오. const 아래에 다음 코드를 추가합니다.

먼저 애플리케이션의 논리를 지시하는 명령줄 인수에 대한 vars 그룹을 만듭니다. 하나의 명령 플래그는 백업, 복원 또는 증분의 값 옵션이 있는 "작업"입니다. 다른 하나는 복원 작업을 호출하는 경우 데이터베이스 이름 및 테이블에 대한 데이터베이스입니다. db 연결 로직은 동일하게 유지되며 그 아래에 dbManager 인스턴스를 생성하여 애플리케이션에 전달한 명령줄 인수를 구문 분석합니다. 그런 다음 호출된 작업에 따라 백업 복원 또는 증분을 실행합니다. 명령줄 플래그에 대한 경험이 없다면 여기에서 더 많은 정보를 찾을 수 있습니다. 애플리케이션을 실행할 때 명령은 다음과 같아야 합니다.
main.go -operation=backup -database=dbName을 실행하십시오.
마지막 생각들
이것은 프로덕션 준비가 된 응용 프로그램이 아닙니다. 생각 프로세스를 진행하고 이상적으로는 구성 시간을 절약하기 위한 데모일 뿐입니다. 이 응용 프로그램 전체에서 어떤 형태의 오류가 발생하면 응용 프로그램을 강제 종료하는 패닉을 호출했습니다. 프로덕션 환경에서는 작업 상태를 알려주는 이메일 또는 SMS 이벤트와 같은 일종의 로깅 또는 유형의 알림 로직을 추가하여 이를 다르게 처리하고 싶을 것입니다.
이 애플리케이션은 모든 데이터베이스 이름을 애플리케이션에 수동으로 전달한다고 가정합니다. 이러한 값을 전달하는 스크립트를 작성한 다음 스크립트를 실행하도록 cron 작업을 설정하여 이를 수행할 수 있지만 더 나은 접근 방식이 있습니다. 내 제안은 반환 결과를 반복하고 백업 메서드를 호출하여 "show database"를 호출하여 Cockroach 인스턴스의 모든 데이터베이스 백업을 실행하는 코드를 작성하는 것입니다. 매일 밤 Go 앱을 실행하기 위해 cron 작업을 설정할 수 있다는 것을 잊지 마십시오.
마지막으로 테이블에서 복원을 실행할 때 Cockroach는 테이블이 존재하지 않는다고 가정합니다. 테이블과 테이블의 현재에 대해 복원을 실행하려고 하면 오류가 발생합니다. 외래 키 제한이 있는 테이블에서 복원을 실행하는 순서를 염두에 두십시오. 외래 키 제한이 있는 테이블을 복원하려고 하지만 다른 테이블이 없으면 문제가 발생합니다.
다음을 추가하여 복원을 실행할 수 있습니다.
'Skip_missing_foreign_keys' 사용
이렇게 하면 외래 키 제약 조건이 삭제되지만 나중에 외래 키 제약 조건을 다시 추가해야 합니다.
이 게시물이 비상 사태 발생 시 회사 데이터를 백업하고 복원하는 방법에 대한 정보를 제공하기를 바랍니다. 준비하고 준비하면 영향을 최소화하고 신속하게 백업하고 실행할 수 있습니다.
