• [中间件] 【华为云鲲鹏云服务最佳实践】【数据库篇】第007期 mongoDB 4.0.3 安装配置指南
    1、简介      MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。      官方链接:https://www.mongodb.com/       类别:数据库2、基础环境类别子项版本获取地址(方法)华为云虚拟机RC3(916)--OSCentOS7.6 Kernel4.14 软件包Gcc7.3.1 Glibc-static2.17 Libcurl7.29.0 Unzip6.0 Openssl1.0.2k Lzip1.19 Python-setuptools0.9.8 Pip19.1.1 Libxml22.9.1 MongoDB4.0.3 3、依赖安装清除yumyum clean all下载服务器包到本地缓存yum makecache更新yum 包yum -y update1)安装操作系统自带依赖软件版本yum install -y unzip python-devel libcurl-devel openssl openssl-devel python-setuptools.noarch libxml2-devel libxmls glibc-static lzip libffi-devel python2-pip createrepo_c2)安装isl1)创建isl.repo文件vim /etc/yum.repos.d/isl.repo           输入以下内容,其中/root/rpmbuild/RPMS/aarch64为isl的rpm包目录[isl]name=isl 0.16baseurl=file:///root/rpmbuild/RPMS/aarch64  gpgcheck=0enabled=12)在isl的rpm包目录下创建repodata createrepo_c ./     3) 更新本地缓存yum makecache         4)安装islyum install -y isl         5)查看gcc是否安装成功rpm -qa isl3)安装gcc  1)创建gcc.repo文件vim /etc/yum.repos.d/gcc.repo          输入以下内容,其中soft_ware/gcc/RPMS/aarch64为gcc的rpm包目录[gcc]name=gcc 7baseurl=file:///soft_ware/gcc/RPMS/aarch64  gpgcheck=0enabled=12)在gcc的rpm包目录下创建repodata目录    createrepo_c ./     3) 更新本地缓存yum makecache         4)安装gccyum install -y gcc         5)查看gcc是否安装成功gcc -v4、组件编译安装新建并进入存放MongoDB目录mkdir -p /soft_ware/mongodbcd /soft_ware/mongodb下载并解压MongoDB包wget -T 10 -O mongo-r4.0.3.zip http://github.com/mongodb/mongo/archive/r4.0.3.zipunzip mongo-r4.0.3.zip进入MongoDB目录cd mongo-r4.0.3执行下列命令,向buildscripts/requirements.txt文件添加2c cryptography >= 2.0.0' buildscripts/requirements.txtsed -i '2c cryptography >= 2.0.0' buildscripts/requirements.txt使用pip安装buildscripts/requirements.txtpip2 install -r buildscripts/requirements.txt编译python buildscripts/scons.py mongod MONGO_VERSION=4.0.3 CCFLAGS="-march=armv8-a+crc" --disable-warnings-as-errors安装python buildscripts/scons --prefix=/opt/mongo install MONGO_VERSION=4.0.3 CCFLAGS="-march=armv8-a+crc" --disable-warnings-as-errors5、系统配置   无6、测试测试内容:mongod是否正常启动测试步骤:1)创建目录/data/dbmkdir -p /data/db2)进入mongodb安装目录cd /opt/mongo/bin3)执行./mongod./mongod测试结果:正常启动测试内容:mongodb数据是否能正常使用测试结果:正常使用测试步骤:1)进入mongodb安装目录cd /opt/mongo/bin2)执行./mongo,进入mongo shell./mongo3)创建数据库use mongodatabase4)查找数据库show dbs7、参考信息官方文档:https://docs.mongodb.com/?_ga=2.205694608.2087915904.1562568984-2077698296.1561340286 8、FAQQ:使用pip安装buildscripts/requirements的时候可能会提醒pip版本过低的问题?A:按照提示的命令升级pip即可,升级过后pip的版本应该为19.1.1。
  • [交流分享] 【鲲鹏翱翔】数据库03-MongoDB移植安装指南
    1.  简介MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。本指南描述了在ARM64,CentOS7.5的环境下移植MongoDB的过程,可供相关人士参考。2.  部署环境Packet NameVersionCentOSCentOS   7.5 with ARMMongoDB3.6.34.0.33.   安装部署     3.1 环境要求MongoDB代码在github托管:https://github.com/mongodb/mongo,可以在docs/building.md中查看编译当前版本的要求以及编译安装指导编译MongoDB3.6和4.0,在CentOS中需要保证的环境有:l  GCC 5.4.0l  Python 2.7可以github地址中的Wiki查看Building MongoDB细节      3.2 依赖安装在系统中安装需要的组件,安装相应的库:yum   install unzip gcc gcc-c++ python-devel libcurl-devel openssl  openssl-devel python-setuptools.noarch libxml2-devel   libxml2  glibc-static libstdc++-static   lzip libffi-devel      3.3 编译升级GCC由于服务器Centos7.5默认安装的GCC版本较低,需要进行升级GCC,版本信息如下:gcc   --versiongcc   (GCC) 4.8.5去官网下载http://ftp.gnu.org/gnu/gcc/下载GCC 5.4.0的源码压缩包解压安装       解压gcc-5.4.0.tar.gztar  -xvf gcc-5.4.0.tar.gz下载安装依赖,下载安装gcc需要的三个依赖yum  -y install bzip2 wget    # 下载依赖需要使用把bzip2和wget两个命令cd   gcc-5.4.0/./contrib/download_prerequisites  # 在解压根目录中执行依赖下载完成后,编译更新gcc版本cd   ../ && mkdir gcc-build-5.3.0 && cd gcc-build-5.3.0    #执行命令前位于gcc-5.4.0目录下#   执行configure../gcc-5.3.0/configure   --enable-checking=release --enable-languages=c,c++ --disable-multilib#   执行编译,make时间1-2小时或更久make   -j8    #-j8意味8核并行编译;make   install    #执行安装update-alternatives   --install /usr/bin/gcc gcc /opt/gcc-5.4.0/gcc-5.4.0    # 切换gcc版本验证是否更新生效gcc   -versiongcc   (GCC) 5.4.03.4 安装python查看python版本,满足要求,不做修改python   -VPython   2.7.53.5 编译安装MongoDB这里有两种方法去下载我们想要的MongoDB版本,一种方法是从github的Releases中找到对应的版本包,举例wget  -T 10 -O mongo-r4.0.3.zip     http://github.com/mongodb/mongo/archive/r4.0.3.zip 这里使用git下载Mongo源代码#   下载源码git   clone git://github.com/mongodb/mongo.gitcd   mongo#   列出所有版本git   tag -l  #   切换到安装的版本git   checkout r3.6.3安装python依赖包,通过在代码根目录中执行如下命令,如果没有查找到pip命令,参考如下链接进行安装pip:Centos使用yum安装pippip   install -r buildscripts/requirements.txt编译MongoDB源代码并安装#arm   安装需要加上CCFLAGS="-march=armv8-a+crc"参数,否则会报错python   buildscripts/scons.py mongod MONGO_VERSION=3.6.3   CCFLAGS="-march=armv8-a+crc" --disable-warnings-as-errorspython   buildscripts/scons.py --prefix=/opt/mongo install MONGO_VERSION=3.6.3   CCFLAGS="-march=armv8-a+crc" --disable-warnings-as-errors备注:如果编译过程中出现/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found,请参考https://itbilu.com/linux/management/NymXRUieg.html解决。3.6 测试安装结束后执行命令启动MongoDB:#执行前请确保/data/db存在或者使用—dbpath指定位置./mongod   -dbpath  /data/db./mongo#在mongo shell创建数据库:use   mongodatabase#使用命令查找数据库,若可以显示,则说明mongoDB正常show   dbs3.7 参考信息[1] MongoDB官网:https://www.mongodb.com/[2] github地址:https://github.com/mongodb/mongo[3] MongoDB(0)- 源码编译:https://www.jianshu.com/p/9cbfc2aa5709   
  • [热门活动] 关于MongoDB数据库非授权访问漏洞的安全预警
    一、概要近日,业界报道有大量MongoDB数据库暴露在互联网上导致重要信息泄露,其主要原因为未正确设置数据库访问权限。在MongoDB数据库启动时,如不修改数据库认证访问权限方面的默认配置,用户则无需权限验证,通过默认的服务端口可本地或远程访问该数据库并进行任意操作。此类数据库若暴露在互联网上,将可能存在信息泄露的风险。华为云提醒各位租户,请您加强对MongoDB等数据库的安全加固,保障数据安全。二、威胁级别威胁级别:【严重】(说明:威胁级别共四级:一般、重要、严重、紧急。)三、排查和处置方法排查方法:1. 检查数据库是否部署在互联网边界;2. 检查数据库实例是否由root账户启动;3. 库实例是否具有访问控制;4. 检查数据库是否修改了默认端口;5. 检查数据库是否限制了终端访问地址;6. 检查数据库是否禁用HTTP接口;7. 检查数据库是否禁用REST接口;8. 检查数据库管理时是否启用SSL协议;9. 检查数据库用户权限是否为最小授权;10. 检查数据库是否启用审计功能;11. 集群复制时是否采用Keyfile访问控制部署新副本集;12. 检查数据库是否安装了最新系统漏洞补丁包。处置方案:1. 数据库与应用平台分开部署,不能部署在同一台服务器上,且不能部署在互联网边界及DMZ区,数据库应部署在核心网段中,并在网络层做好相应的访问控制策略;2. 不要对MongoDB设置过多角色,普通用户权限已经满足日常维护需求。另外,对以下文件要配置适应的文件权限,如,只允许mongodb用户自己进行读写(1、数据文件;2、秘钥、证书文件(只读)、日志文件);3. 数据库应带-auth参数启动;4. 数据库应修改27017默认端口;5. 数所库应通过bind_ip来进一步限制MongoDB会在哪一个网络接口上监听;6. 在业务不需要的情况下关闭HTTP接口;7. 在业务不需要的情况下关闭RESET接口;8. MongoDB集群之间,以及从客户端连接到MongoDB实例的连接应该使用SSL,使用SSL对性能没有影响,并且可以防范类似于man-in-the-middle的攻击;9. 为数据库用户分配合理的角色和权限,不建议(1、仅仅使用一个高权限用户(如root)来执行所有操作;2、给用户分配不需要的权限;3、使用简单密码或者多个账号同用一个密码;4、删除数据库后没有删除相应的用户);10. 启用数据库审计功能或采用第三方数据库审计产品对数据库的操作进行审计;11. 使用KeyFile认证,副本集中的每个MongoDB实例使用KeyFile内容作为认证其他成员的共享密码,只有有正确的KeyFile的MongoDB实例可以加入副本集;12. 关注数据库漏洞情况,发现重大安全漏洞时及时更新补丁。注意:修复漏洞前请将资料备份,并进行充分测试。
  • [热门活动] 关于MongoDB数据库权限提升漏洞的安全预警
    一、概要近日,业界报告了若干利用MongoDB权限提升漏洞(编号SSV-88997、SSV-60914)导致信息泄露的安全事件。SSV-88997漏洞使得攻击者无需进行账号认证即可登录MongoDB数据库服务器,SSV-60914漏洞允许经过授权的远程攻击者可通过任意数据库中的‘__system’用户名获得内部系统权限。通过这两个漏洞的配合,攻击者可直接登录数据库服务器,窃取数据库中的任何信息。华为云提醒各位租户,请您加强对MongoDB等数据库的安全加固,保障数据安全。二、威胁级别威胁级别:【严重】(说明:威胁级别共四级:一般、重要、严重、紧急。)三、排查和处置方法排查方法:1. 检查数据库是否部署在互联网边界;2. 检查数据库实例是否由root账户启动;3. 库实例是否具有访问控制;4. 检查数据库是否修改了默认端口;5. 检查数据库是否限制了终端访问地址;6. 检查数据库是否禁用HTTP接口;7. 检查数据库是否禁用REST接口;8. 检查数据库管理时是否启用SSL协议;9. 检查数据库用户权限是否为最小授权;10. 检查数据库是否启用审计功能;11. 集群复制时是否采用Keyfile访问控制部署新副本集;12. 检查数据库是否安装了最新系统漏洞补丁包。处置方案:1. 数据库与应用平台分开部署,不能部署在同一台服务器上,且不能部署在互联网边界及DMZ区,数据库应部署在核心网段中,并在网络层做好相应的访问控制策略;2. 不要对MongoDB设置过多角色,普通用户权限已经满足日常维护需求。另外,对以下文件要配置适应的文件权限,如,只允许mongodb用户自己进行读写(1、数据文件;2、秘钥、证书文件(只读)、日志文件);3. 数据库应带-auth参数启动;4. 数据库应修改27017默认端口;5. 数所库应通过bind_ip来进一步限制MongoDB会在哪一个网络接口上监听;6. 在业务不需要的情况下关闭HTTP接口;7. 在业务不需要的情况下关闭RESET接口;8. MongoDB集群之间,以及从客户端连接到MongoDB实例的连接应该使用SSL,使用SSL对性能没有影响,并且可以防范类似于man-in-the-middle的攻击;9. 为数据库用户分配合理的角色和权限,不建议(1、仅仅使用一个高权限用户(如root)来执行所有操作;2、给用户分配不需要的权限;3、使用简单密码或者多个账号同用一个密码;4、删除数据库后没有删除相应的用户);10. 启用数据库审计功能或采用第三方数据库审计产品对数据库的操作进行审计;11. 使用KeyFile认证,副本集中的每个MongoDB实例使用KeyFile内容作为认证其他成员的共享密码,只有有正确的KeyFile的MongoDB实例可以加入副本集;12. 关注数据库漏洞情况,发现重大安全漏洞时及时更新补丁。注意:修复漏洞前请将资料备份,并进行充分测试。https://www.huaweicloud.com/notice/2018/20190219183938203.html
  • [技术干货] MongoDB 网络通信和线程池处理初步
  • [技术干货] 深入理解MongoDB Sharding迁移之moveChunk命令源码分析
    在了解moveChunk命令之前,首先要做的事是深入理解chunk的概念:什么是chunk?chunk是一个逻辑概念,可以理解为一个文档块。这个文档块的特点是块中文档的shardKey取值是连续的。每一个chunk都有一个取值范围,这个范围对应的就是块中minShardKey-maxShardKey的范围。为什么chunk如此重要?MongoDB Shard Cluster往往具有多个shard,这些shard上存储了不同的数据,这也是为何MongoDB具有强大的横向扩展能力。但这里就涉及到两个问题:shard上的数据如何做到负载均衡?系统又如何把insert命令发送到正确的shard上?其实chunk和这两个问题的解决息息相关。不同shard间是否负载均衡,是通过shard上的chunk数是否接近来衡量的。如果shard间chunk数量的差大于默认的阈值,那么就会触发balance,自动将部分chunk迁移到chunk数较少的shard上。注意:所谓的迁移chunk,其实真正迁移的是chunk范围内的文档,chunk只是个逻辑概念。通过chunk范围可以知道哪些文档存在于哪些chunk上,然后只需要知个chunk存在于哪个shard,也就知道了文档存在于哪个shard。所以chunk的信息其实就是元数据,这些信息都存储在configsvr的config.chunks集合里,这就解答了第二个问题。chunk迁移的方式:chunk迁移除了balance触发,还有一种方式就是通过moveChunk命令,直接指定将某个chunk迁移到某个shard上。进入正题:moveChunk命令流程在深入到源码之前先准备三个问题:chunk迁移是一个持续过程,为了不影响客户端的操作,肯定不会一直锁库,那么迁移的过程中是否存在锁库,如果存在锁库,在什么时候?如果不锁库,那么在持续写入的情况下,如何保证chunk内的增量数据完成迁移?chunk迁移最终需要更新元数据config.chunks集合,更新元数据的时机如何把握,才能保证元数据和真实数据一致?带着这些问题可以深入源码了(基于3.4版本):moveChunk源码流程图如下Step1:mongos发送moveChunk给configsvr,configsvr发送moveChunk给源shard主要实现:cluster_move_chunk_cmd.cppmongos解析入参,并构造moveChunk命令发给configsvr。configsvr接收命令后对入参进一步校验,保证元数据在此期间没有更新,然后拿到集合的分布式锁,再给源shard发送moveChunk命令。step2:源shard通知目标shard同步数据(step2-5由move_chunk_command.cpp的_runImpl方法串联)主要实现:migration_destination_manager_legacy_commands.cpp在config.migrations集合中新增moveChunk记录,然后给目标shard发送命令_recvChunkStart。目标shard执行_recvChunkStart命令的主要步骤:设置state为ready,启动迁移线程。如果目标shard不存在该集合,则首先从源shard拷贝集合元数据。从源shard拷贝索引。删除可能在迁移chunk范围内的孤儿文档(之前迁移失败的脏数据)。设置state为clone,向源shard循环发送_migrateClone命令开始同步数据。如果返回result的size为0,则跳出循环。设置state为catchup,向源shard发送_transferMods命令,同步迁移过程中增量修改的数据。设置state为steady,继续向源shard发送_transferMods命令,同步迁移过程中增量修改的数据。如果state为commit_start,说明源shard的所有数据同步完成,再进行最后一次调用后,跳出循环,修改state为done。step3: 源shard轮询目标shard,查询迁移状态主要实现:migration_chunk_cloner_source_legacy.cpp源shard轮询目标shard的state是否为steady,如果state为steady则给集合加锁,源shard禁止写入。给目标chunk发送_recvChunkCommit命令,修改目标shard的state为commit_start,此时触发目标shard执行_recvChunkStart的第7步条件。step4:源shard更新config server元数据。并更新chunk版本号主要实现:migration_source_manager.cpp源shard通知configsvr修改元数据,并更新chunk version。chunk version的作用:mongos在写入时会带上路由表信息,如果shard发现路由信息里的版本号小于自身缓存里的版本号,就会发现mongos的路由信息是陈旧的,这时通知mongos刷新路由表重新写入。step5:删除源shard上的数据主要实现:range_deleter.cppchunk迁移完成后,源shard上被迁移chunk的数据就成为了无用数据,要删除的数据会加入到_deleteSet队列中,异步删除。如果_waitForDelete为:true,则等同步删除完成后再返回结果。此时moveChunk完成。如果删除失败,则源shard上该chunk的数据就成为孤儿文档,需要手动清理。解答一开始提到的三个问题:  当chunk初始全量数据迁移完后,目标shard的state变为steady,此时源shard给集合加锁,禁止该chunk写入。目的shard开始拷贝迁移过程中的增量数据。也就是锁库时间段是在迁移增量数据的过程中。增量数据的迁移是通过transferMods命令完成的,它内部实现的逻辑也很简单,在增量操作写入oplog之前,先记录到两个list里面(std::list _delete记录delete操作,std::list _reolad记录insert和update操作),所以增量数据通过这两个list就可以获得。补充一点,初始全量数据的迁移_migrateClone实现类似,在迁移之前先查询chunk的全量数据,并将文档对应的recordId存储到一个std::set  _cloner中。然后迁移时通过recordId查询到对应的文档。当chunk的全量文档迁移完成后,就通知configsvr修改元数据,并更新chunkVersion,如果更新失败则本次迁移失败,chunk还在源shard上,如果更新成功,chunk归属变为目标shard,本次moveChunk成功!
  • [技术干货] 细说mongodb索引
        索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。一 、B-树索引         B-树索引是MongoDB的默认索引结构。以下是B-树索引结构高等级的概述。    B-树索引具有分层树结构。树顶部是头部块。此块包含指向任何给定范围的键值的适当分支块的指针。分支块通常会指向适当的叶子块以获得更具体的范围,或者对于更大的索引,则指向另一个分支块。 叶子块包含一个键值列表和指向磁盘上文档位置的指针。    查看上面的图,让我们想象一下MongoDB如何遍历这个索引。 如果我们需要访问“BAKER”的记录,我们首先会查阅头部块。 头部块会告诉我们,从A到K开始的键值存储在最左边的分支块中。 访问这个分支块,我们发现从A到D开始的键值存储在最左边的叶子块中。 咨询这个叶子块,我们发现值“BAKER”以及它关联的磁盘位置,我们将用它来获得有关的文件。叶子块包含前一个和后一个叶子块的链接。 这允许我们以升序或降序扫描索引,并且允许使用$gt或$lt操作符的范围查询使用索引进行处理。    与其他索引策略相比,B-树索引具有以下优点:(1)由于每个叶子节点处于相同的深度,所以性能是非常可预测的。 从理论上讲,集合中的任何文档都不会超过三或四次I/O。(2)B树为大型集合提供了良好的性能,因为深度最多为四个(一个头部块,两个分支块级别和一个叶子块级别)。 一般来说,没有任何文件需要四个以上的I/O来定位。 实际上,因为头部块几乎总是已经加载到内存中,而分支块通常加载到内存中,所以实际的物理磁盘读取次数通常只有一次或两次。(3)因为与前一个和后一个叶子块的链接,所以B-树索引支持范围查询以及精确的查找是可行的。    B-树索引提供了灵活高效的查询性能。但是,在更改数据时维护B-树可能很昂贵。例如,考虑在上面的图表中**一个键值为“NIVEN”的文档。要**集合,我们必须在“L-O”块中添加一个新条目。如果在这个区域内有空闲空间,那么成本是很大的,但也许不会过多。但是如果块中没有可用空间会发生什么?如果叶子块中没有空闲空间用于新条目,则需要索引拆分。必须分配新块,并将现有块中的一半条目移入新块。除此之外,还需要在分支块中添加一个新条目(以便指向新创建的叶子块)。如果分支块中没有空闲空间,则分支块也必须分割。这些索引拆分是一项昂贵的操作:必须分配新块,并将索引条目从一个块移到另一个块。二、创建/重建索引MongoDB全新创建索引使用ensureIndex()方法,对于已存在的索引可以使用reIndex()进行重建。MongoDB创建索引使用ensureIndex()方法。语法结构:db.COLLECTION_NAME.ensureIndex(keys[,options])keys,要建立索引的参数列表。如:{KEY:1},其中key表示字段名,1表示升序排序,也可使用使用数字-1降序。options,可选参数,表示建立索引的设置。可选值如下:background,Boolean,在后台建立索引,以便建立索引时不阻止其他数据库活动。默认值 false。unique,Boolean,创建唯一索引。默认值 false。name,String,指定索引的名称。如果未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。dropDups,Boolean,创建唯一索引时,如果出现重复删除后续出现的相同索引,只保留第一个。sparse,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。v,index version,索引的版本号。weights,document,索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。如,为集合sites建立索引> db.sites.ensureIndex({name: 1, domain: -1}) {   "createdCollectionAutomatically" : false,   "numIndexesBefore" : 1,   "numIndexesAfter" : 2,   "ok" : 1 }重建索引reIndex()db.COLLECTION_NAME.reIndex()如,重建集合sites的所有索引:> db.sites.reIndex() {   "nIndexesWas" : 2,   "nIndexes" : 2,   "indexes" : [     {   "key" : { "_id" : 1   },   "name" : "_id_", "ns" : "newDB.sites" }, {   "key" : { "name" : 1, "domain" : -1   },   "name" : "name_1_domain_-1",   "ns" : "newDB.sites" }   ],   "ok" : 1 }三、创建/重建索引    MongoDB提供了查看索引信息的方法:getIndexes()方法可以用来查看集合的所有索引,totalIndexSize()查看集合索引的总大小,db.system.indexes.find()查看数据库中所有索引信息。查看集合中的索引getIndexes()db.COLLECTION_NAME.getIndexes()如,查看集合sites中的索引:>db.sites.getIndexes() [   { "v" : 1, "key" : {   "_id" : 1 }, "name" : "_id_", "ns" : "newDB.sites"   },   { "v" : 1, "key" : {   "name" : 1,   "domain" : -1 }, "name" : "name_1_domain_-1", "ns" : "newDB.sites"   } ]查看集合中的索引大小totalIndexSize()db.COLLECTION_NAME.totalIndexSize()如,查看集合sites索引大小:> db.sites.totalIndexSize() 16352 查看数据库中所有索引db.system.indexes.find()db.system.indexes.find()四、创建/重建索引不在需要的索引,我们可以将其删除。删除索引时,可以删除集合中的某一索引,可以删除全部索引。删除指定的索引dropIndex()db.COLLECTION_NAME.dropIndex("INDEX-NAME")如,删除集合sites中名为"name_1_domain_-1"的索引:> db.sites.dropIndex("name_1_domain_-1") { "nIndexesWas" : 2, "ok" : 1 }删除所有索引dropIndexes()db.COLLECTION_NAME.dropIndexes()如,删除集合sites中所有的索引:> db.sites.dropIndexes() {   "nIndexesWas" : 1,   "msg" : "non-_id indexes dropped for collection",   "ok" : 1 }
  • mongodb几种备份恢复方式比较
    总览[hr]MongoDB server 提供了两种备份恢复的方法:一种是通过拷贝底层数据文件进行备份(这种方法又细化为两个不同的操作模式:1.文件快照 2.cp or rsync 等类似的文件传输复制工具)。第二种是通过mongodb 的备份恢复工具mongodump,mongorestore进行对应的备份恢复操作。两种方法有各种的优缺点和适应的应用场景,下面详细进行对比分析。1.通过文件快照(Filesystem Snapshots)进行备份和恢复[hr]概述 文件快照备份依赖mongodb宿主机器的操作系统(linux 的LVM特性),它使用操作系统级别的工具对mongodb数据文件所在的设备进行拷贝备份,由于这种方法使用的是操作系统级别的工具,因此拷贝备份效率高并且可靠性也高,同时也决定了它的一个缺点:需要宿主环境的支持。操作步骤(linux LVM) · 创建快照:lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb· 归档快照:umount/dev/vg0/mdb-snap01; dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz· 恢复快照:lvcreate--size 1G --name mdb-new vg0;gzip -d -c mdb-snap01.gz | ddof=/dev/vg0/mdb-new;mount /dev/vg0/mdb-new /srv/mongodb操作步骤(未开启日志功能或日志文件和数据文件不在同一个卷) · 刷新写操作到硬盘并锁住数据库:db.fsyncLock()· 创建快照· 快照完成后,解锁数据库:db.fsyncUnlock()优点 · 支持时间点的快照备份(point-in-time snapshots)· 更高的效率和可靠性· 在满足一定条件下能够获取分片集群的一致性快照备份· 提供增量备份缺点 · 需要文件系统支持时间点快照(linux:the Logical Volume Manager LVM)· 需要开启日志功能(journalingenabled)并且日志文件和数据文件位于同一个文件卷上(3.2 WiredTiger 数据文件和日志文件可以位于不同的文件卷),否则无法保证快照有效性和一致性· 为获取分片集群的一致快照,需要关闭集群均衡器并在大致相同的时刻从集群的每个分片和配置服务器上抓取快照· 没有开启日志功能时,备份前需要将写落地硬盘,备份中停止任何写操作(MMAPv1)· MMAPv1通过日志功能在快照时无需停止写达到一致状态, WiredTiger通过thelast checkpoint 达到一致状态(Checkpoints 每2G数据或每分钟)· 快照创建整个磁盘的镜像,因此将数据文件,配置,日志放在一个逻辑磁盘上节约空间版本特性 · MongoDB 3.2以上的WiredTiger引擎支持卷级备份,也就是说日志文件(journal files)和数据文件位于不同的磁盘卷上,而3.2以前版本的WiredTiger引擎如果要支持卷级备份,日志文件和数据文件必须在同一个卷上(只要开启日志就无需刷新硬盘并停写进行备份)2.通过cp 或rsync 备份和恢复[hr]概述 利用cp 或者rsync 等类似的文件复制同步工具对mongodb 的数据库文件进行拷贝备份优点 · 无需文件系统支持快照功能缺点 · 备份拷贝前必须停止所有的对mongod的写操作,否则将是一个无效的备份· 不支持副本集时间点级(point in time recovery)恢复,并且很难管理大型分片集群· 备份文件占有更多的空间(包括索引以及重复的底层文件填充和碎片)操作步骤 · 执行对应的文件传输工具命令直接拷贝数据文件3.通过mongodump/mongorestore工具进行备份和恢复[hr]概述 在运行的mongod程序上,mongodump从MongoDB数据库中读取数据生产一个高质量的BSON格式文件,mongorestore则可以将其还原为MongoDB数据库。优点 · 备份恢复小型mongoDB集群更简单和效率,备份文件占有的空间更少(只备份文档,不备份索引)· 备份过程中应用可以继续修改数据(记录oplog,通过--oplog选项达到数据状态一致)缺点 · 备份的数据库中不包含local数据库,只备份数据库的文档不备份数据库索引,因此恢复后必须重建索引· 备份恢复大型mogoDB集群不理想(效率不高)· 备份时会影响运行中的mongod的性能(产生网络流量)· 备份的数据比系统内存大时,查询操作会引起页错误· 必须拥有对应的访问控制权限(执行find操作的权限,内建的backup角色拥有备份的权限)· mongodump不同版本的格式不能兼容,不要使用新版本的mongodump备份老版本的数据操作步骤 · 备份:mongodump--host mongodb.example.net --port 27017 --collection myCollection --db test--out /data/backup/(会覆盖备份目录中的文件)· 恢复:mongorestore--port --oplogReplay4.总结 Snapshot备份时由于是对整个磁盘卷进行快照,为了减少不必要的数据的备份,需要预先将mongodb的数据,日志等放在一个单独的磁盘卷上。而mongodump备份时只备份数据文档,不备份索引,恢复后需要重建。但mongodump可以备份指定的数据库和集合,备份数据更灵活些,但备份的时候会对运行的mongodb产生性能影响。两者对分片集群备份,要产生同一时间点的一致备份,都需要在备份期间停止应用程序对mongodb的写操作,否则两者对分片集群的备份只能达到近似的同一时间点备份(approximately the same moment in time)。 两者在做恢复的时候都需要对集群进行一段时间的停机操作维护。 来源: mongodb几种备份恢复方式比较
  • [技术干货] Python操作MongoDB看这一篇就够了
    。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址,第二个参数为端口(如果不给它传递参数,默认是27017): pymongoclient = pymongo.MongoClient(host=, port=)的第一个参数还可以直接传入MongoDB的连接字符串,它以开头,例如:的属性即可返回test数据库。当然,我们也可以这样指定:对象。    : ,    : ,    : ,    : }的方法即可**数据,代码如下:print(result)属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个类型的属性。方法会在执行后返回值。    : ,    : ,    : ,    : }student2 = {    : ,    : ,    : ,    : }result = collection.insert([student1, student2])print(result)的集合:方法了。当然,继续使用也没有什么问题。官方推荐使用和方法来分别**单条记录和多条记录,示例如下:    : ,    : ,    : ,    : }result = collection.insert_one(student)print(result)print(result.inserted_id)>ab0f15c2606f0c1cf6c5方法不同,这次返回的是对象,我们可以调用其属性获取。方法,我们可以将数据以列表形式传递,示例如下:    : ,    : ,    : ,    : }student2 = {    : ,    : ,    : ,    : }result = collection.insert_many([student1, student2])print(result)print(result.inserted_ids)>[ObjectId(), ObjectId()],调用属性可以获取**数据的列表。或方法进行查询,其中查询得到的是单个结果,则返回一个生成器对象。示例如下:: })print(type(result))print(result)为的数据,它的返回结果是字典类型,运行结果如下:{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}属性,这就是MongoDB在**过程中自动添加的。来查询,此时需要使用bson库里面的: bson.objectid ObjectIdresult = collection.find_one({: ObjectId()})print(result)。方法。例如,这里查找年龄为20的数据,示例如下:: })print(results) result results:    print(result)>{: ObjectId(), : , : , : , : }{: ObjectId(), : , : , : , : }{: ObjectId(), : , : , : , : }类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。,意思是大于,键值为20。来指定正则匹配,代表以M开头的正则表达式。以M开头属性存在的类型为类型的属性中包含字符串https://docs.mongodb.com/manual/reference/operator/query/。方法。比如,统计所有数据条数:print(count): }).count()print(count)方法,并在其中传入排序的字段及升降序标志即可。示例如下:, pymongo.ASCENDING)print([result[] result results])指定升序。如果要降序排列,可以传入。方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:, pymongo.ASCENDING).skip()print([result[] result results])方法指定要取的结果个数,示例如下:, pymongo.ASCENDING).skip().limit()print([result[] result results])方法,原本会返回三个结果,加了限制后,会截取两个结果返回。 bson.objectid ObjectIdcollection.find({: {: ObjectId()}})。方法,指定更新的条件和更新后的数据即可。例如:: }student = collection.find_one(condition)student[] = result = collection.update(condition, student)print(result)为的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用方法将原条件和修改后的数据传入。代表执行成功,代表影响的数据条数。操作符对数据进行更新,代码如下:字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用的话,则会把之前的数据全部用字典替换;如果原本存在其他字段,则会被删除。方法其实也是官方不推荐使用的方法。这里也分为方法和方法,用法更加严格,它们的第二个参数需要使用类型操作符作为字典的键名,示例如下:: }student = collection.find_one(condition)student[] = result = collection.update_one(condition, {: student})print(result)print(result.matched_count, result.modified_count)方法,第二个参数不能再直接传入修改后的字典,而是需要使用这样的形式,其返回结果是类型。然后分别调用和属性,可以获得匹配的数据条数和影响的数据条数。> : {: }}result = collection.update_one(condition, {: {: }})print(result)print(result.matched_count, result.modified_count),也就是年龄加1,执行之后会将第一条符合条件的数据年龄加1。> 方法,则会将所有符合条件的数据都更新,示例如下:: {: }}result = collection.update_many(condition, {: {: }})print(result)print(result.matched_count, result.modified_count)> 方法指定删除的条件即可,此时符合条件的所有数据均会被删除。示例如下:: })print(result)和。示例如下:: })print(result)print(result.deleted_count)result = collection.delete_many({: {: }})print(result.deleted_count)>即删除第一条符合条件的数据,即删除所有符合条件的数据。它们的返回结果都是类型,可以调用属性获取删除的数据条数。、和,它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。、和等。api.mongodb.com/python/current/api/pymongo/collection.html。api.mongodb.com/python/current/api/pymongo/。来源: Python操作MongoDB看这一篇就够了
  • Python操作MongoDB看这一篇就够了
    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。1. 准备工作在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。2. 连接MongoDB连接MongoDB时,我们需要使用PyMongo库里面的MongoClient。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,第二个参数为端口port(如果不给它传递参数,默认是27017):import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)这样就可以创建MongoDB的连接对象了。另外,MongoClient的第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头,例如:client = MongoClient('mongodb://localhost:27017/')这也可以达到同样的连接效果。3. 指定数据库MongoDB中可以建立多个数据库,接下来我们需要指定操作哪个数据库。这里我们以test数据库为例来说明,下一步需要在程序中指定要使用的数据库:db = client.test这里调用client的test属性即可返回test数据库。当然,我们也可以这样指定:db = client['test']这两种方式是等价的。4. 指定集合MongoDB的每个数据库又包含许多集合(collection),它们类似于关系型数据库中的表。下一步需要指定要操作的集合,这里指定一个集合名称为students。与指定数据库类似,指定集合也有两种方式:collection = db.studentscollection = db['students']这样我们便声明了一个Collection对象。5. **数据接下来,便可以**数据了。对于students这个集合,新建一条学生数据,这条数据以字典形式表示:student = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}这里指定了学生的学号、姓名、年龄和性别。接下来,直接调用collection的insert()方法即可**数据,代码如下:result = collection.insert(student) print(result)在MongoDB中,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性。insert()方法会在执行后返回_id值。运行结果如下:5932a68615c2606814c91f3d当然,我们也可以同时**多条数据,只需要以列表形式传递即可,示例如下:student1 = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}student2 = {    'id': '20170202',    'name': 'Mike',    'age': 21,    'gender': 'male'}result = collection.insert([student1, student2])print(result)返回结果是对应的_id的集合:[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]实际上,在PyMongo 3.x版本中,官方已经不推荐使用insert()方法了。当然,继续使用也没有什么问题。官方推荐使用insert_one()和insert_many()方法来分别**单条记录和多条记录,示例如下:student = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}result = collection.insert_one(student)print(result)print(result.inserted_id)运行结果如下:<pymongo.results.InsertOneResult object at 0x10d68b558>5932ab0f15c2606f0c1cf6c5与insert()方法不同,这次返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。对于insert_many()方法,我们可以将数据以列表形式传递,示例如下:student1 = {    'id': '20170101',    'name': 'Jordan',    'age': 20,    'gender': 'male'}student2 = {    'id': '20170202',    'name': 'Mike',    'age': 21,    'gender': 'male'}result = collection.insert_many([student1, student2])print(result)print(result.inserted_ids)运行结果如下:<pymongo.results.InsertManyResult object at 0x101dea558>[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]该方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取**数据的_id列表。6. 查询**数据后,我们可以利用find_one()或find()方法进行查询,其中find_one()查询得到的是单个结果,find()则返回一个生成器对象。示例如下:result = collection.find_one({'name': 'Mike'})print(type(result))print(result)这里我们查询name为Mike的数据,它的返回结果是字典类型,运行结果如下:<class 'dict'>{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}可以发现,它多了_id属性,这就是MongoDB在**过程中自动添加的。此外,我们也可以根据ObjectId来查询,此时需要使用bson库里面的objectid:from bson.objectid import ObjectIdresult = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})print(result)其查询结果依然是字典类型,具体如下:{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}当然,如果查询结果不存在,则会返回None。对于多条数据的查询,我们可以使用find()方法。例如,这里查找年龄为20的数据,示例如下:results = collection.find({'age': 20})print(results)for result in results:    print(result)运行结果如下:<pymongo.cursor.Cursor object at 0x1032d5128>{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。如果要查询年龄大于20的数据,则写法如下:results = collection.find({'age': {'$gt': 20}})这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为20。这里将比较符号归纳为下表。符号含义示例$lt小于{'age': {'$lt': 20}}$gt大于{'age': {'$gt': 20}}$lte小于等于{'age': {'$lte': 20}}$gte大于等于{'age': {'$gte': 20}}$ne不等于{'age': {'$ne': 20}}$in在范围内{'age': {'$in': [20, 23]}}$nin不在范围内{'age': {'$nin': [20, 23]}}另外,还可以进行正则匹配查询。例如,查询名字以M开头的学生数据,示例如下:results = collection.find({'name': {'$regex': '^M.*'}})这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式。这里将一些功能符号再归类为下表。符号含义示例示例含义$regex匹配正则表达式{'name': {'$regex': '^M.*'}}name以M开头$exists属性是否存在{'name': {'$exists': True}}name属性存在$type类型判断{'age': {'$type': 'int'}}age的类型为int$mod数字模操作{'age': {'$mod': [5, 0]}}年龄模5余0$text文本查询{'$text': {'$search': 'Mike'}}text类型的属性中包含Mike字符串$where高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数关于这些操作的更详细用法,可以在MongoDB官方文档找到:https://docs.mongodb.com/manual/reference/operator/query/。7. 计数要统计查询结果有多少条数据,可以调用count()方法。比如,统计所有数据条数:count = collection.find().count() print(count)或者统计符合某个条件的数据:count = collection.find({'age': 20}).count()print(count)运行结果是一个数值,即符合条件的数据条数。8. 排序排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志即可。示例如下:results = collection.find().sort('name', pymongo.ASCENDING)print([result['name'] for result in results])运行结果如下:['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']这里我们调用pymongo.ASCENDING指定升序。如果要降序排列,可以传入pymongo.DESCENDING。9. 偏移在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:results = collection.find().sort('name', pymongo.ASCENDING).skip(2)print([result['name'] for result in results])运行结果如下:['Kevin', 'Mark', 'Mike']另外,还可以用limit()方法指定要取的结果个数,示例如下:results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)print([result['name'] for result in results])运行结果如下:['Kevin', 'Mark']如果不使用limit()方法,原本会返回三个结果,加了限制后,会截取两个结果返回。值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询:from bson.objectid import ObjectIdcollection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})这时需要记录好上次查询的_id。10. 更新对于数据更新,我们可以使用update()方法,指定更新的条件和更新后的数据即可。例如:condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 25result = collection.update(condition, student)print(result)这里我们要更新name为Kevin的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用update()方法将原条件和修改后的数据传入。运行结果如下:{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}返回结果是字典形式,ok代表执行成功,nModified代表影响的数据条数。另外,我们也可以使用$set操作符对数据进行更新,代码如下:result = collection.update(condition, {'$set': student})这样可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。而如果不用$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除。另外,update()方法其实也是官方不推荐使用的方法。这里也分为update_one()方法和update_many()方法,用法更加严格,它们的第二个参数需要使用$类型操作符作为字典的键名,示例如下:condition = {'name': 'Kevin'}student = collection.find_one(condition)student['age'] = 26result = collection.update_one(condition, {'$set': student})print(result)print(result.matched_count, result.modified_count)这里调用了update_one()方法,第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式,其返回结果是UpdateResult类型。然后分别调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。运行结果如下:<pymongo.results.UpdateResult object at 0x10d17b678>1 0我们再看一个例子:condition = {'age': {'$gt': 20}}result = collection.update_one(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)这里指定查询条件为年龄大于20,然后更新条件为{'$inc': {'age': 1}},也就是年龄加1,执行之后会将第一条符合条件的数据年龄加1。运行结果如下:<pymongo.results.UpdateResult object at 0x10b8874c8>1 1可以看到匹配条数为1条,影响条数也为1条。如果调用update_many()方法,则会将所有符合条件的数据都更新,示例如下:condition = {'age': {'$gt': 20}}result = collection.update_many(condition, {'$inc': {'age': 1}})print(result)print(result.matched_count, result.modified_count)这时匹配条数就不再为1条了,运行结果如下:<pymongo.results.UpdateResult object at 0x10c6384c8>3 3可以看到,这时所有匹配到的数据都会被更新。11. 删除删除操作比较简单,直接调用remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除。示例如下:result = collection.remove({'name': 'Kevin'})print(result)运行结果如下:{'ok': 1, 'n': 1}另外,这里依然存在两个新的推荐方法——delete_one()和delete_many()。示例如下:result = collection.delete_one({'name': 'Kevin'})print(result)print(result.deleted_count)result = collection.delete_many({'age': {'$lt': 25}})print(result.deleted_count)运行结果如下:<pymongo.results.DeleteResult object at 0x10e6ba4c8>14delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据。它们的返回结果都是DeleteResult类型,可以调用deleted_count属性获取删除的数据条数。12. 其他操作另外,PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()和find_one_and_update(),它们是查找后删除、替换和更新操作,其用法与上述方法基本一致。另外,还可以对索引进行操作,相关方法有create_index()、create_indexes()和drop_index()等。关于PyMongo的详细用法,可以参见官方文档:http://api.mongodb.com/python/current/api/pymongo/collection.html。另外,还有对数据库和集合本身等的一些操作,这里不再一一讲解,可以参见官方文档:http://api.mongodb.com/python/current/api/pymongo/。本节讲解了使用PyMongo操作MongoDB进行数据增删改查的方法。
  • [热门活动] 【★盛大公测★】MongoDB 社区增强版,计算存储分离黑科技,3 倍性价比!
    要想数据安全麻烦少,备份恢复先做好!华为云文档数据库 DDS 推出 MongoDB 社区增强版:Cloud Native文档数据库,计算存储分离黑科技,提升 10 倍备份恢复能力、10 倍故障重构能力;读写性能 300% 提升、弹性扩容能力 100 倍增强。体验传送门 》》》 高性能低成本,我们是认真的场景一:  场景二: 场景三:  确认过眼神,我们是一路人(MongoDB 社区增强版三大使用场景)互联网应用 分钟级横向扩容快人一步互联网业务增长快,满足互联网业务高横向扩展能力的要求;100GB 数据扩容及数据均衡 5 分钟内完成。 游戏场景 10倍备份恢复性能,提升回档效率超高读性能,应对游戏高峰期数据访问需求;超强横向扩展能力,满足高峰期业务压力 物联网业务 轻松承载海量数据高并发写入超高写性能,满足物联网服务海量数据高并发写入需求。 了解更多华为云数据库 MongoDB 社区增强版,请移步官网点击这里 
  • 【看点】分布式文档存储数据库 MongoDB 3.6.6 即将发布
    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB 官网上显示 MongoDB 3.6.6 即将发布,不过已经公布了新版的发布说明和更新日志。可以看到,该版本主要是解决了一些 issue,其他变更主要也集中在安全、分片、复制和查询方面。(内容来源:开源中国)
  • 【看点】7 月全球数据库排名:MongoDB 紧追 PostgreSQL!
    来源:开源中国 作者:OSC-王练 DB-Engines 发布了 2018 年 7 月份的数据库排名,排名前三的依然是 Oracle、MySQL 和 Microsoft SQL Server 。 前 20 名的数据库中,对比上个月,第 13 位和第 14 位的 Splunk 和 MariaDB 互换了位置,第 15 和第 16 位的 SAP Adaptive Server 和 Solr 位置进行了对调。 MongoDB 是此榜单中涨幅最大的一个,上涨 6.54 个百分点。若保持趋势,则有望挑战 PostgreSQL 的位置。 PostgreSQL 本月出现回落,下跌 4.86 的百分点。 18716 完整排名请查看:https://db-engines.com/en/ranking 前三强走势: 18717 PostgreSQL 和 MongoDB 走势: 18718 DB-Engines 排名的数据依据 5 个不同的因素: [*]Google 以及 Bing 搜索引擎的关键字搜索数量 [*]Google Trends 的搜索数量 [*]Indeed 网站中的职位搜索量 [*]LinkedIn 中提到关键字的个人资料数 [*]Stackoverflow 上相关的问题和关注者数量 这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术,才是最重要的。
  • [技术干货] 常见问题FAQ(DDS)-更新至529
    问题描述回复1、华为DDS对应的的阿里和亚马逊的哪个服务?华为云DDS,对标阿里的云数据库MongoDB;对标亚马逊的DynamoDB2、华为DDS命名中为什么不直接使用MongoDB?MongoDB是由MongoDB公司运营的一款开源数据库软件,该公司有明确的商标保护。华为处于尊重原厂、遵守商标保护法的角度,采用DDS命名,寓意MongoDB是面向文档的NoSQL数据库3、华为DDS目前和阿里的最大区别是什么?阿里的MongoDB服务化开始时间较早,在数据库生态方面较全,例如大数据分析对接等功能。华为云计划今年内在生态上追平4、华为DDS目前和阿里的最大的相同点是什么?均支持MongoDB集群(Sharding)、副本集(ReplicaSet)、单节点(Single)三种架构。分别满足高可用/高扩展性需求、高可用需求、非核心业务高性价比需求的用户选型。目前华为云DDS副本集支持包年包月购买,集群支持按需购买,单节点正在公测5、华为DDS是否支持跨AZ高可用?跨AZ特性依赖于ECS是否有跨AZ的资源,6月份华东区三AZ资源到位。预计7月20日左右上线副本集跨三AZ的能力6、为什么DDS副本集、集群不考虑跨两AZ的设计?MonogoDB集群/副本集的三节点高可用架构,存在“多数派选举机制”:若将1个节点放在1个AZ,另外2个节点放在1个AZ,当另外2个节点挂了,数据库也是不可用,因此意义不大;原生MongoDB副本集/集群架构不支持实例级别的两AZ部署,需要服务改造,目前所有云商均未提供该能力7、华为DDS跟社区版MongoDB有什么区别吗?目前由于数据库通过云化,服务化封装后,关闭了一些功能,另外华为是一家非常重视安全的公司,将一些存在安全隐患的功能也关闭了,但我们会根据市场需求,陆续通过内核改造,安全加固的方式陆续开放出来,详细区别请点击查看8、什么情况下选择集群(sharding)架构?   集群是基于多个副本集(每个副本沿用三节点高可用模式)组成。集群的主要特点是横向扩展能力强,能满足用户不断增长的数据量需求,目前DDS可支持1T~12T的数据量。因此当客户对可用性要求较高、数据量较大(>2T)、未来扩展性要求较高的情况下,推荐用户使用集群架构9、什么情况下选择副本集(replica)架构?副本集是三节点高可用的结构,DDS副本集目前最大可支持1T的数据存储量。因此,当客户对可用性要求高、数据量不大(<1T)、未来扩展性要求不高的情况下,推荐用户使用副本集架构10、什么情况下选择单节点(single)架构?单节点是一个成本低、可用性相对较弱架构选型,当前最大可支持1T的数据存储量。因此,当客户对可用性要求不高(比如非核心业务/测试场景/个人学习场景,能接受数据丢失)、数据量不大的情况下,推荐用户使用单节点架构11、集群(sharding)架构里的mongos、config、shard组件分别有什么作用?三者如何配合工作的?DDS分片集群架构由路由(mongos)、配置(config)和分片(shard)组成。数据读写请求经mongos分发,通过查询config信息,并行分配到相应shard,可轻松应对高并发场景,且config和shard均采用三副本架构,保证高可用。12、副本集的三节点高可用架构,是如何保证高可用的?DDS副本集架构由主节点(Primary)、备节点(Secondary)和隐藏节点(Hidden)组成。用户可以直接操作主节点和备节点,当主节点故障时,系统自动选出新的主节点,当备节点不可用时,隐藏节点接管服务,保证高可用13、华为DDS是怎么收费的?集群目前支持按需购买,计划7月20日左右支持包周期;副本集支持按需和包周期购买;单节点目前在公测阶段。价格与友商持平,主流价格低于友商:点击查看14、华为DDS支持MongoDB的那个版本?为什么没有小版本说明?是否会支持更多版本?目前支持的版本为3.2,子版本不呈现给用户,一方面由于子版本较多,不利于统一维护,另外随着更稳定的子版本发布,我们希望能够统一维护,帮助用户分批升级。6月20日左右,DDS可支持3.4版本15、华为DDS上MongoDB的admin库下创建不collection?基于最佳实践的考虑,DDS不允许admin下mongodb创建集合。16、华为DDS上为何Hidden不让用户看到,而secendary可以让客户看到?因为首先要实现高可用,是需要3节点的(MysQL的高可用其实也是3节点,只是有一个仲裁的角色藏在后台,用户看不到),secondary可能会被用户用于只读(虽然这样做有很多问题需要考虑),所以Hidden不可缺少,但一般需要一个保留住特殊节点,避免用户侧发出额外的工作负载,这样让hidden可以做一些特殊操作,比如:备份可以在hidden上做,而不影响Primary和secondary17、建立数据库连接失败的原因有哪些?1.数据库客户端版本与DDS支持的版本不匹配;2.账号密码错误;3.开启SSL,但是用普通方式连接:点击查看18、哪里可以查看更多场常见问题?点击查看
  • [技术干货] MongoDB基于角色的访问控制
    本帖最后由 昵称 于 2018-5-27 19:04 编辑MongoDB采用基于角色的访问控制(RBAC Role-Based Access Control)来管理对MongoDB系统的访问。 用户被授予一个或多个角色来确定用户对数据库资源和操作的访问权限。 在分配的角色之外,用户无权访问系统。 启用访问控制 MongoDB默认不启用访问控制。 使用--auth(命令行参数)或security.authorization(配置文件中参数)设置启用授权。 启用内部验证还可以启用客户端授权。 一旦启用访问控制,用户必须进行身份验证。 15967 角色 角色授予在指定资源上执行指定操作的权限。 可以在角色中明确指定每个权限,或者从另一个角色继承。 权限 权限由指定资源和资源上允许的操作组成。 资源是数据库,集合,文档或集群。 如果资源是集群,则关联的操作会影响系统的状态,而不会影响特定的数据库或集合 操作 定义了指定资源上允许的操作。比如 find, insert, update,listIndexes, createUser, replSetGetStatus等 继承权限 定义一个角色,可以包含一个或多个角色,在这种情况下角色会继承所包含角色的所有权限 一个角色可以继承本数据库的其他角色的权限,在admin数据库上创建的角色可以继承任何数据库创建的角色 查看角色的权限 在showPrivileges 和 showBuiltinRoles 权限都设置为true的情况下,用户可以通过rolesInfo命令查询角色权限 用户和角色 在用户创建的时候,可以分配角色,也可以给存在的用户授予或者撤销角色 分配了角色的用户会得到该角色的所有权限,一个用户可有多个角色,通过分配给一个用户不同数据库的角色。在一个数据库创建的用户可以具有其他数据库的操作权限 第一个创建的系统用户具有管理其他用户的权限 内置角色和用户自定义角色 Mongodb提供了内置角色,提供数据库系统用户通常需要的一些权限. 参考 MongoDB内置角色 如果内置角色不足以满足需要,MongoDB提供了方法创建或者修改用户自定义角色
总条数:168 到第
上滑加载中