Kudu 의 복제는 한 클러스터 안에서 태블릿 복제본을 유지하는 기능이다. 다른 클러스터로 실시간 복제하는 기능은 없다. kudu remote_replica 하위 명령은 원격 tablet server 의 복제본을 조회·조작하는 운영 도구이지 클러스터 간 복제 수단이 아니다.
kudu remote_replica list <tserver>:7050
kudu remote_replica copy_from_remote <tablet-id> <source-tserver>:7050 <dest-tserver>:7050
이 명령들은 같은 클러스터의 태블릿을 대상으로 한다. DR 용도로 쓰려고 하면 안 된다.
Kudu CLI 의 table copy 는 원본 클러스터의 테이블을 읽어 대상 클러스터에 그대로 쓴다.
kudu table copy <source-master-addresses> <table-name> <dest-master-addresses>
스캔과 쓰기를 반복하는 방식이므로 원본에 부하가 걸리고, 복사 중 원본이 계속 변경되면 스냅샷 일관성은 보장되지 않는다. 정기 전량 복사나 초기 이관에 맞고, 실시간 동기화에는 맞지 않는다. 증분 복사를 위한 조건 지정 옵션은 버전에 따라 다르므로 kudu table copy --help 로 확인한다. (확인 필요)
Kudu 1.10 부터 Spark 기반 백업/복원 작업이 제공된다. 전량 백업과 이후의 증분 백업을 지원하고, 결과물은 HDFS 나 오브젝트 스토리지에 파일로 남는다.
spark-submit --class org.apache.kudu.backup.KuduBackup <kudu-backup jar> \
--kuduMasterAddresses <master-addresses> \
--rootPath hdfs:///kudu-backup \
db.tbl
spark-submit --class org.apache.kudu.backup.KuduRestore <kudu-backup jar> \
--kuduMasterAddresses <dest-master-addresses> \
--rootPath hdfs:///kudu-backup \
db.tbl
백업 파일을 DR 사이트로 옮기는 구간은 별도로 준비해야 한다. 정확한 jar 이름과 옵션은 배포판 문서를 확인한다.
실시간성이 필요하면 복제를 Kudu 밖에서 푼다. 원천 데이터를 Kafka 에 넣고 두 클러스터가 각각 소비하게 하거나, NiFi 에서 PutKudu 를 두 개 두어 양쪽에 적재한다. 한쪽이 실패해도 다른 쪽은 진행되므로 정합성 확인 수단을 같이 만들어야 한다.
Impala JDBC 로 읽어 대상에 쓰는 방식도 가능하다. Spark 에서 원본은 Impala JDBC 로 읽고 대상은 Kudu 커넥터로 쓰는 구성이 흔하다.
df = (spark.read.format("jdbc")
.option("url", "jdbc:impala://<impalad>:21050/db")
.option("driver", "com.cloudera.impala.jdbc.Driver")
.option("dbtable", "db.tbl")
.load())
(df.write.format("kudu")
.option("kudu.master", "m1:7051,m2:7051,m3:7051")
.option("kudu.table", "db.tbl")
.mode("append")
.save())
Impala JDBC 드라이버 jar 은 --jars 로 드라이버와 익스큐터 양쪽에 올려야 한다. No suitable driver 는 대부분 jar 이 익스큐터에 없거나 드라이버 클래스명을 지정하지 않은 경우다.
Kudu CLI 자체에 Kerberos 옵션이 따로 있지는 않다. 실행 전에 티켓을 얻어 두면 그 자격으로 인증한다.
kinit -kt /path/to/service.keytab svc_user@REALM
klist
kudu table copy <source-masters> db.tbl <dest-masters>
두 클러스터의 realm 이 다르면 realm 간 신뢰(cross-realm trust)가 있어야 한 번의 인증으로 양쪽에 접근할 수 있다. 신뢰가 없으면 중간에 파일로 내렸다가 다시 올리는 방식으로 끊어서 수행한다.
Not authorized: unauthorized action 은 인증은 됐는데 권한이 없는 상태다. Kudu 의 세밀한 권한은 Ranger 로 관리되므로, 원본 테이블 읽기와 대상 테이블 생성·쓰기 권한을 각각 확인한다. Ranger 를 쓰지 않는 클러스터라면 --superuser_acl · --user_acl 설정을 본다.