MongoDB 3.2复制集单节点部署(四)
MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源。在这里我使用的是MongoDB 3.2版本进行复制集实验(但MongoDB配置文件使用的是老版本格式),一共使用三个节点,一个是主节点(PRIMARY),一个是从节点(SECONDARY),一个是投票节点(ARBITER)。如下图:

一、实验环境
1)节点信息:192.168.60.10
3)节点确保iptables和selinux已关闭
| 1 2 | [root@node1 ~]# iptables -F [root@node1 ~]# setenforce 0 | 
二、安装MongoDB 3.2
| 1 2 3 4 5 | mongodb-org-3.2.0-1.el6.x86_64.rpm mongodb-org-mongos-3.2.0-1.el6.x86_64.rpm mongodb-org-server-3.2.0-1.el6.x86_64.rpm mongodb-org-shell-3.2.0-1.el6.x86_64.rpm mongodb-org-tools-3.2.0-1.el6.x86_64.rpm | 
PS:需要的软件包可以去https://repo.mongodb.org/yum/redhat/下载,MongoDB的安装很简单,怎么安装都成。
三、配置单点复制集(启动三个套接字)
1)创建所需要的目录
| 1 2 3 4 5 6 | $ mkdir -p /data/mongodb/{conf,log,pid,data} $ mkdir -p /data/mongodb/conf/{conf27017,conf27018,conf27019} $ mkdir -p /data/mongodb/log/{log27017,log27018,log27019} $ mkdir -p /data/mongodb/pid/{pid27017,pid27018,pid27019} $ mkdir -p /data/mongodb/data/{data27017,data27018,data27019} $ chown -R mongod.mongod /data/mongodb/data/{data27017,data27018,data27019} | 
2)创建三个配置文件
192.168.60.10:27017
| 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 | $ cat /data/mongodb/conf/conf27017/mongod.conf # 开启日志文件; logpath = /data/mongodb/log/log27017/mongod.log # 开启日志追加; logappend = true # 指定数据目录; dbpath = /data/mongodb/data/data27017 # 实例端口; port = 27017 # 绑定地址; bind_ip = 0.0.0.0 # 守护进程模式开启; fork = true # 进程号文件; pidfilepath = /data/mongodb/pid/pid27017/mongod.pid # 日志回转; logRotate = rename # 日志时间格式; timeStampFormat = ctime # 日志刷盘间隔(默认100毫秒); journalCommitInterval = 100 # 数据刷盘间隔(默认60秒); syncdelay = 60 # 最大连接数(默认65536); maxConns = 65536 ###Replica Set # Oplog大小(单位MB); oplogSize = 1024 # 复制集名称; replSet = ywnds | 
192.168.60.10:27018
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ cat /data/mongodb/conf/conf27018/mongod.conf logpath = /data/mongodb/log/log27018/mongod.log logappend = true dbpath = /data/mongodb/data/data27018 port = 27018 bind_ip = 0.0.0.0 fork = true pidfilepath = /data/mongodb/pid/pid27018/mongod.pid logRotate = rename timeStampFormat = ctime journalCommitInterval = 100 syncdelay = 60 maxConns = 65536 ###Replica Set oplogSize = 1024 replSet = ywnds | 
192.168.60.10:27019
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ cat /data/mongodb/conf/conf27019/mongod.conf logpath = /data/mongodb/log/log27019/mongod.log logappend = true dbpath = /data/mongodb/data/data27019 port = 27019 bind_ip = 0.0.0.0 fork = true pidfilepath = /data/mongodb/pid/pid27019/mongod.pid logRotate = rename timeStampFormat = ctime journalCommitInterval = 100 syncdelay = 60 maxConns = 65536 ###Replica Set oplogSize = 1024 replSet = ywnds | 
PS:更多具体参数详细含义请看《MongoDB命令行选项介绍》
3)启动集群(所有节点)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ killall mongod $ mongod -f /data/mongodb/conf/conf27019/mongod.conf about to fork child process, waiting until server is ready for connections. forked process: 35554 child process started successfully, parent exiting $ mongod -f /data/mongodb/conf/conf27018/mongod.conf about to fork child process, waiting until server is ready for connections. forked process: 35601 child process started successfully, parent exiting $ mongod -f /data/mongodb/conf/conf27017/mongod.conf about to fork child process, waiting until server is ready for connections. forked process: 35648 child process started successfully, parent exiting | 
查看进程三个节点都启动
| 1 2 3 4 | $ netstat -anplt | grep mongod tcp        0      0 0.0.0.0:27019         0.0.0.0:*                   LISTEN      35554/mongod        tcp        0      0 0.0.0.0:27017         0.0.0.0:*                   LISTEN      35648/mongod        tcp        0      0 0.0.0.0:27018         0.0.0.0:*                   LISTEN      35601/mongod | 
4)选择一个节点做主节点(可以随意选择一个,这里我使用21017)
| 1 2 3 4 | $ mongo 192.168.60.10:27017/admin MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27017/admin > | 
5)初始化27017节点
5.1.为复制集初始化建立配置文档
| 1 2 3 4 5 6 7 | > config = { _id:"ywnds", members:[ {_id:0,host:"192.168.60.10:27017"}, {_id:1,host:"192.168.60.10:27018"}, {_id:2,host:"192.168.60.10:27019"} ]} | 
5.2.更新配置文档参数,设置27019为arbiterOnly(投票节点)
| 1 | > config.members[2] = {"_id":2,"host":"192.168.60.10:27019","arbiterOnly":true} | 
PS:上面是把复制集初始化配置文档赋值给config变量,这里是通过membes数组的索引来修改节点属性,数组索引从0开始。
具体的配置文档说明请看《MongoDB复制集配置文档介绍》
5.3.使用rs.initiate(cfg)初始化集群
| 1 2 3 4 5 | > rs.initiate(config) {          "info" : "Config now saved locally.  Should come online in about a minute.",          "ok" : 1 } | 
这里使用rs.initiate(config)初始化集群,config文件为我们上面定义的。这里的ok返回值为1表示命令执行成功,如果为0则表示没有执行成功。跟Linux中的状态值刚好相反。现在可以使用rs.conf()方法返回配置文件内容。
| 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 | ywnds:PRIMARY> rs.conf() {          "_id" : "ywnds",          "version" : 2,          "protocolVersion" : NumberLong(1),          "members" : [                    {                             "_id" : 0,                             "host" : "192.168.60.10:27017",                             "arbiterOnly" : false,                             "buildIndexes" : true,                             "hidden" : false,                             "priority" : 1,                             "tags" : {                             },                             "slaveDelay" : NumberLong(0),                             "votes" : 1                    },                    {                             "_id" : 1,                             "host" : "192.168.60.10:27018",                             "arbiterOnly" : false,                             "buildIndexes" : true,                             "hidden" : false,                             "priority" : 1,                             "tags" : {                             },                             "slaveDelay" : NumberLong(0),                             "votes" : 1                    },                    {                             "_id" : 2,                             "host" : "192.168.60.10:27019",                             "arbiterOnly" : true,                             "buildIndexes" : true,                             "hidden" : false,                             "priority" : 1,                             "tags" : {                             },                             "slaveDelay" : NumberLong(0),                             "votes" : 1                    }          ],          "settings" : {                    "chainingAllowed" : true,                    "heartbeatIntervalMillis" : 2000,                    "heartbeatTimeoutSecs" : 10,                    "electionTimeoutMillis" : 10000,                    "getLastErrorModes" : {                    },                    "getLastErrorDefaults" : {                             "w" : 1,                             "wtimeout" : 0                    }          } } | 
在Mongodb3.2版本中,相比之前的版本rs.conf返回配置文件的信息更加详细了。把”arbiterOnly”、”buildIndexes”、”hidden”、”priority”、”tags”、”slaveDelay”、”votes”的默认值都给真是出来了,具体的含义看《MongoDB复制集配置文档介绍》。
5.4.查看集群状态
| 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 | ywnds:PRIMARY> rs.status() {  "set" : "ywnds",  "date" : ISODate("2016-02-03T01:56:49Z"),  "myState" : 1,  "members" : [  {  "_id" : 0,  "name" : "192.168.60.10:27017",  "health" : 1,  "state" : 1,  "stateStr" : "PRIMARY",  "uptime" : 1043,  "optime" : Timestamp(1454464583, 1),  "optimeDate" : ISODate("2016-02-03T01:56:23Z"),  "electionTime" : Timestamp(1454464592, 1),  "electionDate" : ISODate("2016-02-03T01:56:32Z"),  "self" : true  },  {  "_id" : 1,  "name" : "192.168.60.10:27018",  "health" : 1,  "state" : 2,  "stateStr" : "SECONDARY",  "uptime" : 25,  "optime" : Timestamp(1454464583, 1),  "optimeDate" : ISODate("2016-02-03T01:56:23Z"),  "lastHeartbeat" : ISODate("2016-02-03T01:56:48Z"),  "lastHeartbeatRecv" : ISODate("2016-02-03T01:56:47Z"),  "pingMs" : 2,  "syncingTo" : "192.168.60.10:27017"  },  {  "_id" : 2,  "name" : "192.168.60.10:27019",  "health" : 1,  "state" : 7,  "stateStr" : "ARBITER",  "uptime" : 25,  "lastHeartbeat" : ISODate("2016-02-03T01:56:48Z"),  "lastHeartbeatRecv" : ISODate("2016-02-03T01:56:47Z"),  "pingMs" : 0  }  ],  "ok" : 1 } | 
我们的集群中有三个节点,由状态返回值可以看出27017为PRIMARY节点,而27018为SECONDARY节点,而27019为我们设置的ARBITER节点。这里我们发现mongodb的角标已经变了,变成了复制集名称加上当前节点的状态。同样如果登陆27018和27019会发现都发生了变化。
5.5.查看主节点local库
| 1 2 3 4 5 6 7 8 9 10 | ywnds:PRIMARY> use local switched to db local ywnds:PRIMARY> show tables me oplog.rs replset.minvalid slaves startup_log system.indexes system.replset | 
这里我们看一下本地的local库,每一个mongod实例都有自己的local数据库,其中存储了复制进程所用的数据和其他实例单独的信息,local数据库对于复制时不可见的,local数据库将不会被复制。
进入到local库可以看到一些集合和索引文件,其中startup_log 是一个固定集合,该集合主要是用来诊断的(每个mongod 实例向 startup_log 插入一条有关mongod实例自身和host信息的诊断信息);system.replset保存了复制集的配置文档信息(就是我们上面定义的config),跟rs.conf()返回的信息一样;oplog.rs是一个存储了oplog的固定集合,大小为我们在配置文件中设置的大小;replset.minvalid包含了复制集内部定位复制集状态信息;slaves包含了复制集每个节点和与其通讯的最后时间戳。如果该集合过时了,我们可以通过删除该节点来让复制集自动刷新生成。
6)验证复制集
192.168.60.10:27017插入数据
| 1 2 3 4 5 6 7 | $ mongo 192.168.60.10:27017 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27017/test ywnds:PRIMARY> use ywnds switched to db ywnds ywnds:PRIMARY> db.ywnds.insert({name:"ywnds",age:"20",gender:"B"}) WriteResult({ "nInserted" : 1 }) | 
然后我们来看一下主节点的数据目录(WiredTiger存储引擎为例)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $ ll -h /data/mongodb/data/data27017/ 总用量 400K -rw-r--r--. 1 root root  16K 1月  18 03:29 collection-0--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:29 collection-2--3354265032980496329.wt -rw-r--r--. 1 root root  36K 1月  18 04:26 collection-4--3354265032980496329.wt -rw-r--r--. 1 root root  32K 1月  18 03:39 collection-5--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:32 collection-7--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 04:26 collection-9--3354265032980496329.wt drwxr-xr-x. 2 root root 4.0K 1月  18 04:33 diagnostic.data -rw-r--r--. 1 root root  16K 1月  18 04:26 index-10--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:29 index-1--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:29 index-3--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:32 index-6--3354265032980496329.wt -rw-r--r--. 1 root root  16K 1月  18 03:32 index-8--3354265032980496329.wt drwxr-xr-x. 2 root root 4.0K 1月  18 03:28 journal -rw-r--r--. 1 root root  36K 1月  18 04:26 _mdb_catalog.wt -rw-r--r--. 1 root root    6 1月  18 03:28 mongod.lock -rw-r--r--. 1 root root  36K 1月  18 04:26 sizeStorer.wt -rw-r--r--. 1 root root   95 1月  18 03:28 storage.bson -rw-r--r--. 1 root root   49 1月  18 03:28 WiredTiger -rw-r--r--. 1 root root 4.0K 1月  18 03:28 WiredTigerLAS.wt -rw-r--r--. 1 root root   21 1月  18 03:28 WiredTiger.lock -rw-r--r--. 1 root root  920 1月  18 04:26 WiredTiger.turtle -rw-r--r--. 1 root root  64K 1月  18 04:26 WiredTiger.wt | 
这里我们可以看到,由于使用了WiredTiger存储引擎,数据存储格式都跟MongoDB 2.6(使用MMAPV1存储引擎)不同了。
192.168.60.10:27018同步数据
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $ mongo 192.168.60.10:27018 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27018/test ywnds:SECONDARY> rs.slaveOk() ywnds:SECONDARY> show dbs local  0.000GB ywnds  0.000GB ywnds:SECONDARY> use ywnds switched to db ywnds ywnds:SECONDARY> show tables 2016-02-03T11:34:24.505+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } ywnds:SECONDARY> db.ywnds.insert({name:"eric",age:20}) WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } }) ywnds:SECONDARY> rs.slaveOk(true) ywnds:SECONDARY> show tables ywnds ywnds:SECONDARY> db.ywnds.find() { "_id" : ObjectId("569bf8b9a0c81df2ebc0d75d"), "name" : "ywnds", "age" : 20, "gender" : "B" } | 
我们看到数据已经同步过来了,但是如果我们不是通过驱动连接从节点的话,我们查看数据时会报错,说我们不是master节点,且slaveOK=false,所以查看不了。MongoDB在数据一致性上确实下了很大的功夫啊。那么也就是说如果从节点想查看数据就需要开启slaveOK,并且在从节点上是无法进行写入操作的。然后我们开启rs.slaveOk(1)立马就可以查看同步的数据了。
192.168.60.10:27019投票节点
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | $ mongo 192.168.60.10:27019 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27019/test ywnds:ARBITER> show dbs admin  (empty) local  0.078GB ywnds:ARBITER> use local switched to db local ywnds:ARBITER> show tables me startup_log system.indexes system.replset | 
连接到投票节点,我们可以看到PRIMARY上的数据没有同步到投票节点上来,没有ywnds这个库。但是这里需要说明的是,我们可以看到arbiter虽然不同步数据但是local库却有system.indexes和system.replset这两个文件。另外我们可以发现local数据的大小为0.078GB(80M),库物理文件的第一个文件默认大小为64M,而命名空间文件为16M。
四、按照功能来区分复制集成员
从上面的分析可以看出三个节点的不同之处,也可以这么说,上面我们是按照数据来区分不同的复制集节点,那么下面我们按照功能上来区分各个节点。先来简单说一下各个节点状态的不同所能提供的功能有哪些?
主节点(PRIMARY):默认提供读写服务的节点。
从节点(SECONDARY):提供读服务的节点,但可以提供多样性服务,如可以转为“隐藏节点”对程序不可见、转为“延时节点”延时复制节点、转为“投票节点”具有投票权但不是arbiter。
投票节点(ARBITER):ARBITER节点,无数据,仅作选举和充当复制集节点、也称它为选举节点。
五、复制集自动容灾
Mongodb复制集最大的特点就是可以自动容灾,这个特性是从主从复制的架构上改变而来,简单来说就是当复制集(3节点)中如果PRIMARY发生故障,其他节点无法探测到它的心跳信息时,复制集就会产生从新投票选出一个新的PRIAMRY提供服务。下面我们来模拟一下MongoDB的自动故障转移功能。
我们连接到27017主机上,此时的27017是PRIMARY
| 1 2 3 4 | $ mongo 192.168.60.10:27017 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27017/test ywnds:PRIMARY> | 
我们连接到27018主机上,此时的27018是SECONDARY
| 1 2 3 4 | $ mongo 192.168.60.10:27018 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27018/test ywnds:SECONDARY> | 
我们连接到27019主机上,此时的27019是ARBITER
| 1 2 3 4 | $ mongo 192.168.60.10:27019 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27019/test ywnds:ARBITER> | 
模拟主节点宕机,kill掉27017的进程。
| 1 2 3 4 5 6 | $ cat /mongodb/pid/pid27017/mongod.pid 125484 $ kill -2 125484 $ ps aux | grep mongod root     125581  0.5  7.9 5266620 48252 ?       Sl   04:07   0:00 mongod -f /data/mongodb/conf/conf27018/mongod.conf root     125670  0.5  5.1 849056 31440 ?        Sl   04:07   0:00 mongod -f /data/mongodb/conf/conf27019/mongod.conf | 
然后登录27018主机上,看看此时的SECONDARY已经转为PRIMARY了,但是这个过程会有短暂的断开。
| 1 2 3 4 | $ mongo 192.168.60.10:27018 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27018/test ywnds:PRIMARY> | 
而27019主机上ARBITER还是ARBITER节点。
| 1 2 3 4 | $ mongo 192.168.60.10:27019 MongoDB shell version: 3.2.0 connecting to: 192.168.60.10:27019/test ywnds:ARBITER> | 
有兴趣可以通过show log rs命令查看复制集的日志信息,看看这个过程是怎么进行的。这就是MongoDB三节点(一主一从一投票或一主二从)复制集的故障转移功能,是不是很强大。当然除了复制集内部自动选举之外,我们也可以进行人工干预,使用rs.stepdown()方法可以手动切换。
MongoDB 3.2复制集单节点部署(四)的更多相关文章
- MongoDB 2.6复制集单节点部署(三)
		MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 2.6版本进行复制集实验(但MongoDB配置文件 ... 
- mongodb 3.4复制集详解
		1关闭数据库,打开三个mongodb数据库数据库实例 rs.printReplicationInfo() 2:原理 主库能够进行读写操作,一个复制集群只能有一个活跃的主库 一般情况下复制可以分为好几种 ... 
- Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
		0. 前言 最近受“新冠肺炎”疫情影响,在家等着,入职暂时延后,在家里办公和学习 尝试通过源码编译二进制的方式在单一节点(Master 与 Node 部署在同一个机器上)上部署一个 k8s 环境,整理 ... 
- Ubuntu下用devstack单节点部署Openstack
		一.实验环境 本实验是在Vmware Workstation下创建的单台Ubuntu服务器版系统中,利用devstack部署的Openstack Pike版. 宿主机:win10 1803 8G内存 ... 
- mongodb 3.4复制集配置
		1:启动三个实例 /bin/mongod --config /home/mongodb/db27017/mongodb27017.conf /bin/mongod --config /home/mon ... 
- .netcore consul实现服务注册与发现-单节点部署
		原文:.netcore consul实现服务注册与发现-单节点部署 一.Consul的基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分 ... 
- HyperLedger Fabric 1.4 单机单节点部署(10.2)
		单机单节点指在一台电脑上部署一个排序(Orderer)服务.一个组织(Org1),一个节点(Peer,属于Org1),然后运行官方案例中的example02智能合约例子,实现转财交易和查询功能.单机单 ... 
- mongoDB研究笔记:复制集概述
		自我学习,仅供参考: 数据库总是会遇到各种失败的场景,如网络连接断开.断电等,尽管journaling日志功能也提供了数据恢复的功能,但journaling通常是针对单个节点来说的,只能保证单节点数据 ... 
- 【2016-11-1】【坚持学习】【Day16】【MongoDB】【复制集 分片】
		Mongodb 两种集群方式 复制集 通常是一主一从,一主多从 mongodb的复制至少需要两个节点.其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据. mongodb各 ... 
随机推荐
- C# PropertyGrid控件应用心得 【转】
			源文 : http://blog.csdn.net/luyifeiniu/article/details/5426960 c#stringattributesobjectmicrosoftclass ... 
- Java中的BigInteger在ACM中的应用
			Java中的BigInteger在ACM中的应用 在ACM中的做题时,常常会遇见一些大数的问题.这是当我们用C或是C++时就会认为比較麻烦.就想有没有现有的现有的能够直接调用的BigInter,那样就 ... 
- solaris软件管理 FTP
			安装一些常用软件 一.应用程序与系统命令的关系: 系统命令文件位置在 /bin /sbin下面或为shell内部指令:完成对系统的基本管理工作:一般在字符操作界面中运行:一般包括命令字.命令选项和命令 ... 
- UIView 的 autoresizingMask 属性 详解。
			转载自:liubo0_0的专栏 链接网址:http://blog.csdn.net/liubo0_0/article/details/7085935 在 UIView 中有一个autoresizin ... 
- Windows 系统 vs2012 MinGW 编译ffmpeg 静态库
			Windows系统下 vs2012编译ffmpeg 动态库 前面已经有文章讲述,本文将讲述如果编译生成ffmpeg静态库以方便 在vs2012下调用. 准备工作:安装MinGW环境,修改ffmpeg配 ... 
- 图像滤镜艺术---PS图层混合模式之明度模式
			本文将介绍PS图层混合模式中比較复杂 的"明度"模式的算法原理及代码实现内容. 说到PS的图层混合模式,计算公式都有,详细代码实现也能找到,可是,都没有完整介绍全部图层混合模式的代 ... 
- [Cocoa]深入浅出Cocoa之Bonjour网络编程
			本文转载至 http://www.cnblogs.com/kesalin/archive/2011/09/15/cocoa_bonjour.html 深入浅出Cocoa之Bonjour网络编程 罗 ... 
- iOS8 Push Notifications
			本文转载至 http://blog.csdn.net/pjk1129/article/details/39551887 原贴地址:https://parse.com/tutorials/ios-p ... 
- Create a /etc/yum.repos.d/mongodb-org-4.0.repo
			Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux — MongoDB Manual https://doc ... 
- js 中常用的正则表达式
			主要有以下几种: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了哦 获取日期正则表达式:\d{4}[年|\-|\.]\d{1,2}[ ... 
