一、NoSQL简介
NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是 SQL”。NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至 2009 年趋势越发高涨。NoSQL拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是
一种全新的思维的注入。
对 NoSQL 最普遍的解释是”非关联型的”,强调 Key-Value Stores 和文档数据库的优点,而不是单纯的反对 RDBMS。NoSQL 用于超大规模数据的存储。
用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那 SQL 数据库已经不适合这些应用了, NoSQL 数据库的发展也能很好的处理这些大的数据。
二、MongoDB
1、简介
Mongodb 由 C++语言编写的,MongoDB 以一种叫做 BSON(二进制 JSON)的存储形式将数据作为文档存储。
2、数据格式
(1)JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式。
{"FirstName":"ke","LastName":"me","email":"hikeme@aa"}
取值方式和所有语言中一样,使用 key 获取,字段值的类型可以是 数字、字符串、数组、对象几种。
(2)BSON
是一种类 JSON 的一种二进制形式的存储格式,简称 Binary JSON,它和 JSON 一样,支持内嵌的文档对象和数组对象,但是 BSON 有 JSON 没有的一些数据类型,如 Date 和 BinData 类型。
它的优点是灵活性高,但它的缺点是空间利用率不是很理想。
BSON 有三个特点:轻量性、可遍历性、高效性。
3、特点
高性能:Mongodb 提供高性能的数据持久性,尤其是支持嵌入式数据模型减少数据库系统上的I/O 操作,索引支持能快的查询,并且可以包括来嵌入式文档和数组中的键
丰富的语言查询:Mongodb 支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总,文本搜索和地理空间索引。
高可用性:Mongodb 的复制工具,成为副本集,提供自动故障转移和数据冗余,
水平可扩展性:Mongodb 提供了可扩展性,作为其核心功能的一部分,分片是将数据分,在一组计算机上。
支持多种存储引擎:WiredTiger 存储引擎和、 MMAPv1 存储引擎和 InMemory 存储引擎。
4、MongoDB 包含的程序
MongoDB Drivers:官方 MongoDB 客户端库提供 C, C ++, C#, Java, Node.JS, Perl, PHP, Python, Ruby和 Scala 驱动程序的参考指南。
MongoDB Stitch:为开发人员提供了一个 API 到 MongoDB 和其他后端服务。保持 MongoDB 的全部功能和灵性,同时受益于强大的系统来配置细粒度的数据访问控制。
MongoDB Atlas:MongoDB 在云中部署,操作和扩展的最佳方式。适用于 AWS, Azure 和 Google Cloud Platform。轻松将数据迁移到 MongoDB Atlas,零停机
MongoDB Cloud Manager:是一个用于管理 MongoDB 部署的软件包。Ops Manager 提供 Ops Manager 监控和 Ops Manager 备份,可帮助用户优化群集并降低操作风险。
MongoDB Charts:可以最快速最简单的创建 Mongodb 可视化图表。
MongoDB Connector for BI:MongoDB 商业智能连接器(BI)允许用户使用 SQL 创建查询,(如 Tableau, MicroStrategy 和 Qlik)对其 MongoDB Enterprise 数据进行可视化,图形化和报告。
MongoDB Compass:通过从集合中随机抽样一个文档子集,为用户提供其 MongoDB 模式的图形视图。采样文件可最大程度地降低对数据库的影响,并能快速产生结果。有关 抽样的更多信息。
MongoDB Spark Connector:使用连接器,您可以访问所有使用 MongoDB 数据集的 Spark 库:用 SQL 进行分析的数据集(受益于自动模式推理),流式传输,机器学习和图形 API。您也可以使用连接器与 Spark Shell。
三、安装软件部署
1、帮助文档:https://docs.mongodb.com/manual/installation/
2、下载软件包
官方下载地址:
https://www.mongodb.com/download-center/community
这里选用 tar 包的安装方式:
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
如果没有3.6.13版本,下载3.6.18版本:
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.18.tgz
3、规划目录:
软件安装路径:
#mkdir /application/mongo_cluster/ -p
安装存放路径:/server/tools
4、安装依赖包
#yum install libcurl openssl -y
5、解压到指定目录
#tar zxvf mongodb-linux-x86_64-3.6.13.tgz -C /application/mongo_cluster/
#cd /application/mongo_cluster/
创建软连接:
#ln -s mongodb-linux-x86_64-3.6.13 mongodb
创建配置文件目录:
#mkdir /application/mongo_cluster/mongo_27017/{conf,logs,pid} -p
创建数据目录:
# mkdir /data/mongo_cluster/mongo_27017 -p
6、创建用户
#useradd mongo
#echo '123456'|passwd --stdin mongo
更改目录授权:
#chown -R mongo:mongo /application/mongo_cluster
#chown -R mongo:mongo /data/mongo_cluster
#chown -R mongo.mongo /application/mongo_cluster/mongo_27017/conf/mongodb.conf
#chown -R mongo.mongo /data/mongo_cluster/mongo_27017/mongod.lock
#chown -R mongo.mongo /application/mongo_cluster/mongo_27017/logs/mongodb.log
#chown -R mongo.mongo /application/mongo_cluster/mongo_27017/pid/mongod.pid
因为mongodb.log和mongodb.pid所属用户不是mongo,导致启动不了。
7、修改配置文件
YML:对缩进要求非常严格;
写入配置文件:
cat > /application/mongo_cluster/mongo_27017/conf/mongodb.conf << EOF
systemLog:
destination: file
logAppend: true
path: /application/mongo_cluster/mongo_27017/logs/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_cluster/mongo_27017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /application/mongo_cluster/mongo_27017/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,192.168.40.137
EOF
配置文件说明:
systemLog:
destination: file #Mongodb 日志输出的目的地,指定一个 file 或者 syslog,如果指定 file,必须指定
logAppend: true #当实例重启时,不创建新的日志文件,在老的日志文件末尾继续添加
path: /application/mongo_cluster/mongo_27017/logs/mongodb.log #日志路径
storage:
journal: #回滚日志
enabled: true
dbPath: /data/mongo_cluster/mongo_27017 #数据存储目录
directoryPerDB: true #默认 false,不适用 inmemory engine
wiredTiger:
engineConfig:
cacheSizeGB: 1 #将用于所有数据缓存的最大小
directoryForIndexes: true #默认 false 索引集合 storage.dbPath 存储在数据单独子目录
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement: #使用处理系统守护进程的控制处理
fork: true #后台运行
pidFilePath: /application/mongo_cluster/mongo_27017/pid/mongod.pid #创建 pid 文件
net:
port: 27017 #监听端口
bindIp: 127.0.0.1,192.168.40.137 #绑定 ip
8、配置环境变量:
#echo “”export PATH=/application/mongo_cluster/mongodb/bin:$PATH" >> /etc/profile
#source /etc/profile
9、启动:
#su mongo
$mongod -f /application/mongo_cluster/mongo_27017/conf/mongodb.conf
$ps -ef |grep mongodb
关闭启动:
#mongod -f /application/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
10、登录命令:
$mongo redis01:27017
警告1:
WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
解决方法:配置文件中cacheSizeGB设置的太大,虚拟机总内存才1G;
cacheSizeGB: 1。增加内存或者在配置文件里把 cash 调小。
警告2:用户访问控制
WARNING: Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.
解决方法:
security:
authorization: enabled
警告3:解决大内存页
WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
We suggest setting it to 'never'
WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
We suggest setting it to 'never'
解决方法参考:
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
查看状态:
#cat /sys/kernel/mm/transparent_hugepage/enabled
#cat /sys/kernel/mm/transparent_hugepage/defrag
临时关闭:
#echo never > /sys/kernel/mm/transparent_hugepage/enabled
#echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久关闭:
#vim /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO
case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag
re='^[0-1]+$'
if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi
unset re
unset thp_path
;;
esac
脚本权限:
#chmod 755 /etc/init.d/disable-transparent-hugepages
开机启动:
#chkconfig --add disable-transparent-hugepages
立即生效:
#source /etc/init.d/disable-transparent-hugepages
用脚本的方式必须重启服务器,可以先用临时生效。
警告4:relimit 警告
#vim /etc/profile
ulimit -u 64000
#source /etc/profile
重启:mongo 服务