一, 简介
MongoDB 是一种强大, 灵活, 且易于扩展的通用型数据库. 他能扩展出非常多的功能. 如二级索引(secondary index), 范围查询(range query), 排序, 聚合(aggregation), 以及地理空间索引(geospatial index).
1, 易于使用
MongoDB 是一个面向文档 (document-oriented) 的数据库, 而不是关系型数据库. 面向文档的数据库不在有 "行(row)" 的概念, 取而代之的是更为灵活的 "文档(document)" 模型. 通过在文档中嵌入文档和数组, 面向文档的方法能够仅适用一条记录来表现复杂的层次关系.
不在有预定义模式 (predefined schema), 文档的键(key) 和值 (value) 不在是固定的类型和大小. 由于没有固定的模式, 根据需要添加或删除字段变得更容易了.
2, 易于扩展
MongoDB 的设计采用横向扩展. 面向文档的数据模型使它很容易地在多台服务器之间进行数据切割. MongoDB 能自动处理跨集群的数据和负载, 自动重新分配文档, 以及将用户的路由到正确机器上.
3, 丰富的功能
MongoDB 作为一款通用型数据库, 除了能够创建, 读取, 更新和删除数据之外, 还提供一系列不断扩展的独特功能.
索引(indexing):
MongoDB 支持通用二级索引, 允许多种快速查找, 且提供唯一索引, 符合索引, 地理空间索引, 以及全文索引.
聚合(aggregation):
MongoDB 支持 "聚合管道(aggregation pipeline)". 用户能够通过简单的片段创建复杂的聚合, 并通过数据库自动优化.
特殊的集合类型:
MongoDB 支持存在时间有限的集合, 适用于那些将在某个时刻过期的数据, 如会话(session). 类似的, MongoDB 也支持固定大小的集合, 用于保存近期数据, 如日志.
文件存储(file storage):
MongoDB 支持一种非常易用的协议, 用于存储大文件和文件元数据.
MongoDB 并不具备一些在关系型数据库中很普遍的功能, 如连接 (join) 和复杂的多事务(multirow transcation). 省略这些功能是出于架构上的考虑(为了得到更好的扩展性), 因为在分布式系统中这两个功能难以高效地实现.
4, 卓越的性能
MongoDB 能对文档尽心动态填充(dynamic padding), 也能预分配数据文件以利用额外的空间来换取稳定的新能. MongoDB 把尽可能多的内存用作缓存(cache), 一般会用尽服务器的可用内存, 试图为每次查询自动选择正确的索引. 所以 MongoDB 会非常占用服务器内存, 目前并没有什么办法可以限制 MongoDB 占用内存的方法, 所以一般不建议在 MongoDB 服务器上启用其他进程.
二, 下载安装包
下载地址为: https://www.mongodb.com/download-center?jmp=nav#community
- Windows: mongodb-win32-x86_64-2008plus-ssl-3.6.4.zip
- Linux(CentOS 7): mongodb-linux-x86_64-rhel70-3.6.4.tgz
注意: 这里下载的都是压缩包, 本文不提供 rpm 和 msi 等可执行程序的安装方式
三, Windows 下的 MongoDB 单节点安装
我们将下载完的包解压: C:/context/mongodb
在工作目录下创建 MongoDB 数据存放目录: D:/workspaces/mongodbspaces/data
在工作目录下创建 MongoDB 日志文件: D:/workspaces/mongodbspaces/logs/mongodb.log
在安装目录下创建 config 目录: C:/context/mongodb/config
在配置目录下创建配置文件: C:/context/mongodb/config/config.conf
修改配置文件:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: D:/workspaces/mongodbspaces/logs/mongodb.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # Windows 特有配置选项
- windowsService:
- # mongos/mongod 作为 Windows 服务时的服务名称, 在 net start <name > 和 net stop <name > 时使用.
- # 类型: string. 默认: MongoDB
- # 必须与 --install 安装服务或者 --remove 删除服务结合使用.
- serviceName: MongoDB
- # 在服务管理应用程序中 MongoDB 服务应用程序的名称. 默认: MongoDB
- displayName: MongoDB
- # 设置 MongoDB 服务的描述, 默认为 MongoDB Server, 在 --install 安装服务时使用.
- description: MongoDB Server
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27017
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 0.0.0.0
- security:
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- # 启用或禁用服务器端 JavaScript 执行, 仅 mongod 有效.
- # 如果为 false, 那么任何与 javascript 相关的功能都不能使用. 类型: boolean. 默认: true
- javascriptEnabled: true
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- storage:
- # mongod 实例存储数据库文件路径, 仅 mongod 有效. 类型: string
- dbPath: D:/workspaces/mongodbspaces/data
- journal:
- # 是否开启 journal 日志持久存储, journal 日志用来数据恢复,
- # 是 mongod 最基础的特性, 通常用于故障恢复, 仅 mongod 有效.
- # 类型: boolean.64bit 默认为 true,32bit 默认为 false
- enabled: true
- # 是否将不同 DB 的数据存储在不同的目录中, dbPath 的子目录, 目录名为 db 的名称, 仅 mongod 有效.
- # 类型: boolean. 默认: false
- directoryPerDB: true
配置 mongodb 环境变量这里就不赘述了. 我们执行命令将 MongoDB 安装成服务:
mongod.exe --config C:/context/mongodb/config/config.conf --install
如果需要删除 MongoDB 服务, 则需要执行命令:
mongod.exe --config C:/context/mongodb/config/config.conf --remove
如果需要重新安装 MongoDB(先卸载再安装), 则需要执行:
mongod.exe --config C:/context/mongodb/config/config.conf --reinstall
需要注意的是, 这里的 --config 选项的值必须是绝对路径, 也可以使用 - f 参数后面跟配置文件路径, 这些操作都必须是在管理员 CMD 命令窗口里面完成. 至此 MongoDB 的安装已经完成, 我们需要先启动 MongoDB 服务, 然后创建 admin 数据库下的管理员账号和密码:
- C:\Users\Administrator> mongo
- ...
- > use admin
- ...
- > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]})
- ...
需要注意的是, 由于我们第一次启动之前就已经打开了角色认证功能: security.authorization: enabled, 但是初始是没有用户和密码的. MongoDB 中 setParameter.enableLocalhostAuthBypass: true 这个配置是默认开启的, 使用 localhost/127.0.0.1 第一次登录的时候可以免去角色认证, 但是也仅有一次机会.
四, Linux 下的 MongoDB 单节点安装
我们将下载完的包解压:
[root@abc] tar -zxvf mongodb-linux-x86_64-rhel70-3.6.4.tgz -C /use/local/mongodb
在工作目录下创建 MongoDB 数据存放目录:
[root@abc] mkdir /data/mongodb/data -p
在工作目录下创建 MongoDB 日志文件:
- [root@abc] mkdir /data/mongodb/logs/ -p
- [root@abc] touch /data/mongodb/logs/mongodb.log
在安装目录下创建 config 配置文件, 并编辑配置文件:
- [root@abc] mkdir /usr/local/mongodb/config -p
- [root@abc] vim /usr/local/mongodb/config/config.conf
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/logs/mongodb.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/logs/mongodb.pid
- net:
- # MongoDB 服务监听端口
- port: 27017
- # 指定 MongoDB 绑定的 IP, 多个 IP 使用逗号分隔. 如果是 0.0.0.0 则可是使用机器上的任何 IP 访问, 否则只能使用指定 IP 访问
- bindIp: 0.0.0.0
- storage:
- # 指定数据文件的路径
- dbPath: /data/mongodb/data
- # 默认关闭
- directoryPerDB: true
- journal:
- # 记录操作日志, 防止数据丢失. 64bit 默认为 true,32bit 默认为 false
- enabled: true
- security:
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
创建 mongodb.service 文件, 将 mongodb 配置成 Linux 服务:
- [root@abc] vim /lib/systemd/system/mongodb.service
- [Unit]
- Description=mongodb
- After=network.target remote-fs.target nss-lookup.target
- [Service]
- Type=forking
- ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/config/config.conf
- ExecReload=/bin/kill -s HUP $MAINPID
- ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/config/config.conf
- PrivateTmp=true
- [Install]
- WantedBy=multi-user.target
设置 MongoDB 服务开机启动:
[root@abc] systemctl enable mongodb.service
如果需要取消开机启动则执行: systemctl disable mongodb.service
第一次启动 MongoDB 服务:
[root@abc] systemctl start mongodb.service
如果需要停止服务则执行: systemctl stop mongodb.service
配置 mongodb 环境变量:
- [root@abc] vim /etc/profile
- ...
- ...
- export PATH=$PATH:/usr/local/mongodb/bin
- :wq
- [root@abc] source /etc/profile
然后开始创建 admin 数据库的 root 角色用户. 记住, 这里只有一次机会免密码登入创建用户:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]})
- ...
五, Linux 下的 MongoDB 集群安装
在安装之前, 我们得先要了解一下 MongoDB 集群的集群类型, 以及集群中的一些角色和它们的作用. mongodb 有传统的主从集群(未来可能会被废弃), 副本集集群和分片集群三种模式的集群, 传统的主从集群这里不做介绍. 副本集和分片两种集群模式并不对立, 既可以单独部署也可以组合部署.
1, 副本集
在副本集集群中有两种类型的角色: 主节点 (primary) 和备用节点(secondary). 客户端只会与主节点进行数据交互(只有主节点允许写操作), 备用节点通过 oplog 日志异步复制主节点数据, oplog 包含了主节点的每一次写操作, 是主节点中 local 数据库中的一个固定集合, 备用节点通过这个集合复制主节点数据, 每个备用节点都维护着自己的 oplog, 记录者每一次从主节点复制数据的操作, 备用节点不对外提供服务.
集群中每个成员会每隔 2 秒向其他成员发送一条心跳请求, 确认集群中成员的状态(那个是主节点, 那个可以作为同步源, 那个节点下线了), 心跳信息量非常小, 用于检查每个成员状态. 心跳的功能之一就是让主节点知道自己是否满足集合 "大多数" 的条件, 如果主节点不在得到 "大多数" 服务器的支持, 他就会退位, 变成备用节点.
如果主节点宕机或者由于网络原因, 备用节点无法连接到主节点, 那么所有得到这个消息的备用节点都会申请被选举成为主节点, 希望被选举成为主节点的成员会向它能到达的所有成员发送通知. 如果这个申请选举的成员不符合候选主节点要求(这个成员的数据落后于副本集, 或者只是由于网络原因备用节点无法到达主节点而申请的选举), 其他成员不会进行选举.
如果没有反对理由, 那么其他成员就会对这个成员进行选举投票. 如果这个成员得到副本集中 "大多数" 赞成票, 那么它就会被选举成为主节点. 如果达不到 "大多数" 的要求, 那么选举失败, 它仍然助于备用节点状态, 它之后还可以在此申请. 主节点会一直处于主节点状态, 除非它由于不在满足 "大多数" 的要求而退位. 副本集节点数据必须是奇数个, 否则在选举时可能会出现平局的选举结果导致无法出现主节点而集群不能工作. 如果一定要使用偶数个节点, 那么就必须再加一个仲裁节点, 仲裁节点只会在选举平局的时候出来仲裁, 并不会提供其他任何服务, 所以占用资源非常少, 但官方建议使用奇数个节点.
2, 分片
分片是指将数据拆分, 将其分散存放到不同的机器上的过程. 在分片集群中有配置服务 (Config Server), 路由服务(Router Server), 和分片服务(Shard Server) 等角色. mongodb 本身有两种组件: mongod 和 mongos,Shard Server 和 Config Server 服务是以 mongod 类型的进程运行的, Router Server 是以 mongos 类型的进程运行的.
Config Server: 配置服务相当于集群大脑, 保存着集群和分片的元数据, 即各分片包含着那些数据的信息. MongDB 3.4 之后要求配置服务必须是奇数个节点的副本集, 否则集群不能正常启动. 鉴于配置服务所包含的数据极端重要, 所以必须启用日志功能, 并确保其数据保存在非易失性驱动器上.
Router Server: 前端路由, 客户端由此接入, 且让整个集群看上去像单一数据库, 前端应用可以透明使用. mongos 能够根据给定的片键找到文档的存放位置, 但当集群中存在成千上万个文档时, 就会难以操作. 因此将文档分组为块 (chunk), 每个块由给定片键特定范围内的文档组成. 一个块只存在一个分片上, 所以可以使用一个比较小的空间就能够维护块和分片间的映射. 数据块大小是固定的, 均衡器(balancer) 会周期性地检查快的大小, 当块超过这个大小之后, 会有均衡器将其拆分为多个块, 以保证数据均衡.
Shard Server: 用于存储实际的数据块, 实际生产环境中一个 shard server 角色可由几台机器组个一个副本集承担, 防止主机单点故障. 当需要对集合分片时, 就必须得指定一个片键, 片键必须有索引, 如果集合已存储了大量数据, 那么基本就不可能再修改片键了, 因此选择片键时需要慎重.
3, 分片 + 副本集集群安装
通过上面的描述, 我们大概已经了解了分片 + 副本集集群的相关概念, 可以开始安装了. 这里我们提供三台机器供安装, 服务规划为:
172.23.102.56 | 172.23.102.57 | 172.23.102.58 |
mongos port:27017 | mongos port:27017 | mongos port:27017 |
config server port:27018 | config server port:27018 | config server port:27018 |
shard1 server port:27019 | shard1 server port:27019 | shard1 server port:27019 |
shard2 server port:27020 | shard2 server port:27020 | shard2 server port:27020 |
shard3 server port:28021 | shard3 server port:28021 | shard3 server port:28021 |
将安装包解压到 / use/local/mongodb 目录下(三个机器相同操作):
[root@abc] tar -zxvf mongodb-linux-x86_64-rhel70-3.6.4.tgz -C /use/local/mongodb
在安装目录下创建配置文件存放目录和配置文件(三个机器相同操作):
- [root@abc] mkdir /usr/local/mongodb/config
- [root@abc] cd /usr/local/mongodb/config
[root@abc] touch mongos.conf config.conf shard1.conf shard2.conf shard3.conf
配置文件目录和配置文件都已经创建好了, 其中 mongos.conf 为路由服务配置文件, config.conf 为配置服务配置文件, shard1.conf shard2.conf shard3.conf 为三个分片服务配置文件. 我们开始创建数据存储目录(三个机器相同操作):
- [root@abc] mkdir /data/mongodb/mongos/logs -p ## mongos 日志文件存储目录, 由于 mongos 不存储数据, 所以不需要数据存储目录
- [root@abc] touch /data/mongodb/mongos/logs/mongos.log ## mongos 日志文件
- [root@abc] mkdir /data/mongodb/config/logs -p ## config 日志文件存储目录
- [root@abc] mkdir /data/mongodb/config/logs/config.log ## config 日志文件
- [root@abc] mkdir /data/mongodb/config/data -p ## config 数据文件存储目录
- [root@abc] mkdir /data/mongodb/shard1/logs -p ## 第一个分片日志文件存储目录
- [root@abc] mkdir /data/mongodb/shard1/logs/shard1.log ## 第一个分片日志文件
- [root@abc] mkdir /data/mongodb/shard1/data -p ## 第一个分片数据文件存储目录
- [root@abc] mkdir /data/mongodb/shard2/logs -p ## 第二个分片日志文件存储目录
- [root@abc] mkdir /data/mongodb/shard2/logs/shard2.log ## 第二个分片日志文件
- [root@abc] mkdir /data/mongodb/shard2/data -p ## 第二个分片数据文件存储目录
- [root@abc] mkdir /data/mongodb/shard3/logs -p ## 第三个分片日志文件存储目录
- [root@abc] mkdir /data/mongodb/shard3/logs/shard3.log ## 第三个分片日志文件
- [root@abc] mkdir /data/mongodb/shard3/data -p ## 第三个分片数据文件存储目录
在这里我们使用 keyFile 的方式作为集群成员之间的安全校验, 所以需要先生成 keyFile 文件:
- [root@abc] openssl rand -base64 756> /usr/local/mongodb/keyFile.file
- [root@abc] chmod 400 /usr/local/mongodb/keyFile.file
编写 config server 配置文件, 在三个机器中除 net.bindIp 配置需要对应到不同的机器之外, 其他配置都一样:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/config/logs/config.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- # 在 Linux 下如果是使用 npm 包的方式安装, 并使用自带的 init script 脚本, 则不推荐修改默认值.
- # 否则需要禁用默认的 init script, 而使用自己的 init script.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/config/logs/config.pid
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27018
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #这里三个设备分别对应
- security:
- # 密钥文件的路径, 它存储 MongoDB 实例在共享的集群或副本集中相互验证的共享密钥.
- # 必须设置 security.authorization 为 enable. 类型: string
- keyFile: /usr/local/mongodb/keyFile.file
- # 集群成员之间的认证模式. 类型: string. 可选: keyFile,sendKeyFile,sendX509,x509. 默认: keyFile.
- clusterAuthMode: keyFile
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- # 启用或禁用服务器端 JavaScript 执行, 仅 mongod 有效.
- # 如果为 false, 那么任何与 javascript 相关的功能都不能使用. 类型: boolean. 默认: true
- javascriptEnabled: true
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- storage:
- # mongod 实例存储数据库文件路径, 仅 mongod 有效. 类型: string
- dbPath: /data/mongodb/config/data
- # 是否将不同 DB 的数据存储在不同的目录中, dbPath 的子目录, 目录名为 db 的名称, 仅 mongod 有效. 类型: boolean. 默认: false
- directoryPerDB: true
- journal:
- # 记录操作日志, 防止数据丢失. 64bit 默认为 true,32bit 默认为 false
- enabled: true
- replication:
- # 指定 oplog 的最大尺寸. 对于已经建立过 oplog.rs 的数据库, 指定无效.
- # 默认为磁盘的 5%. 仅 mongod 有效
- # oplogSizeMB:
- # 指定副本集的名称. 仅 mongod 有效
- replSetName: config
- # 指定副本集成员在接受 oplog 之前是否加载索引到内存. 默认会加载所有的索引到内存.
- # none, 不加载; all, 加载所有;_id_only, 仅加载_id. 仅 mongod 有效
- secondaryIndexPrefetch: all
- sharding:
- # 指定分片集的 mongodb 角色. configsvr: 配置服务器. shardsvr: 分片实例. 仅 mongod 有效
- clusterRole: configsvr
- # 在块移动过程中, 该选项强制 mongodb 实例保存所有移动的文档到 moveChunk 目录.
- # 在版本 3.2 及以后版本中默认值为 false.
- archiveMovedChunks: false
分别启动三个机器上的 config server:
[root@abc] mongod --config /usr/local/mongodb/config/config.conf
当三个机器上的配置服务都启动之后, 然后随便选择一个服务登入, 将三个配置服务节点添加到一个副本集中:
- [root@abc] mongo --port 21018 #连接
- ...
- > config = {
- > ... _id: "config", # 配置文件中配置服务副本集的名称
- > ... members: [
- > ... { _id: 0, host: "172.23.102.56:21018" },
- > ... { _id: 1, host: "172.23.102.57:21018" },
- > ... { _id: 2, host: "172.23.102.58:21018" }
- > ... ]
- > ... } # 设置变量
- ...
- rs.initiate(config) # 初始化副本集
- ...
- rs.status(); # 查看副本集状态
- ...
如果这里使用的是偶数个节点的话, 那么就需要多加一个参数 {_id : 2, host : "172.23.102.58:21018", arbiterOnly: true } , 表示 58 这个机器为仲裁节点. 需要注意的是, 配置服务一定要在 mongos 路由服务之前启动并初始化完成, 因为 mongos 服务需要依赖配置服务中的数据.
编写 shard1 server 配置文件, 在三个机器中除 net.bindIp 配置需要对应到不同的机器之外, 其他配置都一样:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/shard1/logs/shard1.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- # 在 Linux 下如果是使用 npm 包的方式安装, 并使用自带的 init script 脚本, 则不推荐修改默认值.
- # 否则需要禁用默认的 init script, 而使用自己的 init script.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/shard1/logs/shard1.pid
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27019
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #这里三个设备分别对应
- security:
- # 密钥文件的路径, 它存储 MongoDB 实例在共享的集群或副本集中相互验证的共享密钥.
- # 必须设置 security.authorization 为 enable. 类型: string
- keyFile: /usr/local/mongodb/keyFile.file
- # 集群成员之间的认证模式. 类型: string. 可选: keyFile,sendKeyFile,sendX509,x509. 默认: keyFile.
- clusterAuthMode: keyFile
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- # 启用或禁用服务器端 JavaScript 执行, 仅 mongod 有效.
- # 如果为 false, 那么任何与 javascript 相关的功能都不能使用. 类型: boolean. 默认: true
- javascriptEnabled: true
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- storage:
- # mongod 实例存储数据库文件路径, 仅 mongod 有效. 类型: string
- dbPath: /data/mongodb/shard1/data
- # 是否将不同 DB 的数据存储在不同的目录中, dbPath 的子目录, 目录名为 db 的名称, 仅 mongod 有效. 类型: boolean. 默认: false
- directoryPerDB: true
- journal:
- # 记录操作日志, 防止数据丢失. 64bit 默认为 true,32bit 默认为 false
- enabled: true
- replication:
- # 指定 oplog 的最大尺寸. 对于已经建立过 oplog.rs 的数据库, 指定无效.
- # 默认为磁盘的 5%. 仅 mongod 有效
- # oplogSizeMB:
- # 指定副本集的名称. 仅 mongod 有效
- replSetName: shard1
- # 指定副本集成员在接受 oplog 之前是否加载索引到内存. 默认会加载所有的索引到内存.
- # none, 不加载; all, 加载所有;_id_only, 仅加载_id. 仅 mongod 有效
- secondaryIndexPrefetch: all
- sharding:
- # 指定分片集的 mongodb 角色. configsvr: 配置服务器. shardsvr: 分片实例. 仅 mongod 有效
- clusterRole: shardsvr
- # 在块移动过程中, 该选项强制 mongodb 实例保存所有移动的文档到 moveChunk 目录.
- # 在版本 3.2 及以后版本中默认值为 false.
- archiveMovedChunks: false
分别启动三个机器上的 shard1 server:
[root@abc] mongod --config /usr/local/mongodb/config/shard1.conf
当三个机器上的第一个分片服务都启动之后, 然后随便选择一个服务登入, 将三个配置服务节点添加到一个副本集中:
- [root@abc] mongo --port 21019 #连接
- ...
- > config = {
- > ... _id: "shard1", # 配置文件中第一个分片副本集的名称
- > ... members: [
- > ... { _id: 0, host: "172.23.102.56:21019" },
- > ... { _id: 1, host: "172.23.102.57:21019" },
- > ... { _id: 2, host: "172.23.102.58:21019" }
- > ... ]
- > ... } # 设置变量
- ...
- rs.initiate(config) # 初始化副本集
- ...
- rs.status(); # 查看副本集状态
- ...
如果这里使用的是偶数个节点的话, 那么就需要多加一个参数 {_id : 1, host : "172.23.102.57:21019", arbiterOnly: true } , 表示 57 这个机器为仲裁节点.
编写 shard2 server 配置文件, 在三个机器中除 net.bindIp 配置需要对应到不同的机器之外, 其他配置都一样:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/shard2/logs/shard2.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- # 在 Linux 下如果是使用 npm 包的方式安装, 并使用自带的 init script 脚本, 则不推荐修改默认值.
- # 否则需要禁用默认的 init script, 而使用自己的 init script.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/shard2/logs/shard2.pid
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27020
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #这里三个设备分别对应
- security:
- # 密钥文件的路径, 它存储 MongoDB 实例在共享的集群或副本集中相互验证的共享密钥.
- # 必须设置 security.authorization 为 enable. 类型: string
- keyFile: /usr/local/mongodb/keyFile.file
- # 集群成员之间的认证模式. 类型: string. 可选: keyFile,sendKeyFile,sendX509,x509. 默认: keyFile.
- clusterAuthMode: keyFile
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- # 启用或禁用服务器端 JavaScript 执行, 仅 mongod 有效.
- # 如果为 false, 那么任何与 javascript 相关的功能都不能使用. 类型: boolean. 默认: true
- javascriptEnabled: true
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- storage:
- # mongod 实例存储数据库文件路径, 仅 mongod 有效. 类型: string
- dbPath: /data/mongodb/shard2/data
- # 是否将不同 DB 的数据存储在不同的目录中, dbPath 的子目录, 目录名为 db 的名称, 仅 mongod 有效. 类型: boolean. 默认: false
- directoryPerDB: true
- journal:
- # 记录操作日志, 防止数据丢失. 64bit 默认为 true,32bit 默认为 false
- enabled: true
- replication:
- # 指定 oplog 的最大尺寸. 对于已经建立过 oplog.rs 的数据库, 指定无效.
- # 默认为磁盘的 5%. 仅 mongod 有效
- # oplogSizeMB:
- # 指定副本集的名称. 仅 mongod 有效
- replSetName: shard1
- # 指定副本集成员在接受 oplog 之前是否加载索引到内存. 默认会加载所有的索引到内存.
- # none, 不加载; all, 加载所有;_id_only, 仅加载_id. 仅 mongod 有效
- secondaryIndexPrefetch: all
- sharding:
- # 指定分片集的 mongodb 角色. configsvr: 配置服务器. shardsvr: 分片实例. 仅 mongod 有效
- clusterRole: shardsvr
- # 在块移动过程中, 该选项强制 mongodb 实例保存所有移动的文档到 moveChunk 目录.
- # 在版本 3.2 及以后版本中默认值为 false.
- archiveMovedChunks: false
分别启动三个机器上的 shard2 server:
[root@abc] mongod --config /usr/local/mongodb/config/shard2.conf
当三个机器上的第二个分片服务都启动之后, 然后随便选择一个服务登入, 将三个配置服务节点添加到一个副本集中:
- [root@abc] mongo --port 21020 #连接
- ...
- > config = {
- > ... _id: "shard2", # 配置文件中第二个分片副本集的名称
- > ... members: [
- > ... { _id: 0, host: "172.23.102.56:21020" },
- > ... { _id: 1, host: "172.23.102.57:21020" },
- > ... { _id: 2, host: "172.23.102.58:21020" }
- > ... ]
- > ... } # 设置变量
- ...
- rs.initiate(config) # 初始化副本集
- ...
- rs.status(); # 查看副本集状态
- ...
如果这里使用的是偶数个节点的话, 那么就需要多加一个参数 {_id : 0, host : "172.23.102.56:21020", arbiterOnly: true } , 表示 56 这个机器为仲裁节点.
编写 shard3 server 配置文件, 在三个机器中除 net.bindIp 配置需要对应到不同的机器之外, 其他配置都一样:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/shard3/logs/shard3.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- # 在 Linux 下如果是使用 npm 包的方式安装, 并使用自带的 init script 脚本, 则不推荐修改默认值.
- # 否则需要禁用默认的 init script, 而使用自己的 init script.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/shard3/logs/shard3.pid
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27021
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #这里三个设备分别对应
- security:
- # 密钥文件的路径, 它存储 MongoDB 实例在共享的集群或副本集中相互验证的共享密钥.
- # 必须设置 security.authorization 为 enable. 类型: string
- keyFile: /usr/local/mongodb/keyFile.file
- # 集群成员之间的认证模式. 类型: string. 可选: keyFile,sendKeyFile,sendX509,x509. 默认: keyFile.
- clusterAuthMode: keyFile
- # 打开访问数据库和进行操作的用户角色认证, 仅 mongod 有效. disabled: 关闭; enabled: 开启(默认开启)
- authorization: enabled
- # 启用或禁用服务器端 JavaScript 执行, 仅 mongod 有效.
- # 如果为 false, 那么任何与 javascript 相关的功能都不能使用. 类型: boolean. 默认: true
- javascriptEnabled: true
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- storage:
- # mongod 实例存储数据库文件路径, 仅 mongod 有效. 类型: string
- dbPath: /data/mongodb/shard3/data
- # 是否将不同 DB 的数据存储在不同的目录中, dbPath 的子目录, 目录名为 db 的名称, 仅 mongod 有效. 类型: boolean. 默认: false
- directoryPerDB: true
- journal:
- # 记录操作日志, 防止数据丢失. 64bit 默认为 true,32bit 默认为 false
- enabled: true
- replication:
- # 指定 oplog 的最大尺寸. 对于已经建立过 oplog.rs 的数据库, 指定无效.
- # 默认为磁盘的 5%. 仅 mongod 有效
- # oplogSizeMB:
- # 指定副本集的名称. 仅 mongod 有效
- replSetName: shard1
- # 指定副本集成员在接受 oplog 之前是否加载索引到内存. 默认会加载所有的索引到内存.
- # none, 不加载; all, 加载所有;_id_only, 仅加载_id. 仅 mongod 有效
- secondaryIndexPrefetch: all
- sharding:
- # 指定分片集的 mongodb 角色. configsvr: 配置服务器. shardsvr: 分片实例. 仅 mongod 有效
- clusterRole: shardsvr
- # 在块移动过程中, 该选项强制 mongodb 实例保存所有移动的文档到 moveChunk 目录.
- # 在版本 3.2 及以后版本中默认值为 false.
- archiveMovedChunks: false
分别启动三个机器上的 shard3 server:
[root@abc] mongod --config /usr/local/mongodb/config/shard3.conf
当三个机器上的第三个分片服务都启动之后, 然后随便选择一个服务登入, 将三个配置服务节点添加到一个副本集中:
- [root@abc] mongo --port 21021 #连接
- ...
- > config = {
- > ... _id: "shard3", # 配置文件中第三个分片副本集的名称
- > ... members: [
- > ... { _id: 0, host: "172.23.102.56:21021" },
- > ... { _id: 1, host: "172.23.102.57:21021" },
- > ... { _id: 2, host: "172.23.102.58:21021" }
- > ... ]
- > ... } # 设置变量
- ...
- rs.initiate(config) # 初始化副本集
- ...
- rs.status(); # 查看副本集状态
- ...
如果这里使用的是偶数个节点的话, 那么就需要多加一个参数 {_id : 2, host : "172.23.102.58:21021", arbiterOnly: true } , 表示 58 这个机器为仲裁节点.
编写 mongos server 配置文件, 在三个机器中除 net.bindIp 配置需要对应到不同的机器之外, 其他配置都一样:
- systemLog:
- # 日志级别, 0: 包含 "info" 信息, 1~5, 即大于 0 的值均会包含 debug 信息. 类型: integer, 默认: 0
- verbosity: 0
- # 发送所有的诊断信息日志文件的路径. systemLog.destination 为 file 时有效. 类型: string.
- path: /data/mongodb/mongos/logs/mongos.log
- # 如果是 true, 则 mongod 服务重启时会将日志追加到日志末尾, 否则每次重启会备份已有的日志并创建新日志.
- # 类型: boolean. 默认: false.
- logAppend: true
- # 日志输出目的地, 可以指定为 "file" 或者 "syslog", 如果指定 "file" 则必须要设置 systemLog.path.
- # 如果不指定, 则会输出到标准输出中(standard output).
- destination: file
- processManagement:
- # 是否以守护进程 (后台进程) 的方式运行 mongod/mongos 进程. 类型: boolean. 默认: false.
- # 在 Linux 下如果是使用 npm 包的方式安装, 并使用自带的 init script 脚本, 则不推荐修改默认值.
- # 否则需要禁用默认的 init script, 而使用自己的 init script.
- fork: false
- # 配合 "fork:true" 参数, 将 mongod/mongos 进程 ID 写入指定的文件, 如果不指定, 将不会创建 PID 文件. 类型: string
- pidFilePath: /data/mongodb/mongos/logs/mongos.pid
- net:
- # mongod/mongos 服务侦听客户端连接的端口. 类型: int. 默认: 27017.
- port: 27017
- # mongod/monogs 应用侦听客户端的 IP 地址或者完整 UNIX 域套接字路径, 如果想要绑定多个地址使用逗号分隔.
- # 若要绑定到所有 IPv4 地址, 请输入 0.0.0.0. 与 net.bindIpAll 配置互斥, 不能同时配置两个.
- # 类型: string. 默认: localhost
- bindIp: 127.0.0.1,172.23.102.56 / 127.0.0.1,172.23.102.57 / 127.0.0.1,172.23.102.58 #这里三个设备分别对应
- security:
- # 密钥文件的路径, 它存储 MongoDB 实例在共享的集群或副本集中相互验证的共享密钥.
- # 必须设置 security.authorization 为 enable. 类型: string
- keyFile: /usr/local/mongodb/keyFile.file
- # 集群成员之间的认证模式. 类型: string. 可选: keyFile,sendKeyFile,sendX509,x509. 默认: keyFile.
- clusterAuthMode: keyFile
- setParameter:
- # 如果开启, 则允许本机 (localhost/127.0.0.1) 第一次访问时不需要密码认证, 以便于创建第一个 admin 数据库的用户
- # true/1 或者 false/0, 默认为 true.mongods 和 mongod 有效, 建议 mongod 关闭该功能.
- enableLocalhostAuthBypass: true
- # 认证机制, 可选值为 "SCRAM-SHA-1","MONGODB-CR","PLAN" 等, 建议为 "SCRAM-SHA-1"
- authenticationMechanisms: SCRAM-SHA-1
- sharding:
- # 配置分片块大小, 默认 64(MB).MongoDB 3.4 已删除该配置.
- # chunkSize: 64
- # 配置服务器副本集地址. MongoDB 3.2 必须将配置服务部署为副本集,
- # 配置服务副本必须以默认的 WiredTiger 存储引擎存储.
- configDB: config/172.23.102.56:21018,172.23.102.57:21018,172.23.102.58:21018
分别启动三个机器上的 mongos server, 当然也可以只启动一个, 一个客户端也只能连接一个 mongos:
[root@abc] mongos --config /usr/local/mongodb/config/mongos.conf
当 mongos 服务都启动之后登入服务, 将副本集添加到集群中(其实就是保存在配置服务中):
- [root@abc] mongo --port 27017
- ...
- > use admin #使用 admin 数据库
- ...
- > sh.addShard("shard1/172.23.102.56:21019,172.23.102.57:21019,172.23.102.58:21019")
- ...
- > sh.addShard("shard2/172.23.102.56:21020,172.23.102.57:21020,172.23.102.58:21020")
- ...
- > sh.addShard("shard3/172.23.102.56:21021,172.23.102.57:21021,172.23.102.58:21021")
- ...
- > sh.status() #查看集群状态
- ...
至此 MongoDB 分片和副本集集群已搭建完成, 接下来我们创建集群用户注意这里同样只有一次机会. mongos 没有 security.authorization 配置, 一般如果集群成员之间需要进行鉴权, 那么 mongos 就会启用 security 相关配置, 这样 mongos 就必须要进行用户名和密码认证了:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.createUser({user: "root", pwd: "root", roles: [{role: "root", db: "admin"}]})
- ...
- > db.auth("root", "root")
- ...
MongoDB 数据库默认会有一个主分片, 如果没有指明数据库中的集合十分片集合, 那么该数据库的所有集合和文档都默认会存储在这个主分片之上. 接下来我们来启用分片集合, 首先指明一个数据库是分片数据库:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.auth("root", "root")
- ...
- > sh.enableSharding("testdb") # 指明 testdb 库启用分片
- ...
- > sh.status() # 查看分片情况
- ...
注意, 这里如果被启用分片的数据库不存在, 那么 MongoDB 会自动创建该数据库. 这里虽然启用了分片, 但还得指明是哪个集合需要分片, 使用集合里面的那一个字段作为片键, 以什么方式进行分片:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.auth("root", "root")
- ...
- > sh.enableSharding("testdb") # 指明 testdb 库启用分片
- ...
- > sh.status() # 查看分片情况
- ...
- # 指定 testdb 库下面的 mycollection 集合以 username 字段为片键进行 hash 分片
- > sh.shardCollection("testdb.mycollection", {"username": "hashed"})
- ...
- > sh.status() # 查看分片情况
- ...
这里使用的分片测是 hash 分片, 适合大规模插入, 高并发, 数据能够平均分布可充分利用整个集群的性能. 还可以进行范围分片和指定分片 (指定拿一些片键存储在那个分片上) 等策略进行分片, 建议线上大规模读写情况下使用 hash 分片. 接下来可以批量插入一些数据, 然后查看集合情况:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.auth("root", "root")
- ...
- > sh.enableSharding("testdb") # 指明 testdb 库启用分片
- ...
- > sh.status() # 查看分片情况
- ...
- # 指定 testdb 库下面的 mycollection 集合以 username 字段为片键进行 hash 分片
- > sh.shardCollection("testdb.mycollection", {"username": "hashed"})
- ...
- > sh.status() # 查看分片情况
- ...
- > use testdb
- ...
- > db.mycollection.stats()
- ...
注意, 分片集合的片键必须有索引. 在给集合分片的时候, 如果集合不存则会自动创建集合, 然后为片键创建索引. 如果集合存在并且已经有了数据, 那么就必须手动为片键创建索引, 才能为集合分片成功. 集合一旦分片成功, 片键是不能够修改的, 所以选择片键的时候需要谨慎. 至此集合分片完成.
如果后期需要直接访问 testdb 数据库, 则必须在 testdb 数据库下创建用户. 注意用户信息是全部存储在 admin 数据库下的, 用户必须归属为某一个数据库, admin 数据库下的用户可以操作所有数据库, 但是直接在非 admin 数据库下对 admin 数据库的用户进行认证是不成功的, 必须要先切换到 admin 下进行认证然后在切换到其他库才可, 如果想直接认证则必须在需要认证的数据库下创建用户:
- [root@abc] mongo
- ...
- > use admin
- ...
- > db.auth("root", "root")
- ...
- > use testdb
- ...
- # 注意只有 admin 数据库才有 root 角色, 其他数据库的管理类角色可以选择: dbOwner,dbAdmin,userAdmin 等
- > db.createUser({user: "testdb", pwd: "testdb", roles: [{role: "dbOwner", db: "testdb"}]})
- ...
- # 可以切换到 admin 数据库下查看用户信息
- > use admin
- ...
- > db.system.users.find({})
- ...
- # 也可以删除用户
- > db.system.users.remove({ _id: "...", user: "..." })
- ...
六, 配置说明
yaml 配置中, 缩进只能只用空格, 不可以使用 tab 键. 如果需要查阅跟多配置相关的信息, 请翻阅 MongoDB 官方手册: https://docs.mongodb.com/manual/reference/configuration-options/
来源: https://www.cnblogs.com/lbole/p/8902337.html