• Apache Ignite 集群安装


    Apache Ignite具有非常先进的集群能力,包括逻辑集群组和自动发现。Apache Ignite节点之间会自动发现对方,这有助于必要时扩展集群,而不需要重启整个集群。开发者可以利用Ignite的混合云支持,允许公有云(比如AWS)和私有云之间建立连接,向他们提供两者的好处。

    在启动时,节点被分配以下两种角色之一:服务器节点客户端节点。服务器节点是集群的主力;它们缓存数据、执行计算任务等。客户端节点作为常规节点加入拓扑,但它们不存储数据。客户端节点用于将数据流式传输到集群中并执行用户查询。

    要形成集群,每个节点必须能够连接到所有其他节点。为确保这一点,必须配置适当的发现机制。

    发现机制

    节点可以自动发现彼此并形成集群。这允许您在需要时进行横向扩展,而无需重新启动整个集群。开发人员还可以利用 Ignite 的混合云支持,允许在私有云和公共云(如 Amazon Web Services)之间建立连接,为他们提供两全其美的体验。

    Ignite 提供了两种用于不同使用场景的发现机制实现:

    集群配置

    本文使用版本为 ignite v2.13.1

    默认安装 jdk 1.8 版本即可,解压安装包,在集群每台主机上的 $IGNITE_HOME/config 目录下增加 default.xml 配置文件如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:util="http://www.springframework.org/schema/util"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/util
    9. http://www.springframework.org/schema/util/spring-util.xsd">
    10. <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    11. <!-- 对等类加载是否启用,默认为true不开启很容易报错 -->
    12. <property name="peerClassLoadingEnabled" value="true"/>
    13. <!-- 系统线程池大小 (max(8, total number of cores)) -->
    14. <property name="systemThreadPoolSize" value="24"/>
    15. <!-- 公共线程池大小 (max(8, total number of cores)) -->
    16. <property name="publicThreadPoolSize" value="8"/>
    17. <!-- 查询线程池大小 (max(8, total number of cores)) -->
    18. <property name="queryThreadPoolSize" value="8"/>
    19. <!-- 服务线程池大小 (max(8, total number of cores)) -->
    20. <property name="serviceThreadPoolSize" value="8"/>
    21. <!-- 源线程池大小 (max(8, total number of cores)) -->
    22. <property name="stripedPoolSize" value="8"/>
    23. <!-- 数据流线程池大小(max(8, total number of cores) -->
    24. <property name="dataStreamerThreadPoolSize" value="8"/>
    25. <!-- 平衡线程池大小-->
    26. <property name="rebalanceThreadPoolSize" value="8"/>
    27. <!-- 用户验证是否开启 默认为false 开启后默认用户名密码都是ignite -->
    28. <!--
    29. <property name="authenticationEnabled" value="true"/>
    30. -->
    31. <!-- 对象序列化过程 -->
    32. <property name="marshaller">
    33. <bean class="org.apache.ignite.internal.binary.BinaryMarshaller" />
    34. </property>
    35. <!-- 数据存储配置 -->
    36. <property name="dataStorageConfiguration">
    37. <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
    38. <!--并发性水平 可由自己实际情况而定 -->
    39. <property name="concurrencyLevel" value="200"/>
    40. <!-- 设置内存页大小 (getconf PAGESIZE) -->
    41. <property name="pageSize" value="#{4 * 1024}"/>
    42. <!-- Size of the WAL (Write Ahead Log) segment -->
    43. <property name="walSegmentSize" value="#{1024 * 1024 * 1024}"/>
    44. <!--In our experience LOG_ONLY is a good compromise between durability and performance.-->
    45. <property name="walMode" value="LOG_ONLY"/>
    46. <!-- Enable write throttling. -->
    47. <property name="writeThrottlingEnabled" value="true"/>
    48. <!-- 检查点频率-->
    49. <!--Checkpointing frequency which is a minimal interval when the dirty pages will be written to the Persistent Store.-->
    50. <property name="checkpointFrequency" value="180000"/>
    51. <!--数据分布配置 默认是都存放到内存中,此处进行持久化 -->
    52. <property name="defaultDataRegionConfiguration">
    53. <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
    54. <!--是否持久化到磁盘 true为持久化 -->
    55. <property name="persistenceEnabled" value="true"/>
    56. <property name="name" value="vehicle_Region"/>
    57. <!-- 2G initial size. 初始化内存-->
    58. <property name="initialSize" value="#{2L * 1024 * 1024 * 1024}" />
    59. <!-- 4G maximum size. 最大内存大小-->
    60. <property name="maxSize" value="#{4L * 1024 * 1024 * 1024}" />
    61. <!-- 4G 内存页缓存大小-->
    62. <property name="checkpointPageBufferSize" value="#{4L *1024* 1024 * 1024L}" />
    63. </bean>
    64. </property>
    65. <!-- Defining several data regions for different memory regions 持久化数据存储目录 -->
    66. <property name="storagePath" value="/home/ignite/storage" />
    67. <property name="walArchivePath" value="/home/ignite/walArchive" />
    68. <property name="walPath" value="/home/ignite/wal" />
    69. </bean>
    70. </property>
    71. <property name="metricsLogFrequency" value="0"/>
    72. <!--失败检测 超时时长-->
    73. <property name="failureDetectionTimeout" value="#{60 * 60 * 1000}"/>
    74. <!-- 服务worker 之间交互 timeout 时间,默认 10s -->
    75. <property name="systemWorkerBlockedTimeout" value="#{60 * 60 * 1000}"/>
    76. <!-- 服务出现故障自动重启 -->
    77. <property name="failureHandler">
    78. <bean class="org.apache.ignite.failure.RestartProcessFailureHandler"/>
    79. </property>
    80. <property name="cacheConfiguration">
    81. <bean class="org.apache.ignite.configuration.CacheConfiguration">
    82. <!-- Set a cache name. -->
    83. <property name="name" value="memdb2"/>
    84. <!-- Set asynchronous rebalancing. -->
    85. <property name="rebalanceMode" value="ASYNC"/>
    86. <!-- Set cache mode. 分区模式,副本为 2 -->
    87. <property name="cacheMode" value="PARTITIONED"/>
    88. <property name="backups" value="2"/>
    89. <!-- 副本同步模式: -->
    90. <!-- PRIMARY_SYNC (默认模式,primary 写成功即可算成功,从backup节点读数据,有可能读到的任然是旧数据) -->
    91. <!-- FULL_SYNC (写cache的操作在primary节点和backup节点都成功写入后返回, 保证了写入成功后节点之间的数据都一样) -->
    92. <!-- FULL_ASYNC (写cache的操作不用等primary节点和backup节点成功写入即可返回, 读primary节点的数据都有可能读到旧数据) -->
    93. <property name="writeSynchronizationMode" value="PRIMARY_SYNC"/>
    94. <!-- 分区丢失处理: -->
    95. <!-- IGNORE (默认模式,即使出现了partition loss的情况,Ignite会自动忽略并且会清空和partion loss相关的状态不会触发EVT_CACHE_REBALANCE_PART_DATA_LOST 事件) -->
    96. <!-- READ_WRITE_ALL (Ignite允许所有的读写操作,就好像partition loss没发生过) -->
    97. <!-- READ_WRITE_SAFE (允许对没有丢失的partition的读写操作,但是对已经丢失的partition的读写操作会失败并抛异常) -->
    98. <!-- READ_ONLY_ALL (允许对丢失的和正常的partition的读操作,但是写操作会失败并抛异常) -->
    99. <!-- READ_ONLY_SAFE (所有的写操作和对丢失partition的读操作都会失败并抛异常。允许对正常的partition的读操作) -->
    100. <property name="partitionLossPolicy" value="READ_WRITE_ALL"/>
    101. <!-- enable disk page compression for this cache -->
    102. <!--
    103. <property name="diskPageCompression" value="SNAPPY"/>
    104. -->
    105. <!-- optionally set the compression level -->
    106. <property name="diskPageCompressionLevel" value="10"/>
    107. </bean>
    108. </property>
    109. <!-- Set batch size. -->
    110. <property name="rebalanceBatchSize" value="#{1 * 1024 * 1024 * 1024}"/>
    111. <!-- Set throttle interval. -->
    112. <property name="rebalanceThrottle" value="100"/>
    113. <!--
    114. Explicitly configure TCP discovery SPI to provide list of initial nodes.
    115. Ignite自己本身有发现机制,只需要配置静态IP即可相互发现;单机只需要配置自己即可
    116. -->
    117. <property name="discoverySpi">
    118. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
    119. <property name="ipFinder">
    120. <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
    121. <property name="addresses">
    122. <!--此处放置全部节点IP 如下方-->
    123. <list>
    124. <value>192.168.165.3:47500..47509</value>
    125. <value>192.168.165.4:47500..47509</value>
    126. <value>192.168.165.5:47500..47509</value>
    127. </list>
    128. </property>
    129. </bean>
    130. </property>
    131. </bean>
    132. </property>
    133. </bean>
    134. </beans>
    135. 193,1 底端

    通过bin/ignite.sh   config/default.xml启动服务,一般Ignite有服务发现机制,无论有多少个节点,都可以只配置如上面配置的集群中的3个IP就可以,这个三个节点需要提前启动,其他新加入的节点,会通过这三个节点,路由到集群中的其他机器。

    客户端访问

    通过集群API查看集群的状态。

    1. public class ClusterDemo {
    2. public static void main(String[] args) {
    3. IgniteConfiguration cfg = new IgniteConfiguration();
    4. cfg.setPeerClassLoadingEnabled(true);
    5. cfg.setClientMode(true);
    6. // Setting up an IP Finder to ensure the client can locate the servers.
    7. TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
    8. ipFinder.setAddresses(Collections.singletonList("192.168.165.3:47500..47509"));
    9. cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder));
    10. // Starting the node
    11. Ignite ignite = Ignition.start(cfg);
    12. IgniteCluster cluster = ignite.cluster();
    13. Collection<BaselineNode> baselineNodes = cluster.currentBaselineTopology();
    14. System.out.println(baselineNodes);
    15. ClusterGroup remoteGroup = cluster.forRemotes();
    16. System.out.println(remoteGroup.hostNames());
    17. // 所有的缓存
    18. System.out.println(ignite.cacheNames());
    19. ignite.close();
    20. }
    21. }

    缓存读写

    通过客户端API创建缓存,读写数据

    1. public class HelloWorld {
    2. public static void main(String[] args) throws IgniteException {
    3. // Preparing IgniteConfiguration using Java APIs
    4. IgniteConfiguration cfg = new IgniteConfiguration();
    5. // The node will be started as a client node.
    6. cfg.setClientMode(true);
    7. // Classes of custom Java logic will be transferred over the wire from this app.
    8. cfg.setPeerClassLoadingEnabled(true);
    9. // Setting up an IP Finder to ensure the client can locate the servers.
    10. TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
    11. ipFinder.setAddresses(Collections.singletonList("192.168.165.2:47500..47509"));
    12. cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder));
    13. // Starting the node
    14. Ignite ignite = Ignition.start(cfg);
    15. // Create an IgniteCache and put some values in it.
    16. IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
    17. cache.put(1, "Hello");
    18. cache.put(2, "World!");
    19. System.out.println(">> Created the cache and add the values.");
    20. // Executing custom Java compute task on server nodes.
    21. ignite.compute(ignite.cluster().forServers()).broadcast(new RemoteTask());
    22. System.out.println(">> Compute task is executed, check for output on the server nodes.");
    23. // Disconnect from the cluster.
    24. ignite.close();
    25. }

    基线拓扑

    基线拓扑是一组用于保存数据的节点。引入基线拓扑的概念是为了让您能够控制何时要 重新平衡集群中的数据。例如,如果您有一个由 3 个节点组成的集群,其中数据在节点之间分布,并且您再添加 2 个节点,则重新平衡过程会在所有 5 个节点之间重新分布数据。当基线拓扑发生变化时,就会发生重新平衡过程,这可以自动发生,也可以手动触发。

    基线拓扑仅包括服务器节点;客户端节点从不包括在内,因为它们不存储数据。

    基线拓扑的目的是:

    • 当服务器节点在短时间内离开集群时,避免不必要的数据传输,例如,由于偶尔的网络故障或计划的服务器维护。

    • 让您能够控制何时要重新平衡数据。

    启用基线拓扑自动调整后,基线拓扑会自动更改。这是纯内存集群的默认行为。对于持久集群,必须手动启用基线拓扑自动调整功能。默认情况下,它被禁用,您必须手动更改基线拓扑。您可以使用控制脚本更改基线拓扑。

  • 相关阅读:
    【图像处理-计算机视觉学习路线】个人记录
    第二范式
    腾讯云国际出现网站无法访问的排查方法
    如何平衡三维模型的顶层合并构建的文件大小与质量关系
    Leetcode 49.字母异位词分组
    采用动态权重和概率扰动策略改进的灰狼优化算法-附代码
    机器学习策略篇:详解如何使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)
    网站授权QQ登录
    cmmi分为哪几个等级?
    Mysql8的优化(DBA)
  • 原文地址:https://blog.csdn.net/wank1259162/article/details/125408671