Docker 搭建集群MongoDB的实现步骤

前言

由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主、一副、一仲裁

基本概念

Replica Set 副本集:一个副本集就是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成

  • 主节点(master):主节点接收所有写入操作。主节点将对其数据集所做的所有更改记录到其 oplog。
  • 副节点(secondary):复制主节点的 oplog 并将操作应用到其数据集,如果主节点不可用,一个合格的副节点将被选为新的主节点。
  • 仲裁节点(arbiter):负载选举,当主节点不可用,它将从副节点中选一个作为主节点。

Sharding 分片:

Master-slave 主备

  • MongoDB 4.0 以上版本运行时提示:[main] Master/slave replication is no longer supported,也就是 MongoDB 4.0 后不在支持主从复制

一、环境准备

使用 CentOS 7.6 64bit 系统,安装 Docker、Docker-compose、Docker-Swarm

二、生成 KeyFile

  • MongoDB 使用 KeyFile 认证,副本集中的每个 MongoDB 实例使用 KeyFile 内容作为认证其他成员的共享密码。MongoDB 实例只有拥有正确的 KeyFile 才可以加入副本集。
  • keyFile 的内容必须是 6 到 1024 个字符的长度,且副本集所有成员的 KeyFile 内容必须相同。
  • 有一点要注意是的:在 UNIX 系统中,KeyFile 必须没有组权限或完全权限(也就是权限要设置成 X00 的形式)。Windows 系统中,keyFile 权限没有被检查。
  • 可以使用任意方法生成 keyFile。例如,如下操作使用 openssl 生成复杂的随机的 1024 个字符串。然后使用 chmod 修改文件权限,只给文件拥有者提供读权限。
  • 这是 MongoDB 官方推荐 keyFile 的生成方式:
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

二、创建跨主机网络

搭建集群我们肯定是跨主机通讯,要搭建 Overlay Network 网络,我们就要用到 Docker Swarm 这个工具了。Docker Swarm 是 Docker 内置的集群工具,它能够帮助我们更轻松地将服务部署到 Docker daemon 的集群之中。

既然要将 Docker 加入到集群,我们就必须先有一个集群,我们在任意一个 Docker 实例上都可以通过 docker swarm init 来初始化集群。

$ sudo docker swarm init

Swarm initialized: current node (t4ydh2o5mwp5io2netepcauyl) is now a manager.

To add a worker to this swarm, run the following command:

  docker swarm join --token SWMTKN-1-4dvxvx4n7magy5zh0g0de0xoues9azekw308jlv6hlvqwpriwy-cb43z26n5jbadk024tx0cqz5r 192.168.1.5:2377

在集群初始化后,这个 Docker 实例就自动成为了集群的管理节点,而其他 Docker 实例可以通过运行这里所打印的 docker swarm join 命令来加入集群。

加入到集群的节点默认为普通节点,如果要以管理节点的身份加入到集群中,我们可以通过 docker swarm join-token 命令来获得管理节点的加入命令。

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:

  docker swarm join --token SWMTKN-1-60am9y6axwot0angn1e5inxrpzrj5d6aa91gx72f8et94wztm1-7lz0dth35wywekjd1qn30jtes 192.168.1.5:2377

我们通过这些命令来建立用于我们服务开发的 Docker 集群,并将相关开发同事的 Docker 加入到这个集群里,就完成了搭建跨主机网络的第一步。

建立跨主机网络

接下来,我们就通过 docker network create 命令来建立 Overlay 网络。

$ sudo docker network create --driver overlay --attachable mongodbs

在创建 Overlay 网络时,我们要加入 --attachable 选项以便不同机器上的 Docker 容器能够正常使用到它。

在创建了这个网络之后,我们可以在任何一个加入到集群的 Docker 实例上使用 docker network ls 查看一下其下的网络列表。我们会发现这个网络定义已经同步到了所有集群中的节点上。

$ sudo docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
## ......
y89bt74ld9l8    mongodbs        overlay       swarm
## ......

接下来我们要修改 Docker Compose 的定义,让它使用这个我们已经定义好的网络,而不是再重新创建网络。

我们只需要在 Docker Compose 配置文件的网络定义部分,将网络的 external 属性设置为 true,就可以让 Docker Compose 将其建立的容器都连接到这个不属于 Docker Compose 的项目上了。

networks:
 mesh:
  external: true

通过这个实现,我们在开发中就使整个服务都处于一个可以使用别名映射网络中,避免了要对不同功能联调时切换服务 IP 的烦琐流程。在这种结构下,我们只需要让我们开发的 Docker 退出和加入不同的集群,就能马上做到切换不同联调项目。

二、编写 docker-compose 文件

主节点

version: "3"
services:
 master:
  image: mongo:4.1
  container_name: master
  environment:
   MONGO_INITDB_ROOT_USERNAME: root
   MONGO_INITDB_ROOT_PASSWORD: 123456
   TZ: "Asia/Shanghai"
  volumes:
   # 挂载 MongoDB 数据目录
   - "/data/docker/mongodb/data/mongo:/data/db:rw"
   # 挂载 KeyFile
   - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
  ports:
   - "27018:27017"
  networks:
   - mongodbs
  command:
   # 密码
   --auth
   # 副本集名称
   --replSet testSet
   --oplogSize 128
   --keyFile /data/mongodb.key
# Swarm 跨主机网络网络
networks:
 mongodbs:
  external: true

副节点

version: "3"
services:
secondary:
 image: mongo:4.1
 container_name: secondary
 environment:
  MONGO_INITDB_ROOT_USERNAME: root
  MONGO_INITDB_ROOT_PASSWORD: 123456
  TZ: "Asia/Shanghai"
 volumes:
  - "/data/docker/mongodb/data/mongo:/data/db:rw"
  - "/data/docker/mongodb/data/mongodb.key:/data/mongodb.key"
 ports:
  - "27018:27017"
 networks:
  - mongodbs
 command:
  --auth
  --replSet testSet
  --oplogSize 128
  --keyFile /data/mongodb.key
networks:
mongodbs:
 external: true

仲裁节点,因为仲裁节点不需要存储数据,他只是用来当主节点挂掉后选举新的主节点,所以不需要密码、映射端口等操作

version: "3"
services:
arbiter:
 image: mongo:4.1
 container_name: arbiter
 restart: always
 volumes:
  - "/data/docker/mongodb/data/mongo:/data/db:rw"
  - "/data/docker/mongodb/data/mongo_key:/mongo:rw"
 networks:
  - mongodbs
 command:
  mongod --replSet testSet --smallfiles --oplogSize 128
networks:
mongodbs:
 external: true

三、启动容器

接下来我们分别在三台服务器中使用容器编排启动容器

docker-compose up -d

四、配置副本集

进入主节点容器内部

docker exec -it master mongo

在 mongo shell 里执行:

> rs.initiate()
{
   "info2" : "no configuration specified. Using a default configuration for the set",
   "me" : "7abd89794aa7:27017",
   "ok" : 1
}

继续执行:

testSet:SECONDARY> rs.add('secondary:27017')
{
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562800, 1),
       "signature" : {
           "hash" : BinData(0,"wrxMUIX/0bEyLgCVoQqdLvH59T0="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599562800, 1)
}

继续执行,其中 true 表示这个节点是仲裁节点

testSet:PRIMARY> rs.add('arbiter:27017',true)
{
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562838, 1),
       "signature" : {
           "hash" : BinData(0,"p9ub49lLD8ij8nkxpfu2l/AvRRY="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599562838, 1)
}

查看配置

testSet:PRIMARY> rs.conf()
{
   "_id" : "testSet",
   "version" : 3,
   "protocolVersion" : NumberLong(1),
   "writeConcernMajorityJournalDefault" : true,
   "members" : [
       {
           "_id" : 0,
           "host" : "7abd89794aa7:27017",
           "arbiterOnly" : false,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 1,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       },
       {
           "_id" : 1,
           "host" : "secondary:27017",
           "arbiterOnly" : false,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 1,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       },
       {
           "_id" : 2,
           "host" : "arbiter:27017",
           "arbiterOnly" : true,
           "buildIndexes" : true,
           "hidden" : false,
           "priority" : 0,
           "tags" : {

           },
           "slaveDelay" : NumberLong(0),
           "votes" : 1
       }
   ],
   "settings" : {
       "chainingAllowed" : true,
       "heartbeatIntervalMillis" : 2000,
       "heartbeatTimeoutSecs" : 10,
       "electionTimeoutMillis" : 10000,
       "catchUpTimeoutMillis" : -1,
       "catchUpTakeoverDelayMillis" : 30000,
       "getLastErrorModes" : {

       },
       "getLastErrorDefaults" : {
           "w" : 1,
           "wtimeout" : 0
       },
       "replicaSetId" : ObjectId("5f576426fe90ef2dd8cd2700")
   }
}

查看状态

testSet:PRIMARY> rs.status()
{
   "set" : "testSet",
   "date" : ISODate("2020-09-08T11:45:12.096Z"),
   "myState" : 1,
   "term" : NumberLong(1),
   "syncingTo" : "",
   "syncSourceHost" : "",
   "syncSourceId" : -1,
   "heartbeatIntervalMillis" : NumberLong(2000),
   "optimes" : {
       "lastCommittedOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "lastCommittedWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "readConcernMajorityOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "readConcernMajorityWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "appliedOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "durableOpTime" : {
           "ts" : Timestamp(1599565502, 1),
           "t" : NumberLong(1)
       },
       "lastAppliedWallTime" : ISODate("2020-09-08T11:45:02.775Z"),
       "lastDurableWallTime" : ISODate("2020-09-08T11:45:02.775Z")
   },
   "lastStableRecoveryTimestamp" : Timestamp(1599565492, 1),
   "lastStableCheckpointTimestamp" : Timestamp(1599565492, 1),
   "members" : [
       {
           "_id" : 0,
           "name" : "7abd89794aa7:27017",
           "ip" : "10.0.1.41",
           "health" : 1,
           "state" : 1,
           "stateStr" : "PRIMARY",
           "uptime" : 2784,
           "optime" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDate" : ISODate("2020-09-08T11:45:02Z"),
           "syncingTo" : "",
           "syncSourceHost" : "",
           "syncSourceId" : -1,
           "infoMessage" : "",
           "electionTime" : Timestamp(1599562790, 2),
           "electionDate" : ISODate("2020-09-08T10:59:50Z"),
           "configVersion" : 3,
           "self" : true,
           "lastHeartbeatMessage" : ""
       },
       {
           "_id" : 1,
           "name" : "secondary:27017",
           "ip" : "10.0.1.233",
           "health" : 1,
           "state" : 2,
           "stateStr" : "SECONDARY",
           "uptime" : 2711,
           "optime" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDurable" : {
               "ts" : Timestamp(1599565502, 1),
               "t" : NumberLong(1)
           },
           "optimeDate" : ISODate("2020-09-08T11:45:02Z"),
           "optimeDurableDate" : ISODate("2020-09-08T11:45:02Z"),
           "lastHeartbeat" : ISODate("2020-09-08T11:45:11.494Z"),
           "lastHeartbeatRecv" : ISODate("2020-09-08T11:45:11.475Z"),
           "pingMs" : NumberLong(0),
           "lastHeartbeatMessage" : "",
           "syncingTo" : "7abd89794aa7:27017",
           "syncSourceHost" : "7abd89794aa7:27017",
           "syncSourceId" : 0,
           "infoMessage" : "",
           "configVersion" : 3
       },
       {
           "_id" : 2,
           "name" : "arbiter:27017",
           "ip" : null,
           "health" : 0,
           "state" : 8,
           "stateStr" : "(not reachable/healthy)",
           "uptime" : 0,
           "lastHeartbeat" : ISODate("2020-09-08T11:45:10.463Z"),
           "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
           "pingMs" : NumberLong(0),
           "lastHeartbeatMessage" : "Error connecting to arbiter:27017 :: caused by :: Could not find address for arbiter SocketException: Host not found (authoritative)",
           "syncingTo" : "",
           "syncSourceHost" : "",
           "syncSourceId" : -1,
           "infoMessage" : "",
           "configVersion" : -1
       }
   ],
   "ok" : 1,
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599565502, 1),
       "signature" : {
           "hash" : BinData(0,"7/ei+8UrhlpIny9zKeWuAFpn46c="),
           "keyId" : NumberLong("6870069879538450434")
       }
   },
   "operationTime" : Timestamp(1599565502, 1)
}

五、验证 MongoDB 可用性

先进入主节点服务器添加一条数据

docker exec -it master mongo
use admin
db.auth('root', '123456')
use test
db.test.insert({name:"muyang",age:20})

在来副节点服务器查看是否已经同步了这条数据

[root@linux secondary] docker exec -it secondary mongo
testSet:SECONDARY> use admin
testSet:SECONDARY> db.auth('root', '123456')
testSet:SECONDARY> use test
testSet:SECONDARY> db.test.find()
2020-09-08T19:03:02.295+0800 E QUERY  [js] uncaught exception: Error: listCollections failed: {
   "operationTime" : Timestamp(1599562972, 1),
   "ok" : 0,
   "errmsg" : "not master and slaveOk=false",
   "code" : 13435,
   "codeName" : "NotMasterNoSlaveOk",
   "$clusterTime" : {
       "clusterTime" : Timestamp(1599562972, 1),
       "signature" : {
           "hash" : BinData(0,"mhsrpGHRl7qZg2QOjyS3RbBb/Yc="),
           "keyId" : NumberLong("6870069879538450434")
       }
   }
} :
testSet:SECONDARY> rs.slaveOk()
testSet:SECONDARY> db.users.find()
{ "_id" : ObjectId("5f5764b1f909544b783696c2"), "name" : "muyang", "age" : 20 }

在 secondary 查询时报如下错误:

not master and slaveok=false

这是正常的,因为 secondary 是不允许读写的,如果非要解决,方法如下:

testSet:SECONDARY> rs.slaveOk()

到此这篇关于Docker 搭建集群MongoDB的实现步骤的文章就介绍到这了,更多相关Docker 搭建集群MongoDB内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)

    原因是这样的 想要部署一个mocker平台,就在朋友的推荐下选择了 api-mocker 这个现成的项目 该项目分为服务端node.客户端vue.以及数据库mongoDB 在尝试直接部署的时候发现需要装一大堆的环境,node.mongo.nginx啊,特别的麻烦,之前简单的使用过docker,就在想能不能用docker免环境直接部署呢?于是就有了这次的尝试 多容器通信 该项目分为3个部分,于是就要建立3个容器(node.mongo.nginx) 那容器之间怎么实现通信呢? # 通过link指令建

  • docker中使用mongodb数据库详解(在局域网访问)

    前言 有了docker,基本上就告别了各种软件.数据库的安装,直接从镜像库pull下来,爽,想想以前那真是一个遭罪啊. 这文章就来看一下如何跑mongo的docker镜像,并且可以在局域网访问,内容相对简单,也是记录我的自学过程. 第一步 获得mongo镜像,命令如下, # 拉取mongo镜像 docker pull mongo # 查看本地库mongo镜像 docker images mongo 第二步 启动mongo镜像,如下 # 启动mongo镜像 docker run -itd -P -

  • 如何利用MongoDB存储Docker日志详解

    前言 日志是系统很重要的一个组成部分,通过日志可以及时发现系统中存在的问题,也可以为修复问题提供线索.Docker提供了多种插件方式管理日志,本文就对使用MongoDB存储Docker日志的过程做个记录. 数据流 Docker产生的日期 发送到 FluentD,然后FluentD在转存到MongoDB. 配置Fluentd 前提:操作系统是CentOS7,已安装MongoDB3.4 1. 安装Fluentd CentOS 7的软件库并没有包含Fluentd的安装包,所以需要手动安装.在CentO

  • 如何使用Docker安装一个MongoDB最新版

    1 安装 本文假设大家已经安装好了docker并能正常使用,所以不讲解如何安装docker了.用docker安装MongoDB最新版本如下: # 从repository查找mongo的相关镜像,结果很多,其中第一条为官方的镜像 $ docker search mongo # 下载官方镜像的最新版本 $ docker pull mongo:latest # 完成后,检查是否下载成功 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE cento

  • Springboot整合MongoDB的Docker开发教程全解

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. 2 把Springboot打包成Docker镜像 Springboot的Web开发非常简单,本次使用之前讲解过的Springboot整合MongoDB的项目,请参考 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式,文章中有源码:MongoDB的安装请参考:用Docker安装

  • 基于Docker的MongoDB实现授权访问的方法

    基于Docker部署一个数据库实例通常比直接在服务器上安装数据库还要简单,Gevin在开发环境中经常使用基于docker的数据库服务,docker也渐渐成为Gevin在Linux上安装MongoDB的首选方式,由于MongoDB默认是不用通过认证就能直接连接的,出于安全考虑,在公网上部署MongoDB时,务必设置authentication机制,以避免类似 "黑客赎金" 问题的发生. 那么,基于Docker拉起的MongoDB,如何实现通过用户名密码访问指定数据库呢?方法很简单,但前提

  • 在Docker中使用mongodb数据库的实现代码

    获取 mongo 镜像 sudo docker pull mongo 运行 mongodb 服务 sudo docker run -p 27017:27017 -v /tmp/db:/data/db -d mongo 运行 mongodb 客户端 sudo docker run -it mongo mongo --host <宿主机IP地址> --port 27017 > show dbs admin 0.000GB config 0.000GB local 0.000GB > u

  • Docker 搭建集群MongoDB的实现步骤

    前言 由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主.一副.一仲裁 基本概念 Replica Set 副本集:一个副本集就是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 主节点(master):主节点接收所有写入操作.主节点将对其数据集所做的所有更改记录到其 oplog. 副节点(secondary):复制主节点的 oplog

  • .Net Core中使用MongoDB搭建集群与项目实战

    目录 安装MongoDB apt直接安装(方法1) apt仓库安装(方法2) 方法1.2启动MongoDB 通过二进制包安装(方法3) 安装依赖 deb安装MongoDB tgz安装MongoDB 启动MongoDB 卸载方法 apt卸载方法 tgz卸载方法 指定启动的配置 通过配置文件 通过参数 MongoDB绑定IP.端口 测试远程IP连接 加上密码验证 设置账号密码 开启登录验证 停止MongoDB 搭建集群 副本集 故障转移 方案 设计实例名称 如何创建集群 启动两个实例(配置) 副本集

  • 详解使用docker 1.12 搭建多主机docker swarm集群

    swarm是docker公司自己的容器集群管理工具,本文介绍了使用docker 1.12 搭建多主机docker swarm集群,分享给大家 准备 准备至少两台的centos 7 主机(全新最小安装, 可以使用虚拟机安装) 开放端口2377 tcp端口, 7946 4789 tcp udp 端口 本文使用192.168.99.101(hostname:centos-node4) 作为swarm manager 192.168.99.102(hostname:centos-node5) 作为sw

  • Docker+K8S 集群环境搭建及分布式应用部署

    1.安装docker yum install docker #启动服务 systemctl start docker.service systemctl enable docker.service #测试 docker version 2.安装etcd yum install etcd -y #启动etcd systemctl start etcd systemctl enable etcd #输入如下命令查看 etcd 健康状况 etcdctl -C http://localhost:2379

  • Docker搭建部署Node项目的方法步骤

    目录 什么是Docker 客户端Docker Docker基本操作 镜像名称 拉取镜像 其他操作 Dockerfile Docker-compose 构建nginx-node-postgres项目 前段时间做了个node全栈项目,服务端技术栈是 nginx + koa + postgresql.其中在centos上搭建环境和部署都挺费周折,部署测试服务器,接着上线的时候又部署生产环境服务器.这中间就有很多既无聊又费精力,吃力不讨好的"体力活".所以就开始思考怎么自动化这部分搭建部署的工

  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    介绍 Docker Swarm是用于部署Docker主机集群的Docker本地解决方案.您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群. 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcd或Consul)来进行服务发现.但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用. 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器

  • 利用Docker搭建Laravel开发环境的完整步骤

    前言 在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速.轻量级.不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器里),加入Vue只是因为有的项目里会在Laravel项目中使用Vue做前后端分离开发,开发环境中需要安装前端开发需要的工具集,当然前后端也可以分成两个项目开发,这个话题不在本篇文章的讨论范围内. 所以我们的目标是: 不在本地安装Mamp/Wamp这样的软件 不使用类似Vagrant这样的虚拟机

  • 玩转Redis搭建集群之Sentinel详解

    前言 Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失.我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务.但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的.为此,Redis官方提供了一种解决方案:Redis Sentinel 简介 Redis Sentinel集群通常由3到5个节点组成,如果

  • VMware ESXI服务器虚拟化搭建集群

    摘要 VMwarev Center Server 提供了一个可伸缩.可扩展的平台,为虚拟化管理奠定了基础.可集中管理VMware vSphere环境,与其他管理平台相比,极大地提高了 IT 管理员对虚拟环境的控制. VMware vCenter Server:提高在虚拟基础架构每个级别上的集中控制和可见性,通过主动管理发挥 vSphere 潜能,是一个具有广泛合作伙伴体系支持的可伸缩.可扩展平台. 无论您拥有十几个虚拟机,还是几千个虚拟机,VMware vCenter Server 都是管理 V

  • .Net Core服务治理Consul搭建集群

    延续上一篇的话题继续,顺便放上一篇的传送门:点这里. 集群的必要性 consul本身就是管理集群的,现在还需要给consul搞个集群,这是为啥?因为consul单点也容易挂啊!万一管理集群的consul挂掉了,那么相当于上下游应用都变成了瞎子,看不到也调不到.所以集群的必要性不用我说了吧? Server & Client 生产环境下,可以选择上面两种模式,下面我就简称S端.C端.说说它俩有啥不一样: S端: 1.数量不宜过多,一般推荐3.5个,要求是奇数. 2.持久化保存节点数据. 3.多个S端

随机推荐