我在云服务器上尝试了搭建MongoDB集群

首先

在本地环境中,搭建系统需要完成服务器采购、物理工作和操作系统安装等步骤才能进行,但在云环境中,只需点击按钮即可在短时间内准备好从网络到服务器的一切。而且,在最近的”基础设施即代码”中,甚至不需要点击按钮。通过编写配置文件,服务器和网络配置可以自动进行规划,只需执行命令即可完成基础设施的搭建。

对我个人来说,我发现这很有趣,所以我想尝试用代码来构建MongoDB集群。正好@mosuke5的terraform存储库有一个示例,所以我参考了这个示例。

构成

image.png

在MongoDB的复制配置中,至少需要3个副本。为了确保可用性,每个副本都需要连接到不同的交换机上。因此,在Alibaba云上,我们将创建如下图所示的组件。

architecture_mongo_cluster.png

组件

    • VPCネットワーク。CIDR: 10.0.0.0/16

 

    • それぞれのレプリカのプライベートネットワーク

10.0.0.0/19: プライマリレプリカ
10.0.32.0/19: セカンダリレプリカ
10.0.64.0/19: セカンダリレプリカ

mongoクラスタ用のECSインスタンス

テストのため、1CPU-1GBメモリを使います

mongoクラスタのECSはグローバルIPを持つと外からデータストアへアクセスができてしまうため、プライベートIPしか付与しません。ソフトウェア更新やmongoインストールするために、それぞれのゾーンにSNATゲートウェイを構築します。SNATのECSがmongoクラスタへ影響しないように、別のサブネットワークにおきます。

パブリックCIDR: 10.0.128.0/20

建立

使用Terraform自动构建

根据设计的组件,使用阿里云提供商进行实施。

可以在mosuke5的代码库中参考详细的源代码,但提供者如下所示。


resource "alicloud_vpc" "vpc" {
  name = "mongovpc"
  cidr_block = "${var.vpc_cidr}"
}

# vswitchの作成。mongo-primary
resource "alicloud_vswitch" "mongo-primary-switch" {
  name              = "mongo-primary-switch"
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "${var.mongo_primary_cidr}"
  availability_zone = "${var.zones[0]}"
}

# vswitchの作成。mongo-secondary0
resource "alicloud_vswitch" "mongo-secondary0-switch" {
  name              = "mongo-secondary0-switch"
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "${var.mongo_secondary0_cidr}"
  availability_zone = "${var.zones[1]}"
}
...

通过运行上述程序 terraform apply –var-file=”terraform.tfvars” ,可以创建出图中所示的配置。

image.png
image.png

复制品设置

在执行 Terraform 之后,将会创建一个 MongoDB 集群(包括服务器和中间件)。集群的配置可以使用 Ansible 等工具自动化完成。然而,本次我们将选择手动操作。

首先,删除mongodb的bindIp配置,并设置复制集的名称,以便在所有接口上实现通信。然后,使用配置命令启动mongodb。将这些步骤分别在三台mongodb上执行。

[mongoadmin@mongo-primary ~]$ sudo vim /etc/mongodb.conf
net:
  port: 27017
#  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.

replication:
  replSetName: testrepl

# :wq
[mongoadmin@mongo-primary ~]$ sudo systemctl start mongod.service
[mongoadmin@mongo-primary ~]$ sudo systemctl status mongod.service
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-06-05 10:02:25 CST; 3s ago
     Docs: https://docs.mongodb.org/manual
  Process: 9504 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
  Process: 9502 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
  Process: 9501 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
 Main PID: 9509 (mongod)
   CGroup: /system.slice/mongod.service
           └─9509 /usr/bin/mongod --quiet -f /etc/mongod.conf run

Jun 05 10:02:25 mongo-primary systemd[1]: Starting High-performance, schema-free document-oriented database...
Jun 05 10:02:25 mongo-primary systemd[1]: Started High-performance, schema-free document-oriented database.
Jun 05 10:02:25 mongo-primary mongod[9506]: about to fork child process, waiting until server is ready for connections.
Jun 05 10:02:25 mongo-primary mongod[9506]: forked process: 9509

接下来,我们将在mongo shell中进行复制设置。

[mongoadmin@mongo-primary ~]$ mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
Welcome to the MongoDB shell.
...
>
> rs.initiate( {
...    _id : "testrepl",
...    members: [
...        { _id : 0, host : "10.0.26.159:27017" },
...        { _id : 1, host : "10.0.43.6:27017" },
...        { _id : 2, host : "10.0.91.206:27017" }
...    ]
... })
{ "ok" : 1 }
> rs.status()
..
{
            "_id" : 0,
            "name" : "10.0.26.159:27017",
            "health" : 1,
...
},
{
            "_id" : 1,
            "name" : "10.0.43.6:27017",
            "health" : 1,
...
},
{
            "_id" : 2,
            "name" : "10.0.91.206:27017",
            "health" : 1,
...
}

请确认每个”health”值为1。

在每个次级实例上设置该实例为从属实例。

testrepl:SECONDARY> db.getMongo().setSlaveOk()

确认动作

在Mongo主服务器上创建testCollection,并确认数据是否被复制到次要服务器。

testrepl:PRIMARY> db.testCollection.insertOne({what: "Test mongodb", status: "ok"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5934bf70cefc8e44e631908e")
}

我将在Secondary上查询testCollection。

testrepl:SECONDARY> db.testCollection.find()
{ "_id" : ObjectId("5934bf70cefc8e44e631908e"), "what" : "Test mongodb", "status" : "ok" }

最后

我使用Terraform创建了一个简单的Mongo集群。通过使用Terraform,可以自动化云服务器的购买和配置等工作。

广告
将在 10 秒后关闭
bannerAds