您的位置 首页 > 数码极客

「mongo主从如何同步」mongo主从模式

部署架构

本文介绍如何利用ArgoCD在三个OpenShift集群上部署一套MongoDB的主从集群。下一章节再在部署三个OpenShift集群上部署应用访问MongoDB集群。

部署mongodb主从集群

准备操作环境

1. 操作环境以Linux为例。

2. 正常安装ArgoCD服务器和客户端。

3. 将复制一份到自己的github账号,然后再clone一份到本地。最后将本地的federation-dev/labs/utility/目录中的文件全部赋予可执行权限,并将该目录放到PATH环境变量中。

4. 参照我在头条中《OpenShift 4 之 GitOps(1)安装ArgoCD环境》。

5. 在下载对应平台的cfssl和cfssljson软件。

配置ArgoCD

参考《OpenShift 4 之 GitOps(4)用ArgoCD向多OpenShift集群发布应用》,先通过“oc config rename-context <*NEW_NAME*>”命令修改三个OpenShift集群的Config Context名称(分别命名为cluster1、cluster2、cluster3),然后通过“argocd cluster add *<CONTEXT_NAME>*”命令分别将三个OpenShift集群加到ArgoCD环境中。

准备MongoDB所需证书

为了让MongoDB可通过TLS访问,需要生成证书和秘钥。

1. 进入lab-6-assets目录,然后创建三个文件,分别是ca-con,ca-c,mongodb-c。

$ cd ~/federation-dev/labs/lab-6-assets $ cat > ca-con <<EOF { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": ["signing", "key encipherment", "server auth", "client auth"], "expiry": "8760h" } } } } EOF $ cat > ca-c <<EOF { "CN": "Kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Austin", "O": "Kubernetes", "OU": "TX", "ST": "Texas" } ] } EOF $ cat > mongodb-c <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "Austin", "O": "Kubernetes", "OU": "TX", "ST": "Texas" } ] } EOF ```

2. 生成CA文件。

$ cfssl gencert -initca ca-c | cfssljson -bare ca

3. 设置所需环境变量,最后创建MongoDB证书。

$ NAMESPACE=mongo $ SERVICE_NAME=mongo $ ROUTE_CLUSTER1=mongo-cluster1.$(oc --context=cluster1 get ingre cluster -o jsonpath='{ . }') $ ROUTE_CLUSTER2=mongo-cluster2.$(oc --context=cluster2 get ingre cluster -o jsonpath='{ . }') $ ROUTE_CLUSTER3=mongo-cluster3.$(oc --context=cluster3 get ingre cluster -o jsonpath='{ . }') $ SANS="localhost,local,${ROUTE_CLUSTER1},${ROUTE_CLUSTER2},${ROUTE_CLUSTER3},${SERVICE_NAME},${SERVICE_NAME}.${NAMESPACE},${SERVICE_NAME}.${NAMESPACE}.; $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-con -hostname=${SANS} -profile=kubernetes mongodb-c | cfssljson -bare mongodb

4. 合并秘钥和证书文件。

$ cat mongodb-key.pem mongodb.pem > mongo.pem

更新被部署的yaml文件

在Gitops中所有部署对象都是YAML文件,所以在通过ArgoCD执行YAML之前,我们还需要将和操作环境相关的配置更新到YAML中。

1. 修改本地的mongo-文件

$ sed -i ": .*$: $(openssl base64 -A < mongo.pem)/" base/mongo- $ sed -i ": .*$: $(openssl base64 -A < ca.pem)/" base/mongo-

2. 修改本地的mongo-r文件

$ sed -i "s/primarynodehere/${ROUTE_CLUSTER1}:443/" base/mongo-r $ sed -i "s/replicamembershere/${ROUTE_CLUSTER1}:443,${ROUTE_CLUSTER2}:443,${ROUTE_CLUSTER3}:443/" base/mongo-r

3. 修改本地的mongo-rou文件

$ sed -i "s/mongocluster1route/${ROUTE_CLUSTER1}/" overlays/cluster1/mongo-rou $ sed -i "s/mongocluster2route/${ROUTE_CLUSTER2}/" overlays/cluster2/mongo-rou $ sed -i "s/mongocluster3route/${ROUTE_CLUSTER3}/" overlays/cluster3/mongo-rou

4. 将mongo-、mongo-r、mongo-rou更新至自己的github。

在三个OpenShift集群中部署MongoDB

1. 将自己github账号(<MY-GITHUB>)中的三个MongoDB集群的配置加入到ArgoCD中。

$ MY_GITHUB=;MY-GITHUB> $ argocd app create --project default --name cluster1-mongo \ --repo ${MY_GITHUB} \ --path labs/lab-6-assets/overlays/cluster1 \ --dest-server $(argocd cluster list | grep cluster1 | awk '{print $1}') \ --dest-namespace mongo --revision master --sync-policy automated $ argocd app create --project default --name cluster2-mongo \ --repo ${MY_GITHUB} \ --path labs/lab-6-assets/overlays/cluster2 \ --dest-server $(argocd cluster list | grep cluster2 | awk '{print $1}') \ --dest-namespace mongo --revision master --sync-policy automated $ argocd app create --project default --name cluster3-mongo \ --repo ${MY_GITHUB} \ --path labs/lab-6-assets/overlays/cluster3 \ --dest-server $(argocd cluster list | grep cluster3 | awk '{print $1}') \ --dest-namespace mongo --revision master --sync-policy automated

如果对自己Github账户中的部署文件进行了更改,可执行以下命令手动同步到ArgoCD。

$ argocd app sync cluster1-mongo $ argocd app sync cluster2-mongo $ argocd app sync cluster3-mongo

2. 运行命令,查看三个ArgoCD app的状态。直到它们变为“Healthy”即完成。

$ argocd app list NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET cluster1-mongo mongo default OutOfSync Healthy Auto <none> https://github.com/liuxiaoyu-git labs/lab-6-assets/overlays/cluster1 master cluster2-mongo mongo default OutOfSync Healthy Auto <none> https://github.com/liuxiaoyu-git labs/lab-6-assets/overlays/cluster2 master cluster3-mongo mongo

3. 查看三个OpenShift集群中的Deployment和Route对象都正常。

$ for cluster in cluster1 cluster2 cluster3; do oc --context $cluster -n mongo get deployment mongo; done $ for cluster in cluster1 cluster2 cluster3; do oc --context $cluster -n mongo get deployment mongo; done

## 配置MongoDB的ReplicaSet

1. 执行命令通过给pod打标签,将cluster1设为ReplicaSet的primary replica角色。

$ MONGO_POD=$(oc --context=cluster1 -n mongo get pod --selector="name=mongo" --output=jsonpath='{.items..me}') $ oc --context=cluster1 -n mongo label pod $MONGO_POD replicaset=primary

2. 执行命令(该命令在federation-dev/labs/utility目录中),查看MongoDB ReplicaSet的状态。

$ wait-for-mongo-replicaset cluster1 mongo 3 Checking if MongoDB Replicaset from namespace mongo on cluster cluster1 is configured 。。。 MongoDB ReplicaSet Status: -------------------------- Primary Member: "mongo-clu; Secondary Members: "mongo-clu; "mongo-clu;

注意:在操作的时候如果出现作为Primary成员的cluster1的状态如果不正常(后台的MongoCD Pod出现CrashLoopBackOff),可以尝试先执行以下命令删除cluster1的“replicaset=primary”的标签,然后再修改本节(1)步骤的命令(将cluster2或cluste在r3设为Primary成员),最后在执行修改后的命令。

一旦在此步骤更换了replicaset的primary,后面所有和MongoDB

$ oc --context=cluster1 -n mongo label pod $MONGO_POD replicaset-

3. 执行命令,查看MongoDB的Replicaset。确认其中三个member的"name"、"stateStr"和"syncingTo"字段内容,确认三个成员的相互关系是"stateStr"为"SECONDARY"的成员其"syncingTo"指向的是"stateStr"为"PRIMARY"的成员。

$ MONGO_POD=$(oc --context=cluster1 -n mongo get pod --selector="name=mongo" --output=jsonpath='{.items..me}') $ oc --context=cluster1 -n mongo exec $MONGO_POD \ -- bash -c 'mongo --norc --quiet --username=admin --password=$MONGODB_ADMIN_PASSWORD --host localhost admin --tls --tlsCAFile /opt/mongo-ssl --eval "rs.status()"'

此时在三个OpenShift集群中就配置好了三个具备主从关系的MongoDB集群。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“mongo主从如何同步,mongo主从模式,mongo,主从复制,mongo主从同步原理,mongo主从同步停止,mongo主从同步数据”边界阅读