搭建测试3节点ES集群,官网下载所需的版本进行解压运行,ECS与阿里云ES在同一地域可用区,并在相同的VPC内。
# mkdir /usr/java
# tar xvf jdk-8u162-linux-x64.tar.gz -C /usr/java/
# tar xvf logstash-5.5.3.tar.gz -C /srv/
# tar xvf kibana-5.4.3-linux-x86_64.tar.gz -C /srv
# tar xvf elasticsearch-5.4.3.tar.gz -C /srv/
# cat /etc/profile.d/elk.sh
export JAVA_HOME=/usr/java/jdk1.8.0_162/
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:/srv/elasticsearch-5.4.3/bin
export PATH=$PATH:/srv/logstash-5.5.3/bin
export PATH=$PATH:/srv/kibana-5.4.3-linux-x86_64/bin
# nohup kibana -c /srv/kibana-5.4.3-linux-x86_64/config/kibana.yml &
# nohup elasticsearch &
# cat /srv/kibana-5.4.3-linux-x86_64/config/kibana.yml
server.name: "kibana_test"
server.port: 9070 #监听端口
server.host: "192.168.0.80" #监听端口
elasticsearch.url: "http://es1:9007"
logging.dest: /srv/logs/kibana/kibana.log
xpack.security.enabled: false
ES配置文件说明,重要配置修改
# cat /srv/elasticsearch-5.4.3/config/elasticsearch.yml
cluster.name: robin_test #集群名称,默认叫elasticsearch
node.name: es1 #节点名称,若不指定,每次启动时会随机分配一个
node.master: true #是否有选举为主节点的资格,主节点可以控制整个集群
node.data: false #是否设置为数据节点,数据节点保存数据并执行增删改查,搜索聚合
node.ingest: false #是否为摄取节点,可以执行由一个或多个摄取处理器组成的预处理管道
path:
data: #默认将插件、日志以及数据配置在安装目录,建议拆分
- /srv/data/elasticsearch//0/
- /srv/data/elasticsearch//1/
logs: /srv/logs/elasticsearch/
http:
host: es1
port: 9007
network.host: es1
transport.tcp.port: 9002
discovery.zen.minimum_master_nodes: 2 #需要多少个node选举通过才能当上master,应设置为master候选节点的法定个数((master候选节点个数/2)+1)。
gateway:
recover_after_nodes: 2 #至少要有几个节点在线,集群才可用
expected_nodes: 2 #集群正常情况下应该存活的节点个数
recover_after_time: 1m #等待多长时间后才进行数据恢复
discovery.zen.ping:
unicast.hosts: ['es1:9002','es2:9002','es3:9002']
#单播列表,至少列出集群中一部分节点,当一个节点联系到列表中的成员时,可以获得整个集群所有节点的状态,然后它会联系master节点,并加入集群
thread_pool:
bulk:
size: 3
queue_size: 300
index:
size: 3
queue_size: 300
bootstrap:
memory_lock : true #避免系统swapping来提高性能
system_call_filter: false #Centos6不支持SecComp,设置为false,不进行检测
action.destructive_requires_name: true #在删除索引时是否指定索引名称,设置为true禁止允许通过通配符或_all删除索引
indices:
fielddata.cache.size: 40% #设置fielddata缓存的最大大小,Fielddata cache主要用于字段(field)的排序和聚合。Elasticsearch使用Fielddata和Filter两种主要类型的缓存来更快地提供搜索请求
breaker.total.limit: 70% #通过设置parent-level breaker指定所有breaker可以使用的内存总量,默认为JVM堆的70%。Elasticsearch包含多个断路器,用于防止操作引起的OutOfMemoryError。
breaker.request.limit: 60% #阻止每个请求数据结构超过一定数量的内存,默认为JVM堆的60%
store.throttle.max_bytes_per_sec: 500mb #存储节流限制,默认为20mb.
recovery.max_bytes_per_sec: 20mb #从0.90.1版开始,默认为20mb.
monitor.jvm.gc.overhead:
warn: 60
info: 50
debug: 40
cluster.routing.allocation:
node_concurrent_recoveries: 1 #允许在一个节点上发生多少次并发恢复。默认为2
cluster_concurrent_rebalance: 1 #允许集群范围内分片并发重平衡的数量,默认为2
使用logstash同步同步单个index
# cat index2index.conf
input {
elasticsearch {
hosts => ["es1:9007"] #老ES集群访问地址
index => "messages-20180401" #需要同步的索引名称
size => 1000
scroll => "1m"
codec => "json"
docinfo => true
}
}
output {
elasticsearch {
hosts => ["es-id.elasticsearch.aliyuncs.com:9200"] #阿里云ES访问地址
user => "elastic" #默认为 elastic
password => "123456789" #购买阿里云ES界面中指定的密码,或初始化 Kibana 时指定的密码
index => "messages-20180401" #在新ES集群中的索引名
}
stdout { codec => rubydebug { metadata => true } }
}
# logstash -f index2index.conf
在目标的elasticsearch中看到已经同步的index
使用Shell脚本同步单个index
# cat sync.sh
#!/bin/bash
# file:reindex.sh
indexName="sync" #需要同步的索引名称
newClusterUser="elastic" #默认为 elastic
newClusterPass="123456789" #购买阿里云ES界面中指定的密码,或初始化 Kibana 时指定的密码
newClusterHost="es-id.elasticsearch.aliyuncs.com:9200" #阿里云ES访问地址
oldClusterHost="http://192.168.0.79:9007" #老ES集群访问地址
curl -u ${newClusterUser}:${newClusterPass} -XPOST "http://${newClusterHost}/_reindex?pretty" -H "Content-Type: application/json" -d'{
"source": {
"remote": {
"host": "'${oldClusterHost}'"
},
"index": "'${indexName}'",
"query": {
"match_all": {}
}
},
"dest": {
"index": "'${indexName}'"
}
}'
执行成功返回
# sh sync.sh
{
"took" : 418,
"timed_out" : false,
"total" : 151,
"updated" : 151,
"created" : 0,
"deleted" : 0,
"batches" : 1,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
TIPS
ES启动报错
[2018-04-08T11:39:20,428][ERROR][o.e.b.Bootstrap ] Exception
java.lang.RuntimeException: can not run elasticsearch as root #需要新建非roo用户启动进程
[2018-04-08T11:40:46,187][ERROR][o.e.b.Bootstrap ] [es1] node validation exception
[1] bootstrap checks failed
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] # 最大文件描述符受限
调整最大文件打开数和最大进程数限制
$ tail /etc/security/limits.conf
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft memlock unlimited
* hard memlock unlimited
search soft nofile 65536
search hard nofile 65536
search soft nproc 2048
search hard nproc 2048
执行同步脚本报错
{
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "[192.168.0.79:9001] not whitelisted in reindex.remote.whitelist"
}
],
"type" : "illegal_argument_exception",
"reason" : "[192.168.0.79:9001] not whitelisted in reindex.remote.whitelist"
},
"status" : 400
}
由于通过IP + Port
访问老集群,必须在新集群的yml中配置 reindex 白名单
执行同步脚本报错
{
"error" : {
"root_cause" : [
{
"type" : "connect_exception",
"reason" : null
}
],
"type" : "connect_exception",
"reason" : null
},
"status" : 500
}
同时需要在ECS所属的安全组放行公网入方向访问自建ES集群的端口,reindex 是阿里云ES访问自建ES。即使自建ES与阿里云ES在同一地域,ECS上测试访问阿里云ES并不能保证阿里云的ES能访问到自建ES