• [技术干货] MongoDB shardCollection介绍
    1.    特性概述 对于mongodb分片集群来说,在默认情况下一个集合的数据都是存储在一个shard上。如果一个集合的数据量非常大,就会导致不同shard之间的业务负载有很大差异,这种情况显然是不合理的。所以大多数情况下都应该对集合开启分片,也就是执行shardCollection,这个命令的作用就是开启集合在不同shard之间的自动均衡。2.    命令原理 shardCollection命令的基本要素是指定集合(namespace)和片键(key);片键是集合文档中的一个字段,片键字段所对应的值就是collection切分为不同chunk的依据。shard概念及片键选择建议请参考https://docs.mongodb.com/manual/sharding/3.    约束l  如果是新集合,选择片键后,mongo会在片键上创建索引。l  一个集合不能同时选择多个片键。l  不能update片键对应字段。l  如果集合不为空,则在shardCollection之前需要在对应片键上提前创好索引。l  分片集合不能在片键以外的字段创建唯一索引。l  选择片键时不能有片键以外的字段存在唯一索引。4.    处理逻辑shardCollection命令在mongos上执行,命令入口cluster_shard_collection_cmd.cpp:1)        cluster_shard_collection_cmd.cpp的run方法:可以看到命令内部有一个是否retry的判断,后面部分判断和rollback的逻辑都是为了命令重试的场景因为创建片键的限制比较多,所以校验逻辑也会比较长。除了命令入参的合法性校验以外的核心就是usefulIndex校验。因为对于有数据的集合,在片键上有合法索引才能shardCollection。上面是入参校验。涉及到的两个知识点:collation参考 http://www.mongoing.com/archives/3912, view参考 http://www.mongoing.com/archives/3502。合法索引校验。校验完成后会调用harding_catalog_client_impl.cpp的shardCollection方法。2)        sharding_catalog_client_impl.cpp的shardCollection方法:该方法主要用来:l  获取集合的分布式锁,防止shardCollection过程中集合被删除或重复调用shardCollection。l  在config.changelog中写入记录shardCollection.start。l  调用config的shard_collection.cpp的run方法。3)        shard_collection.cpp的run方法: 该方法有两个主要分支,如果是新集合直接走run_normal方法,如果不是新集合走shardCollectionExist2方法。l  先看run_normal方法的实现: 主要工作是创建集合和索引的元数据对于hash分片的新集合有一个特殊处理,这种场景会先算出一批拆分点,并同时创出一批chunk(numShards-1)。拆分原理是把hash值的范围进行均分(-MIN long, +MAX long),long类型是64位,所以hash的最大值是2^64,这样做的好处是可以一开始就保证数据的均匀分布,减少迁移。如果不符合该条件则调用_create_one_chunk方法创建一个chunk。l  接着看shardCollectionExist2方法的实现:可以发现对有数据集合执行shardCollection的逻辑要复杂一些 一开始也是执行run_normal方法,但这种场景下入参newCmdObj是不同的。在创建集合元数据时会先创建一个临时的集合。等临时集合创建好后,会把旧集合的数据和索引拷贝过来,然后重命名这个临时集合。至此shardCollection的主要流程解释完成。
  • [技术干货] 华为云数据库—MongoDB经典故障案例四:调整oplog大小,引起从库宕机怎么办?
  • [技术干货] MongoDB经典故障系列三|副本集延迟太高怎么办?
  • [技术干货] MongoDB经典故障系列二:如何限制最大连接数?
    华为开发者大会2020(Cloud)是华为面向ICT(信息与通信)领域全球开发者的年度顶级旗舰活动。大会旨在搭建一个全球性的交流和实践平台,开放华为30年积累的ICT技术和能力,以“鲲鹏+昇腾”硬核双引擎,为开发者提供澎湃动力,改变世界,变不可能为可能。我们期待与你共创计算新时代在一起,梦飞扬!
  • [技术干货] MongoDB经典故障系列一|数据库频繁启动失败怎么办?
    华为开发者大会2020(Cloud)是华为面向ICT(信息与通信)领域全球开发者的年度顶级旗舰活动。大会旨在搭建一个全球性的交流和实践平台,开放华为30年积累的ICT技术和能力,以“鲲鹏+昇腾”硬核双引擎,为开发者提供澎湃动力,改变世界,变不可能为可能。我们期待与你共创计算新时代在一起,梦飞扬!
  • 云原生时代下MongoDB的寻求与突破
    1月4日,2019年MongoDB中文社区年终盛会在深圳时代大厦举行,大会邀请了众多知名云服务商和业内技术大咖,共同畅谈云时代下MongoDB如何寻求突破,如何给企业带来巨大红利。华为云NoSQL数据库负责人胡达与会并发表了《云原生时代的MongoDB》的主题演讲,表示云原生数据库在性价比、数据可靠性、弹性伸缩等方面十分具有优势,对企业发展具有重大意义。华为云NoSQL数据库负责人胡达现场分享云原生时代下的MongoDB随着数字化和智能化进程的加快,数据上云成为了各大企业的首选,而MongoDB也在数字化进程中不断加速云化过程,云服务也愈来愈多样,胡达对目前云上MongoDB的典型部署架构作了简要分析。目前国内云厂商的MongoDB兼容云服务基本是以社区开源版本的托管为主,通过用云硬盘替代本地硬盘,发挥了一部分云计算优势,实现存储容量快速扩展;提供一站式的部署、管理、运维能力,在数据可靠性、安全性、备份恢复等方面有一定的易用性改进,减轻了DBA的工作负担。但是,相比国外友商的基于云原生架构同类云服务产品,在弹性、高可用、可靠性、性能稳定等方面仍存在差距。会上胡达分享了云原生时代的MongoDB,认为未来的方向是计算存储分离架构下的Serverless模式,给用户提供更简单易用的使用体验。华为云GeminiDB的更多可能性基于云时代下客户数据上云,企业的数字化转型,客户对MongoDB的使用,大数据量的压力这些痛点,胡达在会上重点介绍了华为云数据库GeminiDB,这是一款基于华为自主研发的计算存储分离架构的分布式多模NoSQL数据库服务,100%兼容MongoDB接口,并提供高性能、高可靠的优势。与市面上各类MongoDB云服务相比,GeminiDB for MongoDB API构筑了以下优势:一是分钟级计算节点扩容和秒级存储扩容,扩容性能提升百倍,满足敏捷业务弹性需要。二是高性价比,同等成本下提升了3倍写性能。三是数据高可靠,基于分布式存储的数据副本故障快速恢复能力,副本重建时长缩短10倍+。此外,GeminiDB for MongoDB API支持单套实例最大100TB数据,N-1个节点故障容忍,具备一键部署、监控报警等服务能力。胡达表示,华为云数据库会充分利用华为软硬件优势持续构建业内领先的技术和服务,打造真正的云原生MongoDB API兼容的云服务。未来,云原生数据库,我们可以做得更好。欲了解更多云数据库详情,请前往华为云官网:https://www.huaweicloud.com/product/geminidb.html
  • KUNPENG平台MongoDB3.6.13移植自动安装脚本
    1 MongoDB简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。2 环境信息2.1 环境信息类别子项版本获取地址OSCentOS7.5 Aarch64href="https://www.centos.org/download/" https://www.centos.org/download/服务器配置16U16GB50GB软件MongoDB3.6.13https://github.com/mongodb/mongo/archive/r3.6.13.tar.gz3 软件移植3.1 环境准备:OS安装类型:CentOS-7.5-aarch64-1804。 注:操作系统安装使用最小简化版安装(如上图),其余步骤安装一般安装操作系统步骤即可。网络安装arm版MongoDB的所在服务器上必须联网,能够使用网络yum源,否则执行脚本会失败。 3.1.1 相关软件下载上传:无  3.2 安装MongoDB 1、 上传以下脚本至要安装MongoDB的服务器上的任意目录,如/opt。(mongodb_install.sh)2、 执行如下命令添加执行权限:    chmod +x /opt/mongodb_install.sh3、 执行脚本,提示mongodb install success表示安装成功    sh /opt/mongodb_install.sh 3.3 验证执行1.进入mongodb安装目录/bin,执行./mongod开启服务 2.执行./mongo,使用客户端连接,简单执行增加和查询  
  • [技术干货] 华为云DDS服务携三大价值特性助力企业云服务更上一层楼
    华为云文档数据库DDS是一款兼容MongoDB协议,在华为云高性能、高可用、高安全、可弹性伸缩的基础上,提供了一键部署、弹性扩容、容灾、备份、恢复、监控等服务能力的产品。目前,DDS社区版新增了审计日志、库表级时间点恢复、兼容MongoDB4.0版本三大价值特性,功能更完善,性能进一步提升。 一、审计策略灵活设置,保留时间长达2年华为云DDS服务社区版集群、副本集和单节点支持审计日志,保留天数长达732天,且价格亲民。(1)华为云审计日志除了能对整个实例审计之外,还支持只设置部分表,比如有些日志表不需要审计的,则可以不进行审计,也可以根据语句类型来审计。目前各大云服务的审计日志大多只能做到实例级,也就是所有表都审计,没有那么灵活。华为云DDS既考虑了客户的审计使用,又能让客户灵活设置敏感表的审计,节省了审计成本。(2)审计日志保留时间长达2年。二、库表级时间点恢复灵活迅速华为云DDS采取了灵活性和恢复效率合一的方式,单次恢复可以支持每个库表恢复到不同时间点,比如游戏场景,可能每个局服开局时间不一致,华为云DDS可支持单次多时间点回档。首先选择基准时间点,我们通过这个基准时间点来选择基准全备,然后展示基准可恢复时间区间,单次恢复每个库表可以在这个时间区间里面选择任意不同的时间点。三、全面兼容MongoDB社区4.0版本华为云DDS目前支持分片集群(Sharding)、副本集(ReplicaSet)和单节点(Single)三种部署架构,三大架构全面兼容MongoDB社区4.0版。华为云DDS服务三大价值特性的加持使其领先行业,在市面上具有极大优势,社区版现已发布,如想体验领先的服务,想企业更好更快地上云,敬请前往华为云官网:https://www.huaweicloud.com/product/dds.html?utm_source=wechat&utm_medium=officialaccount&utm_campaign=dds_1011&utm_content=sjk_dds
  • 【漏洞分享】基于鲲鹏云服务器的MongoDB未授权访问漏洞检测及整改建议
    #化鲲为鹏,我有话说#此前我在发表(shui)帖子(tie)的时候,有一篇帖子讲到了关于MongoDB的安装以及对其安全账户的一些配置问题,紧接着过了两天在网上冲浪的时候看到了一篇关于MongoDB未授权访问的漏洞,吓得赶紧排查核实了一下。爱发帖(shui)子(tie)的我赶紧给大家分享一哈~哈哈哈环境:华为云鲲鹏服务器    镜像:Ubuntu 18.04 64bit ARM架构(Debian系)主角MongoDB安装历程,传送门:https://bbs.huaweicloud.com/forum/thread-24370-1-1.html此处的版本为3.6MongoDB shell version v3.6.3connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.6.3一、漏洞危害对外开放的MongoDB服务(公网开放),存在未配置访问认证授权漏洞,无需认证连接数据库后对数据库进行任意操作(常见的增、删、改、查操作),存在严重的数据泄露风险。二、漏洞成因MongoDB服务安装后,默认未开启权限验证。如果服务监听在0.0.0.0,则可远程无需授权访问数据库。3.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。3.0之前版本,如未添加用户管理员账号及数据库账号,使用--auth参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;3.0及之后版本,使用--auth参数启动后,无账号则本地和远程均无任何数据库访问权限。三、漏洞验证MongoDB存在未授权访问漏洞时,执行show dbs命令,无报错信息,列表存在默认库local库,则判断存在未授权访问(local库即便删除,重启MongoDB后仍会生成)。赶紧检查一波服务器,不过咱们这版本这么高,应该不可能存在漏洞吧~、mongo --authenticationMechanism argMongoDB shell version v3.6.3connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.6.3> show dbs数据库回显error,msg称未验证的admin用户来执行命令。四、整改建议    方案1:本地监听如MongoDB只需在本地使用,建议只在本地开启监听服务,使用--bind_ip 127.0.0.1绑定监听地址。$ mongod --bind_ip 127.0.0.1 --dbpath /tmp/test###本地监听端口即可或:在配置文件中指定监听IP,Linux下默认配置文件为/etc/mongod.conf。# network interfacesnet:  port: 27017  bindIp: 127.0.0.1指定配置文件启动mongod --config /etc/mongod.conf方案2:启动基于角色的登录认证功能上面的传送门里有启用登录认证的教程~溜了溜了~水完贴就溜了
  • [中间件] 【华为云鲲鹏云服务最佳实践】【数据库篇】第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成功!
总条数:166 到第
上滑加载中