NoSQL数据库:MongoDB初探
跟着时下炒得火热的NOSQL潮流,学习了一下mongodb,记录在此,希望与感兴趣的同学一起研究! MongoDB概述 mongodb由C++写就,其名字来自hu mongo us这个单词的中间部分,是由10gen开发并维护的,关于它的一个最简洁描述为:scalable, high-performance, ope
跟着时下炒得火热的NOSQL潮流,学习了一下mongodb,记录在此,希望与感兴趣的同学一起研究!
MongoDB概述
mongodb由C++写就,其名字来自humongous这个单词的中间部分,是由10gen开发并维护的,关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
MongoDB特性:
l 面向文档存储
l 全索引支持,扩展到内部对象和内嵌数组
l 复制和高可用
l 自动分片支持云级扩展性
l 查询记录分析
l 动态查询
l 快速,就地更新
l 支持Map/Reduce操作
l GridFS文件系统
l 商业支持,培训和咨询
官网: http://www.mongodb.org/
配置
Master-slaves 模式
机器 | IP | 角色 |
test001 | 192.168.1.1 | master |
test002 | 192.168.1.2 | slave |
test003 | 192.168.1.3 | slave |
test004 | 192.168.1.4 | slave |
test005 | 192.168.1.5 | slave |
test006 | 192.168.1.6 | slave |
启动master:
1 |
|
添加repl用户:
1 2 3 |
|
启动slaves:
1 2 |
|
添加repl用户:
1 2 3 |
|
autoresync 参数会在系统发生意外情况造成主从数据不同步时,自动启动复制操作 (同步复制 10 分钟内仅执行一次)。除此之外,还可以用 –slavedelay 设定更新频率(秒)。
通常我们会使用主从方案实现读写分离,但需要设置 Slave_OK。
slaveOk
When querying a replica pair or replica set, drivers route their requests to the master mongod by default; to perform a query against an (arbitrarily-selected) slave, the query can be run with the slaveOk option. Here’s how to do so in the shell:
db.getMongo().setSlaveOk(); // enable querying a slave db.users.find(...)
Note: some language drivers permit specifying the slaveOk option on each find(), others make this a connection-wide setting. See your language’s driver for details.
Replica Set模式
Replica Sets 使用 n 个 Mongod 节点,构建具备自动容错转移(auto-failover)、自动恢复(auto-recovery) 的高可用方案。
机器 | IP | 角色 |
test001 | 192.168.1.1 | secondary |
test002 | 192.168.1.2 | secondary |
test003 | 192.168.1.3 | primary |
test004 | 192.168.1.4 | secondary |
test005 | 192.168.1.5 | secondary |
test006 | 192.168.1.6 | secondary |
test007 | 192.168.1.7 | secondary |
启动:
1 |
|
添加repl用户:
1 2 3 |
|
配置:
1 2 3 4 5 6 7 8 9 10 |
|
查看:
访问 http://test001 :28017/_replSet
或者
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
在Replica Sets上做操作后调用getlasterror使写操作同步到至少3台机器后才返回
db.runCommand( { getlasterror : 1 , w : 3 } )
注:该模式不支持auth功能,需要auth功能请选择m-s模式
Sharding模式
要构建一个 MongoDB Sharding Cluster,需要三种角色:
- Shard Server: mongod 实例,用于存储实际的数据块。
- Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
- Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一进程数据库。
机器 | IP | 角色 |
test002 | 192.168.1.2 | mongod shard11:27017 |
test003 | 192.168.1.3 | mongod shard21:27017 |
test004 | 192.168.1.4 | mongod shard31:27017 |
test005 | 192.168.1.5 | mongod config1:20000 mongs1:30000 |
test006 | 192.168.1.6 | mongod config2:20000 mongs2:30000 |
test007 | 192.168.1.7 | mongod config3:20000 mongs3:30000 |
test008 | 192.168.1.8 | mongod shard12:27017 |
test009 | 192.168.1.9 | mongod shard22:27017 |
test010 | 192.168.1.10 | mongod shard32:27017 |
Shard配置
Shard1
[test002; test008]
test002:
1 |
|
test008:
1 |
|
初始化shard1
1 2 3 4 5 |
|
Shard2
[test003; test009]
test003:
1 |
|
test009:
1 |
|
初始化shard2
1 2 3 4 5 |
|
Shard3
[test004; test010]
test004:
1 |
|
test010:
1 |
|
初始化shard3
1 2 3 4 5 |
|
config server配置
[test005; test006; test007]
1 |
|
Mongos配置
[test005; test006; test007]
1 |
|
Route 转发请求到实际的目标服务进程,并将多个结果合并回传给客户端。Route 本身并不存储任何数据和状态,仅在启动时从 Config Server 获取信息。Config Server 上的任何变动都会传递给所有的 Route Process。
Configuring the Shard Cluster
1. 连接admin数据库
1 |
|
2. 加入shards
1 2 3 |
|
3. Listing shards
1 |
|
如果列出了以上3个shards,表示shards已经配置成功
4. 激活数据库和表分片
1 2 |
|
使用
shell操作数据库
超级用户相关:
1) 进入数据库admin
1 |
|
2) 增加或修改用户密码
1 |
|
3) 查看用户列表
1 |
|
4) 用户认证
1 |
|
5) 删除用户
1 |
|
6) 查看所有用户
1 |
|
7) 查看所有数据库
1 |
|
8) 查看所有的collection
1 |
|
9) 查看各collection的状态
1 |
|
10) 查看主从复制状态
1 |
|
11) 修复数据库
1 |
|
12) 设置记录profiling,0=off 1=slow 2=all
1 |
|
13) 查看profiling
1 |
|
14) 拷贝数据库
1 |
|
15) 删除collection
1 |
|
16) 删除当前的数据库
1 |
|
增加删除修改:
1) Insert
1 2 3 |
|
嵌套对象:
1 |
|
数组对象:
1 |
|
2) delete
删除name=’dump’的用户信息:
1 |
|
删除foo表所有信息:
1 |
|
3) update
//update foo set xx=4 where yy=6
//如果不存在则插入,允许修改多条记录
1 |
|
查询:
1 2 3 4 5 6 7 8 |
|
其他:
1 2 3 4 5 |
|
索引:
1(ascending),-1(descending)
1 2 3 4 5 6 7 |
|
MongoDB Drivers
C
C#
C++
Haskell
Java
Javascript
Perl
PHP
Python
Ruby
Scala (via Casbah)
Mongodb支持的client 编程api非常多,由于dump中心是建立在hadoop的基础上的,所以着重介绍java api,后面的测试程序采用的也是java api.
MongoDB in Java
下载MongoDB的Java驱动,把jar包(mongo-2.3.jar)扔到项目里去就行了,
Java中,Mongo对象是线程安全的,一个应用中应该只使用一个Mongo对象。Mongo对象会自动维护一个连接池,默认连接数为10。
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 |
|
MongoDB 测试
测试版本: 1.6.3
采用单线程分别插入100万,300万,500万,1000万数据和多个线程,每线程插入100万数据.
插入数据格式:
1 |
|
1) Master slaves模式
Insert
Per-thread rows | run time | Per-thread insert | Total-insert | Total rows | threads |
1000000 | 20 | 50000 | 50000 | 1000000 | 1 |
3000000 | 60 | 50000 | 50000 | 3000000 | 1 |
5000000 | 99 | 50505 | 50505 | 5000000 | 1 |
8000000 | 159 | 50314 | 50314 | 8000000 | 1 |
10000000 | 208 | 48076 | 48076 | 10000000 | 1 |
1000000 | 64 | 15625 | 31250 | 2000000 | 2 |
Mongodb只有主节点才能进行插入和更新操作.
Update
数据格式:
1 |
|
Per-thread rows | run time | Per-thread update | Total-update | Total rows | threads |
1000000 | 96 | 10416 | 10416 | 1000000 | 1 |
3000000 | 287 | 10452 | 10452 | 3000000 | 1 |
1000000 | 188 | 5319 | 15957 | 3000000 | 3 |
1000000 | 351 | 2849 | 14245 | 5000000 | 5 |
Select
以”_id”字段为key,返回整条记录
a) 客户端:单机多线程
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 72 | 13888 | 13888 | 1000000 | 1 |
1000000 | 129 | 7751 | 77519 | 10000000 | 10 |
1000000 | 554 | 1805 | 90252 | 50000000 | 50 |
1000000 | 1121 | 892 | 89206 | 100000000 | 100 |
1000000 | 2256 | 443 | 88652 | 200000000 | 200 |
b) 客户端:分布式多线程
程序部署在39台机器上
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 173 | 5780 | 5780*39=223470 | 1000000*39 | 1 |
1000000 | 1402 | 713 | 7132*39=278148 | 10000000*39 | 10 |
500000 | 1406 | 355 | 7112*39=277368 | 10000000*39 | 20 |
200000 | 1433 | 139 | 6978*39=272142 | 10000000*39 | 50 |
2) Replica Set 模式
Insert
Per-thread rows | run time | Per-thread insert | Total-insert | Total rows | threads |
1000000 | 40 | 25000 | 25000 | 1000000 | 1 |
3000000 | 117 | 25641 | 25641 | 3000000 | 1 |
5000000 | 211 | 23696 | 23696 | 5000000 | 1 |
8000000 | 289 | 27681 | 27681 | 8000000 | 1 |
10000000 | 388 | 25773 | 25773 | 10000000 | 1 |
1000000 | 83 | 12048 | 24096 | 2000000 | 2 |
1000000 | 210 | 4762 | 23809 | 5000000 | 5 |
Update
Per-thread rows | run time | Per-thread update | Total-update | Total rows | threads |
1000000 | 28 | 35714 | 35714 | 1000000 | 1 |
3000000 | 83 | 36144 | 36144 | 3000000 | 1 |
1000000 | 146 | 6849 | 20547 | 3000000 | 3 |
1000000 | 262 | 3816 | 19083 | 5000000 | 5 |
Select
以”_id”字段为key,返回整条记录
a) 客户端:单机多线程
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 198 | 5050 | 5050 | 1000000 | 1 |
1000000 | 264 | 3787 | 37878 | 10000000 | 10 |
1000000 | 436 | 2293 | 114678 | 50000000 | 50 |
1000000 | 754 | 1326 | 132625 | 100000000 | 100 |
1000000 | 1526 | 655 | 131061 | 200000000 | 200 |
b) 客户端:分布式多线程
程序部署在39台机器上
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 216 | 4629 | 4629*39=180531 | 1000000*39 | 1 |
1000000 | 1375 | 729 | 7293*39=284427 | 10000000*39 | 10 |
500000 | 1469 | 340 | 6807*39=265473 | 10000000*39 | 20 |
200000 | 1561 | 128 | 6406*39=249834 | 10000000*39 | 50 |
3) Sharding 模式
Insert
Per-thread rows | run time | Per-thread insert | Total-insert | Total rows | threads |
1000000 | 58 | 17241 | 17241 | 1000000 | 1 |
3000000 | 180 | 16666 | 16666 | 3000000 | 1 |
5000000 | 373 | 13404 | 13404 | 5000000 | 1 |
2000000 | 234 | 8547 | 17094 | 4000000 | 2 |
2000000 | 447 | 4474 | 22371 | 10000000 | 5 |
Update
Per-thread rows | run time | Per-thread update | Total-update | Total rows | threads |
1000000 | 38 | 26315 | 26315 | 1000000 | 1 |
3000000 | 115 | 26086 | 26086 | 3000000 | 1 |
1000000 | 64 | 15625 | 46875 | 3000000 | 3 |
1000000 | 93 | 10752 | 53763 | 5000000 | 5 |
Select
以”_id”字段为key,返回整条记录
a) 客户端:单机多线程
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 277 | 3610 | 3610 | 1000000 | 1 |
1000000 | 456 | 2192 | 21929 | 10000000 | 10 |
1000000 | 1158 | 863 | 43177 | 50000000 | 50 |
1000000 | 2299 | 434 | 43497 | 100000000 | 100 |
b) 客户端:分布式多线程
程序部署在39台机器上
Per-thread rows | run time | Per-thread select | Total-select | Total rows | threads |
1000000 | 659 | 1517 | 1517*39= 59163 | 1000000*39 | 1 |
1000000 | 8540 | 117 | 1170*39=45630 | 10000000*39 | 10 |
小结:
Mongodb在M-S和Repl-Set模式下查询效率还是不错的,区别在于Repl-Set模式如果有primary节点挂掉,系统自己会选举出另一个primary节点,不会影响后续的使用,原来的主节点恢复后自动成为secondary节点,而M-S模式一旦master 节点挂掉需要手工将别的slaves 节点修改成master,另外Repl-Set模式最多只能有7个节点.
由于sharding模式查询速度下降明显,耗时太长,所以只测试了2轮,估计他的威力应该在数据量非常大的环境下才能体现出来吧,以上数据仅供参考,现在只是简单的进行了测试,接下来会对源码进行一下研究,欢迎和感兴趣的同学多多交流!
?

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

전자 상거래 웹 사이트를 개발할 때 어려운 문제가 발생했습니다. 사용자에게 개인화 된 제품 권장 사항을 제공하는 방법. 처음에는 간단한 권장 알고리즘을 시도했지만 결과는 이상적이지 않았으며 사용자 만족도에도 영향을 미쳤습니다. 추천 시스템의 정확성과 효율성을 향상시키기 위해보다 전문적인 솔루션을 채택하기로 결정했습니다. 마지막으로 Composer를 통해 Andres-Montanez/Residations-Bundle을 설치하여 문제를 해결했을뿐만 아니라 추천 시스템의 성능을 크게 향상 시켰습니다. 다음 주소를 통해 작곡가를 배울 수 있습니다.

Oracle은 데이터베이스 회사 일뿐 만 아니라 클라우드 컴퓨팅 및 ERP 시스템의 리더이기도합니다. 1. Oracle은 데이터베이스에서 클라우드 서비스 및 ERP 시스템에 이르기까지 포괄적 인 솔루션을 제공합니다. 2. OracleCloud는 AWS와 Azure에 도전하여 IAA, PAAS 및 SAAS 서비스를 제공합니다. 3. E-BusinessSuite 및 FusionApplications와 같은 Oracle의 ERP 시스템은 기업이 운영을 최적화하는 데 도움이됩니다.

MySQL은 웹 응용 프로그램 및 컨텐츠 관리 시스템에 적합하며 오픈 소스, 고성능 및 사용 편의성에 인기가 있습니다. 1) PostgreSQL과 비교하여 MySQL은 간단한 쿼리 및 높은 동시 읽기 작업에서 더 잘 수행합니다. 2) Oracle과 비교할 때 MySQL은 오픈 소스와 저렴한 비용으로 인해 중소 기업에서 더 인기가 있습니다. 3) Microsoft SQL Server와 비교하여 MySQL은 크로스 플랫폼 응용 프로그램에 더 적합합니다. 4) MongoDB와 달리 MySQL은 구조화 된 데이터 및 트랜잭션 처리에 더 적합합니다.

CentOS 시스템 하에서 MongoDB 효율적인 백업 전략에 대한 자세한 설명이 기사는 CentOS 시스템에서 MongoDB 백업을 구현하기위한 다양한 전략을 자세히 소개하여 데이터 보안 및 비즈니스 연속성을 보장 할 것입니다. Docker 컨테이너 환경에서 수동 백업, 시간이 정해진 백업, 자동 스크립트 백업 및 백업 메소드를 다루고 백업 파일 관리를위한 모범 사례를 제공합니다. 수동 백업 : MongoDump 명령을 사용하여 Manual 전체 백업을 수행하십시오 (예 : Mongodump-HlocalHost : 27017-U username-P password-d 데이터베이스 이름 -o/백업 디렉토리이 명령은 지정된 데이터베이스의 데이터 및 메타 데이터를 지정된 백업 디렉토리로 내보내게됩니다.

MySQL은 테이블 구조 및 SQL 쿼리를 통해 구조화 된 데이터를 효율적으로 관리하고 외래 키를 통해 테이블 간 관계를 구현합니다. 1. 테이블을 만들 때 데이터 형식을 정의하고 입력하십시오. 2. 외래 키를 사용하여 테이블 간의 관계를 설정하십시오. 3. 인덱싱 및 쿼리 최적화를 통해 성능을 향상시킵니다. 4. 데이터 보안 및 성능 최적화를 보장하기 위해 데이터베이스를 정기적으로 백업 및 모니터링합니다.

데비안 시스템에서 MongoDB 데이터베이스를 암호화하려면 다음 단계에 따라 필요합니다. 1 단계 : 먼저 MongoDB 설치 먼저 Debian 시스템이 MongoDB가 설치되어 있는지 확인하십시오. 그렇지 않은 경우 설치를위한 공식 MongoDB 문서를 참조하십시오 : https://docs.mongodb.com/manual/tutorial/install-mongodb-ondodb-on-debian/step 2 : 암호화 키 파일 생성 암호화 키를 포함하는 파일을 만듭니다.

CentOS 시스템의 GitLab 데이터베이스 배포 안내서 올바른 데이터베이스를 선택하는 것은 GitLab을 성공적으로 배포하는 데 중요한 단계입니다. Gitlab은 MySQL, PostgreSQL 및 MongoDB를 포함한 다양한 데이터베이스와 호환됩니다. 이 기사는 이러한 데이터베이스를 선택하고 구성하는 방법을 자세히 설명합니다. 데이터베이스 선택 권장 사항 MySQL : 널리 사용되는 RDBMS (Relational Database Management System). PostgreSQL : 강력한 오픈 소스 RDBM은 복잡한 쿼리 및 고급 기능을 지원하며 대형 데이터 세트를 처리하는 데 적합합니다. MongoDB : 인기있는 NOSQL 데이터베이스, 바다 취급에 능숙합니다

MySQL의 실제 응용 프로그램에는 기본 데이터베이스 설계 및 복잡한 쿼리 최적화가 포함됩니다. 1) 기본 사용 : 사용자 정보 삽입, 쿼리, 업데이트 및 삭제와 같은 사용자 데이터를 저장하고 관리하는 데 사용됩니다. 2) 고급 사용 : 전자 상거래 플랫폼의 주문 및 재고 관리와 같은 복잡한 비즈니스 로직을 처리합니다. 3) 성능 최적화 : 인덱스, 파티션 테이블 및 쿼리 캐시를 사용하여 합리적으로 성능을 향상시킵니다.
