왜 Elasticsearch 검색이 실시간 검색이라고 해요?

2797 단어 ELK
앞의 두 문장의 소개를 통해 우리는 아마 이미 알고 있을 것이다
Elasticsearch가 데이터를 처리하는 절차입니다. 그 중에서 Elasticsearch와 디스크 사이에 File System Cache라고 불리는 시스템 캐시가 있습니다. 바로 이cache의 존재로 인해es가 더욱 빠른 검색 응답 능력을 가지게 되었습니다.
우리는 모두 index가 몇 개의segment로 구성되어 있다는 것을 알고 있다. 각각segment가 끊임없이 증가함에 따라 우리가 데이터를 색인한 후에 분 단계의 지연을 거쳐야 검색될 수 있다. 왜 이렇게 큰 지연이 있는지. 이 안의 병목점은 주로 디스크에 있다.
하나의 segment를 지구화하려면 fsync 작업이 디스크에 물리적으로 기록되어 데이터 분실을 피할 수 있도록 해야 하지만, fsync 작업은 시간이 많이 걸리기 때문에 색인마다 데이터를 한 번 사용한 후에 실행할 수 없습니다. 만약 그렇게 하면 색인과 검색의 지연이 매우 클 것입니다.
그래서 검색의 지연이 더욱 줄어들 수 있도록 더 가벼운 처리 방식이 필요하다.이것은 위에서 언급한 File System Cache를 사용해야 하기 때문에es에 추가된document는 indexingbuffer 구역에 수집된 후segment로 다시 쓰고 filesystem cache에 직접 기록됩니다. 이 작업은 매우 경량급이고 상대적으로 소모되는 시간이 적습니다. 이후에 일정한 간격이나 외부 터치를 거친 후에flush가 디스크에 기록됩니다. 이 작업은 매우 소모됩니다.그러나sengment 파일이cache에 기록되면, 이sengment는 열고 조회할 수 있으며, 짧은 시간 안에 찾을 수 있으며, fullcommit, 즉 fsync 조작을 실행하지 않아도 된다. 이것은 매우 경량급 처리 방식이며, 고주파로 실행될 수 있으며, es의 성능을 파괴하지 않는다.
다음 그림:
[img]http://dl2.iteye.com/upload/attachment/0129/1648/35bcc42d-1656-3071-9aa0-5861aeeb6857.png[/img]
[img]http://dl2.iteye.com/upload/attachment/0129/1650/455f672a-85b9-3881-8adb-41bbaf86ad23.png[/img]
elasticsearch에서 이 경량급의 쓰기와 캐시에 있는segment를 여는 작업은refresh라고 합니다. 기본적으로 es집단의 모든shard는 1초마다 자동으로 refresh를 합니다. 이것이 바로 우리가 왜 es가 실시간 검색엔진이 아니라 실시간 검색엔진이라고 말합니까? 즉, 색인에 데이터를 삽입한 후에 우리는 1초를 기다려야 이 데이터를 찾을 수 있습니다.이것은 es가 쓰기와 조회에 대한 균형적인 설정 방식이다. 이렇게 설정하면 es의 인덱스 쓰기 효율을 높일 뿐만 아니라 es가 실시간으로 데이터를 검색할 수 있다.
refresh의 사용법은 다음과 같습니다.
````
POST /_refresh //
POST /blogs/_refresh //
````

refresh 조작은commit 조작에 비해 매우 경량급이지만 일정한 성능을 소모하기 때문에 데이터를 삽입할 때마다 refresh 명령을 실행하는 것을 권장하지 않습니다. es의 기본 1초 지연은 대부분의 장면에 기본적으로 받아들일 수 있습니다.
물론 모든 업무 장면이 초당 한 번씩refresh를 필요로 하는 것은 아니다. 만약에 짧은 시간에 대량의 데이터를 인덱스해야 한다면 인덱스의 쓰기 속도를 최적화하기 위해 우리는 더 큰refresh 간격을 설정하여 쓰기 성능을 향상시킬 수 있다. 명령은 다음과 같다.
````
PUT /my_logs
{
"settings": {
"refresh_interval": "30s"
}
}
````

위의 매개 변수는 수시로 존재하는 인덱스에 동적으로 설정할 수 있습니다. 만약에 우리가 초대형 인덱스를 삽입하고 있을 때, 우리는 이 Refresh 메커니즘을 끄고 쓰기가 끝난 후에 다시 열 수 있습니다. 이렇게 하면 쓰기 속도를 크게 높일 수 있습니다.
명령은 다음과 같습니다.
````
PUT /my_logs/_settings
{ "refresh_interval": -1 } //

PUT /my_logs/_settings
{ "refresh_interval": "1s" } //
````

주의refresh_interval의 매개 변수는 시간 주기를 가질 수 있습니다. 만약에 하나만 썼다면 1밀리초마다 색인을 새로 고칠 수 있기 때문에 이 매개 변수를 설정할 때 조심해야 합니다.
[b] [color=green] [size=large] 어떤 문제가 있으면 위챗 공중번호를 스캔해서 팔로우할 수 있습니다. 저는 공성사(woshigcs)입니다. 백스테이지에서 메시지를 남겨 문의하세요.기술채는 빚질 수 없고, 건강채는 더더욱 빚질 수 없고, 도를 구하는 길은 군과 동행할 수 없다.[/size][/color][/b] [img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg[/img]

좋은 웹페이지 즐겨찾기