ElasticSearch 실천 과정에서 겪는 몇 가지 작은 문제

8551 단어 elasticsearch

ulimit "효력 없음"


한 기계가 ES를 시작할 때 항상 오류를 보고합니다.
1
max file descriptors [65000] for elasticsearch process is too low

하지만 저는 /etc/security/limits.conf에 다음과 같은 설정을 추가했습니다.
1
2
3
4
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536

이치대로ulimit -n때는 65536을 볼 수 있을 것 같지만 여전히 65000을 출력한다.답답하다
마지막으로 이 문장을 받아서 ulimit는 도대체 누가 결정했습니까?의 계발, 프로필과bashrc 파일 위에 검사 목표를 놓았습니다.
결국 누군가가 이 기계/etc/bashrc의 문장 끝에 한 마디ulimit -n 65000를 덧붙여서 이 줄을 빼면 정상이라는 것을 발견했다.
만약 당신에게도 이 문제가 발생한다면 다음 네 개의 서류를 검토하는 것을 건의합니다.
1
2
3
4
/etc/profile
/etc/bashrc
~/.profile
~/.bashrc

X-Pack 인증 메커니즘으로 인한 문제


X-Pack은 Elastic Stack의 확장으로 보안, 경보, 감시, 보고 및 그래픽 기능을 설치하기 쉬운 패키지에 포함합니다.Elasticsearch 5.0.0 이전에 X-Pack의 모든 기능을 보려면 별도의 Shield, Watcher 및 Marvel 플러그인을 설치해야 합니다.
ES, Kibana 및 X-Pack 설치는 간단합니다. 필요한 경우 Elasticsearch, Kibana 및 X-Pack 설치

HTTP REST API


터미널에서 REST API에 액세스할 때
1
curl -XGET 'localhost:9200/_cat/health?v&pretty'

잘못 보고하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "missing authentication token for REST request [/_cat/health?v&pretty]",
        "header": {
          "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
        }
      }
    ],
    "type": "security_exception",
    "reason": "missing authentication token for REST request [/_cat/health?v&pretty]",
    "header": {
      "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
    }
  },
  "status": 401
}

해결 방법은 계정 비밀번호를 추가하면 돼요.
1
curl --user elastic:changeme -XGET 'localhost:9200/_cat/health?v&pretty'

이렇게 하면 정상적으로 방문할 수 있다.
1
2
epoch      timestamp cluster  status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1487747024 15:03:44  myClusterName yellow          1         1     19  19    0    0       19             0                  -                 50.0%

이 계정 비밀번호는 실제로 X-Pack이라는 플러그인에 포함된 인증 기능입니다.

Java API


X-Pack을 사용한 후 Java API를 사용하여 Client를 가져오면 다음과 같은 오류가 발생합니다.
1
2
3
4
5
...
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{pyXJL2PeTtGejUwbpycDUg}{127.0.0.1}{127.0.0.1:9300}]]
...
Caused by: org.elasticsearch.ElasticsearchSecurityException: missing authentication token for action [cluster:monitor/nodes/liveness]
...

사실 Caused by을 보았을 때 X-Pack이 도입한 인증 메커니즘으로 인한 오류가 기본적으로 확인되었다.
오류 원인을 알았으니 사용자 이름과 비밀번호를 붙여라!그러나 생각보다 간단하지 않다. ES의 공식 문서에는 사용자 이름과 비밀번호를 어디서 추가할 수 있는지 언급되지 않았다.
그렇다면 Google이 단번에 해결할 수 있겠지만, 이 해결 과정은 사실 순조롭지 않다.우선 ES의 버전이 비교적 많습니다. 만약에 ES5의 이전 버전이라면 이 문제를 거의 보지 못했을 것입니다. 그 다음으로 모든 사람이 X-Pack을 장착할 수 있는 것은 아닙니다!마지막으로pass는 몇 가지 한물간 해결 방안을 잃어버린 후에 마침내 ES의 지역사회에서 유사한 문제를 찾았다. 최종적인 해결 방법은 사실elastic이 그의 문서에 썼다. 단지 ElasticSearch의 문서가 아니라 X-Pack의 문서에 있을 뿐이다(에이, 사실 나는 진작에 생각했어야 했다.
해결의 관건은jar가방x-pack-transport-5.2.1을 도입하는 것이다.jar, Transport Client를 구성할 때 이jar 가방에 있는 PreBuilt XPack Transport Client로 PreBuilt Transport Client를 교체하면 Settings에서 정의할 수 있습니다xpack.security.user.
해결 단계는 다음과 같습니다(Maven을 사용하여 의존도를 관리하는 경우).
  • 우선pom에 있습니다.xml 파일에 창고와 의존 추가
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    
    
       
          
          
             elasticsearch-releases
             https://artifacts.elastic.co/maven
             
                true
             
             
                false
             
          
          ...
       
       ...
    
       
          
          
             org.elasticsearch.client
             x-pack-transport
             {version}
          
          ...
       
       ...
    
     
    
  • 그리고 구성에 xpack.security.user 넣으면 됩니다
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    ...
    
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
            .put("cluster.name", "myClusterName")
            .put("xpack.security.user", "elastic:changeme")
            ...
            .build())
        .addTransportAddress(new InetSocketTransportAddress("localhost", 9300));
    

    정상적이면 위의 두 단계를 다 하면 코드가 순조롭게 실행될 수 있다.하지만 저는 Maven 라이브러리를 회사의 사복이기 때문에 첫 번째 단계에서 의존을 추가할 때 추가할 수 없습니다. x-pack-transport-5.2.1.jar 이 가방은 직접적이고 간접적으로 의존하는 가방이 20여 개에 달하며, 하나하나 수동으로 추가하는 것은 비현실적이며, 이때 마ven의 설정 문제만 처리할 수 있습니다.Maven은 평소에도 그냥 사용하기 때문에, settings.xml 프로필은 모두 선배에게서 전해져서 자세히 연구한 적이 없는데 이번에는 보충 수업인 셈이다.
    내 ${HOME}/.m2/settings.xml에 있는 이전 mirrors 노드의 설정은 다음과 같습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    
      
        ...
      
      
        nexus
        *
        http://my.host.com/nexus/groups/public
      
    
    

    문제는 * 이 구성으로 인해 발생합니다. mirrorOf 의 의미는 다음과 같습니다.
    mirror Of: 이 mirror가 연결된 창고를 나타내는 데 사용되며, 그 값은 해당 창고의 id입니다.여러 창고를 동시에 연결하려면 이 여러 창고 사이를 쉼표로 구분할 수 있다.모든 창고를 연결하려면''을 (를) 사용할 수 있습니다.어떤 창고를 제외한 다른 모든 창고를 연결하려면',! repository Id'로 표시할 수 있습니다.localhost나 파일로 요청하지 않은 창고를 연결하려면 "external:*"라고 표시할 수 있습니다.
    문제의 소재를 찾았으니 대응하는 것을 바꾸면 됩니다. 즉, id가elasticsearch-releases인 이repository는nexus라는 거울에 더 이상 연결되지 않습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    
      
      ...
      
      
        nexus
        *,!elasticsearch-releases
        http://my.host.com/nexus/groups/public
      
    
    

    P.S.
    You can also add an  Authorization  header to each request. If you’ve configured global authorization credentials, the  Authorization  header overrides the global authentication credentials. This is useful when an application has multiple users who access Elasticsearch using the same client. You can set the global token to a user that only has the  transport_client  role, and add the  transport_client  role to the individual users.
    코드 세션은 다음과 같습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.xpack.security.authc.support.SecuredString;
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    
    import static org.elasticsearch.xpack.security.authc.support.UsernamePasswordToken.basicAuthHeaderValue;
    ...
    
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
            .put("cluster.name", "myClusterName")
            .put("xpack.security.user", "transport_client_user:changeme")
            ...
            .build())
        .build()
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9301))
    
    String token = basicAuthHeaderValue("elastic", new SecuredString("changeme".toCharArray()));
    
    client.filterWithHeader(Collections.singletonMap("Authorization", token))
        .prepareSearch().get();
    

    SSL 정보는 Java Client and Security 참조

    좋은 웹페이지 즐겨찾기