일래스틱서치가 초기화시,
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 |