我在云服务器上尝试了搭建MongoDB集群
首先
在本地环境中,搭建系统需要完成服务器采购、物理工作和操作系统安装等步骤才能进行,但在云环境中,只需点击按钮即可在短时间内准备好从网络到服务器的一切。而且,在最近的”基础设施即代码”中,甚至不需要点击按钮。通过编写配置文件,服务器和网络配置可以自动进行规划,只需执行命令即可完成基础设施的搭建。
对我个人来说,我发现这很有趣,所以我想尝试用代码来构建MongoDB集群。正好@mosuke5的terraform存储库有一个示例,所以我参考了这个示例。
构成
在MongoDB的复制配置中,至少需要3个副本。为了确保可用性,每个副本都需要连接到不同的交换机上。因此,在Alibaba云上,我们将创建如下图所示的组件。
组件
-
- 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” ,可以创建出图中所示的配置。
复制品设置
在执行 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,可以自动化云服务器的购买和配置等工作。