一、业务需求
用户访问日志是在web服务器access.log存储
cat access.log | awk '{print $1}' | uniq -c | sort -nr
查看访问次数最多的ip(百万次访问24小时)
统计每日访问量,峰值访问量
把每次访问存储到mongodb中,mongodb用来筛选日志
二、Mongodb介绍
1、nosql介绍
数据库排名: https://db-elWgines.com/en/ranking
关系数据库RDBMS设计表结构,通过SQL语句进行操作。连表关系
常见的关系型数据库: mysql oracle(商业) DB2 (IBM) sqlserver(微软) access(微软) sqlite3(小型嵌入到APP中) postgresql (加州伯克利大学)
nosql泛指非关系数据库存储格式key=>value memcached redis内存缓存数据库
mongodb 具有更多的功能,可以适用于大部分的mysql场景document store文档型数据库
2、产品特点
2.1、存储性
比较适合存储大量的没有规则、无序的数据。未经过处理的数据
存储量大:单表实现存储PB级别的数据 1PB=1024TB
2.2、效率性
数据的效率,就是指存储和读写速度。
2.3、结构
三、Mongodb安装及使用
yum方式安装: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
手动通用安装: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux)
1、编译安装mongodb
①上传安装包到服务器目录
②解压到安装目录并移动
tar xvf mongodb-linux-x86_64-rhe162-3.6.5.tgz
mv mongodb-linux-x86_64-rhel62-3.6.5 /usr/local/mongodb
移动到local目录下
③创建数据存储目录和日志目录
cd /usr/local/mongodb
mkdir data
mkdir logs
可以提前创建,后面就不用创建了
④启动mongod服务
cd /usr/local/mongodb/bin
./mongod --dbpath=/usr/local/mongodb/data
--logpath=/usr/local/mongodb/logs/log.txt --fork
#可以通过进程和端口的方式检测是否启动成功
ps aux |grep mongod 查看进程
netstat -lntp |grep mongod 查看端口
参数介绍:
dbpath数据存储路径
logpath日志存储路径指向到一个文件
fork 后台启动
auth权限开启
bind_ip 指定绑定网卡ip
2、命令行客户端操作
四、数据结构类型操作CURD
1、添加数据
1.1、普通数据添加 多维数据添加 数组信息添加
第一步:连接数据库之后切换使用数据库,不存在就自动创建
./mongo 启动数据库
语法:
db.集合名称.insert (bson格式数据)
2、查询数据
语法:db.集合名称.find(查询条件)
findOne(查询条件)
2.1、笼统方式查询不进行条件限制,全部取出来。
findOne会取出符合结果的第一条信息,并且以格式化形式返回
2.2、条件限制查询
条件格式,所见及所得
db.goods.find({name:'xiaomimax'})
db.goods.findOne({name:'xiaomimax'}) 查询符合条件的第一条数据
2.3、范围条件查询
mysql < <= > => !=
mongo $lt 小于 $lte 小于等于 $gt 大于 $gte $ne 不等于
db.goods.find({price:{'$lte':1999}})
db.goods.find({price:{'$lt':1999}})
2.4、多个条件查询
类似mIysql中的AND语法
db.goods.find ({price:{'$lte':1999 },number:{'$gte':40}})
$转义字符 $lte小于等于 $gte大于等于
2.5、多维字段查询
通过多维字段的值进行查询
db.goods.find({'area.city':'zhengzhou'});
结果一定是河南
注意:多维字段需要用引号包含起来
2.6、数组条件查询
①查询满足其中之一即可显示
db.goods.find ( {color : ' black ' })
②满足所有的查询条件才可显示
db.集合名称.find({字段(数组):{'$all':[v1,v2]}})
db.goods.insert({name:'iphonex',price:8398,weight:100,number:200,area:
{province:'jiangsu',city:'nanjing'},color:['gray','black','white','gold']})
db.goods.find({color:{'$all':['black','gold']}})
2.7、限制查询字段
在实际使用环境,不需要查询并显示太多的字段。可以选择设定显示。
语法: db.集合名称.find({查询条件},{筛选条件})
显示为1,不显示为0 要是1都是1,要是0都是0 _id除外(默认是1)
最好用什么查什么,节约内存
2.8、查看官方文档
安装下载以及使用文档,上面都有
2.9、$or查询
满足其中之一的条件就可以显示,类似mysql的中的or条件语法select * from goods where price > 5000 or number >= 100
db.goods.find( { ' $or ': [{price: { '$gt ':5000}},{number: {'$gte ' :100}}]})
格式:
db. goods .find({'$or':[{},{}]})
2.10、count语法
返回结果的数量统计
链式操作
db .goods.count()|
db.goods.find( {price : {'$gt' :500} }).count( )
db.goods.count({price : { '$gt ' :500}})
2.11、limit、skip语法
类似于mysql中的limit (skip,length)语法
limit()取几个
skip()跳过几个
查询价格最高的数据,只显示名字和价格,不显示_id .sort排序也是链式操作
3、修改数据
关系型数据修改无序的数据需要重新定义表结构,非关系型数据库就可以直接存储无序的,更灵活
语法:db.集合名称.update({查询条件},{修改条件})
updateOne()修改匹配的第—条
updateMany()修改匹配所有条
3.1、有$set的修改
db.goods.update( {name : ' iphonex ' } , { ' $set ' :{price : 8000}})
3.2、没有$set的修改
没有$set关键字语法,把设置的字段进行修改,没有设置的就会被删除掉
db. goods.update( {name : ' iphonex ' } ,{price :8000})
4、删除数据
4.1、删除记录
语法:db.集合名称.remove({查询条件})
deleteOne()删除匹配的第一条
deleteMany()删除匹配的多条 如果({})是空的则删除所有数据
一般业务环境是不会delete的,都是和回收站一样隐藏状态信息,数据还是真实存在的
db. goods.remove( {price:8000})
remove不指定字段就会默认全删除
4.2、删除字段
可以删除某个字段的操作,使用的是update语法的$unset
db.goods.update( {name : ' huawei81},{'$unset ' : {weight:0}})
删除weight字段,非关系型数据库特别灵活,字段可以随意删除
值给一个就可以删除了
真实业务当中,一般不做物理删除,会使用一个标识status,来确认是否已经被删除的数据
五、安全设置
https://docs.mongodb.com/manual/tutorial/create-users/mongodb
安全事件: https://www.jianshu.com/p/48d17a69e190 mongodb数据库公网裸奔
1、限制登录
①使用另外一台虚拟机,使用mongo命令行端进行测试
在公网裸奔也没事,因为mongodb默认只能本地连接127.0.0.1
②关闭mongodb
正常情况下不要kill -9 mongod,最好不用,很容易起不来服务,使用mongo命令客户端里的关机命令
修改mongod脚本文件
2、用户权限管理
需求:设置一个超级管理员账户,对于所有库具有读写权限
语法:
db.createUser({user: 'root',pwd:'root',roles:['root']})
实现步骤:
①切换admin库,进行用户创建
普通用户创建
roles:[{role:'read',db:'tp5shop'}]
②关闭mongod服务,重启添加权限参数并启动
最后就是登录测试
本地登录测试
忘记了参数可以 直接./mongo --help
远程登录测试
六、php扩展安装mongodb
是真的卡,需要等
1、PHP扩展安装
安装到web服务器server01和server03上(把web服务器的日志存储到mongodb)
①上传php扩展包
②解压编译安装
③添加php.ini匹配
shell > vim /usr/local/php/etc/php.ini
④重启或者重载php-fpm查看phpinfo
shell > service php-fpm restart/reload
2、桌面管理使用
官网:https://robomongo.org/download
可以下载远程管理工具
3、日志统计展示
很多网站需要统计某个页面或者某个功能访问量,如果访问量比较大,需要记录的组件具有很快的读写效率。可以使用功能性更多的mongodb来完成此业务。mongodb具有更多的数据灵活性。
网站访问日志记录的信息;
ip 用户访问的来源ip
url 用户访问的地址功能模块页面地址time访问时间记录用户访问的时间
user_agent 用户访问的客户端信息
操作实现步骤:
①删除原来的文件
②上传修改好的文件
php中获取代理的真实IP的方式,但是一定要注意必须是代理服务器有传真实IP
③访问页面之后,可以查看到访问已经被记录
如果访问测试时连接不上web页面
可以启动nginx、mycat、redis
开启mongodb服务器
实现了把web访问日志存储在mongodb
七、mongodb数据迁移
1、mongoexport导出
第一步:导出数据
开启 mongodb服务
servcie mongod start
mongo自己连接 自己
use admin 使用或创建 数据库
db.auth({'root'},{'root'})
显示1,代表登录数据库成功
use tp5shop
db.help() //忘记语法可以查帮助
./mongoexport -d tp5shop -c 集合 -uroot -proot --authenticationDatabase=admin -o ./集合.json 导出集合数据到当前文件的.json
db.qiubai.drop
第二步:导入数据
2、mongodump导出
第一步:导出数据(整个数据库)
./mongodump -d tp5shop -uroot -proot --authenticationDatabase=admin -o ./dump
第二步:导入数据
./mongorestore -uroot -proot --authenticationDatabase=admin --dir=./dump
八、mongoDB命令监控工具
1 ./mongostat
2 ./mongotop
定位哪个数据库在写入数据,哪些没有写入数据
3 、db.hostInfo()
mongodb扩容 主从master slave 4.0 主从方式废弃掉了
4.0后扩容用 复制集replication