一、概述
1、MongoDB简介
- 文档或对象在许多编程语言中与本地的数据类型相对应;
- 文档或文档数组的嵌套能够减少开销巨大的Join操作;
- 动态的数据模式平滑支持数据的多样性
MongoDB的特点
- 高性能:通过支持数据模型嵌套减少数据库中的I/O,索引支持快速查询,可以从嵌套的文档和数组中提取Key;
- 丰富的查询接口:支持数据聚合、文本搜索和地理空间的查询;
- 高可用:MongoDB副本集replica set可以自动故障转移和数据冗余存储;
- 水平扩展:集群中数据分片Sharding分布,基于shard key可以创建数据分区zones,在负载均衡中,MongoDB可以从zone中直接读和直接写。
2、Replication集群
MongoDB的replica set为一组mongod守护进程用来管理相同数据集,Replica sets可以在生产环境中提供冗余存储和高可用。在多个的数据库服务器上的多副本在一定程度上避免了单点故障。此外,副本也可以提高读数据的能力,这主要通过读写分离来实现。不同数据中心上的数据副本也可以为分布式应用提升数据的本地性和可用性。
Replica set包含多个数据接受节点和可选的仲裁节点(arbiter ),在数据接受节点中有且只有一个主节点(primary node),同时具备多个次节点( secondary nodes)。
主节点接受所有的写操作,并通过自己的数据操作日志记录数据集的所有变化,客户端可以通过读次节点的数据集提高数据读性能。次节点同步拷贝主节点的操作日志,并将数据操作应用到自身的数据集中。如果主节点变的不可用,将从剩余的次节点中选举出新的主节点,
所有节点之间都具备心跳检测机制,从而能够及时检测主节点的宕机
可以选择一个节点作为仲裁节点,该节点不管理数据集,主要用来通过心跳检测和选举请求来管理副本集的quorum,如果数据节点数据较多时,增加一个仲裁节点arbiter 非常有必要,淡然这个节点不需要专门的高配硬件。
说明:我们这里的MongoDB的高可用集群副本集采用“一主两副”的配置,没有配置仲裁节点。
3、关于Ceilometer
Ceilmeter,维基百科解释为云层高度仪,通过激光或其他光源来测量云层高度,现在选为Openstack云的计量服务组件的名称,真的非常形象!
Ceilmeter通过收集CPU、网络、磁盘等计量数据,为openstack的计费提供支撑。因为需要大量的写操作,MongoDB成为数据库的首选。尽管具备其他后端数据库的驱动,但MongoDB仍被认为是功能完备的数据库。一个具备两个副本集的部署架构如下,
二、安装脚本
我们在三个控制节点上安装MongoDB,然后配置“一主两副”的replica sets,安装脚本如下
(1)安装MongoDB脚本:install-configure-mongodb.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh . ../0-set-config.sh ./style/print-split.sh "MongoDB Installation" mongo_replica_cfg=../conf/mongo_replica_setup.js ### 所有控制节点安装mongodb ./pssh-exe C "yum install -y mongodb-server mongodb" ./pssh-exe C "sed -i -e 's#.*bind_ip.*#bind_ip = 0.0.0.0#g' -e 's/.*replSet.*/replSet = ceilometer/g' -e 's/.*smallfiles.*/smallfiles = true/g' /etc/mongod.conf" ./pssh-exe C "systemctl start mongod && systemctl stop mongod" ### [controller01] 添加资源 pcs resource create mongod systemd:mongod op start timeout=300s --clone ### [controller01] 设置副本集,等待pcs启动所有节点上的mongod服务 . restart-pcs-cluster.sh mongo $mongo_replica_cfg ### [controller01] 确认副本集状态 #mongo rs.status() #mongo rs.conf() |
(2)mongo集群副本集JS配置脚本:conf/mongo_replica_setup.js
1 2 3 |
config = { _id:"ceilometer", members: [{ _id: 0, host: "controller01:27017" }, { _id: 1, host: "controller02:27017" } , { _id: 2, host: "controller03:27017" }]} rs.initiate(config) |
安装完成后,可以查看replica sets的状态:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# mongo ceilometer:SECONDARY> rs.status() { "set" : "ceilometer", "date" : ISODate("2017-06-16T12:20:43Z"), "myState" : 2, "syncingTo" : "controller02:27017", "members" : [ { "_id" : 0, "name" : "controller01:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 38998, "optime" : Timestamp(1497615396, 2), "optimeDate" : ISODate("2017-06-16T12:16:36Z"), "self" : true }, { "_id" : 1, "name" : "controller02:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 38998, "optime" : Timestamp(1497615396, 2), "optimeDate" : ISODate("2017-06-16T12:16:36Z"), "lastHeartbeat" : ISODate("2017-06-16T12:20:42Z"), "lastHeartbeatRecv" : ISODate("2017-06-16T12:20:41Z"), "pingMs" : 0, "electionTime" : Timestamp(1497576647, 1), "electionDate" : ISODate("2017-06-16T01:30:47Z") }, { "_id" : 2, "name" : "controller03:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 38998, "optime" : Timestamp(1497615396, 2), "optimeDate" : ISODate("2017-06-16T12:16:36Z"), "lastHeartbeat" : ISODate("2017-06-16T12:20:42Z"), "lastHeartbeatRecv" : ISODate("2017-06-16T12:20:42Z"), "pingMs" : 0, "syncingTo" : "controller02:27017" } ], "ok" : 1 } |
三、参考文档
https://docs.mongodb.com/manual/
四、源码
脚本源码:https://github.com/zjmeixinyanzhi/Openstack-HA-Install-Shells
五、系列文章
Openstack云平台脚本部署之Galera高可用集群配置(二)
Openstack云平台脚本部署之RabbitMQ高可用集群部署(三)
Openstack云平台脚本部署之Memcached配置(五)
Openstack云平台脚本部署之Keystone认证服务配置(六)
Openstack云平台脚本部署之Glance镜像服务配置(七)
Openstack云平台脚本部署之Nova计算服务配置(八)
Openstack云平台脚本部署之Neutron网络服务配置(九)
Openstack云平台脚本部署之Dashboard配置(十)
Openstack云平台脚本部署之Cinder块存储服务配置(十一)
Openstack云平台脚本部署之Ceilometer数据收集服务配置(十二)
Openstack云平台脚本部署之Aodh告警服务配置(十三)
code
more code
~~~~