• [技术干货] MongoDB内存过高问题分析及解决【转】
    告警公司有个3.2.7版本的mongo复制集,最近几天频繁告警内存过高。服务器配置16C+64G内存。mongo备节点内存使用到55G,触发告警。以下内容基于3.2.7版本,3.2.7版本已经太老,很多后来的命令和配置,3.2.7都没有。排查排查mongo配置主要是检查cacheSizeGB123wiredTiger:   engineConfig:        cacheSizeGB: 20MongoDB 3.2 及以后,默认使用 WiredTiger 存储引擎,可通过 cacheSizeGB 选项配置 WiredTiger 引擎使用内存的上限,一般建议配置在系统可用内存的一班左右。默认值是(RAM – 1GB) / 2。出发点是防止系统OOM kill。因为这里的配置只是wiredTiger的内存cache限额,并不是mongo的全部使用内存限额,整个mongo进程的内存占用要比这个值大,所以cacheSizeGB万万不可设置超过RAM的60%。我们这里配置到了20G。但是实际运行中发现,在并发查询很高的情况下,wt的cacheSize还是会超过这个配置一点点。查看mongo实例的内存使用情况1db.serverStatus().wiredTiger.cache返回结果中 bytes currently in the cache 后的值为缓存数据的大小123..."bytes currently in the cache" : 21483838298,...已经用满了,这种情况可以加一下内存了。但是内存太贵,业务也没有那么高的性能要求,保障不宕机是更有性价比的方案。既然cache只用了20G,看看tcmalloc的情况1db.serverStatus().tcmalloc12345678910111213141516171819------------------------------------------------MALLOC:    22351254936 (21315.8 MiB) Bytes in use by applicationMALLOC: +  24922800128 (23768.2 MiB) Bytes in page heap freelistMALLOC: +    449403872 (  428.6 MiB) Bytes in central cache freelistMALLOC: +       262144 (    0.2 MiB) Bytes in transfer cache freelistMALLOC: +    841870984 (  802.9 MiB) Bytes in thread cache freelistsMALLOC: +    109572256 (  104.5 MiB) Bytes in malloc metadataMALLOC:   ------------MALLOC: =  48675164320 (46420.3 MiB) Actual memory used (physical + swap)MALLOC: +   8663441408 ( 8262.1 MiB) Bytes released to OS (aka unmapped)MALLOC:   ------------MALLOC: =  57338605728 (54682.4 MiB) Virtual address space usedMALLOC:MALLOC:         378600              Spans in useMALLOC:           1451              Thread heaps in useMALLOC:           8192              Tcmalloc page size------------------------------------------------Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).Bytes released to the OS take up virtual address space but no physical memory.可以看到page heap freelist占了大头。解释一下,57338605728 (54682.4 MiB) Virtual address space used 是mongo总的使用的虚拟内存。48675164320 (46420.3 MiB) Actual memory used (physical + swap)是mongo总的使用的实际内存。(我没有开swap)实际内存又分成两部分,freelist中的和非freelist的。freelist的就是已经分配后来又用完释放的内存,存在这个freelist数据结构中,已备后面重用这些内存,我的理解就是我用完了,但是我先拿着。这样后面的业务来了,mongo就不需要再向os申请分配内存这一步了,从性能和效率的维度来看更好。但是缺点是内存一直没有还给os,导致os角度来看,内存的使用率很高。tcmalloc 为性能考虑,每个线程会有自己的 local free page cache,还有 central free page cache;内存申请时,按 local thread free page cache ==> central free page cache 查找可用内存,找不到可用内存时才会从堆上申请;当释放内存时,也会归还到 cache 里,tcmalloc 后台慢慢再归还给 OS操作系统, 多数情况下,内存使用率高的原因是 tcmalloc 未能及时将内存归还给操作系统,导致内存最大可能达到几十GB。mongo为了提高性能,倾向于利用os上尽可能多的内存。解决所以可以将freelist的内存及时释放给os,可以解决内存水位过高的问题。1db.adminCommand({setParameter:1,tcmallocAggressiveMemoryDecommit:1})tcmallocAggressiveMemoryDecommit 是一个服务器参数,用于控制 TCMalloc 内存分配器在什么程度上积极地将不再使用的内存释放回操作系统。当设置为 1(开启状态)时,tcmallocAggressiveMemoryDecommit 会使 TCMalloc 更积极地释放不再使用的内存。这意味着当应用程序释放内存后,TCMalloc 会尝试将这部分内存标记为空闲并返回给操作系统,而不是保留在进程的地址空间中以便快速重用。
  • [技术干货] Mongodb 的基本用法
    什么是MongodbMongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成,类似于JSON对象。MongoDB文档支持动态查询,可以通过网络访问,且支持丰富的数据表达和索引。Mongodb与传统数据库的区别MongoDB与传统数据库的区别主要体现在以下几个方面:数据存储方式:MongoDB是一种文档数据库,以文档为单位存储数据,文档类型为BSON(二进制JSON)。而传统关系型数据库(如MySQL、SQL Server、Oracle等)则以结构化数据为主,数据存储在表格中,每一行必须符合表结构。数据结构:MongoDB的数据结构非常松散,可以存储比较复杂的数据类型,且同一个表下可以存储不同结构的对象。而传统关系型数据库的数据结构则较为固定,列的个数和类型都需要预先定义。扩展性:MongoDB是一个分布式数据库,支持水平扩展,可以方便地添加更多的服务器来扩展性能和存储容量。而传统关系型数据库则需要通过升级硬件或增加分库分表等方式进行扩展。查询语言:MongoDB使用基于文档的查询语言,语法较为灵活,可以通过JavaScript进行操作。而传统关系型数据库则使用SQL作为查询语言。事务处理:MongoDB支持ACID事务,但并非所有操作都需要事务处理,可以根据应用需求进行选择。而传统关系型数据库则通过ACID事务来保证数据的完整性和一致性。数据一致性:MongoDB的默认一致性级别是最终一致性,但也可以根据需求进行调整。而传统关系型数据库则通常通过强一致性来保证数据的一致性。应用场景:MongoDB适用于Web应用、实时数据处理、大数据分析等场景,可以方便地存储和处理非结构化数据。而传统关系型数据库则更适用于结构化数据处理、事务处理、复杂查询等场景。Python 操作MongodbPython操作MongoDB需要使用PyMongo库。PyMongo是一个Python编写的MongoDB驱动程序,用于连接MongoDB数据库,执行CRUD(创建、读取、更新和删除)操作以及执行其他数据库管理任务。以下是一个简单的Python代码示例,演示如何使用PyMongo库操作MongoDB:首先,确保已经安装了PyMongo库。你可以使用以下命令使用pip安装:pip install pymongo安装完成后,你可以使用以下代码连接到MongoDB数据库,并执行一些基本操作:from pymongo import MongoClient # 连接到MongoDB服务器 client = MongoClient('localhost', 27017) # 选择数据库 db = client['mydatabase'] # 选择集合(表) collection = db['customers'] # 插入文档(记录) customer = { "name": "John Doe", "address": { "street": "123 Main St", "city": "Anytown", "state": "NY", "zip": "12345" }, "phone": "555-555-5555" } result = collection.insert_one(customer) print("Inserted document with ID:", result.inserted_id) # 查询文档 query = { "name": "John Doe" } cursor = collection.find(query) for document in cursor: print(document) # 更新文档 query = { "name": "John Doe" } new_values = { "$set": { "address.city": "Newtown" } } result = collection.update_one(query, new_values) print("Updated", result.modified_count, "document") # 删除文档 query = { "name": "John Doe" } result = collection.delete_one(query) print("Deleted", result.deleted_count, "document")在上面的示例中,我们首先使用MongoClient类连接到MongoDB服务器。然后,我们选择要使用的数据库和集合(类似于表)。接下来,我们演示了插入、查询、更新和删除文档的基本操作。每个操作都使用相应的PyMongo方法执行,并通过打印相关结果来验证操作是否成功。Java 操作MongodbJava操作MongoDB需要使用MongoDB的Java驱动程序。MongoDB提供了官方的Java驱动程序,称为MongoDB Java Driver,它提供了与MongoDB数据库进行交互的Java API。以下是一个简单的Java代码示例,演示如何使用MongoDB Java Driver连接MongoDB数据库并执行基本操作:首先,确保已将MongoDB Java Driver添加到Java项目的类路径中。你可以通过Maven或Gradle等构建工具来添加依赖项。Maven依赖项示例:<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.2.3</version> <!-- 请使用最新版本 --> </dependency>然后,你可以使用以下代码连接到MongoDB数据库并执行操作:import com.mongodb.MongoClient; import com.mongodb.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Updates; import org.bson.Document; public class MongoDBExample { public static void main(String[] args) { // 连接到MongoDB服务器 MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017"); // 选择数据库 MongoDatabase database = mongoClient.getDatabase("mydatabase"); // 选择集合(表) MongoCollection<Document> collection = database.getCollection("customers"); // 插入文档(记录) Document customer = new Document() .append("name", "John Doe") .append("address", new Document() .append("street", "123 Main St") .append("city", "Anytown") .append("state", "NY") .append("zip", "12345")) .append("phone", "555-555-5555"); collection.insertOne(customer); System.out.println("Inserted document with ID: " + customer.getObjectId("_id")); // 查询文档 Document query = new Document("name", "John Doe"); for (Document document : collection.find(query)) { System.out.println(document.toJson()); } // 更新文档 Document updateQuery = new Document("name", "John Doe"); Document newValues = new Document("$set", new Document("address.city", "Newtown")); collection.updateOne(updateQuery, newValues); System.out.println("Updated document"); // 删除文档 collection.deleteOne(updateQuery); System.out.println("Deleted document"); // 关闭连接 mongoClient.close(); } }在上面的示例中,我们首先使用MongoClients类创建一个MongoClient实例来连接到MongoDB服务器。然后,我们选择要使用的数据库和集合(类似于表)。接下来,我们演示了插入、查询、更新和删除文档的基本操作。每个操作都使用相应的MongoDB Java Driver方法执行,并通过打印相关结果来验证操作是否成功。最后,我们关闭与MongoDB的连接。
  • [技术干货] Mongodb原理解读
    Mongodb定义MongoDB 是一个基于分布式文件存储的 NoSQL 数据库,它的数据结构是类似文档的,而不是像传统的关系型数据库那样使用表格。MongoDB 的数据是存储在文档中的,这些文档类似于 JSON 对象,可以进行嵌套或链接。MongoDB 的主要特点面向文档的存储:MongoDB 的数据是存储在文档中的,每个文档可以包含多个键值对,这些键值对就是数据库中的字段和值。这种面向文档的存储方式使得 MongoDB 非常适合存储非结构化的数据,例如 JSON 数据、XML 数据等。动态查询:MongoDB 支持类似 JSON 的查询语言,可以使用该语言进行动态查询。这种查询语言非常灵活,可以轻松地构建复杂的查询条件,并且支持嵌套查询和链接查询。面向集合的存储:MongoDB 的数据是按照集合来存储的,每个集合可以包含多个文档。集合类似于关系型数据库中的表,但是集合并不要求文档具有相同的结构。分布式:MongoDB 是分布式的数据库,可以在多个服务器之间进行分片存储。这种分布式架构使得 MongoDB 可以轻松地扩展到大量数据和高并发访问的场景。高效性能:MongoDB 具有良好的性能,特别是在读取操作方面。这主要是因为 MongoDB 使用内存映射文件(mmap)来管理数据,将数据直接映射到内存中,从而提高了读取效率。灵活的数据模型:MongoDB 的数据模型非常灵活,可以轻松地添加或删除字段,而不会影响其他文档的操作。这使得 MongoDB 非常适合于快速迭代和灵活的业务需求。MongoDB 与传统数据库的区别MongoDB 和传统数据库的区别主要体现在以下三个方面:数据模型:传统数据库通常使用表格来存储数据,而 MongoDB 使用文档模型来存储数据。这种模型非常适合存储非结构化或半结构化的数据,如 JSON 数据、XML 数据等。查询语言:传统数据库使用 SQL 语言进行查询和操作,而 MongoDB 使用 JSON 语法进行查询和操作。这种查询语言非常灵活,可以嵌套字段、使用比较操作符、使用逻辑操作符等。性能和可扩展性:MongoDB 和传统数据库在性能和可扩展性方面也有所不同。MongoDB 通常用于处理大量的非结构化数据,例如文档、图像、视频、音频等,它可以快速访问并处理这些数据,而不需要将其分解为多个表格。此外,MongoDB 非常适合处理分布式数据,可以轻松扩展到多个节点,以处理大量的数据负载。而传统数据库通常在复杂的事务处理方面表现得更加优秀,例如多个操作的集合,以确保数据完整性和一致性。
  • [技术干货] 鲲鹏环境下MongDB客户端驱动安装过程参考
    1、安装mongdb-c-driver1.1 安装libbson库1.0.0版本参考:cid:link_41)安装环境依赖yum install git automake autoconf libtool gcc2)获取libbson库1.0.0版本源码wget cid:link_33)解压libbson库1.0.0版本源码tar zxvf 1.0.0.tar.gz4)进入libbson-1.0.0路径执行编译cd libbson-1.0.0/ ./autogen.sh make make install 1.2 安装libmongc驱动1)获取mongo-c-driver-1.13.1.tar.gz源码下载地址:cid:link_2wget cid:link_12)解压mongo-c-driver-1.13.1.tar.gz源码tar zxvf 1.13.1.tar.gz3)进入mongo-c-driver-1.13.1.tar.gz源码解压路径cd mongo-c-driver-1.13.1/4)创建编译路径mkdir cmake-build5)进入编译路径cd cmake-build/6)执行编译cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..make 7)执行编译安装make install2、安装libmongcxx 版本 1)获取mongo-cxx-driver-r3.4.0.tar.gz源码wget cid:link_02)解压mongo-cxx-driver-r3.4.0.tar.gztar zxzf r3.4.0.tar.gz 3)进入mongo-cxx-driver-r3.4.0.tar.gz解压路径cd mongo-cxx-driver-r3.4.0/build/4)执行编译cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON -DBSONCXX_POLY_USE_SYSTEM_MNMLSTC=0 -DCMAKE_PREFIX_PATH=/usr/local/lib/ -DCMAKE_INSTALL_PREFIX=/usr/local/【注】:其中,/usr/local/lib/是libmonc的驱动安装路径make -j 96 5)执行编译安装make install 注:上面的步骤均需执行;FAQ 【问题描述】安装libmongcxx 版本执行如下命令cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS_WITH_STATIC_MONGOC=ON -DBSONCXX_POLY_USE_SYSTEM_MNMLSTC=0 -DCMAKE_PREFIX_PATH=/usr/local/lib/ -DCMAKE_INSTALL_PREFIX=/usr/local/报如下错误:CMake Error at src/bsoncxx/CMakeLists.txt:81 (find_package): By not providing "Findlibbson-1.0.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "libbson-1.0", but CMake did not find one. Could not find a package configuration file provided by "libbson-1.0" (requested version 1.10.0) with any of the following names: libbson-1.0Config.cmake libbson-1.0-config.cmake Add the installation prefix of "libbson-1.0" to CMAKE_PREFIX_PATH or set "libbson-1.0_DIR" to a directory containing one of the above files.  If "libbson-1.0" provides a separate development package or SDK, be sure it has been installed.【问题原因】:因为mongo-c-driver没有安装;【解决方法】:安装libmongc驱动,获取源码执行cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF ..后,还需要执行make && make install 进行安装,然后再编译mongo-cxx-driver即可。
  • [技术干货] openEuler 20.03 LTS SP1系统编译安装MongoDB 4.4.0(aarch64)指导
    1 简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。官方链接: https://www.mongodb.com/类别:数据库语言:C++/JavaScript/Python/2 环境类别子项版本获取地址(方法)硬件CPUKunpeng920iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSopenEuler20.03 LTS SP1cat /etc/os-releaseKernel4.19.90cat /proc/version软件GCC9.3.1参考下面安装说明 gcc -vOpenJDK1.8.0_272参考下面安装说明MongoDB4.4.0参考下面安装说明3 系统依赖安装3.1 配置本地yum源挂载OS镜像:mount -o loop /home/openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /mnt/iso/执行mv /etc/yum.repos.d /etc/yum.repos.d.bak备份默认yum源,然后mkdir /etc/yum.repos.d/创建/etc/yum.repos.d/路径,执行vim /etc/yum.repos.d/local.repo文件,配置yum本地源:[local]name=localbaseurl= file:///mnt/isogpgcheck=0enabled=1运行下面的命令,使yum源配置生效:yum clean allyum makecache3.2 安装GCC等相关依赖yum安装GCC、Python3等相关依赖:sudo yum install -y snappy snappy-devel autoconf automake libtool git gcc* make cmake openssl openssl-devel zlib zlib-devel bzip2 bzip2-devel bzip2-libs readline readline-devel bison zip unzip tar tcl java-1.8.0* bison* ncurses* wget libyaml libyaml-devel python-setuptools libcurl-devel python-devel gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel libpcap-dev* python3*4 编译依赖安装4.1 安装Kunpeng gcc 9.3.1注:MongoDB 4.4.0编译依赖8.2.0及更新版本的gcc,需要先升级gcc版本到8.2.0或以上版本;1、下载Kunpeng gcc-9.3.1二进制包wget https://mirror.iscas.ac.cn/kunpeng/archive/compiler/kunpeng_gcc/gcc-9.3.1-2021.03-aarch64-linux.tar.gztar zxvf gcc-9.3.1-2021.03-aarch64-linux.tar.gz注:如果系统环境无法联网,则手动点击https://mirror.iscas.ac.cn/kunpeng/archive/compiler/kunpeng_gcc/gcc-9.3.1-2021.03-aarch64-linux.tar.gz下载gcc-9.3.1-2021.03-aarch64-linux.tar.gz后传到系统/home/路径下。2、进入解压目录cd gcc-9.3.1-2021.03-aarch64-linux/3、配置环境变量,在/etc/profile文件其末尾添加如下内容:export PATH=/home/gcc-9.3.1-2021.03-aarch64-linux/bin:$PATHexport INCLUDE=/home/gcc-9.3.1-2021.03-aarch64-linux/include:$INCLUDEexport LD_LIBRARY_PATH=/home/gcc-9.3.1-2021.03-aarch64-linux/lib64:$LD_LIBRARY_PATH【注】:执行source /etc/profile使环境变量生效;4、查看gcc版本gcc -v5、备份系统自带gcc版本的gcc、g++和c++mv /usr/bin/gcc /usr/bin/gcc.bakmv /usr/bin/g++ /usr/bin/g++.bakmv /usr/bin/c++ /usr/bin/c++.bak6、创建Kunpeng gcc的gcc、g++、c++、cc、cc1和libstdc++.so.6软链接ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/gcc /usr/bin/gccln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/g++ /usr/bin/g++ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/c++ /usr/bin/c++ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/bin/gcc /usr/bin/ccln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6ln -sf /home/gcc-9.3.1-2021.03-aarch64-linux/libexec/gcc/aarch64-linux-gnu/9.3.1/cc1 /usr/bin/cc14.2 编译安装cython1、进入/hom目录获取cython源码cd /home/git clone cid:link_4注:如果系统环境无法联网,则手动单击链接cid:link_4打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装cypthoncd /home/cythonpython3 setup.py install注:系统环境无法联网情况下,执行如下命令安装cypthonunzip cython-master.zipcd /home/cython-masterpython3 setup.py install4.3 编译安装pyyaml1、进入/hom目录获取pyyaml源码cd /home/git clone cid:link_5注:如果系统环境无法联网,则手动单击链接cid:link_5打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装pyyamlcd /home/pyyamlpython3 setup.py install注:系统环境无法联网情况下,执行如下命令安装pyyamlunzip pyyaml-master.zipcd /home/pyyaml-masterpython3 setup.py install4.4 编译安装typing 3.10.0.01、进入/hom目录获取typing 3.10.0.0源码cd /home/wget https://files.pythonhosted.org/packages/b0/1b/835d4431805939d2996f8772aca1d2313a57e8860fec0e48e8e7dfe3a477/typing-3.10.0.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/b0/1b/835d4431805939d2996f8772aca1d2313a57e8860fec0e48e8e7dfe3a477/typing-3.10.0.0.tar.gz载typing-3.10.0.0.tar.gz并上传到系统的/home/目录下。2、安装typing 3.10.0.0tar xf typing-3.10.0.0.tar.gzcd /home/typing-3.10.0.0python3 setup.py install4.5 编译安装cheetah31、进入/hom目录获取cheetah3源码cd /home/git clone cid:link_3注:如果系统环境无法联网,则手动单击链接cid:link_3打开网页,然后单击“Download ZIP”下载安装包,并上传到系统的/home/目录下。2、安装cheetah3cd /home/cheetah3python3 setup.py install注:系统环境无法联网情况下,执行如下命令安装cheetah3unzip cheetah3-master.zipcd /home/cheetah3-masterpython3 setup.py install4.6 编译安装psutil 5.8.01、进入/hom目录获取psutil 5.8.0源码cd /home/wget https://files.pythonhosted.org/packages/e1/b0/7276de53321c12981717490516b7e612364f2cb372ee8901bd4a66a000d7/psutil-5.8.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/e1/b0/7276de53321c12981717490516b7e612364f2cb372ee8901bd4a66a000d7/psutil-5.8.0.tar.gz下载psutil-5.8.0.tar.gz并上传到系统的/home/目录下。2、安装psutil 5.8.0tar xf psutil-5.8.0.tar.gzcd /home/psutil-5.8.0python3 setup.py install4.7 编译安装pymongo 4.0.11、进入/hom目录获取pymongo 4.0.1源码cd /home/wget https://files.pythonhosted.org/packages/3f/ff/7ec17064d403799d644f7db9c2e99202441849aebe771efe3199f3dd9076/pymongo-4.0.1.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/3f/ff/7ec17064d403799d644f7db9c2e99202441849aebe771efe3199f3dd9076/pymongo-4.0.1.tar.gz下载pymongo-4.0.1.tar.gz并上传到系统的/home/目录下。2、安装pymongo 4.0.1tar xf pymongo-4.0.1.tar.gzcd /home/pymongo-4.0.1python3 setup.py install4.8 编译安装pathlib 1.0.11、进入/hom目录获取pathlib 1.0.1源码cd /home/wget https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz下载pathlib-1.0.1.tar.gz并上传到系统的/home/目录下。2、安装pathlib 1.0.1tar xf pathlib-1.0.1.tar.gzcd /home/pathlib-1.0.1python3 setup.py install4.9 编译安装pathlib2 2.3.61、进入/hom目录获取pathlib2 2.3.6源码cd /home/wget https://files.pythonhosted.org/packages/df/16/e9d6bcf1aed52a55bc1696324ab22586716053b3e97b85266e0f3ad36bae/pathlib2-2.3.6.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/df/16/e9d6bcf1aed52a55bc1696324ab22586716053b3e97b85266e0f3ad36bae/pathlib2-2.3.6.tar.gz下载pathlib2-2.3.6.tar.gz并上传到系统的/home/目录下。2、安装pathlib2 2.3.6tar xf pathlib2-2.3.6.tar.gzcd /home/pathlib2-2.3.6python3 setup.py install4.10 编译安装scandir 1.10.01、进入/hom目录获取scandir 1.10.0源码cd /home/wget https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/df/f5/9c052db7bd54d0cbf1bc0bb6554362bba1012d03e5888950a4f5c5dadc4e/scandir-1.10.0.tar.gz下载scandir-1.10.0.tar.gz并上传到系统的/home/目录下。2、安装scandir 1.10.0tar xf scandir-1.10.0.tar.gzcd /home/scandir-1.10.0python3 setup.py install4.11 编译安装regex 2021.11.101、进入/hom目录获取regex 2021.11.10源码cd /home/wget https://files.pythonhosted.org/packages/97/cd/93ad08b2f97ec95da0bd860380ce0ac7481eaccc760356ee11eda369c048/regex-2021.11.10.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/97/cd/93ad08b2f97ec95da0bd860380ce0ac7481eaccc760356ee11eda369c048/regex-2021.11.10.tar.gz下载regex-2021.11.10.tar.gz并上传到系统的/home/目录下。2、安装regex 2021.11.10tar xf regex-2021.11.10.tar.gzcd /home/regex-2021.11.10python3 setup.py install4.12 编译安装Scons 4.3.01、进入/hom目录获取Scons 4.3.0源码cd /home/wget https://files.pythonhosted.org/packages/64/a1/9dc5c5e43b3d1b1832da34c8ae7b239a8f2847c33509fa0eb011fd8bc1ad/SCons-4.3.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://files.pythonhosted.org/packages/64/a1/9dc5c5e43b3d1b1832da34c8ae7b239a8f2847c33509fa0eb011fd8bc1ad/SCons-4.3.0.tar.gz下载SCons-4.3.0.tar.gz并上传到系统的/home/目录下。2、安装Scons 4.3.0tar xf SCons-4.3.0.tar.gzcd /home/SCons-4.3.0python3 setup.py install5 编译安装1、下载MongoDB 4.4.0源码wget cid:link_2 -O mongo-r4.4.0.tar.gztar xf mongo-r4.4.0.tar.gz注:如果系统环境无法联网,则手动点击cid:link_2下载mongo-r4.4.0.tar.gz后传到系统/home/路径下。2、进入解压目录cd mongo-r4.4.0/3、安装python依赖python3 -m pip install -r etc/pip/compile-requirements.txt4、创建MongoDB安装路径并执行编译(编译安装路径空间需要大于500G)mkdir -p /home/local/mongopython3 buildscripts/scons.py MONGO_VERSION=4.4.0 install-all CFLAGS="-march=armv8-a+crc -mtune=generic" -j64 DESTDIR=/home/local/mongo --disable-warnings-as-errors5、查看编译后路径cd /home/local/mongo/6、删除调试信息并查看编译后的二进制文件cd bin/strip mongosstrip mongodstrip mongo6 验证1、查看MongoDB版本/home/local/mongo/bin/mongod --version2、创建dbpath路径并启动MongoDB数据库mkdir -p /data/db./mongod &3、查看数据库进程是否正常启动ps -ef | grep mongod4、登录mongodb数据库并查看当前存在的数据库./mongoshow dbs5、退出数据库并查看dbpath文件exitls /data/db/7 参考信息1、https://www.cnblogs.com/hiyang/p/13560493.html2、cid:link_03、cid:link_18 FAQ1、执行./mongod启动MongoDB失败,报“/data/db not found”错误【详细描述】:执行./mongod启动MongoDB失败,报“/data/db not found”错误,具体报错如下:解答:执行mkdir -p /data/db命令创建dbpath路径,再次执行./mongod &启动MongoDB数据库。
  • [问题求助] Huawei Cloud EulerOS 2.0 等保2.0三级版 64位 怎么安装mongodb5
    请问:Huawei Cloud EulerOS 2.0 等保2.0三级版 64位 怎么安装mongodb5啊?弄了半天整不明白啊。用了linux 的安装方法也不行。
  • [问题求助] 【obs产品】【并行文件系统】mongodb的数据路径指向obsfs挂载的盘
    【功能模块】obs对象存储,并行文件系统【操作步骤&问题现象】1、将mongdb的数据路径放在并行文件系统中2、启动mongodb,日志的预加载文件写入速度每秒128K,有没有办法提速。我知道obs不适合数据库这类零碎文件存储,但想试试看。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 受到华尔街追捧,MongoDB热度直线上升
    6月7日(美国时间),MongoDB年度最大的活动MongoDB World 2022在纽约举行。会上,MongoDB发布了公司新愿景——成为开发者数据平台提供商,同时还发布了一系列新产品和功能,包括其旗舰数据库 MongoDB 6.0、增强的分析功能、Atlas数据湖服务以及可查询加密数据技术等。这些新功能将进一步优化开发人员的体验、简化发布流程、加速创新步伐。MongoDB World是MongoDB每年一度的市场活动,会议当天MongoDB股价飙升7.65%,领涨美股云计算板块,引来了更多人关注。实际上,近几个月来,MongoDB一直很受华尔街关注,热度直逼网红股Snowflake,包括摩根斯坦利、花旗银行等多家分析机构分析师给予MongoDB“增持”的评级。MongoDB公司于2007年在纽约成立,2017年10月在纳斯达克上市,是纳斯达克第一家上市的数据库公司。MongoDB从成立以来一直处于高速增长之中,市值从最初的12亿美元上涨到目前的200亿美元左右,一度突破300亿美元。与此同时,MongoDB已经成为文档数据库的事实标准,AWS、Azure等云平台商推出的文档数据库纷纷选择与其兼容,并专门为其提供API接口。“今天的MongoDB是世界上用于构建现代应用程序最受欢迎的数据库。”MongoDB首席执行官兼总裁 Dev Ittycheria 在大会主题演讲中表示。下面这些数字提供了很好的证明:截至目前MongoDB社区版下载量超过了2.65亿次,仅仅过去12个月的下载量就比MongoDB之前下载量的总和还要多(中国是下载量最大的地区),在全球100多个国家拥有3.5万家客户。此外,MongoDB云服务版Atlas进展顺利,已经在AWS、Google Cloud和 Azure的全球95个区域运行,MongoDB 还与世界各地的其他云提供商合作,其中包括中国的阿里云和腾讯云。 伴随着MongoDB产品功能的不断丰富,MongoDB不再把自己仅仅定位为文档型数据库,而是希望成为一个通用数据库,同时不断向更多应用场景扩张。尤为值得关注的是,MongoDB正在向传统数据库领域渗透,与Oracle等传统数据库巨头的竞争正在悄悄展开,这一场竞争结果或许将对数据库市场的未来演变带来重要影响。 01  提供现代而便捷的开发体验MongoDB是一个专门为“开发者(Developer)”打造的数据库,也正是这一出发点让MongoDB成为最受开发者认可的数据库之一。在DB-Engine排行榜上,MongoDB多年来一直和Oracle、MySQL、SQL Server、PostgreSQL一起成为最受关注的5个数据库产品。  “MongoDB致力于帮助开发人员提升效率,减少他们非必要的工作。这是公司从15年前成立就一直秉承的核心理念,也正是这一理念让MongoDB拥有世界上最忠实的开发者社区。” MongoDB首席技术官Mark Porter在接受记者采访时表示。 Dev Ittycheria在大会的主题演讲中也强调了类似观点,他说:“我们构建的每一个产品,我们开发的每一个功能都是为了提高开发人员的生产力。”如何让开发人员变得异常快速和高效?MongoDB选择以文档模型为突破口。该模型改变了传统数据库以表格来组织数据和与数据交互的方式,灵活而且可以很容易扩展。基于此模型,MongoDB构建了整个产品系列。 “未来几年,不计其数的全新应用程序将不断面世,这些应用程序可以提供令人惊艳的客户体验,满足企业转型的功能需求,通过更尖端的自动化水平提高运营效率等,这些都离不开一个高度可扩展、云原生、全球分布式的数据平台。”Dev Ittycheria表示,MongoDB的愿景是打造一个开发者数据平台,为开发者提供现代、便捷的使用体验,广泛支持各种用例,并满足最为严苛的性能和规模要求。 Dev Ittycheria援引 IDC的数据说,到2025年将有7.5亿个新的数字应用程序,而且未来4年构建的应用程序将比前40年构建的应用程序还多。 创新的步伐正在加快,意味着开发人员的生产力越来越重要。为了支持开发人员创新的需求,MongoDB致力于打造出一个高效的开发者数据平台,以帮助开发者更快速地开发应用,让企业迅速把握机遇,以更好地应对挑战。02 不仅仅是文档型数据库MongoDB属于文档型数据库,这也是人们对MongoDB的普遍认知。不过,MongoDB显然无意强化人们的这一认知,而是正好相反,MongoDB希望突出其通用性,以将应用场景拓展到更广泛的领域。为此,MongoDB不断增加支持的数据类型。 Mark Porter说,今天的MongoDB几乎支持所有的数据类型,包括文档、图形、数组、文本、对象、地理空间、时间序列和关系型数据等,同时一直在强化对这些数据类型的支持能力。其目的就希望通过一个统一的数据库来帮助开发者处理所有需求,从而简化开发者的工作。 因为在MongoDB看来,“通用”让开发人员的生活更轻松,而 MongoDB 一直专注于为开发人员提供便利。比如,MongoDB 6.0新增的时间序列集合就可以简化应用程序构建,加快构建速度并降低成本。 在即将发布的MongoDB 6.0版本中,时间序列集合功能将支持测量数据库的二级索引,并针对读取性能进行改进和优化,以便更快地对时序数据进行排序。尽管市场上有许多专门针对时间序列数据的数据库,但许多人可能不想为此专门建立一个新的数据库。 一般而言,NoSQL与关系型数据库是两个不同的市场,两者基本不会存在直接竞争关系。不过,正如MongoDB并不把自己限定在NoSQL一样,它对关系数据库市场同样有兴趣。实际上,MongoDB正在将覆盖领域扩展到关系型数据市场,大会上推出的Rational Migrator工具就是举措之一,它可帮助用户把数据从关系型数据库(包括Oracle、SQL Server、MySQL和 PostgreSQL)轻松地迁移到MongoDB。 MongoDB未来与关系型数据库会是竞争关系吗?对此,Mark Porter表示,关系数据库太不灵活,也不便于扩展。多年来,MongoDB一直在与关系数据库竞争并赢得胜利。因为MongoDB将通用的现代分布式架构与强大的基础数据库功能(如ACID事务和企业级安全性)相结合,让用户能比利用其他平台更快地构建创新性、高度可扩展的应用程序。 “Relational Migrator工具的推出是回应众多客户的需求,他们希望更容易地将旧的遗留应用程序转移到 MongoDB。”Mark Porter说。03  满足更多应用场景的需求今年MongoDB World大会上发布的新产品和功能超过了150项,达到了近几年的一个高峰。其中一些让人尤为印象深刻,分析能力就是其中之一。 随着大数据时代的兴起,数据分析的需求越来越普遍,对分析的支持成为数据库能力的重要组成部分。显然,MongoDB也注意到用户不断增长的分析需求。不过,MongoDB最先响应的是更靠近应用程序的分析需求,而不是离线分析。这一点也不难理解,在 MongoDB 的世界里,前者能让开发人员能够更方便地构建应用程序,而离线分析可能更多地面向数据分析人员。 为了方便开发人员的工作,MongoDB推出了几种新手段来简化针对运营数据的分析,支持应用内分析的列存储索引技术就是其中之一。由于列格式非常适合分析类工作,因此该索引选项使开发人员可以轻松地将文档保存在适合其应用程序的模型中,而无需迁移数据,从而大幅提升许多常见分析查询的速度。此外,分析节点目前已支持单独扩展,便于团队独立调整其操作和分析查询性能,避免出现过度配置或配置不足情况。 “我们会优先关注应用内分析能力,如产品推荐、防欺诈等,而不是OLAP。前者要在很短的时间内完成,一般低于1秒,有的甚至在100毫秒内,完全不同于数据仓库。”Mark Porter表示。 其他支持分析的技术还包括新的Atlas SQL Interface、Atlas Data Federation 、Atlas Data Lake、Cluster-to-Cluster Synchronization等。 另外,MongoDB的云服务版Atlas尤其值得一提。MongoDB今天的成功很大程度上就是因为Atlas。Atlas于2016年正式推出以来,增长迅速,最近4个季度都保持80%的增长,贡献了MongoDB 60%的营收,对MongoDB的重要性由此可见一斑。 高速增长的背后是MongoDB一直在不断丰富Atlas的功能,除了前面提到的分析能力方面增强外,今年Atlas还新增了不少其他功能,包括Atlas Search、Atlas Device Sync、Data API等。其中,Atlas Search是在应用程序中构建基于相关性搜索功能的最迅速且最简单的方法;Atlas Device Sync可以实现Atlas与移动端数据库Realm的同步;Data API无需额外的开发就可以通过HTTPS协议为Atlas中的数据提供安全的API访问服务。 近年来,无服务器计算是云计算市场的热点,此前MongoDB已经推出了Atlas Serverless预览版。在大会上,MongoDB宣布Atlas Serverless已全面上市,用户已经可以在AWS、Azure、GCP的平台中使用这一功能。04  突破加密技术,保护使用中的数据如果要问今年MongoDB World大会的参会者,哪项技术发布印象最深?可查询加密(Queryable Encryption)很可能会高票当选。 这些年,MongoDB一直在持续提升安全性,但可查询加密将其安全性提高了新的层次。虽然大多数数据库已经对如何保护静态或动态数据的安全有了很好的办法,但一直无法对使用中的数据进行很好地保护。目前,针对使用中数据进行加密技术普遍很复杂,需要使用来自应用程序端的自定义代码,还需要加密密钥管理,以便对数据进行加密和解密;同时,开发者还需要掌握一定的密码学经验。另外,查询功能会受限,甚至有些不具备查询功能,这导致应用层数据加密变得格外困难,性能上也很难得到保证。 可查询加密技术支持客户从客户端加密敏感数据,将完全随机加密的数据存储在数据库服务器端,并对加密数据执行表达式查询。随着可查询加密技术的推出,MongoDB成为唯一一家支持客户对完全随机加密数据执行表达式查询的数据库提供商,包括等值查询(预览版中可用)、范围查询、前缀查询、后缀查询、子串查询等(即将推出)。对于那些既需要执行表达式查询,又需要确保数据安全的企业而言,这无疑是一个巨大优势。05  写在最后当前,数据库市场仍处于高速增长态势。根据Gartner发布的《2021年数据库管理系统(DBMS)市场研究报告》,非关系型数据库市场2021年总收入为 148亿美元,年增长22%,占整个数据库市场的19%。其中,MongoDB表现亮眼,年增长达到47%,远高于市场平均水平。与AWS、Google、阿里云、Cloudera一起位列市场前5位,已经把其他NoSQL厂商甩在了身后。 随着MongoDB的成长,MongoDB面对的竞争对手会越来愈多,其中有像Snowflake这样的高增长热门公司,更有像甲骨文和 IBM 这样的老牌公司,竞争可能会非常激烈。特别是与传统数据库之间,这是一场事关数据库市场演变的竞争,我们期待竞争格局的演变。
  • [交流吐槽] 进大厂必看的 MongoDB 面试题集锦
    1、MongoDB是什么?MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。2、MongoDB有哪些特点? MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。 你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。 MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 MongoDB使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。 MongoDB中的Map/Reduce主要是用来对数据进行批量处理和聚合操作。 Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。 Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 MongoDB允许在服务端执行脚本,可以用JavaScript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。3、你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?NoSQL是非关系型数据库,NoSQL = Not Only SQL。关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。在处理非结构化/半结构化的大数据时,在水平方向上进行扩展时,随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。再考虑数据库的成熟度,支持,分析和商业智能,管理及专业性等问题时,应优先考虑关系型数据库。4、NoSQL数据库有哪些类型?NoSQL数据库的类型例如:MongoDB、Cassandra、CouchDB、Hypertable、Redis、Riak、HBASE、Memcache等.5、MySQL与MongoDB之间最基本的差别是什么?MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。通过比较MySQL和MongoDB,实际上我们是在比较关系型和非关系型数据库,即数据存储结构不同。6、你怎么比较MongoDB、CouchDB及CouchBase?MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。除了都以文档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有很多不同。7、MongoDB成为最好NoSQL数据库的原因是什么?以下特点使得MongoDB成为最好的NoSQL数据库: 面向文件的 高性能 高可用性 易扩展性 丰富的查询语言8、journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?每个journal(group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。9、分析器在MongoDB中的作用是什么?MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。10、namespace是什么?MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连接起来叫做namespace。11、如果用户移除对象的属性,该属性是否从存储层中删除?是的,用户移除属性然后对象会重新保存(re-save())。12、能否使用日志特征进行安全备份?是的。13、允许空值null吗?对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象,然而用户能够添加空对象{}。14、更新操作立刻fsync到磁盘?不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和经过getLastError_old是有效的)15、如何执行事务/加锁?MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。16、为什么我的数据文件如此庞大?MongoDB会积极的预分配预留空间来防止文件系统碎片。17、启用备份故障恢复需要多久?从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败——包括写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间里。18、什么是master或primary?它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。19、什么是secondary或slave?Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。20、我必须调用getLastError来确保写操作生效了么?不用。不管你有没有调用getLastError(又叫Safe Mode)服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。21、我应该启动一个集群分片(sharded)还是一个非集群分片的MongoDB环境?为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个MongoDB环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。22、分片(sharding)和复制(replication)是怎样工作的?每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。23、数据在什么时候才会扩展到多个分片(shard)里?MongoDB分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是64Mb,所以你需要至少64Mb空间才可以实施一个迁移。24、当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上。25、如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。26、我可以把moveChunk目录里的旧文件删除吗?没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件。一旦这些操作已经完成,相关的临时文件也应该被删除掉。但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间。27、我怎么查看MongoDB正在使用的链接?db._adminCommand("connPoolStats"); 28、如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。29、如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?可以。30、当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。31、MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?不会,只会在A:{B,C}上使用索引。32、如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。33、MongoDB支持存储过程吗?如果支持的话,怎么用?MongoDB支持存储过程,它是JavaScript写的,保存在db.system.js表中。34、如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。35、为什么MongoDB的数据文件很大?MongoDB采用的预分配空间的方式来防止文件碎片。36、分析器在MongoDB中的作用是什么?分析器就是explain显示每次操作性能特点的数据库分析器。通过分析器可能查找比预期慢的操作。37、如何执行事务/加锁?因为MongoDB设计就是轻量高性能,所以没有传统的锁和复杂的事务的回滚。38、getLastError的作用?调用getLastError可以确认当前的写操作是否成功的提交。39、MongoDB的结构介绍?数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成。40、数据库的整体结构?键值对–》文档–》集合–》数据库41、MongoDB是由哪种语言写的?MongoDB用C++编写的,流行的开源数据库MySQL也是用C++开发的。C++于1983年发行,是一种使用广泛的计算机程序设计语言。它是一种痛用程序设计语言,支持多种编程模式。42、MongoDB的优势有哪些? 面向文档的存储:以JSON格式的文档保存数据。 任何属性都可以建立索引。 复制以及高可扩展性。 自动分片。 丰富的查询功能。 快速的即时更新。 来自MongoDB的专业支持。43、什么是集合?集合就是一组MongoDB文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。44、什么是文档?文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。45、什么是“mongod”?mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。46、“mongod”参数有什么? 传递数据库存储路径,默认是“/data/db” 端口号默认是“27017”47、什么是“mongo”?它是一个命令行工具,用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令,它将使用默认的端口号和localhost连接。48、在MongoDB中如何创建一个新的数据库?MongoDB用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。49、什么是非关系型数据库?非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和Web Apps等。50、非关系型数据库有哪些类型? -Key-Value 存储,eg:Amazon S3 图表,eg:Neo4J 文档存储,eg:MongoDB 基于列存储,eg:Cassandra51、为什么用MongoDB? 架构简单 没有复杂的连接 深度查询能力,MongoDB支持动态查询 容易调试 容易扩展 不需要转化/映射应用对象到数据库对象 使用内部内存作为存储工作区,以便更快的存取数据52、在哪些场景使用MongoDB? 大数据 内容管理系统 移动端Apps 数据管理53、MongoDB中的命名空间是什么意思?MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约628字节,也即整个数据库的命名空间的上限约为24000。如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。要建立更多的集合的话,MongoDB也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为2G。每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。54、哪些语言支持MongoDB?C、C++、C#、Java、Node.js、Perl、PHP等。55、在MongoDB中如何查看数据库列表?使用命令:show dbs 
  • [行业资讯] MongoDB在 2022 MongoDB 全球用户大会上发布新愿景, 致力成为开发者数据平台提供商
    美国东部时间6月7日,MongoDB (NASDAQ代码:MDB) 2022 年度全球用户大会 (MongoDB World) 在美国纽约隆重开幕。大会上,MongoDB 发布公司新愿景,致力成为开发者数据平台提供商,同时还发布了一系列变革性的新功能。随着新愿景及功能的发布,MongoDB将赋能开发团队加快创新步伐,借助统一的集成式开发者数据平台满足更为广泛的用例需求,提供覆盖全数据生命周期的服务,进行现代应用架构优化,并实现最精密的数据加密技术。MongoDB总裁兼首席执行官Dev Ittycheria表示:“未来几年,不计其数的全新应用程序将不断面世,这些应用程序可以提供令人惊艳的客户体验,满足企业转型的功能需求,通过更尖端的自动化水平提高运营效率等,这些都离不开一个高度可扩展、云原生、全球分布式的数据平台。MongoDB的愿景是打造开发者数据平台,为开发者提供现代、便捷的使用体验,广泛支持各种用例,并满足最为严苛的性能和规模要求。”满足更广泛的用例需求MongoDB已借助统一的平台,将其别具一格的数据服务方法延伸至联机运营场景和事务场景以外的搜索和分析用例。这些增强功能在提升团队工作效率的同时,还能确保始终一致的开发者体验,降低数据基础设施的复杂性,更好地满足下一代应用程序的需求。• MongoDB发布了一系列全新功能,可帮助开发者更轻松地构建应用程序内分析能力,并打造更丰富的应用体验。拟于今年晚些时候推出的列存储索引(Column store indexing)功能,将助力用户创建和维护专门的索引,无需对文档结构进行任何更改或将数据迁移到其他系统,从而大幅提升许多常见分析查询的速度。此外,分析节点目前已支持单独扩展,便于团队独立调整其操作和分析查询性能,避免出现过度配置或配置不足情况。  • MongoDB时间序列集合功能可以简化应用程序构建,加快构建速度并降低成本,这些应用程序旨在监测物理系统、跟踪资产或处理财务数据。在即将发布的MongoDB 6.0版本中,时间序列集合功能将支持测量数据库的二级索引,并针对读取性能进行改进和优化,以便更快地对时序数据进行排序。• Atlas Search 是在应用程序中构建基于相关性搜索功能的最迅速且最简单的方法。如今,借助搜索分面(Search Facets)功能,开发者能够快速构建搜索体验,确保终端用户能够更加顺畅地浏览、细分或按照不同维度优化搜索结果。提供覆盖数据生命周期的服务  MongoDB发布了众多新产品和功能,使开发团队能够更好地分析、转换和迁移Atlas中的数据,同时减少对可能造成延迟、制约生产效率和增加成本的批处理及ETL作业的依赖。  • Atlas Data Lake 将提供完全托管式存储能力,采用高性价比的云对象存储,同时针对高性能分析查询进行优化。Atlas Data Lake在从Atlas数据库获取数据时,会重新格式化、创建分区索引并对数据进行分区,从而创建一个高性能的伴生数据湖。  • Atlas Data Federation功能可以帮助开发团队创建虚拟数据库,以便处理驻留在不同源头的数据。开发团队可以在一个或多个集合、MongoDB集群和存储桶之间查询、转换或创建视图。  • Atlas SQL Interface为主要使用SQL工具的数据分析师提供了在只读界面中与Atlas进行数据交互的绝佳体验。这样一来,数据分析师可以使用SQL工具轻松完成Atlas数据的本地查询和可视化操作,同时不影响文档模型的灵活性。此外,数据分析师还可以使用SQL在Atlas集群和云对象存储中查询数据,无需进行任何数据操作、模式定义或扁平化处理。针对现代应用架构进行优化除了支持广泛的工作负载外,组织机构还需要灵活地部署合适的应用架构以满足需求。  • Atlas Serverless现已全面上市,用户可以在几乎不需要初始配置和持续容量管理的情况下,满足广泛的应用需求。用户可以在所有三大云计算供应商的平台中实现按需扩展或完全停用(scale-to-zero)操作和部署,而分级定价(tiered pricing)功能可免除前期投入,自动降低大型工作负载的成本。  • 借助Vercel integration功能,平常使用Vercel平台开发、预览和发布网站及应用程序的团队可以更轻松地将MongoDB Atlas作为后台数据库使用。借助Vercel Integrations Marketplace,开发者无需任何配置即可在Atlas上部署新的web体验,即刻开始使用直接映射到其代码的文档进行构建。• Cluster-to-Cluster Synchronization推动MongoDB集群在Atlas、私有云、本地环境、边缘等实现跨环境的持续数据同步。Cluster-to-Cluster Synchronization使用户能够轻松地将数据迁移到云端,创建测试环境,打造独有的分析环境,并满足数据驻留要求。• Atlas Device Sync可以将Atlas中完全托管式后端数据库连接至边缘和移动设备常用的移动端数据库Realm。MongoDB全新Flexible Sync选项通过直观的语言原生查询和分层权限,对同步到用户应用程序的数据进行精细化控制。  • Data API无需额外的开发,就可以通过HTTPS协议为Atlas中的数据提供安全的API访问服务。开发者可以借助这种方法轻松地将Atlas数据扩展到云端的其他应用程序及服务,或者扩展到他们的无服务器架构中。  Amadeus技术平台与工程(TPE)高级副总裁Sylvain Roy表示:“长期以来,我们一直希望当前基于MongoDB的旅游应用程序能够实现Cluster-to-Cluster Synchronization(C2C)功能,这将使我们受益匪浅。它将给我们软件生命周期的许多方面带来极大改善,例如支持‘蓝/绿’部署、数据分配、云迁移等,并进一步提升我们在不同地理位置为航空公司客户提供服务的能力。”  实现最精密的数据加密技术  所有组织机构都必须具备在各种环境中保护敏感信息的能力,同时不影响自身基于这些数据构建丰富应用体验的能力。现有动态和静态加密解决方案涵盖多种使用场景,但是没有一个方案既能完全地保护敏感数据,又能允许开发者灵活使用这些被保护的数据。MongoDB 6.0预览版推出了业界首个使用突破性密码学工程原理的加密搜索方案——Queryable Encryption。这项技术使开发者能够在不影响性能的情况下,简单直观地查询加密的敏感数据,并且不需要具备任何加密经验。数据库中的数据可以始终保持加密状态,包括存储在内存和CPU中的数据;密钥永远不会离开应用程序,且不能通过数据库服务器进行访问。这种端到端的客户端加密技术使用新颖的加密索引数据结构,使得开发者能够史无前例地在完全加密的机密数据上进行表达式查询。Queryable Encryption基于经过充分测试的、框架完善的标准NIST密码学原语,可提供强有力的保护,防止针对数据库发起的攻击,包括来自拥有很多特权的管理员以及云基础设施等人员的内部威胁。  
  • [行业资讯] 6 月数据库排行榜:Oracle、PG 和 MongoDB 分数上涨
    DB-Engines 数据库流行度排行榜发布了 6 月份的更新。可以看到,分数明显上涨的数据库包括 Oracle、PostgreSQL 和 MongoDB,其中 Oracle 分数上涨最多 —— 较上个月增加了 24.92 分。MySQL 和 Redis 的分数则略有下跌,尤其是 MySQL 的分数已连续下跌了两个月。下图是 TOP 10 数据库的最新分数和变化情况。排名方面,Snowflake 较上个月上升了 1 个名次,目前的排名是 13,看来有望进入前十。Snowflake 去年曾获得 “2021 年度数据库” 称号。继续看看主流数据库的分数趋势变化:最后看看各类型数据库的排名情况。关系数据库前 10 名Key-Value 数据库前 10 名文档数据库前 10 名时序数据库前 10 名图数据库前 10 名DB-Engines 根据流行度对数据库管理系统进行排名,排名每月更新一次。排名的数据依据 5 个不同的指标:Google 以及 Bing 搜索引擎的关键字搜索数量Google Trends 的搜索数量Indeed 网站中的职位搜索量LinkedIn 中提到关键字的个人资料数Stackoverflow 上相关的问题和关注者数量这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的。
  • [交流吐槽] 聊聊 MongoDB 时间序列集合
    名词解释bucket:带有相同的元数据且在一段有限制的间 隔区间内的测量值组。bucket collection :用于存储时序型集合的底层的分组桶的系统集合。复制、分片和索引都是在桶级别上完成的。measurement:带有特定时间序列的K-V集合。meta-data:时序序列里很少随时间变化的K-V对,同时可以用于识别整个时序序列。time-series:一段间隔内的一系列测量值。time-series collection:一种表示可写的非物化的视图的集合类型,它允许存储和查询多个时间序列,每个序列可以有不同的元数据。MongoDB 在5.0中支持了新的timeseries collection类型的选项,该类型用于存储时序型数据。timeseries collection提供了一组用于插入和查询测量值的简单接口,同时底层实际的数据是存储在以bucket形式的集合中。在创建timeseries collection时,timeField字段是最小必备的配置项。metaField是另一个可选的、可被指定的元数据字段,它是用于在bucket中对测量值分组的依据。MongoDB通过提供expireAfterSeconds字段选项,也支持了对测量值的过期机制。在mydb数据库中有个以mytscoll 命名的timeseries collection,该集合在MongoDB内部的catelog(用于存储集合或视图的信息)里是由一个视图和一个系统集合组成的。mydb.mytscoll 是个视图,它在MongoDB底层是用bucket collection作为包含特定属性的原始集合实现的:该视图就是通过aggregation里的$_internalUnpackBucket来实现展开bucket里数据的。该视图是可写的(仅支持插入)。同时每个被插入的文档必须包含时间字段。在查询视图时,它会隐式地展开底层在bucket collection中存储的数据,然后返回原始的非bucket形式的文档数据。该系统集合的命名空间是mydb.system.buckets.mytscoll,它是用来存储实际数据的。每一个在bucket collection里的文档,都表示了一组区间间隔的时序型数据。如果在创建timeseries collection时,定义了metaField元数据字段,那么所有在bucket里的测量值都会有这个通用的元数据字段。除了时间范围,bucket还限制了每个文档数据的总条数以及测量值的大小。Bucket Collection Schema{ _id: <Object ID with time component equal to control.min.<time field>>, control: { // <Some statistics on the measurements such min/max values of data fields> version: 1, // Version of bucket schema. Currently fixed at 1 since this is the // first iteration of time-series collections. min: { <time field>: <time of first measurement in this bucket, rounded down based on granularity>, <field0>: <minimum value of 'field0' across all measurements>, <field1>: <maximum value of 'field1' across all measurements>, ... }, max: { <time field>: <time of last measurement in this bucket>, <field0>: <maximum value of 'field0' across all measurements>, <field1>: <maximum value of 'field1' across all measurements>, ... }, closed: <bool> // Optional, signals the database that this document will not receive any // additional measurements. }, meta: <meta-data field (if specified at creation) value common to all measurements in this bucket>, data: { <time field>: { '0', <time of first measurement>, '1', <time of second measurement>, ... '<n-1>': <time of n-th measurement>, }, <field0>: { '0', <value of 'field0' in first measurement>, '1', <value of 'field0' in first measurement>, ... }, <field1>: { '0', <value of 'field1' in first measurement>, '1', <value of 'field1' in first measurement>, ... }, ... } }索引为了保证timeseries collection的查询可以受益于索引扫描而不是全表扫描,timeseries collection允许索引可以被创建在时间上,元数据上以及元数据的子属性上。从MongoDB5.2开始,在timeseries collection也允许索引被创建在测量值上。用户使用createIndex命令提供的索引规范被转换为底层buckets collection的模式。timeseries collection与底层的buckets collection之间的索引映射转换关系细节,你可以参考timeseries_index_schema_conversion_functions.h.在v5.2及以上版本的最新支持的索引类型,timeseries collection会存储用户原始的索引定义到变换后的索引定义上。当从底层的bucket collection的索引映射到timeseries collections的索引时,会返回用户原始的索引定义。当索引被创建后,可以通过listIndexes命令或$indexStats聚合计划来检查。listIndexes 和$indexStats是作用于timeseries collections的,执行时,它们会在内部将底层的bucket collection的索引转化成timeseries格式的索引,并返回。比如,当我们在元数据字段中定义有mm的timeseries collection上执行listIndexes命令时,底层的bucket collection的{meta:1}索引,将会以{mm:1}格式返回。dropIndex 和collMod (hidden: , expireAfterSeconds: ) 也同样支持在timeseries collection上。时间字段上支持的索引类型:单字段索引组合索引哈希索引通配符索引稀疏索引多键索引带排序的索引元数据字段和元数据子字段支持的索引类型:支持所有时间字段上支持的索引类型v5.2及以上版本支持2d 索引v5.2及以上版本支持2dsphere 索引v5.2及以上版本支持 Partial索引仅在v5.2及以上版本,测量值字段支持的索引类型:单字段索引组合索引2dsphere部分条件索引`timeseries collections 上不支持的索引类型,包括 唯一索引以及文本索引。桶目录为了保证高效地桶(分组)操作,我们在BucketCatalog里维护了一组开启的桶,你可以在bucket_catalog.h找到。在更高的级别,我们尝试着把并发写程序的写操作分组合并为可以一起提交地批处理,以减少对底层文档的写次数。写程序会插入它的输入批处理里的每一个文档到BucketCatalog,然后BucketCatalog会返回一个BucketCatalog::WriteBatch的处理器。一旦完成上面那些插入操作后,写程序就会检查每个写批处理。如果没有其他的写程序已经对批处理声明提交的权利,那么它会声明权利,并会提交它的批处理。否则,写程序将会稍后再提交处理。当它检查完所有的批处理,写程序将会等待其他的写程序提交每个剩下的批处理。在内部,BucketCatalog维护一组对每个bucket 文档的更新操作。当批处理被提交时,它会将这些插入转换到成buckets的列格式,并确保任何control字段的更新(例如control.min 和 control.max)。当bucket文档在没有通过BucketCatalog的情况下被更新时,写程序就需要为有问题的文档或命名空间去调用BucketCatalog::clear ,这样它就可以更新它的内部状态,避免写入任何可能破坏bucket 格式的数据。这通常由OP观察者处理,但可能需要通过其他地方去调用。bucket既可以通过手动设置选项control.closed 标识来关闭,也可以在许多场景下通过 BucketCatalog 自动关闭。如果BucketCatalog使用了超出给定的阈值(可通过服务器参数timeseriesIdleBucketExpiryMemoryUsageThreshold控制)的更多内存,此时它将会开始去关闭空闲的bucket。如果bucket是开启的且它没有任何未处于等待中未提交的测量值时,那么它就会被视为空闲的bucket。在下面这些场下 BucketCatalog 也会关闭bucket: 如果它拥有超过最大阈值(timeseriesBucketMaxCount)的测量值数据的数量;如果它拥有过大的数据量大小(timeseriesBucketMaxSize);又或者一个新的测量值数据是否是会导致bucket在其最旧的时间戳和最新的时间戳之间跨度比允许的间隔更长的时间(当前硬编码为一小时)。如果传入的测量值在原理上与已经到达给定bucket的度量不兼容,该bucket将被关闭,同时可以使用numBucketsClosedDueToSchemaChange度量进行跟踪。在第一次提交给定bucket的写批处理时,就会生成新的完整的文档。后续的批处理提交中,我们只执行更新操作,不再生成新的完整的文档(因此称为‘经典’更新),是直接创建DocDiff(“delta”或者v2的更新)。粒度timeseries collection的granularity 选项在集合创建的时候,可以被设置成seconds,minutes或者hours。后期可通过colMod操作来修改这个选项从seconds到minutes或者从minutes到hours,除此之外的转化修改目前都是不支持的。该参数想要表示在已给定的时序型测量数据之间的粗略的时间间隔,同时也用于调节其他内部参数对分组的影响。单个bucket被允许的最大时间跨度,是由granularity选项控制,对于seconds,最大的时间跨度被设置成1小时,对于minutes就是24小时,对于hours就是30天。当通过BucketCatalog开启新的bucket时,_id里的时间戳就是等同于control.min.的值,该值是从第一个插入bucket的测量数据中根据granularity选项来向下近似舍入而得到的。对于seconds,它将向下舍入到最接近的分钟,对于minutes,将向下舍入到最接近的小时,对于hours,它将向下舍入到最接近的日期。在闰秒和日历中的其他不规则情况下,这种舍入可能并不完美,并且通常通过对自纪元以来的秒数进行基本模运算来完成,假设每分钟 60 秒,每小时 60 分钟,以及每天 24 小时。更新和删除timeseries collection 支持符合以下限制的删除语句:仅支持metaField的属性的查询语句支持批量操作同时更新满足上面同样的条件,另外遵循:仅支持metaField对应的属性值更新操作指定一个带有更新运算符表达式的更新文档(而不是替换文档或者更新的pipeline操作)不支持upsert:true 操作这些更新与删除的执行都会被转换成相对应的底层的bucket collection的更新或删除操作。特别是,对于查询和更新文档,我们会使用真正的字段meta 替换集合的metaField。(参见 Bucket 集合规范)例如,对于一个使用 metaField: "tag"创建的timeseries集合db.ts,考虑一个对这个集合的更新操作,其查询语句是{"tag.tag.a": "a"} ,同时更新文档语句是 {$set: {"tag.tag.a": "A"}, $rename: {"tag.tag.b": "tag.tag.c"}}。这个更新操作在 db.system.buckets.ts上会被转换成,查询语句是{"meta.tag.a": "a"},更新语句是 {$set: {"meta.tag.a": "A"}, $rename: {"meta.tag.b": "meta.tag.c"}}。然后这个转换后的更新语句就可以像普通的更新操作一样执行。上面这些转换流程也适用于删除操作。参考文献MongoDB Blog: Time Series Data and MongoDB: Part 2 - Schema Design Best Practices关于作者:黄璜
  • [交流吐槽] Mysql和Mongodb应用场景
    MongoDB 的适用场景为:数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用 MongoDB , 其他情况就还是用 MySQL ,这样组合使用就可以达到最大的效率。1.如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么,这样的使用可能有以下几种情况的考量: (1)mongodb所负责部分以文档形式存储,能够有较好的代码亲和性,json格式的直接写入方便。(如日志之类) (2)从data models设计阶段就将原子性考虑于其中,无需事务之类的辅助。开发用如nodejs之类的语言来进行开发,对开发比较方便。 (3)mongodb本身的failover机制,无需使用如MHA之类的方式实现。2.将mongodb作为类似redis ,memcache来做缓存db,为mysql提供服务,或是后端日志收集分析。 考虑到mongodb属于nosql型数据库,sql语句与数据结构不如mysql那么亲和 ,也会有很多时候将mongodb做为辅助mysql而使用的类redis memcache 之类的缓存db来使用。 亦或是仅作日志收集分析。MongoDB 有一个最大的缺点,就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在 MongoDB 中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题。另外一个就是在一定的时间后,所占空间会莫明其妙地增大,所以要定期把数据库做修复,定期重新做索引,这样会提升MongoDB 的稳定性和效率。1.MySQL 来自女儿的名字; MongoDB 来自 humongous2.MySQL 使用 Table/Row/Column; MongoDB 使用 Collection/Document3.MySQL 需要指定 table 的 schema; MongoDB的 collection 的每个 document 的 schema 可以自由修改4.MySQL 支持 join; MongoDB 没有 join5.MySQL 使用 SQL 语言; MongoDB 使用类似 JavaScript 的函数命令对比MongoDB 与 MySQL 命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB 是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
  • [交流吐槽] MongoDB和Redis区别
    MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。指标 MongoDB(v2.4.9) Redis(v2.4.17) 比较说明实现语言 C++C/C++-协议BSON、自定义二进制类Telnet-性能依赖内存,TPS较高依赖内存,TPS非常高Redis优于MongoDB可操作性丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言数据丰富,较少的IOMongoDB优于Redis内存及存储适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制)Redis2.0后增加虚拟内存特性,突破物理内存限制;数据可以设置时效性,类似于memcache不同的应用角度看,各有优势可用性支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决。(MongoDB 一般会使用replica sets和sharding功能结合,replica sets侧重高可用性及高可靠性,而sharding侧重于性能、易扩展)可靠性从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能MongoDB优于Redis一致性不支持事物,靠客户端自身保证支持事物,比较弱,仅能保证事物中的操作按顺序执行Redis优于MongoDB数据分析内置数据分析功能(mapreduce)不支持MongoDB优于Redis应用场景海量数据的访问效率提升较小数据量的性能及运算MongoDB优于Redis
  • [交流吐槽] mongodb有什么应用场景?
    请教,谢谢
总条数:165 到第
上滑加载中