Loading... ## 节点启动流程都包括:解析配置、检查外部环境和内部环境、初始化内部资源、启动各个子模块和keepalive线程。 ### 1.解析配置 - 通过脚本 bin/elasticsearch 启动时,脚本通过exec加载进程。 ``` exec \ #执行命令 "$JAVA" \ #Java程序路径 $ES_JAVA_OPTS \ #JVM选项,配置文件为config/jvm.options -Des.path.home="$ES_HOME" \ #设置path.home路径 -Des.path.conf="$ES_PATH_CONF" \ #设置path.conf路径 -cp "$ES_CLASSPATH" \ #设置 java classpath org.elasticsearch.bootstrap.Elasticsearch \ #指定main函数所在类 "$@" #传递给main函数命令行参数 ``` - 解析命令行参数 | 参数 | 含义 | | - | - | | -E | 设定某项配置,一般通过配置文件来设置,-E "cluster.name=test_es" | | -V,--version | 打印版本信息 | | -d,--daemonize | 后台启动 | | -h,--help | 打印帮助信息 | | -p,--pidfile | 启动时创建pid文件,后续可通过pid文件关闭进程 | | -q,--quiet | 关闭控制台的标准输出和标准错误输出 | | -s,--silent | 终端输出最少信息 | | -v,--verbose | 终端输出详细信息 | - es常用配置文件: - jvm.options:启动脚本中解析的配置文件 - elasticsearch.yml:主要配置文件 - log4j2.properties:日志配置文件 - 加载安全配置:密文配置,用于加密敏感信息的配置文件:config/elasticsearch.keystore ### 2.检查内部和外部环境 - 检查内部环境: - 检查Lucene版本以防止有人替换不兼容的jar包 - 检查jar冲突(JarHell),发现冲突退出进程 - 检查外部环境:Bootstrap,检查运行时的JVM和操作系统相关参数 - 检查堆大小:检查JVM初始堆大小(Xms)与最大堆大小(Xms),此项配置应配置为相同,配置开启 bootstrap.memory_lock,JVM启动时UI锁定堆初始大小。 - 检查文件描述符:ES进程需要非常多文件描述符。通过"ulimit -n 65535"和/etc/security/limits.conf 中配置"* - nofile 65535"来生效单次和永久。 - 检查内存锁定:ES只允许使用物理内存,避免使用磁盘交换分区。 - 检查最大线程数:ES请求可以分解为多个阶段执行,每个阶段需要使用不同的线程池来执行,需要通过/etc/security/limits.conf nproc来配置。 - 检查最大虚拟内存:Lucene使用mmap来映射部分索引到进程地址空间,通过/etc/security/limits.conf设置as为unlimited。 - 检查最大文件大小:段文件和事务日志文件存储在本地磁盘可能会非常大,通过/etc/security/limits.conf设置fsize为unlimited。 - 检查虚拟内存区域最大数量:ES进程需要创建很多内存映射区,要确保内核允许创建至少262144个内存映射区,通过 systcl -w vm.max_map_count=262144或者/etc/sysctl.conf vm.max_map_count=262144 配置单次或者永久生效。 - 检查JVM Client模式:OpenJDK有client JVM模式与server JVM模式。clientJVM调优了启动时间和内存消耗,server JVM提供了更高的性能。 - 检查串行收集:ES默认使用CMS收集器。为了确保没有使用串行收集器 - 检查系统调用过滤器:为了检查es系统调用的权限。通过检查需要解决过滤器安装期间的错误;bootstrap.system_call_filter: false关闭系统调用过滤器检查 - 检查OnError和OnOutOfMemoryError:如果出现OnError可以制定任意命令,Java 8u92之后使用了ExitOnOutOfMemoryError。 - 检查Early-access:检查ES是否运行在JVM稳定版本。 - 检查G1GC:检查验证是否是早期的HotSpot JVM版本。 ### 3.启动内部模块:子模块在Node类中创建,调用各自的start()方法 - 子模块的start方法基本就是初始化内部数据、创建线程池、启动线程池等操作。如下: - discovery.start(); - clusterService.start(); - nodeConnectionsService.start(); ### 4.启动keepalive线程: - 调用keepAliveThread.start()方法启动keepalive线程,线程本身不做具体的工作。 - 主线程执行完启动流程后会退出,keepalive线程是唯一的用户线程,作用是保持进程运行。 Last modification:September 4th, 2020 at 11:49 am © 允许规范转载