mongo学习整理

时间:2023-12-20 09:12:50

mongo做为NOSQL家族中一员,被广泛使用以及应用到生产环境中,有其出色的性能。关系型数据库(RDBMS )在互联网中依然是不可替代的一部分,mongo基于NOSQL的特性,在程序中RDBMS不适用或性能不高,操作不便,以及缺陷的领域发挥重要的作用。

RDBMS基于ACID准则设计:

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

NOSQL基于BASE思想CAP定理设计:

(1)Basically Available:基本可用;

(2)Soft-state:软状态/柔性事务,即状态可以有一段时间的不同步;

(3)Eventual consistency:最终一致性;

CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼

mongo不支持事物操作,需要事物情况需要程序模拟或者用RDBMS型数据库替代。

mongo支持单document基本操作的原子性。批量操作是非原子性的。

mongo基本操作查阅help。

下面讲一下mongo的主从、集群

mongo有master-slave模式 replica-set模式 share分片模式

官网推荐用replica-set模式代替master-slave模式;

1 mongo master-slave模式

  主从模式:一个主服务,1-N个从服务 主服务有读写的权限,从服务可依据情况配置做可读或只做数据冗余。该模式下不具备故障转移的功能,当主服务器故障时,从服务器不具备写的功能,服务功能部分失效。

主服务器配置

 fork=true
logpath=/var/log/mongodb.log
logappend=true
port=10000
journal=true
dbpath=/data/mongo/master
master=true

从服务器配置

 fork=true
logpath=/var/log/mongodb.log
logappend=true
port=10001
journal=true
dbpath=/data/mongo/slave
slave=true
source=127.0.0.1:10000

依次启动服务器即可实现主从配置。若从服务器不可读,可在从服务器执行db.setSlaveOk()

2 replica-set(副本集)模式:该模式由两个以上服务器+arbiter组成。该模式下,会从N个正常服务中选出1个作为主服务,其他为secondary服务器,arbiter仲裁在主服务器故障时辅助选出新的主服务器,实现故障转移。

服务器配置:

# 0
fork=true
logpath=/var/log/mongodb.log
logappend=true
port=10010
journal=true
dbpath=/data/mongo/replica/arbiter
# 1
replSet=rs0
fork=true
logpath=/var/log/mongodb.log
logappend=true
port=10011
journal=true
dbpath=/data/mongo/replica/1
replSet=rs0
# 2
fork=true
logpath=/var/log/mongodb.log
logappend=true
port=10012
journal=true
dbpath=/data/mongo/replica/2
replSet=rs0

配置了三个服务器 依次启动

var replicaSetConfig = {
_id: "rs0",
members: [
{ _id: 0,
host: 'localhost:10012',
},
{ _id: 1,
host: 'localhost:10011'
},
{ _id: 2,
host: 'localhost:10010',
arbiterOnly: true
}
]
}

rs.initiate(replicaSetConfig)配置副本集。

3 分片模式

其实分片是建立在其他模式上。

# config
fork=true
logpath=/var/log/mongodb.log
logappend=true
port=3000
journal=true
dbpath=/data/mongo/config
# share路由
fork=true
logpath=/var/log/mongodb.log
logappend=true
port=3001
configdb=localhost:3000

mongos -f share路由.conf

进入mongos配置分片

sh.addShard( "rs1/mongodb0.example.net:27017" )
sh.addShard( "mongodb0.example.net:27017" )
sh.enableSharding(dbname)
sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )
sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )
sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )
sh.shardCollection("events.alerts", { "_id": "hashed" } )


写的好乱!