第一 JDK环境变量配置
安装JDK 1.8
第一步:tar -xvf jdk安装包
第二步:配置环境变量 vi /etc/profile
JAVA_HOME=/opt/jdk1.8.0_65
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
第三步: source /etc/profile 刷新配置文件(立即生效)
第二 ES安装(非root用户操作)
ElasticSearch 主节点
一、下载es包
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.3.tar.gz
二、解压es包
tar -xvf elasticsearch-5.5.3.tar.gz
三、将elasticsearch-5.5.3 复制一份 制作两个节点
cp -rf /root/Desktop/elasticsearch-5.5.3 /root/Desktop/elasticsearch-5.5.3-2
四、进入elasticsearch-5.5.3目录 修改es配置文件
1、vi config/elasticsearch.yml
2、编写配置信息:
①cluster.name: datav-cluster 定义集群名称
②node.name: node-1 定义节点名称
node.data:true
node.master:true
node.max_local_storage_nodes:1 只启动一个节点
③path.data: /home/anda1/node1/data 数据存放路径
④path.logs: /home/anda1/node1/logs 日志存放路径
⑤network.host: 172.17.100.184 主机地址
⑥transport.tcp.port: 9300设置节点间交互的端口号,默认9300
⑦http.port: 9200 设置对外服务的http端口 ,默认9200
⑧discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
⑨discovery.zen.ping.unicast.hosts:[“主节点IP:端口”]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
⑩bootstrap.memory_lock: false 是否锁住内存
bootstrap.system_call_filter:false:系统调用过滤器(需linux3.5以上的内核)
ElasticSearch 从节点
一、进入/root/Desktop/elasticsearch-5.5.3-2/config
1、vi elasticsearch.yml 修改配置文件
2、编辑配置信息:
A.cluster.name: datav-cluster
B.node.name: node1_1
C.path.data: /home/anda1/node2/data
D.path.logs: /home/anda1/node2/logs
E.bootstrap.memory_lock: false
F.bootstrap.system_call_filter: false
G.network.host: 0.0.0.0
H.http.port: 9202
I.transport.tcp.port: 9302
J.node.data: true
K.node.master: false
L.node.max_local_storage_nodes: 2
M.discovery.zen.ping.unicast.hosts: ["主节点IP:端口"]
启动节点bin/elasticsearch
常见问题(解决方案参考)
1. max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]
解决:切换到root用户,编辑limits.conf 添加类似如下内容
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
2.max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
3.max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
启动成功验证:
浏览器输入:http://节点IP:节点端口/(注意关闭防火墙)
即成功
第三 Logstash安装
一、下载logstash-5.5.3.tar.gz安装包
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.3.tar.gz
二、解压安装包
tar -xvf logstash-5.5.3.tar.gz
三、运行logstash
1、进入logstash-5.5.3目录
2、运行 bin/logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}'
3、输入123
4、如图所示即成功
第四 Kibana 安装
一、下载Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.3-linux-x86_64.tar.gz
二、解压安装包
tar -xvf kibana-5.5.3-linux-x86_64.tar.gz
三、编辑配置文件Kibana.yml
A. server.port: 5601
B. server.host: "192.168.154.130"
C. elasticsearch.url: "http://客户端节点IP:9200"
D. kibana.index: ".kibana"
四、运行kibana
bin/kibana
第五 常用的插件
一、ES-sql(restful接口调用时可省去写DSL语法,以常用的sql替代)
1、下载ESsql 文件
https://github.com/NLPchina/elasticsearch-sql
2、安装
/bin/elasticsearch-plugin install file:/文件路径
3、测试
Url:http://ip:端口/_sql?sql=select * from myindex limit 10
4、web端
A.cd site-server
B.npm install express --save
C.node node-server.js
D.site_configuration.json修改端口
F:浏览器访问地址http://ip:修改的端口号
二、ES-head(用来监控集群状态,可查看索引个数、分片数等一些简易操作)
1、安装
简单的安装方式就是通过谷歌的扩展插件安装。
2、运行
可通过运行谷歌插件运行
三、Bigdesk(优于ES-head)
1、安装
A.yum install git
B.git clone https://github.com/hlstudio/bigdesk
2、运行
A. cd bigdesk/_site/
B. python -m SimpleHTTPServer
3、查看
默认启动8000端口,http://ip(文件所在机器):8000
Tip:在elasticsearch.yaml需修改配置
①http.cors.enabled:true 启用跨源资源共享
②http.cors.allo-origin:/”.*/” 哪个源允许使用正则表达式*,运行任何地方的源的请求(相当于拦截器)
第六 Elasticsearch的使用
一、集群状态的查看
1、GET /_cat/allocation?v
分配给每个数据节点的碎片数量以及它们使用的磁盘空间大小
2、GET /_cat/count?v GET /_cat/count/myindex?v
快速查询当前整个集群或者指定索引的document数量(不包括已标记删除的document)
3、_cat/fielddata (fielddata?v&fields=XXX 制定fields)
查询集群中每个节点中fielddata所用的堆内存
4、_cat/health(参数ts=false 不显示时间戳)
查询当前集群的健康信息
5、GET /_cat/indices/index1?v
查询指定索引index1的相关信息(组成一个索引(index)的shard数量,document的数量,删除的doc数量,主存大小和所有索引的总存储大小(包括replicas)
6、GET /_cat/master?v
显示master的节点ID,绑定IP地址,节点名称
7、GET /_cat/nodes?v
显示使用堆的百分比,总内存使用百分比,CPU使用率,平均负载,是否主节点资格,节点名称
8、GET /_cat/plugins
显示安装的插件信息
9、GET /_cat/recovery?v
查看分片的恢复状态
10、GET /_cat/template?v
查看模板信息
11、GET /_cat/shards?v
查看分片的状态,大小,所属节点以及HOST
二、索引
1、索引的创建
2、删除索引
3、打开/关闭索引
4、更新索引设置
5、索引模板设置
PUT /_template/template_1?pretty
{
"template": "te*",(通配符* 匹配所有以te开头的索引)
"settings": {
"number_of_shards": 1(主分片为1)
},
"mappings": {
"type1": {(type为type1)
"_source": {
"enabled": false
},
"properties": {
"host_name": {(字段名)
"type": "keyword"(字段类型)
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}
6、清楚索引缓存
curl -XPOST 'localhost:9200/kimchy,elasticsearch/_cache/clear?pretty'(清除指定索引的缓存)
curl -XPOST 'localhost:9200/_cache/clear?pretty'(清楚所有缓存)
第七 ES的优化
(自定义调优)
1、如果对数据的完整性要求不高,可将副本设置为0
原因:副本也要完成分析,索引和段合并的操作,影响导入性能
2、磁盘的优化,使用多个磁盘给Elasticsearch访问,通过在path.data中添加
原因:类似于多线程,同时打开数据目录,逐层查询
3、默认自建ID
原因:自定义ID,每次写入,都会检查ID是否存在(耗时);若存在,则作更新操作
4、禁止swapping交换内存
原因:内存交换到磁盘,再从磁盘交换的内存,影响磁盘的IO性能
5、使用性能更好的硬件,比如固态
6、ES _refresh 和 flush
_refresh 文件->内存->文件系统缓存->磁盘 默认刷新1s。 数据写入磁盘会创建一个segment file/秒,为获取更大吞吐量可增大刷新时间。
_flush ES为了数据安全性,在写入内存buffer时,会产生一份translog日志,从而在出现程序故障/磁盘异常时, 保证数据的完整和安全。flush会触发lucene commit,并清空translog日志文件,释放内存。默认5分钟自动同步刷新,一次commit。
7、增大内存。
原因: ES 是java应用,和它相关的两个名词JVM和GC 离不开内存
Lucene的倒排索引是在内存里生成,然后是以段的形式刷到磁盘。每个段实际就是一个完整的倒排索引,并且一旦写道磁盘上就不会做修改。
API层面的文档更新和删除是增量写入的一种特殊文档,会保存在新的段里。不变的段文件易于被操作系统cache,热数据几乎等效于内存访问。
8、节约内存
①合理设计数据结构(mapping)减少结构占用内存空间
a.明确需要分词字段(默认情况下索引建立的字段类型都是text+keyword,这样搜索时会对所有text类型字段会做分词处理)
b.减少不需要的字段
② ES分配的内存小于32G
原因:jvm在内存小于32G时会采用内存对象指针压缩技术,java中的对象都是通过指针指引对象所在堆的位置,这些指针大小通常是32bit和64bit(取决于处理器)
对于64位系统可以使用更大的内存,64位的指针会造成浪费,所以指针不直接表示对象的位置,而是表示偏移量。(32位的指针可以引用40亿个对象,而不是40亿个字节)
③禁用swapping
原因:物理内存不够用时,释放一部分物理内存提供给当前运行的程序,内存存放到磁盘,影响磁盘IO性能。
9、索引每个分片的大小在10G左右
原因:过多或者过少的分片都会导致检索慢
10、合并段
原因:每个索引文件都是有多个segments组成的,索引的更新和删除操作不会将数据从segments文件中删除,只是标记为删除文档,segments 越多查询性能越差。
在合并段时,会生成新的段,标有删除标记的文档不会存在。
11、查询时多用filter
①查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件
②过滤器上下文中,查询的结果可以被缓存。
12、index buffer
indices.memory.index_buffer_size 这个值默认为10%,即堆内存的10%会被用作index时的缓存,这个值可以设置百分比也可以是固定的大小。缓冲自然是越大越好。但记得千万不能超过可用的对内存,并且要跟filter cache和filed cache保证在一个合理的比例。
(官方调优)
调优索引速度 即写入速度
1、使用批量请求
2、使用多个线程将数据发送到ES
3、增加刷新间隔时间
4、禁用初始加载刷新和副本
5、禁用交换
6、给文件缓冲区内存
7、使用自动生成的ID
8、使用更快的硬件
9、增大索引缓冲区大小
10、调整磁盘使用
(1) 禁用不需要的字段
(2) 不要使用默认的动态字符串映射
(3) 禁用_all
(4) 使用足够的最小数字类型
调整搜索速度
1、给文件缓冲区内存
2、使用更快的硬件
3、文档建模
4、预索引数据
5、搜索舍入日期
6、强制合并只读索引
7、预热文件系统缓存
(1) Index.store.type: niofs
设置参考
#基础设置
cluster.name: ee
node.name: datanode1
node.data: true
node.master: false
path.data: /home/anda2/datanode1_data1,/home/anda2/datanode1_data2,/home/anda2/datanode1_data3,/home/anda2/datanode1_data4
path.logs: /home/anda2/datanode1_logs
network.host: 172.17.100.185
transport.tcp.port: 9302
http.port: 9202
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping.unicast.hosts: ["172.17.100.184:9301"]
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
#碎片分配设置
#启用或禁用分配特定种类的分片
cluster.routing.allocation.enable: all
#允许在一个节点上发生多少个并发传入碎片恢复。即将进行的恢复是在节点上分配目标分片(最有可能是副本,除非分片重新分配)的恢复。默认为2
cluster.routing.allocation.node_concurrent_incoming_recoveries: 2
#虽然复制副本的恢复发生在网络上,但重新启动节点后恢复未分配的主节点将使用本地磁盘中的数据。这些应该很快,以便在同一个节点上可以同时发生更多的初始主恢复。默认为4。
cluster.routing.allocation.node_initial_primaries_recoveries: 4
#碎片重新平衡设置
#启用或禁用特定种类的分片重新平衡
cluster.routing.rebalance.enable: all
#指定何时允许分片重新平衡
cluster.routing.allocation.allow_rebalance: indices_all_active
#允许控制集群范围允许多少个并发碎片重新平衡。默认为2。请注意,此设置仅控制由于群集中的不平衡而导致的并发碎片重定位的数量。此设置不会限制由于分配过滤 或强制感知而导致的碎片重定位
cluster.routing.allocation.cluster_concurrent_rebalance: 2
#碎片平衡启发式
#定义节点上分配的碎片总数(浮点数)的权重因子。默认为0.45f。提高这种趋势会使集群中所有节点上的碎片数量相等
cluster.routing.allocation.balance.shard: 0.45f
#定义在特定节点上分配的每个索引的分片数(浮点数)的权重因子。默认为0.55f。提高这种趋势会使集群中所有节点上的每个索引的碎片数量相等。
cluster.routing.allocation.balance.index: 0.55f
#应该执行的操作的最小优化值(非负浮点数)。默认为1.0f。提高这将导致集群在优化分片余额方面不太积极。
cluster.routing.allocation.balance.threshold: 1.0f
#基于磁盘的碎片分配
#Elasticsearch应该检查集群中每个节点的磁盘使用情况。默认为30s
cluster.info.update.interval: 1m
#本地网关
#预计在群集中的(数据或主节点)数量。一旦预期的节点数量加入到群集中,本地碎片的恢复就会开始。默认为0
gateway.expected_nodes: 0
#预计将在群集中的主节点的数量。当主节点加入集群时,本地碎片的恢复将立即开始。默认为0
gateway.expected_master_nodes: 0
#如果未达到预期的节点数量,则无论恢复尝试恢复,恢复过程都会等待配置的时间量。默认为5m如果expected_nodes配置其中一个设置。
gateway.recover_after_time: 2m
#聚合排序数据缓存
indices.fielddata.cache.size: 40%
#节点查询缓存
indices.queries.cache.size: 20%
index.queries.cache.enabled: true
#索引缓冲区
indices.memory.index_buffer_size: 35%
#索引恢复
indices.recovery.max_bytes_per_sec: 50mb
#线程池
thread_pool.index.size: 9
thread_pool.index.queue_size: 200
thread_pool.search.size: 12
thread_pool.search.queue_size: 1000
thread_pool.get.size: 8
thread_pool.get.queue_size: 1000
thread_pool.bulk.size: 8
thread_pool.bulk.queue_size: 200
JVM 配置
-XX:ParallelCMSThreads=8
-XX:CMSInitiatingOccupancyFraction=75
-XX:MaxGCPauseMillis=200
第八 ES迁移
1. 下载http://nodejs.org/
wget http://nodejs.org/dist/latest/node-v9.3.0-linux-x64.tar.gz
2. 解压
3. 配置全局
4. 验证
node -v
5. 安装迁移工具
npm install elasticdump -g
6. 迁移
elasticdump --input=http://192.168.1.201:9201/map --output=http://192.168.1.201:9202/map --type=mapping/data/analyzer
官方地址链接(https://github.com/taskrabbit/elasticsearch-dump)
#使用分析器和映射将生产索引复制到分段:
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = http://staging.es.com:9200 / my_index \
--type =分析器
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = http://staging.es.com:9200 / my_index \
--type =映射
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = http://staging.es.com:9200 / my_index \
--type =数据
#将索引数据备份到文件中:
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = / data / my_index_mapping.json \
--type =映射
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = / data / my_index.json \
--type =数据
#使用标准输出备份和索引到gzip:
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = $ \
| gzip > /data/my_index.json.gz
#将查询结果备份到文件中
elasticdump \
--input = http://production.es.com:9200 / my_index \
--output = query.json \
--searchBody ' {“query”:{“term”:{“username”:“admin”}}} '
#复制单个分片数据:
elasticdump \
--input = http://es.com:9200 / api \
--output = http://es.com:9200 / api2 \
--params = ' {“preference”:“_shards:0”} '
第九 磁盘挂载
一、
1、echo "- - -" > /sys/class/scsi_host/host0/scan
2、fdisk -l | grep /dev/sd
3、pvcreate /dev/sdb
4、vgextend centos /dev/sdb
5、Vgs
6、lvextend -r -L +3000g /dev/centos/home
7、df -h
二、
1、fdisk /dev/sda
2、n->p->3->enter->enter->w
3、Partprobe
4、Pvcreate /dev/sda3
第十 GC
并发标记清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。可使用 -XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。【默认使用】
G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才可以使用的特性,它的长远目标时代替CMS收集器。G1收集器是一个并行的、并发的和增量式压缩短暂停顿的垃圾收集器。G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域,因此叫“Garbage First”。【建议使用】
Serial GC(-XX:+UseSerialGC):Serial GC使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客户端模式)很有用,比如在简单的独立应用和CPU配置较低的机器。这个模式对占有内存较少的应用很管用。
Parallel GC(-XX:+UseParallelGC):除了会产生N个线程来进行年轻代的垃圾收集外,Parallel GC和Serial GC几乎一样。这里的N是系统CPU的核数。我们可以使用 -XX:ParallelGCThreads=n 这个JVM选项来控制线程数量。并行垃圾收集器也叫throughput收集器。因为它使用了多CPU加快垃圾回收性能。Parallel GC在进行年老代垃圾收集时使用单线程。
Parallel Old GC(-XX:+UseParallelOldGC):和Parallel GC一样。不同之处,Parallel Old GC在年轻代垃圾收集和年老代垃圾回收时都使用多线程收集




