# 커스텀 포트 설정
# https://docs.couchbase.com/server/6.5/install/install-ports.html
# 포트 변경은 클러스터 구성전 초기설정에 수행해야 한다.
# 그렇지 않으면 노드의 데이터도 모두 삭제되기 때문의 주의해야 한다.
# port 설정 파일을 열어 8091 -> 9000 포트를 변경
vi /opt/couchbase/etc/couchbase/static_config
{rest_port, 9000}.
# 기존 설정된 파일 삭제
rm -rf /opt/couchbase/var/lib/couchbase/config/config.dat
# couchbase 재시작
sudo systemctl restart couchbase-server
#####
# tls 연결
# Couchbase 는 기본 8091 외 2.5 버전 이상 부터
# gocb 와 같은 SDK 에서 11201 포트(노드의 memcached protocol사용)로
# 클러스터 맵 정보를 파악한다.
# 하지만 연결 자체가 암호되어 있지 않다.
# 다음 설명을 보면 enterprise 버전에서만 인증서 기능을 제공하는것으로 보임
https://docs.couchbase.com/server/6.5/manage/manage-security/configure-server-certificates.html
Couchbase Server Enterprise Edition supports X.509 certificates, for the encryption of communications between the server and networked clients.
# community vs enterprise 기능 비교
https://www.couchbase.com/products/editions
couchbase migration
# couchbase cli tool 로 couchbase -> couchbase migration
# 로컬(mac 기준) couchbase 앱 설치
# 6.0 에는 cbxxx 툴이 없다.
# 6.0 실행후 6.5 로 업데이트해야 툴이 생긴다.
brew cask install couchbase-server-community
# cli 툴 위치로 이동
cd '/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin'
#####
# 로컬(mac 기준) couchbase 앱 설치
# 6.0 에는 cbxxx 툴이 없다.
# 6.0 실행후 6.5 로 업데이트해야 툴이 생긴다.
brew cask install couchbase-server-community
# cli 툴 위치로 이동
cd '/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin'
#####
# bucket 이동(자세한 설명은 ./cbtransfer -h 참고)
# destination 에 dest_bucket1 버킷을 생성해둬야 한다.
./cbtransfer http://ysoftman-cb1:8091 http://ysoftman-cb2:8091 -u ysoftman -p password -b src_bucket1 -B dest_bucket1
# bucket 단위로 export/import
# cbexport(자세한 설명은 ./cbexport json -h 참고)
# document id 는 디폴트로 export 되지 않아
# --include-key 옵션으로 doc___id 필드에 document id 저장
# --include-key 를 사용하면 value {} 필드안에 값이 저장된다.
./cbexport json -c couchbase://ysoftman-cb1 -u ysoftman -p password -b bucket1 -o bucket1.json -f lines -t 4 --include-key doc___id
# cbimport(자세한 설명은 ./cbimport json -h 참고)
# 신규 cb 에 버킷이 존재해야 한다.
# doc___id 필드의 값을 document id 로 사용
./cbimport json -c couchbase://ysoftman-cb2 -u ysoftman -p password -b bucket1 -d file:///Applications/Couchbase\ Server.app/Contents/Resources/couchbase-core/bin/bucket1.json -f lines -t 4 -g %doc___id%
# 필드 삭제
# --include-key doc___id 를 사용시
# 다음과 같이 import 하기 때문에 필요시 doc___id, value 부분을 삭제해야 한다.
doc___id : "문서id"
value : {
문서내용
}
# 필드 쿼리를 위해 버킷1 에 대한 query 메뉴에서 인덱스 추가
create primary index `#primary` on `bucket1`
# 필드 제거 query
update bucket1 unset doc___id
# 필드 제거 확인 query
select * from bucket1
./cbtransfer http://ysoftman-cb1:8091 http://ysoftman-cb2:8091 -u ysoftman -p password -b src_bucket1 -B dest_bucket1
# 로컬에 백업 받아 이동하기
# /Users/ysoftman/workspace/zzz 디렉토리를 생성해둬야 한다.
./cbtransfer http://ysoftman-cb1:8091/ couchstore-files:////Users/ysoftman/workspace/zzz -u ysoftman -p password -b src_bucket1 -B dest_bucket1
./cbtransfer couchstore-files:////Users/ysoftman/workspace/zzz http://ysoftman-cb2:8091/ -u ysoftman -p password -b src_bucket1 -B dest_bucket1
# 만약 local -> ysoftman-cb2 바로 접근이 되지 않는 상황이라면
# (ysoftman-cb2:11210 포트로 접근이 되어야 한다.)
# ysoftman-cb2 장비에 백업 파일을 올리고
rsync -avz ./zzz/ ysoftman@ysoftman-cb2:~/zzz
# ysoftman-cb2 장비에 접속해
ssh ysoftman@ysoftman-cb2
# 백업 파일을 ysoftman-cb2 로 올린다.
/opt/couchbase/bin/cbtransfer couchstore-files:////home/ysoftman/zzz http://ysoftman-cb2:8091/ -u ysoftman -p password -b src_bucket1 -B dest_bucket1
#####
# cbexport(자세한 설명은 ./cbexport json -h 참고)
# document id 는 디폴트로 export 되지 않아
# --include-key 옵션으로 doc___id 필드에 document id 저장
# --include-key 를 사용하면 value {} 필드안에 값이 저장된다.
./cbexport json -c couchbase://ysoftman-cb1 -u ysoftman -p password -b bucket1 -o bucket1.json -f lines -t 4 --include-key doc___id
# cbimport(자세한 설명은 ./cbimport json -h 참고)
# 신규 cb 에 버킷이 존재해야 한다.
# doc___id 필드의 값을 document id 로 사용
./cbimport json -c couchbase://ysoftman-cb2 -u ysoftman -p password -b bucket1 -d file:///Applications/Couchbase\ Server.app/Contents/Resources/couchbase-core/bin/bucket1.json -f lines -t 4 -g %doc___id%
# 필드 삭제
# --include-key doc___id 를 사용시
# 다음과 같이 import 하기 때문에 필요시 doc___id, value 부분을 삭제해야 한다.
doc___id : "문서id"
value : {
문서내용
}
# 필드 쿼리를 위해 버킷1 에 대한 query 메뉴에서 인덱스 추가
create primary index `#primary` on `bucket1`
# 필드 제거 query
update bucket1 unset doc___id
# 필드 제거 확인 query
select * from bucket1
couchbase cli 사용하기
# couchbase 설치된 곳에 /opt/couchbase/bin/couchbase-cli 을 사용해
# 다양한 작업을 실행할 수 있다.
# 참고로 아래 예시는 couchbase 6.0 기준 이고 버전에 따라 조금 다를 수 있다.
# administrator 비번 변경
# administrator 는 couchbase 설치시 생성한것(이름은 이때 정함)으로 1개만 있다.
# sudo 를 사용하는 이유는 암호 변경을 위해서는
# 토큰(/opt/couchbase/var/lib/couchbase/localtoken)파일로 인증하는데
# couchbase 사용자,그룹만 권한이 있어서다.
sudo /opt/couchbase/bin/couchbase-cli reset-admin-password --new-password ysoftman
# 서버(노드) 추가
# 노드가 수십개 이상일 경우 어드민툴(:8091)->servers->add server 하기보다
# couchbase-cli 를 이용한 쉘 스크립트를 실행하면 편한다.
for ((i=1;i<=10;i++)); do
target="ysoftman-couchbase-$i"
echo "${target}"
/opt/couchbase/bin/couchbase-cli server-add -c ysoftman-couchbase-1 -u admin -p ysoftman --server-add-username=admin --server-add-password=ysoftman --server-add=${target}
done
/opt/couchbase/bin/couchbase-cli rebalance -c ysoftma-couchbase-1 -u admin -p ysoftman
# 서버 리스트 확인
/opt/couchbase/bin/couchbase-cli server-list -c ysoftman-couchbase-1 -u admin -p ysoftman
# 다양한 작업을 실행할 수 있다.
# 참고로 아래 예시는 couchbase 6.0 기준 이고 버전에 따라 조금 다를 수 있다.
# administrator 비번 변경
# administrator 는 couchbase 설치시 생성한것(이름은 이때 정함)으로 1개만 있다.
# sudo 를 사용하는 이유는 암호 변경을 위해서는
# 토큰(/opt/couchbase/var/lib/couchbase/localtoken)파일로 인증하는데
# couchbase 사용자,그룹만 권한이 있어서다.
sudo /opt/couchbase/bin/couchbase-cli reset-admin-password --new-password ysoftman
# 서버(노드) 추가
# 노드가 수십개 이상일 경우 어드민툴(:8091)->servers->add server 하기보다
# couchbase-cli 를 이용한 쉘 스크립트를 실행하면 편한다.
for ((i=1;i<=10;i++)); do
target="ysoftman-couchbase-$i"
echo "${target}"
/opt/couchbase/bin/couchbase-cli server-add -c ysoftman-couchbase-1 -u admin -p ysoftman --server-add-username=admin --server-add-password=ysoftman --server-add=${target}
done
/opt/couchbase/bin/couchbase-cli rebalance -c ysoftma-couchbase-1 -u admin -p ysoftman
# 서버 리스트 확인
/opt/couchbase/bin/couchbase-cli server-list -c ysoftman-couchbase-1 -u admin -p ysoftman
couchbase cluster in kubernetes
# kubernetes(k8s) 노드가 다음과 같이 구성되어 있다고 가정하고 설치한다.
1 maser
3 worker
1 ingress
# k8s couchbase 설치 참고
# https://kubernetes.io/blog/2016/08/create-couchbase-cluster-using-kubernetes/
# couchbase-cluster-master.yaml 내용
apiVersion: v1
kind: ReplicationController
metadata:
name: couchbase-master-rc
spec:
replicas: 1
selector:
app: couchbase-master-pod
template:
metadata:
labels:
app: couchbase-master-pod
spec:
containers:
- name: couchbase-master
image: couchbase:community-6.0.0
env:
- name: TYPE
value: MASTER
ports:
- containerPort: 8091
---
apiVersion: v1
kind: Service
metadata:
name: couchbase-master-service
labels:
app: couchbase-master-service
spec:
ports:
- port: 8091
selector:
app: couchbase-master-pod
# type: LoadBalancer
# couchbase-cluster-worker.yaml 내용
apiVersion: v1
kind: ReplicationController
metadata:
name: couchbase-worker-rc
spec:
replicas: 3
selector:
app: couchbase-worker-pod
template:
metadata:
labels:
app: couchbase-worker-pod
spec:
containers:
- name: couchbase-worker
image: couchbase:community-6.0.0
env:
- name: TYPE
value: "WORKER"
- name: COUCHBASE_MASTER
value: "couchbase-master-service"
- name: AUTO_REBALANCE
value: "false"
ports:
- containerPort: 8091
# couchbase-cluster-ingress.yaml 내용
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: couchbase-ingress
namespace: default
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: ysoftman-couchbase-server
http:
paths:
- path: /
backend:
serviceName: couchbase-master-service
servicePort: 8091
# couchbase 클러스터 master, worker, service, ingress 생성
kubectl apply -f couchbase-cluster-master.yaml
kubectl apply -f couchbase-cluster-worker.yaml
kubectl apply -f couchbase-cluster-ingress.yaml
# service, pod 확인
kubectl get all
# ingress 확인
kubectl get ingress
# couchbase 클러스터 구성
# worker pod 들의 ip 를 파악해서
kubectl get pod -o wide
# couchbase admin 페이지에서 서버 ip 를 추가한다.
http://ysoftman-couchbase-server -> servers -> add server 로 추가 -> rebalance
1 maser
3 worker
1 ingress
# k8s couchbase 설치 참고
# https://kubernetes.io/blog/2016/08/create-couchbase-cluster-using-kubernetes/
# couchbase-cluster-master.yaml 내용
apiVersion: v1
kind: ReplicationController
metadata:
name: couchbase-master-rc
spec:
replicas: 1
selector:
app: couchbase-master-pod
template:
metadata:
labels:
app: couchbase-master-pod
spec:
containers:
- name: couchbase-master
image: couchbase:community-6.0.0
env:
- name: TYPE
value: MASTER
ports:
- containerPort: 8091
---
apiVersion: v1
kind: Service
metadata:
name: couchbase-master-service
labels:
app: couchbase-master-service
spec:
ports:
- port: 8091
selector:
app: couchbase-master-pod
# type: LoadBalancer
# couchbase-cluster-worker.yaml 내용
apiVersion: v1
kind: ReplicationController
metadata:
name: couchbase-worker-rc
spec:
replicas: 3
selector:
app: couchbase-worker-pod
template:
metadata:
labels:
app: couchbase-worker-pod
spec:
containers:
- name: couchbase-worker
image: couchbase:community-6.0.0
env:
- name: TYPE
value: "WORKER"
- name: COUCHBASE_MASTER
value: "couchbase-master-service"
- name: AUTO_REBALANCE
value: "false"
ports:
- containerPort: 8091
# couchbase-cluster-ingress.yaml 내용
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: couchbase-ingress
namespace: default
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: ysoftman-couchbase-server
http:
paths:
- path: /
backend:
serviceName: couchbase-master-service
servicePort: 8091
# couchbase 클러스터 master, worker, service, ingress 생성
kubectl apply -f couchbase-cluster-master.yaml
kubectl apply -f couchbase-cluster-worker.yaml
kubectl apply -f couchbase-cluster-ingress.yaml
# service, pod 확인
kubectl get all
# ingress 확인
kubectl get ingress
# ysoftman-couchbase-server 도메인을 만들면 ingress에서 처리해
# 외부에서 접속 할 수 있다.
http://ysoftman-couchbase-server
# worker pod 들의 ip 를 파악해서
kubectl get pod -o wide
# couchbase admin 페이지에서 서버 ip 를 추가한다.
http://ysoftman-couchbase-server -> servers -> add server 로 추가 -> rebalance
JSON document DB
JSON document 를 저장하고 싶은데 CouchDB, Elasticsearch, MongoDB 어떤것을 선택해야 할까?
https://db-engines.com/en/system/CouchDB%3BElasticsearch%3BMongoDB
https://db-engines.com/en/system/CouchDB%3BElasticsearch%3BMongoDB