学习目标和内容
时间:2017.6.-2017.9
发布产品类型:互联⽹动态站点 商城
⽤户数量: 10000-12000(⽤户量猛增)
PV : 1000000-5000000(24⼩时访问次数总和)
QPS: 50-100*(每秒访问次数)
DAU: 2000~*000(每⽇活跃⽤户数)
根据业务需求:
用户访问日志是在web服务器access.log存储
统计每日访问量,峰值访问量
把每次访问存储到mongodb中,mongodb用来筛选日志
根据以上业务需求,采用mongodb数据库存储用户的访问日志,使用单台服务器
①访问日志存储
②在mongo中筛选查看信息
数据库排名:https://db-engines.com/en/ranking
关系数据库 RDBMS 设计表结构,通过SQL语句进行操作。连表关系
常见的关系型数据库:mysql oracle(商业) DB2(IBM) sqlserver(微软) access(微软) sqlite3(小型 嵌入到APP中) postgresql(加州伯克利大学)
nosql 非关系数据库 存储格式key=>value
memcached redis 内存缓存数据库
mongodb 具有更多的功能,可以适用于大部分的mysql场景 document store 文档型数据库
比较适合存储大量的没有规则、无序的数据。
存储量大:单表实现存储PB级别的数据
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB (Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024ZB,
数据的效率,就是指存储和读写速度。
yum方式安装:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
手动通用安装:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/
①上传安装包到服务器目录
②解压到安装目录 并移动
shell > tar xvf mongodb-linux-x86_64-rhel62-3.6.5.tgz
shell > mv mongodb-linux-x86_64-rhel62-3.6.5 /usr/local/mongodb
③创建数据存储目录
shell > cd /usr/local/mongodb
shell > mkdir data
④启动mongod服务
shell > cd /usr/local/mongodb/bin
shell > ./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/log.txt --fork
参数介绍:
dbpath 数据存储路径
logpath 日志存储路径
fork 后台启动
auth 权限开启
bind_ip 指定绑定网卡ip
mongodb里存储数据的格式文档形式,以bson格式的文档形式。
在mongodb中,可有无需创建数据库和集合,使用的时候会自动创建
创建一个库devops
语法:
db.集合名称.insert(bson格式数据)
db.goods.insert({name:'huawei01',price:1000,weight:135,number:35})
db.goods.insert({name:'xiaomi5',price:1999,weight:156,number:45,area:{province:'beijing',city:'beijing'}})
db.goods.insert({name:'xiaomimax',price:2000,weight:180,number:100,area:{province:'henan',city:'zhengzhou'},color:['black','white','red']})
语法:db.集合名称.find(查询条件)
findOne()
不进行条件限制,全部取出来。
findOne会取出符合结果的第一条信息,并且以格式化形式返回
条件格式,所见及所得
db.goods.find({name:'xiaomimax'})
db.goods.findOne({name:'xiaomimax'})
mysql < <= > >= !=
mongo $lt $lte $gt $gte $ne
db.goods.find({price:{'$lte':1999}})
db.goods.find({price:{'$lt':1999}})
类似mysql中的AND语法
db.goods.find({price:{'$lte':1999},number:{'$gte':40}})
通过多维字段的值进行查询
db.goods.find({'area.city':'zhengzhou'});
注意:多维字段需要用引号包含起来
①查询满足其中之一即可显示
db.goods.find({color:'black'})
②满足查询条件所有的才可显示
db.集合名称.find({字段(数组):{‘$all’:[v1,v2]}})
db.goods.find({color:{'$all':['black','gold']}})
在实际使用环境,不需要查询并显示太多的字段。可以选择设定显示。
语法:db.集合名称.find({查询条件},{筛选条件})
显示为1,不显示为0 要是1都是1,要是0都是0 _id除外
db.goods.find({color:{'$all':['black','gold']}},{name:1,_id:0})
注意采用合适的方式,显示出查询字段值内容
_id是mongodb数据库里的集合中,默认的主键id,具有索引内容,通过主键查询,会很快的查询速度。不要随意修改此值,使用默认即可。
满足其中之一的条件就可以显示,类似mysql的中的or条件语法
select * from goods where price > 5000 or number >= 100
db.goods.find({'$or':[{price:{'$gt':5000}},{number:{'$gte':100}}]})
返回结果的数量统计
链式操作
db.goods.count()
db.goods.find({price:{'$gt':5000}}).count()
db.goods.count({price:{'$gt':5000}})
类似于mysql中的limit(skip,length)语法
limit() 取几个
skip() 跳过几个
db.goods.find().limit(1);
db.goods.find().skip(1).limit(1);
mongodb语法和SQL语句的对比
语法:db.集合名称.update({查询条件},{修改条件})
updateOne() 修改匹配的第一条
updateMany() 修改匹配所有条
db.goods.update({name:'iphonex'},{'$set':{price:8500}})
db.goods.updateOne({name:'xiaomi5'},{'$set':{price:1500}})
没有$set关键字语法,把设置的字段进行修改,没有设置的就会被删除掉
db.goods.update({name:'iphonex'},{price:8550})
语法: db.集合名称.remove({查询条件})
deleteOne() 删除匹配的第一条
deleteMany() 删除匹配的多条
db.goods.remove({price:8550})
db.goods.deleteMany({price:{'$lte':2000}})
可以删除某个字段的操作,使用的是update语法的$unset
db.goods.update({name:'huawei01'},{'$unset':{weight:0}})
值给一个就可以删除了
真实业务当中,一般不做物理删除,会使用一个标识,来确认是否已经被删除的数据
https://docs.mongodb.com/manual/tutorial/create-users/
mongodb安全事件:https://www.jianshu.com/p/48d17a69e190
①使用另外一台虚拟机,使用mongo命令行端进行测试
远程登录方法
②关闭mongodb
正常情况下不要killall mongod,使用mongo命令客户端里的关机命令
③添加启动的脚本,启动mongod
④在mongo服务的服务器上,启动mongo加入--bind_ip参数
--bind_ip
重新启动mongodb
shell > sh /usr/local/mongodb/start.sh
⑤使用远程登录mongod服务
需求:设置一个超级管理员账户,对于所有库具有读写权限
语法:
db.createUser({user:"root",pwd:"root",roles:["root"]})
实现步骤:
①切换admin库,进行用户创建
②关闭mongod服务,重启添加权限参数并启动
关闭
在启动脚本中加入--auth参数
修改加入参数并保存
重新启动mongodb
③测试使用
添加用户,限制用的库的权限,只读
①上传php扩展包
②解压编译安装
shell > tar xvf mongo-1.6.14.tgz
shell > cd mongo-1.6.14
shell > phpize
shell > ./configure && make && make install
③添加php.ini匹配
shell > vim /usr/local/php/etc/php.ini +873
④重启php-fpm查看phpinfo
shell > service php-fpm restart
软件是绿色版本,直接解压,点击使用即可
填写相关参数
测试是否可以正常连接
点击连接
查看数据
很多网站需要统计某个页面或者某个功能访问量,如果访问量比较大,需要记录的组件具有很快的读写效率。可以使用功能性更多的mongodb来完成此业务。mongo具有更多的数据灵活性。
网站访问日志记录的信息:
ip 用户访问的来源ip
url 用户访问的地址 功能模块页面地址
time 访问时间 记录用户访问的时间值
user_agent 用户访问的客户端信息
使用服务器
web1->mycat->master->slave->cache->mongodb
操作实现步骤:
①删除原来的文件
②上传修改好的文件
③访问页面之后,可以查看到访问已经被记录
注意如果使用负载均衡,后端获取的IP为负载均衡代理的IP。
如果后端需要获取到真是的IP,负载均衡服务器,必须要配置参数,把真实IP进行传输
php中获取代理的真实IP的方式,但是一定要注意必须是代理服务器有传真实IP