美文网首页
ElasticSearch 自定义plugin来控制rebala

ElasticSearch 自定义plugin来控制rebala

作者: 白奕新 | 来源:发表于2020-07-29 11:09 被阅读0次

    1、backgroupd

    • ElasticSearch有提供丰富的plugin接口,我们自己能实现plugin来自定义需求。

    • 我们的ElasticSearch是用来做时序性分析数据库,所以就会存在数据的高低峰分别。我们想要控制ElasticSearch的rebalance触发机制,避免在高峰期触发rebalance导致磁盘与网络负载大影响到正常的业务

    2、how to write the plugin

    (1)项目架构
    image.png
    (2)file

    plugin.xml
    这个文件不需要修改,可以直接使用

    <?xml version="1.0"?>
    <assembly>
        <id>plugin</id>
        <formats>
            <format>zip</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <files>
            <file>
                <source>${project.basedir}/src/main/resources/plugin-descriptor.properties</source>
                <outputDirectory/>
                <filtered>true</filtered>
            </file>
        </files>
        <dependencySets>
            <dependencySet>
                <outputDirectory/>
                <useProjectArtifact>true</useProjectArtifact>
                <useTransitiveFiltering>true</useTransitiveFiltering>
            </dependencySet>
        </dependencySets>
    </assembly>
    

    plugin-descriptor.properties
    这个文件需要修改classname对应的类名全路径,即自己实现的那个plugin类。

    description=test
    version=1.0.0
    name=time-decider
    classname=com.cnc.baiyx.plugin.rebalance.MyDecidersPlugin
    java.version=${java.version}
    elasticsearch.version=${elasticsearch.version}
    

    pom.xml
    这个文件需要按照各自的使用情况修改java.version与elasticsearch.version

    <?xml version="1.0" encoding="UTF-8"?>
    <project
        xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.example</groupId>
        <artifactId>elasticsearch-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <elasticsearch.version>7.8.0</elasticsearch.version>
            <java.version>13</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>${elasticsearch.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.7</version>
                <scope>provided</scope>
            </dependency>
            <!-- Testing -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.7</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch.test</groupId>
                <artifactId>framework</artifactId>
                <version>${elasticsearch.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.1.1</version>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <outputDirectory>target</outputDirectory>
                        <descriptors>
                            <descriptor>src/main/assembly/plugin.xml</descriptor>
                        </descriptors>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20.1</version>
                    <configuration>
                        <skipTests>true</skipTests>
                    </configuration>
                </plugin>
            </plugins>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>false</filtering>
                    <excludes>
                        <exclude>plugin-descriptor.properties</exclude>
                    </excludes>
                </resource>
            </resources>
        </build>
    </project>
    

    到这步项目的框架就搭建好了。可以根据各自的需求实现自己想要的功能了。

    3、部署

    1. maven 打包,把zip包上传到服务器上
    2. 到es的bin目录下执行./elasticsearch-plugin install file://[filename],filename替换成zip包全路径
    3. 重启服务
    4. 其他:elasticsearch-plugin list可以看到所有plugin;elasticsearch-plugin remove [plugin-name]卸载plugin

    4、test

    1、先关闭rebalance
    2、手动触发rereoute,使分片分布不均衡。


    image.png

    3、开启rebalance,集群自动触发rebalance。由于在时间控制范围内,rebalance成功


    image.png
    image.png
    4、超过时间允许范围以后,再重复上面操作,rebalance失效。
    image.png
    image.png

    相关文章

      网友评论

          本文标题:ElasticSearch 自定义plugin来控制rebala

          本文链接:https://www.haomeiwen.com/subject/mvkhrktx.html