日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

apache ignite系列(四):持久化

發(fā)布時間:2023/12/13 综合教程 43 生活家
生活随笔 收集整理的這篇文章主要介紹了 apache ignite系列(四):持久化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ignite持久化與固化內存

1.持久化的機制

ignite持久化的關鍵點如下:

ignite持久化可防止內存溢出導致數據丟失的情況;
持久化可以定制化配置,按需持久化;
持久化能解決在大量緩存數據情況下ignite節(jié)點啟動緩慢的問題;
使用持久化后,ignite能存儲海量的數據;
使用持久化之后需要手工啟動集群;

持久化涉及到的一個關鍵點就是WAL,所謂WAL就是預寫日志,目的是為了保證在持久化機制下數據寫入的性能,其原理圖如下所示:

? 在ignite中,對內存中數據的操作并不會立即同步到持久化文件(Partition File)中,而是先記錄在預寫日志(Write-Ahead Log)中,檢查點線程(Checkpointing)將內存中的臟數據(dirty page)同步到持久化文件中,并且會將預寫日志中的過期數據刪除。

? dirty page:在wal文件中但是還沒寫入partition files中,當dirty page 比例占到內存數據的2/3的時候會觸發(fā)checkpoint機制。

? checkpoint : 將內存中的數據同步到partition files中,當checkpoint結束之后,wal會歸檔,開啟一個新的wal文件。

? wal可以防止在極端情況下,比如斷電,程序崩潰的情況下數據丟失,但是如果wal中的數據過多,那么在ignite啟動的時候從wal讀取數據勢必會導致啟動速度緩慢,因為從wal中讀取數據的速度遠比從partition files中讀取數據的速度慢。緩存配置項中有個'writeThrottlingEnabled' 配置項可以改善這個情況,除此之外,還可以調整檢查點的線程數以及同步頻率來提升預寫日志的效率,相關配置如下所示:

<property name="dataStorageConfiguration">
	<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
	......
	 <!-- Threads that generate dirty pages too fast during ongoing checkpoint will be throttled -->
	 <property name="writeThrottlingEnabled" value="true"/>
        
     <!--Checkpointing frequency which is a minimal interval when the dirty pages will be written to the Persistent Store.-->
     <!-- 檢查點頻率 -->
     <property name="checkpointFrequency" value="180000"/>
        
     <!-- Number of threads for checkpointing.-->
     <!-- 檢查點線程數 -->
     <property name="checkpointThreads" value="4"/>
        
     <!-- 在檢查點同步完成后預寫日志歷史保留數量
     <!-- Number of checkpoints to be kept in WAL after checkpoint is finished.-->
     <property name="walHistorySize" value="20"/>       
	......
	</bean>
</property>

?

? WAL有幾種模式可以選擇,可以關閉WAL或者強同步模式,保證數據在苛刻條件下也不會丟失,設置方式如下:

    <!-- 設置持久化預寫日志模式. -->
    <property name="walMode">
        <util:constant static-field="org.apache.ignite.configuration.WALMode.DEFAULT"/>
    </property>

2. 通過配置開啟持久化:

ignite中對于存儲有個內存區(qū)的概念,每個cache默認使用的是Default_Region,可以自定義內存區(qū),然后在定義緩存的時候指定緩存區(qū),這樣可以做到個性化持久化,比如有些緩存的數據量比較小,那么就沒有持久化的必要,而有些表數據量比較大,而且還在持續(xù)增長,需要開啟持久化防止內存溢出,這時可以通過自定義內存區(qū)將兩者緩存區(qū)分開來,實現定制化持久化。

xml配置:

<!-- Consistent globally unique node identifier which survives node restarts. -->
<!-- 設置節(jié)點固定的一致性id,使得節(jié)點使用專用目錄和數據分區(qū) -->
<property name="consistentId" value="ABC"/>

<!-- 節(jié)點自定義存儲配置 -->
<property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
        <!-- Redefining the default region's settings -->
        <property name="defaultDataRegionConfiguration">
            <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                <property name="name" value="Default_Region"/>
                <!-- 設置默認內存區(qū)最大內存為 1GB. -->
                <property name="maxSize" value="#{1L * 1024 * 1024 * 1024}"/>
                <!-- 默認內存區(qū)開啟持久化. -->
                <property name="persistenceEnabled" value="true"/>
            </bean>
        </property>
        <property name="dataRegionConfigurations">
            <list>
                <!-- 自定義內存區(qū)并開啟持久化-->
                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                    <!-- 內存區(qū)名. -->
                    <property name="name" value="500MB_Region"/>
                    <!-- 100 MB initial size. -->
                    <property name="initialSize" value="#{100L * 1024 * 1024}"/>
                    <!-- 500 MB maximum size. -->
                    <property name="maxSize" value="#{500L * 1024 * 1024}"/>
                    <!-- 開啟持久化. -->
                    <property name="persistenceEnabled" value="true"/>
                </bean>
            </list>
        </property>

        <!-- 設置持久化預寫日志模式. -->
        <property name="walMode">
            <util:constant static-field="org.apache.ignite.configuration.WALMode.DEFAULT"/>
        </property>

        <!-- 持久化文件存儲路徑. -->
        <!-- <property name="storagePath" value="D:\Test\db" /> -->
        <property name="storagePath" value="/data/local/db" />

        <!-- 預寫日志存儲路徑. -->
        <!-- <property name="walPath" value="D:\Test\db\wal" /> -->
        <property name="walPath" value="/data/local/db/wal" />

        <!-- 預寫日志解壓路徑. -->
        <!-- <property name="walArchivePath" value="D:\Test\db\wal\archive" /> -->
        <property name="walArchivePath" value="/data/local/db/wal/archive" />

    </bean>
</property>

java配置:

	private static final String usrDir = System.getProperty("user.dir");
	private static final String separator = File.separator;
	private static final String DB = "db";
	private static final String WAL = "wal";
	private static final String ARCHIVE = "archive";
	
	/**設置一致性Id*/
   igniteCfg.setConsistentId("ABC");
    /**ignite持久化配置*/
    DataStorageConfiguration dcfg = igniteCfg.getDataStorageConfiguration();
    dcfg.getDefaultDataRegionConfiguration()
            .setMaxSize(4L * 1024 * 1024 * 1024) //設置默認區(qū)域的最大可用內存
            .setPersistenceEnabled(true); //默認區(qū)域開啟持久化
    //設置持久化路徑
    dcfg.setStoragePath(String.format("%s%s%s", usrDir, separator, DB));
    dcfg.setWalPath(String.format("%s%s%s%s%s", usrDir, separator, DB, separator, WAL));
    dcfg.setWalArchivePath(String.format("%s%s%s%s%s%s%s", usrDir, separator, DB, separator, WAL, separator, ARCHIVE));

相關說明:

1.1 設置consistentId的原因:

?默認狀態(tài)下,如果節(jié)點重啟,那么ignite會隨機生成一個全局唯一的consistentId, 而持久化的磁盤路徑是用consistentId 區(qū)分的,如果重啟之后那么無法再讀取原來區(qū)間的持久化文件,但是指定consistentId就可以使用固定空間,使用之前的持久化文件。

如果一臺主機啟動了若干個節(jié)點,那么每個節(jié)點進程都會在一個預定義的唯一子目錄中,比如${IGNITE_HOME}/work/db/node{IDX}-{UUID},有自己的持久化文件,這里IDXUUID參數都是Ignite在節(jié)點啟動時自動計算的(這里有詳細描述)。如果在持久化層次結構中已經有了若干node{IDX}-{UUID}子目錄,那么他們是按照節(jié)點先入先出的順序進行賦值的。如果希望某節(jié)點即使重啟也有專用目錄和專用的數據分區(qū),需要在集群范圍配置唯一的IgniteConfiguration.setConsistentId,這個唯一ID會在node{IDX}-{UUID}字符串中映、射setStoragePath(...)到、setWalArchivePath(...)ffUUID`。

1.2 自定義存儲區(qū)域的使用方式:

? 默認配置下,緩存使用的是默認內存區(qū)(defaultDataRegionConfiguration),也可以自定義內存區(qū),如上面配置文件中定義的"500MB_Region"。這樣可以將需要持久化的數據和不需要持久化的數據分離出來,但是使用自定義的內存區(qū)的時候需要設置額外的屬性:

<property name="cacheConfiguration">
    <list>
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
          ...
            <property name="dataRegionName" value="500MB_Region"/>
          ...
        </bean>
    </list>
</property>
// Creating a cache configuration.
CacheConfiguration cacheCfg = new CacheConfiguration();
// Binding the cache to the earlier defined region.
cacheCfg.setDataRegionName("500MB_Region");

1.3 啟用持久化之后需要手工激活集群:

集群激活
注意如果開啟了Ignite持久化,集群默認是未激活的,無法進行任何的CRUD操作。用戶需要手工激活集群,后面會介紹如何進行操作。

集群激活方式:

a. 代碼激活:

        // Activating the cluster once all the cluster nodes are up and running.
        if(!ignite.active()) {
            ignite.active(true);  //如果集群未啟動則啟動集群
        }

b. web控制臺:

c. 命令激活:

在命令行中,使用$IGNITE_HOME/bin文件夾中的control.sh|bat腳本,比如
.sh:
control.sh|bat

./control.sh --activate

.bat:

./control.bat --activate

1.4 ignite的destroyCache()方法同樣會清除持久化文件.

destroyCache同樣會清除持久化文件,但是持久化的緩存配置不會清除, 所以重啟之后會出現容量為空的cache。如果要動態(tài)修改cache配置,必須先destroyCache,再做調整;

3. 持久化相關測試:

持久化占用的磁盤空間大小,以及持久化對于節(jié)點啟動速度的提升:

數據量 磁盤占用 未持久化啟動 持久化后啟動
350w(生產數據) 分區(qū)文件5.6g, 預寫日志7.0g 2分鐘 39s
2400w(本地數據) 分區(qū)文件6.76g,預寫日志12.1g .......(內存溢出) 12s

?

總結

以上是生活随笔為你收集整理的apache ignite系列(四):持久化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。