ES介绍,安装
1 如何提高项目并发量
# 1 web,app,微信小程序
# 2 web项目
-前端:
-用cdn,静态资源,放到cdn上(js,css,静态图片)
-用精灵图(一个大图,上面又很多小图,用定位,定位到小图)
-前端缓存(响应头设置缓存时间)cache-control (django如何向响应头写键值对:响应对象["aaa"]="aaa")
-nginx:
-nginx做集群(dns解析,负载均衡硬件 f5)
-动静分离(静态资源直接通过nginx转发,拿去;uwsgi只负责处理动态请求)
-负载均衡(nginx的配置)
-集群化部署
-拆服务(把项目做成分布式)
-使用uwsgi(c写的wsgi服务器)部署,使用gunicorn(python写的wsgi服务器)部署
-代码层面:
-缓存(redis)--》本来一个请求,要查5个表,耗时3s---》json格式--》放到缓存中--》下次再发请求,直接去缓存查---》0.001秒就返回了-----》(存在问题:缓存击穿,缓存穿透,缓存雪崩 双写一致性问题)
-页面静态化(不适用于app和小程序),提前生成一个首页页面(被访问频繁的页面)
-/index--->(查数据库(用了缓存)---》dtl渲染页面)--》提前生成出index.hmtl---》django模板渲染
-数据不一致(当有数据增加,再重新生成一次这个页面),同步?异步?
-用异步:用celery,django的信号(异步操作),当对象保存时,重新生成静态页面
-异步操作(celery),一个请求需要耗时3s,设计成异步--请来了--》直接返回(任务已提交,请求正在处理)
-小米秒杀:您正在排队(前端设置了定时,每隔5s,发送一个请求,查是否秒杀成功)
-保存视频,发送邮件,保存文章,
-后台管理,统计最近三,五,半年,个月的订单量--》折线图,饼状图展示
-消息队列:rabbitmq,kafka。。。异步,解耦
-请求打到数据库了(只要打到数据库,性能就下来了)
-优化sql,外键尽量不建立,适当建索引
-读写分离,数据库集群,分库分表
-优化代码,多线程处理,尽量不在for循环里查数据库
-换框架(异步框架),换语言
--最本质的一句,代码优化不了了,垒机器
django的cache如何实现的?
-配置,缓存到文件,redis,mysql
-可以缓存对象(set了对象,pickle序列化成二进制,存到了redis中)
-cache.set()
-cache.get()
# ================================django模板修改的视图函数
# from django.template import Template,Context
# now=datetime.datetime.now()
# t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
# #t=get_template('current_datetime.html')
# c=Context({'current_date':str(now)})
# html=t.render(c)
#
# return HttpResponse(html)
render('index.html',{'key':'value'})
2 Elasticsearch介绍
# 1 产生背景:大规模数据如何检索,数据安全(单点故障),备份,检索速度
# 2 Elasticsearch介绍
-是一个基于Lucene的分布式搜索和分析引擎,全文检索引擎
-Elasticsearch使用Java开发
-但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单
# 3 Lucene与Elasticsearch关系
-Lucene只是java一个库----》只能java来使用
-python中集合--》只能python来用--》java,go用不了,其它语言想用,怎么做?
-做成服务---》django搭建一个服务---》对外通过restful接口 ---> get /key post /key=value
-基于Lucene封装 ,做成服务,通过restful来调用,使用全文检索
# 4 Elasticsearch vs solr
-solr 也是一个全文检索引擎
-跟es关系就像是mysql和oracle的关系
-传统搜索用solr多,es新兴互联网用的多
# 5 es核心概念
-集群:多台服务器的集合,称为es的集群
-节点:集群的每个服务器称为节点
-分片:10g的数据(一个表中),对10g数据分片,分成2g,3g,5g,把这些数据,分别放在不同的节点上
-副本:为提高查询吞吐量或实现高可用性,可以使用分片副本
-全文检索:分词,全文检索---》可以根据关键字搜索
# 6 es跟mysql比较
mysql es
数据库 索引(index)
表 类型(type)
一条一条数据 文档(document)
一列一列(字段) 字段(field)(name,age)
字段属性(主键,类型,索引) 映射(mapping)
索引 所有字段建索引(倒排索引)、
增删查改 get、post、delete。。。
# 7 ELK是什么?
-ELK=elasticsearch+Logstash+kibana
-日志的收集和分析系统
# 8 Elasticsearch特点和优势
-笔记看一下即可
# 9 为什么使用es?
-13年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索
-我们用在什么地方?
-我们项目如果有搜索功能,都可以用
-日志存储分析
-大数据量的存储和检索
# 10 Elasticsearch索引到底能处理多大数据
-es一个索引(数据库)可以有多个分片,一个分片是一个lucene的索引
-lucene一个索引不能处理多于21亿篇文档,或者多于2740亿的唯一词条
-理论上是可以无限加的
在线教育---》用户去浏览---》浏览记录---》停留时间---》存到日志---》日志分析的系统---》Linux感兴趣---》定向推荐----》linux课程上新了,打折了,短信推送,微信推送,都行
日志记录,收集
3 Elasticsearch安装配置
# 1 基于java开发的,安装jdk,windows上安装(jdk 1.8 以上),一路下一步(jdk,jre),(不需要配置环境变量了)
-java -version
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
# 2 安装es(去官网下载相应的版本,es+kiban. 注意版本一定要对应)
-版本问题:2 5版本 6版本 7版本 7.6.2版本最新(讲课用7版本),公司可能会用6或者6之前的版本
-haystack:不支持es,6以上版本,django上做全文检索的框架(对接es,对接solr,对接whoosh)
-whoosh-纯Python的全文搜索库,Whoosh是索引文本及搜索文本的类和函数库。它能让你开发出一个个性化的经典搜索引擎
-6以后,不允许一个索引下建多个type(类型)---》一个数据库只能有一个表
# 3 解压到指定目录(随便,不要有空格,中文 c://soft )
# 4 启动es
-到es的bin路径下,elasticsearch.bat
-Kibana 就是es的客户端(官方提供,相当于Navicat)
-Elasticsearch-head 就是es的客户端(第三方的,相当于Navicat)
# 5 启动kibana
-修改kibana配置文件
server.port: 5601
server.host: "127.0.0.1"
server.name: lqz
elasticsearch.hosts: ["http://localhost:9200/"]
-配置跨域(改es的配置)
-elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
-到kibana的bin路径下,kibana.bat 启动
# 6 启动Elasticsearch-head(第三方用node 写的一个es客户端)
-node 环境要装好
-下载:https://github.com/mobz/elasticsearch-head
-解压
-执行
npm install
npm run start
http://localhost:9100/
# kibana:官方提供的es客户端,主要用来做增删查改,有提示(postman,Elasticsearch-head)
# Elasticsearch-head :看集群的状态,索引的状态
kibana-docker-compose
version: '3'
services:
prometheus:
container_name: kibana
image: kibana:7.7.1
ports:
- "5601:5601"
restart: unless-stopped
volumes:
- /es/esData/config/kibana.yml:/usr/share/kibana/config/kibana.yml
es-docker-compose
version: '3'
services:
prometheus:
container_name: elasticsearch
image: elasticsearch:7.7.1
ports:
- "9200:9200"
- "9300:9300"
restart: unless-stopped
volumes:
- /es/esData/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
- /es/esData/data:/usr/share/elasticsearch/data \
- /es/esData/plugins:/usr/share/elasticsearch/plugins \
- /es/esData/es/logs:/usr/share/elasticsearch/logs \
environment:
discovery.type: "single-node"
ES_JAVA_OPTS: "-Xms64m -Xmx128m"
选择了IT,必定终身学习