Integrated storage
Integrated storage (Raft) backend
Integrated Storage backend는 Vault의 데이터를 영구 저장하는 데 사용됩니다. 다른 storage backends와 달리 Integrated Storage는 단일 데이터 소스에서 작동하지 않습니다. 대신 Vault 클러스터의 모든 노드는 Vault 데이터의 복제본을 보유합니다. 데이터는 Raft Consensus Algorithm을 통해 모든 노드에 복제됩니다.
출처: 문서
본문
- 고가용성 – Integrated Storage backend는 고가용성을 지원합니다.
- HashiCorp 지원 – Integrated Storage backend는 HashiCorp가 공식 지원합니다.
storage "raft" {
path = "/path/to/raft/data"
node_id = "raft_node_1"
}
cluster_addr = "http://127.0.0.1:8201"
참고: Integrated Storage backend를 사용할 때는 Raft 클러스터의 노드 간 통신에 사용할 주소와 포트를 나타내는 cluster_addr을 제공해야 합니다.
참고: Integrated Storage backend를 사용할 때는 별도의 ha_storage backend를 선언할 수 없습니다.
참고: Integrated Storage backend를 사용할 때는 disable_mlock을 true로 설정하고 시스템에서 메모리 스와핑을 비활성화하는 것을 적극 권장합니다.
raft 파라미터
-
path(string: "")– 모든 Vault 데이터가 저장되는 파일 시스템 경로입니다. 이 값은VAULT_RAFT_PATH환경 변수를 설정해 재정의할 수 있습니다. -
node_id(string: "")- Raft 클러스터에서 노드의 식별자입니다.VAULT_RAFT_NODE_ID환경 변수로node_id를 재정의할 수 있습니다.VAULT_RAFT_NODE_ID가 설정되지 않으면 Vault는 초기화 중 무작위 GUID를 할당하고path파라미터가 지정한 디렉터리의data/node-id에 값을 기록합니다. -
performance_multiplier(integer: 5)- 서버가 핵심 Raft 타이밍 파라미터를 확장하는 데 사용하는 정수 승수로, 각 증가분은 대략 1–2초의 지연으로 변환됩니다. 예를 들어 승수를 "3"으로 설정하면 총 3–6초의 지연으로 변환됩니다. 승수를 튜닝하면 리더 실패 감지와 리더 선거를 수행하는 데 걸리는 시간에 영향을 주며, 성능 향상을 위해 더 많은 네트워크와 CPU 리소스를 요구합니다. 이 값을 생략하거나 0으로 설정하면 아래 설명된 기본 타이밍을 사용합니다. 낮은 값은 타이밍을 조이고 민감도를 높이는 데 사용되며, 높은 값은 타이밍을 완화하고 민감도를 낮춥니다.기본적으로 Vault는 균형 잡힌 타이밍 값 5를 사용하며, 이는 대부분의 플랫폼과 시나리오에 적합합니다. 플랫폼 텔레메트리 지표가 변경이 필요함을 나타내거나 플랫폼(네트워크 등)의 전반적인 신뢰성 때문에 다른 타이밍이 필요할 때만 타이밍 값을 조정해야 합니다.
타이밍 값을 1로 설정하면 Raft를 최고 성능(최저 지연) 모드로 구성합니다. 최대 허용 값은 10입니다.
-
trailing_logs(integer: 10000)- 스냅샷 생성 후 로그 저장소에 남겨지는 로그 항목 수를 제어합니다. 이는 스냅샷이 완전히 설치되기 전에 로그가 잘려질 만큼 매우 큰 스냅샷 크기와 높은 쓰기 처리량 때문에 follower가 leader를 따라잡지 못할 때만 조정해야 합니다. 클러스터를 복구하기 위해 이 값을 사용해야 한다면 쓰기 처리량이나 Vault에 저장된 데이터의 양을 줄이는 것을 고려하세요. 기본값은 모든 일반 워크로드에 적합한 10000입니다.trailing_logs메트릭은max_trailing_logs와 같지 않습니다. -
snapshot_threshold(integer: 8192)- 디스크에 저장되는 스냅샷 사이의 최소 Raft 커밋 항목 수를 제어합니다. 이는 거의 변경할 필요가 없는 저수준 파라미터입니다. 과도한 디스크 IO를 경험하는 매우 바쁜 클러스터는 이 값을 늘려 디스크 IO를 줄이고 모든 서버가 동시에 스냅샷을 찍을 가능성을 최소화할 수 있습니다. 늘리면 로그가 훨씬 커지고 다음 스냅샷까지raft.db파일의 공간을 회수할 수 없으므로 디스크 IO를 디스크 공간과 맞바꾸는 것입니다. 크게 늘리면 재생해야 할 로그가 더 많아지므로 서버가 크래시나 장애 조치에서 복구하는 데 더 오래 걸릴 수 있습니다. -
snapshot_interval(integer: 120 seconds)- 스냅샷 간격은 Raft가 스냅샷 작업이 필요한지 확인하는 빈도를 제어합니다. Raft는 전체 클러스터가 한 번에 스냅샷을 수행하지 않도록 구성된 간격과 간격의 두 배 사이에서 무작위로 지연시킵니다. 기본 스냅샷 간격은 120초입니다. -
retry_join(list: [])- 클러스터의 다른 노드에 대한 연결 세부 정보 집합으로, 노드가 리더를 찾아 클러스터에 조인하는 데 도움이 됩니다.retry_join스탠자는 하나 이상 있을 수 있습니다.클러스터의 모든 노드에 대한 연결 세부 정보를 미리 알고 있다면 이 스탠자를 포함해 노드가 자동으로 Raft 클러스터에 조인하도록 할 수 있습니다. 노드 중 하나가 리더로 초기화되면 나머지 노드는
retry_join구성을 사용해 리더를 찾아 클러스터에 조인합니다.retry_join스탠자가 허용하는 파라미터는 아래 섹션을 참고하세요. Shamir seal을 사용할 때는 조인된 노드를 여전히 수동으로 봉인 해제해야 합니다. -
retry_join_as_non_voter(boolean: false)-Enterprise
이 노드를 영구 non-voter로 구성합니다. 이 노드는 Raft 쿼럼에 참여하지 않지만 클러스터의 읽기 처리량을 향상시키는 데이터 복제 스트림은 계속 받습니다. 이 옵션은
vault operator raft join명령의-non-voter플래그와 같은 효과가 있지만retry_join구성으로 조인할 때의 투표 상태에만 영향을 줍니다.VAULT_RAFT_RETRY_JOIN_AS_NON_VOTER환경 변수를 비어 있지 않은 값으로 설정해 non-voter 구성을 재정의할 수 있습니다. 노드를 non-voter로 구성하는 것은retry_join스탠자가 하나 이상 있을 때만 유효합니다. -
max_entry_size(integer: 1048576)- Raft 항목의 최대 바이트 수를 구성합니다. Put 작업과 트랜잭션 모두에 적용됩니다. 이 구성 값을 초과하는 put 또는 트랜잭션 작업은 해당 작업을 실패시킵니다. Raft는 Raft 로그 항목의 데이터에 권장 최대 크기를 가지고 있습니다. 이것은 현재 아키텍처, 기본 타이밍 등에 기반합니다. Integrated Storage는 큰 값을 청크로 나누는 임계값인 청크 크기도 사용합니다. 기본적으로 청크 크기는 Raft의 최대 로그 항목 크기와 같습니다. 이 구성의 기본값은 1048576이며, 이는 청크 크기의 두 배입니다.- 참고: 이 옵션은 Consul storage backend를 사용하는 Vault 클러스터의 Consul
kv_max_value_size파라미터에 해당합니다. Consul storage에서 Raft Integrated Storage로 마이그레이션하고 Consul에서 이 값을 기본값에서 Integrated Storage 기본값인 1MB보다 큰 값으로 변경했다면 Vault의 Integrated Storage 구성에서도 같은 변경을 해야 합니다.
- 참고: 이 옵션은 Consul storage backend를 사용하는 Vault 클러스터의 Consul
-
max_mount_and_namespace_table_entry_size(integer)-Enterprise
마운트 테이블, auth 테이블, namespace 구성 데이터를 포함하는 특정 storage 항목에 대해
max_entry_size를 재정의해 다른 한도를 설정합니다. 마운트 테이블 크기의 한도에 도달하는 경우 저장할 수 있는 마운트와 namespace의 수를 다른 storage 항목이 너무 커질 위험 없이 늘리는 데 사용할 수 있습니다.max_entry_size에 대한 다른 모든 참고 사항이 적용됩니다. 이것을 변경하기 전에 중요한 성능 고려 사항에 대해 Run Vault Enterprise with many namespaces 가이드를 읽어보세요. -
autopilot_reconcile_interval(string: "10s")- autopilot이 상태 변경을 수집할 간격입니다. 상태 변경은 여러 가지를 의미할 수 있습니다. 예를 들어 autopilot이 처음에 Raft 클러스터에 non-voter로 추가한 새로 조인한 voter 노드가 안정화 기간을 성공적으로 완료해 voter로 승격될 자격을 얻은 경우, 비정상이 되어 상태 API에 그렇게 표시되어야 하는 노드, Raft 구성에서 축출되어야 하는 죽은 것으로 표시된 노드 등입니다. -
autopilot_update_interval(string: "2s")- autopilot이 신경 쓰는 정보의 갱신을 Vault에 폴링할 간격입니다. 여기에는 autopilot 구성, 현재 autopilot 상태, raft 구성, 알려진 서버, 최신 raft 인덱스, 알려진 모든 서버의 통계 같은 것이 포함됩니다. autopilot이 받는 정보는 다음 상태를 계산하는 데 사용됩니다. -
autopilot_upgrade_version(string: "")-Enterprise
자동 업그레이드 중 Autopilot이 사용하는 버전을 재정의합니다. 기본적으로 Vault의 빌드 버전이 사용됩니다. 제공되는 문자열은 유효한 Semantic Version이어야 합니다.
-
autopilot_redundancy_zone(string: "")-Enterprise
Autopilot이 강화된 신뢰성을 위해 실패한 서버를 자동으로 교체하는 데 사용하는 중복 영역을 지정합니다.
실험적
-
raft_wal(boolean: false)- 기본 BoltDB 대신 write-ahead log 저장소를 활성화합니다. -
raft_log_verifier_enabled(boolean: false)- raft log verifier를 활성화합니다. verifier는 주기적으로 작은 raft 로그를 쓰고 체크섬을 검증해 데이터가 올바르게 기록되었는지 확인합니다. verifier는 raft write-ahead 및 BoltDB 로그 저장소에서 작동합니다. -
raft_log_verification_interval(string: "60s")- raft log verifier가 검증 로그를 쓰는 간격을 설정합니다. 기본 간격은60s이고 최소 지원 간격은10s입니다.raft_log_verifier_enabled가false이면raft_log_verification_interval파라미터는 효과가 없습니다.
retry_join 스탠자
-
leader_api_addr(string: "")- 가능한 리더 노드의 주소입니다. -
auto_join(string: "")- 클라우드 자동 조인 구성으로, go-discover 구문을 사용합니다.addr_typeaddress_type=private_v4또는address_type=public_v4를 설정하면 Vault가 IPv4 주소를 사용하도록 강제합니다. -
auto_join_scheme(string: "")- auto-join을 통해 발견된 주소에 대한 선택적 URI 프로토콜 스킴입니다. 사용 가능한 값은http또는https입니다. -
auto_join_port(uint: "")- auto-join을 통해 발견된 주소에 사용되는 선택적 포트입니다. -
leader_tls_servername(string: "")- HTTPS로 연결할 때 사용할 TLS 서버 이름입니다. 원격 서버 인증서의 DNS SAN 중 하나의 이름과 일치해야 합니다. Integrated Storage and TLS도 참고하세요. -
leader_ca_cert_file(string: "")- 가능한 리더 노드의 CA 인증서 파일 경로입니다. -
leader_client_cert_file(string: "")- follower 노드가 가능한 리더 노드와 클라이언트 인증을 설정하기 위한 클라이언트 인증서 파일 경로입니다. -
leader_client_key_file(string: "")- follower 노드가 가능한 리더 노드와 클라이언트 인증을 설정하기 위한 클라이언트 키 파일 경로입니다. -
leader_ca_cert(string: "")- 가능한 리더 노드의 CA 인증서입니다. -
leader_client_cert(string: "")- follower 노드가 가능한 리더 노드와 클라이언트 인증을 설정하기 위한 클라이언트 인증서입니다. -
leader_client_key(string: "")- follower 노드가 가능한 리더 노드와 클라이언트 인증을 설정하기 위한 클라이언트 키입니다.
각 retry_join 블록은 파일 경로 또는 줄바꿈이 \n으로 구분된 단일 줄 인증서 문자열 값으로 TLS 인증서를 제공할 수 있지만, 둘의 조합은 허용되지 않습니다. 각 retry_join 스탠자는 leader_api_addr 값 또는 클라우드 auto_join 구성 값 중 하나만 포함할 수 있으며 둘 다는 안 됩니다. auto_join 값이 제공되면 Vault는 go-discover를 사용해 잠재적 Raft 리더 주소를 자동으로 발견하고 해석하려 시도합니다. auto_join 값 형식에 대한 자세한 내용은 go-discover README를 참고하세요.
기본적으로 Vault는 HTTPS와 포트 8200을 사용해 발견된 피어에 도달하려 시도합니다. 운영자는 auto_join_scheme 및 auto_join_port 필드를 통해 이를 각각 재정의할 수 있습니다.
예시 구성:
storage "raft" {
path = "/Users/foo/raft/"
node_id = "node1"
retry_join {
leader_api_addr = "http://127.0.0.2:8200"
leader_ca_cert_file = "/path/to/ca1"
leader_client_cert_file = "/path/to/client/cert1"
leader_client_key_file = "/path/to/client/key1"
}
retry_join {
leader_api_addr = "http://127.0.0.3:8200"
leader_ca_cert_file = "/path/to/ca2"
leader_client_cert_file = "/path/to/client/cert2"
leader_client_key_file = "/path/to/client/key2"
}
retry_join {
leader_api_addr = "http://127.0.0.4:8200"
leader_ca_cert_file = "/path/to/ca3"
leader_client_cert_file = "/path/to/client/cert3"
leader_client_key_file = "/path/to/client/key3"
}
retry_join {
auto_join = "provider=aws region=eu-west-1 tag_key=vault tag_value=... access_key_id=... secret_access_key=..."
}
}
튜토리얼
Integrated Storage를 사용해 Vault를 구현하는 방법에 대해 더 알아보려면 Integrated Storage 튜토리얼 시리즈를 참고하세요.