1.mongoDB节点介绍
主节点(Primary)
在复制集中,主节点是唯一能够接收写请求的节点。MongoDB在主节点进行写操作,并将这些操作记录到主节点的oplog中。而从节点将会从oplog复制到其本机,并将这些操作应用到自己的数据集上。(复制集最多只能拥有一个主节点)
从节点(Secondaries)
从节点通过应用主节点传来的数据变动操作来保持其数据集与主节点一致。从节点也可以通过增加额外参数配置来对应特殊需求。例如,从节点可以是non-voting或是priority 0.
仲裁节点(ARBITER)
仲裁节点即投票节点,其本身并不包含数据集,且也无法晋升为主节点。但是,旦当前的主节点不可用时,投票节点就会参与到新的主节点选举的投票中。仲裁节点使用最小的资源并且不要求硬件设备。投票节点的存在使得复制集可以以偶数个节点存在,而无需为复制集再新增节点 不要将投票节点运行在复制集的主节点或从节点机器上。 投票节点与其他 复制集节点的交流仅有:选举过程中的投票,心跳检测和配置数据。这些交互都是不加密的。
心跳检测
复制集成员每两秒向复制集中其他成员进行心跳检测。如果某个节点在10秒内没有返回,那么它将被标记为不可用。
mongodb副本集是有故障恢复功能的主从集群,由一个primary节点和一个或多个secondary节点组成:
同步过程: Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。
通俗理解:当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步
- 1、检查自己local库的oplog.rs集合,找出最近的时间戳。
- 2、检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
- 3、将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。
副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:–oplogSize 1000,单位是M。
注意:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。
2.mongoDB安装文档
工具:Robomongo(mongodb可视化管理工具)
安装之前系统优化:
mongoDB 禁用大内存页面
echo never >> /sys/kernel/mm/transparent_hugepage/enabled
echo never >> /sys/kernel/mm/transparent_hugepage/defrag
yum install -y numactl (可以提高mongodb导入速度)
numactl --interleave=all 启动命令
官方安装文档:http://docs.mongoing.com/manual-zh/installation.html
2.1创建mongoDB3.2源
vim /etc/yum.repos.d/mongodb-org-3.2.repo
[mongodb-org-3.2] name=MongoDB
Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
2.2创建mongoDB2.6源
vim /etc/yum.repos.d/mongodb-org-3.2.repo
[mongodb-org-2.6]
name=MongoDB 2.6
Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
2.3安装的MongoDB的最新稳定版本
yum install -y mongodb-org
2.4安装的MongoDB特定版本
分别指定每个组件包以及版本号追加到包的名称,如下面的例子:
yum install -y mongodb-org-3.2.0 mongodb-org-server-3.2.0 mongodb-org-shell-3.2.0 mongodb-org-mongos-3.2.0 mongodb-org-tools-3.2.0
3.创建keyfile(用于集群通信)
openssl rand -base64 755 > keyfile文件名
chmod 400 keyfile文件名
3.2将keyfile文件复制到从库和仲裁等其他节点,并在配置文件中指定路径
3.3配置文件修改(仅供参考)
vi /etc/mongod.conf
systemLog:#配置日志信息
destination: file
path: /home/mongodb/data/arbiter/mongod-qnzs-arbiter.log
logAppend: true
timeStampFormat: iso8601-local
processManagement:#fork后台允许模式
fork: true
pidFilePath: /home/mongodb/data/arbiter/mongod-qnzs-arbiter.pid
net:#配置通信端口
port: 27017
security:#安全通信设置
#初始化数据库之后需要创建管理用户,所以提前关闭用户认证。不然操作数据库提示权限不足
clusterAuthMode: keyFile
keyFile: /home/mongodb/data/mongo-keyfile
#authorization: enabled
authorization: disabled
storage:#引擎配置
dbPath: /home/mongodb/data/arbiter
directoryPerDB: true
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
directoryForIndexes: true
cacheSizeGB: 90
operationProfiling:
slowOpThresholdMs: 100
replication:
oplogSizeMB: 20480
replSetName: qnzs
官方详细配置说明:http://docs.mongoing.com/manual-zh/reference/configuration-options.html
3.4mongoDB启动
numactl --interleave=all mongod -f 配置文件路径
3.5创建管理用户
use admin db.createUser( { user: "root", pwd: "1234", roles: [ { role: "root", db: "admin" } ] } );
3.6mongoDB集群配置(1主+1从+1仲裁)
进入mongoDB:
mongo 172.168.11.19:27017/admin -u root -p 123
use admin
rs.initiate(
{
_id : "qnzs",#设置集群名称
members: [
{_id:0,host:"172.17.116.18:27017",priority:2},#设置主库(优先级高仲裁为主库概率越高)
{_id:1,host:"172.17.116.19:27017",priority:1},#设置从库
{_id:2,host:"172.17.116.20:27017",arbiterOnly:true}#设置仲裁
]
}
)
注意:对于仲裁节点,需要特别的配置:arbiterOnly:true。不设置,主备模式不生效。
3.7查看集群状态
rs.status()
4.扩展知识
节点角色:
读写分离
MongoDB副本集对读写分离的支持是通过Read Preferences特性进行支持的,这个特性非常复杂和灵活。设置读写分离需要先在从节点SECONDARY 设置 setSlaveOk
应用程序驱动通过read reference来设定如何对副本集进行读取操作,默认的,客户端驱动所有的读操作都是直接访问primary节点的,从而保证了数据的严格一致性。
有如下几种模式:
mongo shell中复制相关方法
复制 数据库的命令
用户管理和认证方法
官方详细档:https://docs.mongodb.com/master/reference/security/#security-methods-in-the-mongo-shell
角色管理方法
官方详细档:https://docs.mongodb.com/master/reference/security/#security-methods-in-the-mongo-shell
相关官方资料:mongo Shell Methods , Built-In Roles,Security Methods in the mongo Shell
总结:
由于之前没有接触过mongodb数据库,项目中需要用到。后续查看官方文档,英文就是个渣渣。
还好有翻译工具。按照官文搭建,但还是遇到很多坑。例如验证问题:
security:#安全通信设置
#初始化数据库之后需要创建管理用户,所以提前关闭用户认证。不然操作数据库提示权限不足
clusterAuthMode: keyFile
keyFile: /home/mongodb/data/mongo-keyfile
#authorization: enabled
authorization: disabled
初始化数据库的时候,一定要先禁言用户验证功能。然后在创建管理用户,之后就可以开启验证。操作数据库了
参考文档:
官方文档:
http://docs.mongoing.com/manual-zh/
http://docs.mongoing.com/manual-zh/reference/configuration-options.html
http://docs.mongoing.com/manual-zh/core/security-built-in-roles.html
个人文档:
http://blog.csdn.net/luonanqin/article/details/8497860
https://deepzz.com/2016/05/15/19.html