일래스틱서치가 초기화시, 


InternalSettingsPreparer 클래스의 prepareSettings() 메소드가 호출되며, 설정 관련 부분을 읽는다.


두 가지로 나눠지는데, 첫 번째는 시스템 설정 내용과 다양한 설정 파일(yml, json, properties, config)로부터 읽는 부분이다. 

SettingBuilder에 에 저장한다. 




public class InternalSettingsPreparer {


    public static Tuple<Settings, Environment> prepareSettings(Settings pSettings, boolean loadConfigSettings) {

        // ignore this prefixes when getting properties from es. and elasticsearch.

        String[] ignorePrefixes = new String[]{"es.default.", "elasticsearch.default."};

        boolean useSystemProperties = !pSettings.getAsBoolean("config.ignore_system_properties", false);

        // just create enough settings to build the environment

        ImmutableSettings.Builder settingsBuilder = settingsBuilder().put(pSettings);

        if (useSystemProperties) {

            settingsBuilder.putProperties("elasticsearch.default.", System.getProperties())

                    .putProperties("es.default.", System.getProperties())

                    .putProperties("elasticsearch.", System.getProperties(), ignorePrefixes)

                    .putProperties("es.", System.getProperties(), ignorePrefixes);

        }

        settingsBuilder.replacePropertyPlaceholders();


        Environment environment = new Environment(settingsBuilder.build());


        if (loadConfigSettings) {

            boolean loadFromEnv = true;

            if (useSystemProperties) {

                // if its default, then load it, but also load form env

                if (Strings.hasText(System.getProperty("es.default.config"))) {

                    loadFromEnv = true;

                    settingsBuilder.loadFromUrl(environment.resolveConfig(System.getProperty("es.default.config")));

                }

                // if explicit, just load it and don't load from env

                if (Strings.hasText(System.getProperty("es.config"))) {

                    loadFromEnv = false;

                    settingsBuilder.loadFromUrl(environment.resolveConfig(System.getProperty("es.config")));

                }

                if (Strings.hasText(System.getProperty("elasticsearch.config"))) {

                    loadFromEnv = false;

                    settingsBuilder.loadFromUrl(environment.resolveConfig(System.getProperty("elasticsearch.config")));

                }

            }

            if (loadFromEnv) {

                try {

                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.yml"));

                } catch (FailedToResolveConfigException e) {

                    // ignore

                } catch (NoClassDefFoundError e) {

                    // ignore, no yaml

                }

                try {

                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.json"));

                } catch (FailedToResolveConfigException e) {

                    // ignore

                }

                try {

                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.properties"));

                } catch (FailedToResolveConfigException e) {

                    // ignore

                }

            }

        }


        settingsBuilder.put(pSettings);

        if (useSystemProperties) {

            settingsBuilder.putProperties("elasticsearch.", System.getProperties(), ignorePrefixes)

                    .putProperties("es.", System.getProperties(), ignorePrefixes);

        }

        settingsBuilder.replacePropertyPlaceholders();


        // allow to force set properties based on configuration of the settings provided

        for (Map.Entry<String, String> entry : pSettings.getAsMap().entrySet()) {

            String setting = entry.getKey();

            if (setting.startsWith("force.")) {

                settingsBuilder.remove(setting);

                settingsBuilder.put(setting.substring(".force".length()), entry.getValue());

            }

        }

        settingsBuilder.replacePropertyPlaceholders();

...

}






두 번째는 노드 이름과 클러스터 이름을 정한다. name 또는 node.name 키에 할당된 값이 없다면, 


src/main/resources/config/names.txt 를 읽어 임의로 선택된 노드 이름을 얻는다. (names.txt 파일을 보면 별의 별 이름이 들어가 있다.. TransportClient, NodeClient를 이용하여 일래스틱서치 클러스터에 연결하면 이 이름 중의 하나를 받는다. 그래서 이상한 로그로 보이는 부분이 발견할 수 있다.)


클러스터 이름을 정의하지 않으면 디폴트 이름을 쓰게 되어 있다.





    public static Tuple<Settings, Environment> prepareSettings(Settings pSettings, boolean loadConfigSettings) {

...
        // generate the name

        if (settingsBuilder.get("name") == null) {

            String name = System.getProperty("name");

            if (name == null || name.isEmpty()) {

                name = settingsBuilder.get("node.name");

                if (name == null || name.isEmpty()) {

                    name = Names.randomNodeName(environment.resolveConfig("names.txt"));

                }

            }


            if (name != null) {

                settingsBuilder.put("name", name);

            }

        }


        // put the cluster name

        if (settingsBuilder.get(ClusterName.SETTING) == null) {

            settingsBuilder.put(ClusterName.SETTING, ClusterName.DEFAULT.value());

        }


        Settings v1 = settingsBuilder.build();

        environment = new Environment(v1);


        // put back the env settings

        settingsBuilder = settingsBuilder().put(v1);

        // we put back the path.logs so we can use it in the logging configuration file

        settingsBuilder.put("path.logs", cleanPath(environment.logsFile().getAbsolutePath()));


        v1 = settingsBuilder.build();


        return new Tuple<>(v1, environment);

    }




ClusterName은 바로 "elasticsearch"이다. 



public class ClusterName implements Streamable {


    public static final String SETTING = "cluster.name";


    public static final ClusterName DEFAULT = new ClusterName("elasticsearch".intern());

}


'Elasticsearch' 카테고리의 다른 글

[elasticsearch] action.destructive_requires_name  (0) 2015.09.16
[elasticsearch] 다큐먼트 uid  (0) 2015.09.15
[elasticsearch] mget  (0) 2015.09.09
[elasticsearch] 로그 설정  (0) 2015.09.08
[elasticsearch] 한 샤드 최대 크기  (0) 2015.09.04
Posted by '김용환'
,