30 Ekim 2021 Cumartesi

FieldsQueryCursor Arayüzü - Thick Client

Giriş
Şu satırı dahil ederiz. QueryCursor arayüzünü gerçekleştirir
import org.apache.ignite.cache.query.FieldsQueryCursor;
getAll metodu
Örnek - Select
Şöyle yaparız
Ignite ignite = ...;
IgniteCache<PersonKey, Person> cache = ...;

List<List<?>> result = cache.query(
new SqlFieldsQuery("SELECT * FROM PERSON WHERE PERSONID = 9000")).getAll();
Örnek - Select
Şöyle yaparız
String sql   = "SELECT COUNT(*) AS NUM FROM " + cacheName + " " + sqlParam;
SqlFieldsQuery query = new SqlFieldsQuery(sql);
query.setArgs(args);

FieldsQueryCursor<List<?>> cursor = cache.query(query);
resultCount = cursor.getAll().get(0).get(0);
Örnek - Select
Şöyle yaparız
try (QueryCursor<List<?>> cur = cache2.query(new SqlFieldsQuery("select _key from table"))){
  for (List<?> r : cur) {
    Long key = (Long)r.get(0);
  }
}

26 Ekim 2021 Salı

IgniteSet Arayüzü - Thick Client In-Memory Data Grid

Giriş
Şu satırı dahil ederiz
import org.apache.ignite.IgniteSet;
Kalıtımı şöyledir
IgniteQueue<T> extends Set<T>
add metodu
Set'i yaratmak için name + CollectionConfiguration belirtilir

Örnek
Şöyle yaparız
IgniteSet<String> set = Ignition.ignite().set("setName", null);
for (int i = 0; i < 5; i++) {
  String item = UUID.randomUUID() + "_" + i;
  set.add(item);
}

for (String item : set)
  println("Set item: " + item);

println(set.contains("1"));
println("Set size: " + set.size());
println("Removed: " + set.remove("0"));

IgniteQueue Arayüzü - Thick Client In-Memory Data Grid

Giriş
Şu satırı dahil ederiz
import org.apache.ignite.IgniteQueue;
Kalıtımı şöyledir
IgniteQueue<T> extends BlockingQueue<T>
take metodu - Blocking
Kuyruğu yaratmak için queue name + capacity + CollectionConfiguration belirtilir

Örnek
Şöyle yaparız
IgniteQueue<String> queue = Ignition.ignite().queue("queueName", 0, null);
int TIMES = 10;
for (int i = 0; i < RETRIES; i++) {
  String item = UUID.randomUUID() + "_" + i;
  queue.put(item);
  println("Queue item has been added: " + item);
}

// IgniteQueue is fully compatible with Java library.
for (String item : queue)
  println("Queue item: " + item);

// Take items from queue head.
for (int i = 0; i < TIMES; i++)
  println("Queue item has been read from queue head: " + queue.take());

// Take items from queue head once again.
for (int i = 0; i < TIMES; i++)
  println("Queue item has been read from queue head: " + queue.poll());



CREATE TABLE WITH CACHE_NAME

Giriş
Açıklaması şöyle
When the CREATE TABLE command is executed, the name of the cache is generated with the following format- SQL_{SCHEMA_NAME}_{TABLE}. Use the CACHE_NAME parameter to override the default name.
Örnek
Şöyle yaparız. Burada CACHE_NAME olarak TradeStatsCache belirtiliyor
CREATE TABLE IF NOT EXISTS PRODSCHEMA.TRADESTATS 
(
    TRADERECORDCREATIONDATE VARCHAR(100),
    PRODUCTTYPE VARCHAR(100),
PRODUCTSUBTYPE VARCHAR(100),
TRADETYPE VARCHAR(100),
TOTALIMPACTEDTRADES BIGINT, TOTALTRADEOPENEXCEPTION BIGINT, TOTALTRADECOUNT BIGINT, UPDATEDAT TIMESTAMP, PRIMARY KEY (TRADERECORDCREATIONDATE,PRODUCTTYPE,PRODUCTSUBTYPE,TRADETYPE) ) WITH "template=outputDataCacheTemplate, CACHE_NAME=TradeStatsCache, AFFINITY_KEY=TRADERECORDCREATIONDATE, CACHE_GROUP=TRADE_METADATA_AGGREGATES, KEY_TYPE=com.abc.entities.trade.TradeStatsEntityKey, VALUE_TYPE=com.abc.entities.trade.TradeStatsEntity";

XML DataStorageConfiguration Bean

Giriş
Bu bean IgniteConfiguration bean'inin dataStorageProperty alanına denk gelir.

defaultDataRegionConfiguration Alanı
Örnek
Şöyle yaparız
<dataStorageConfiguration>
  <defaultDataRegionConfiguration
    name="Default_Region"
    initialSize="104857600"/> <!-- 100*1024*1024 -->

  <dataRegionConfigurations>
    <dataRegionConfiguration
      name="My_Region"
      initialSize="104857600"
      persistenceEnabled="true" 
      metricsEnabled="true" />
    </dataRegionConfigurations>
</dataStorageConfiguration>
defaultDataRegionConfiguration Alanı
Ne kadar bellek kullanacağını ve persistence kullanılıp kullanılmayacağını belirtiriz.
Örnek
Şöyle yaparız
<!-- Memory configuration. -->
<property name="dataStorageConfiguration">
  <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
    <property name="defaultDataRegionConfiguration">
      <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
        <!-- max RAM size -->
	<property name="maxSize" value="#{150 * 1024 * 1024}"/>

	<!-- memory metrics -->
	<property name="metricsEnabled" value="true"/>

	<!-- Enabling persistence. -->
	<property name="persistenceEnabled" value="true"/>
      </bean>
    </property>

    <!-- persistence metrics -->
    <property name="metricsEnabled" value="true"/>
  </bean>
</property>
wal Ayarları
  • walMode 
  • walSegmentSize
  • writeThrottlingEnabled
  • walPath
  • walArchivePath
gibi bir sürü ayar yapılabilir.

walMode Alanı
FSYNC değeri alabilir
Örnek
Şöyle yaparız
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
  <property name="metricsEnabled" value="true"/>
  <property name="walMode" value="FSYNC"/>
  <property name="defaultDataRegionConfiguration">
    <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
      <property name="persistenceEnabled" value="true"/>
      <property name="metricsEnabled" value="true"/>
    </bean>
  </property>

  <property name="walPath" value="/gridgain-dev/wal"/>
  <property name="walArchivePath" value="/gridgain-dev/walarchive"/>
</bean>
walSegmentSize Alanı
Örnek
Şöyle yaparız
<property name="dataStorageConfiguration">
  <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
    <!-- set the size of wal segments to 128MB -->
    <property name="walSegmentSize" value="#{128 * 1024 * 1024}"/>
    <property name="writeThrottlingEnabled" value="true"/>
    <!-- Set the page size to 8 KB -->
    <property name="pageSize" value="#{8 * 1024}"/>
    <property name="defaultDataRegionConfiguration">
      <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
        <property name="name" value="Default_Region"/>
	<!-- Memory region of 20 MB initial size. -->
	<property name="initialSize" value="#{20 * 1024 * 1024}"/>
	<!-- Memory region of 8 GB max size. -->
	<property name="maxSize" value="#{8L * 1024 * 1024 * 1024}"/>
	<!-- Enabling eviction for this memory region. -->
	<property name="pageEvictionMode" value="RANDOM_2_LRU"/>
	<property name="persistenceEnabled" value="true"/>
	<!-- Increasing the buffer size to 1 GB. -->
	<property name="checkpointPageBufferSize" value="#{1024L * 1024 * 1024}"/>
      </bean>
   </property>
   <property name="walPath" value="/gridgain/wal"/>
   <property name="walArchivePath" value="/gridgain/walarchive"/>
  </bean>
</property>

25 Ekim 2021 Pazartesi

JDBC Connection String

Giriş
jdbc ile bağlanmak istersek şöyle yaparız
jdbc:ignite:thin://localhost:10800
JdbcThinConnection nesnesi yaratır. Bu sınıf şöyle yani TCP ile bağlantı kuruyor
public class JdbcThinConnection implements Connection {
  ...
  private volatile JdbcThinTcpIo singleIo;
  ...
}
Schema
Başka scheme' ya bağlanmak istersek şöyle yaparız
jdbc:ignite:thin://localhost:10800/MY_SCHEMA
Hangi schema' ya bağlandıysak CREATE TABLE cümlesi o schema altında tablo yaratır.
Schema ile ilgili açıklama şöyle
Here are a few options to connect to a specific schema in Ignite:

  jdbc:ignite:thin://172.16.0.5/mySchema - will connect to "MYSCHEMA" (case insensitive)
  jdbc:ignite:thin://172.16.0.5/"mySchema" - will connect to "mySchema" (case sensitive)
Transaction
JDBC ile transaction yapılabilir. Konuyla ilgili bir soru burada.

Transaction Isolation Level
Grig Gain 8.8.9 ile denediğimde şu sonucu aldım
Connection conn = ...;
DatabaseMetaData dbmd = conn.getMetaData();
int defaultTransactionIsolation = dbmd.getDefaultTransactionIsolation();
//4 yani Connection.TRANSACTION_REPEATABLE_READ
Şu kod işe yaramaz
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Desteklenen Isolation Level'ları şöyle deneyebiliriz
DatabaseMetaData dbmd = conn.getMetaData();
if (dbmd.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ)) {
  System.out.println("Supports TRANSACTION_REPEATABLE_READ");
}
if (dbmd.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)) {
  System.out.println("Supports TRANSACTION_SERIALIZABLE");
}
ResultSet Tipleri
Grig Gain 8.8.9 ile denediğimde şu kod exception fırlattı.
Connection connection = ...;
PreparedStatement statement = connection.prepareStatement("...",
  ResultSet.TYPE_SCROLL_SENSITIVE, 
  ResultSet.CONCUR_UPDATABLE);
Exception şöyle
Invalid result set type (only forward is supported).
INSERT Cümlesi
Elimizde şöyle bir SQL olsun.
CREATE TABLE IF NOT EXISTS MYUSER (
  ID NUMBER(10,0),
  NAME VARCHAR2(100),
  PRIMARY KEY (ID)
) WITH "ATOMICITY=TRANSACTIONAL";
Ama aslında dokümantasyon şöyle. Aslında SQL Transaction ile TRANSACTIONAL_SNAPSHOT kullan diyor ancak bu cümle sanırım JDBC'yi kapsamıyor.
Enables fully ACID-compliant transactional cache behavior for the key-value API.
Note! In this mode, transactional consistency is guaranteed for key-value API operations only. To enable ACID capabilities for SQL transactions, use the TRANSACTIONAL_SNAPSHOT mode.

Note! This atomicity mode is not compatible with the other modes within the same transaction. if a transaction is executed over multiple caches, all caches must have the same atomicity mode, either TRANSACTIONAL_SNAPSHOT or TRANSACTIONAL.
Ancak benim denemelerimde bu tabloya şöyle yaptım ve sorun olmadan çalışıyor. Burada tablonun TRANSACTIONAL olmasında bir problem yok. Bunu denememim sebebi TRANSACTIONAL_SNAPSHOT kullandığımda MVCC'nin devreye girmesi. Ben de bunu istemiyorum
Connection connection = ...;

int id = ...;
String name = ...;
String SQL_INSERT = "INSERT INTO MYUSER(ID,NAME) VALUES(?,?)";
try (PreparedStatement insertStatement = connection.prepareStatement(SQL_INSERT)) {

  insertStatement.setLong(1, id);
  insertStatement.setString(2, name);

   updateStatement.executeUpdate();
} catch (Exception exception) {
 ...
}
Aynı şeyi tabloyu şöyle yaratarak denedim yine sorun çıkmadı
CREATE TABLE IF NOT EXISTS MYUSER (
  ID NUMBER(10,0),
  NAME VARCHAR2(100),
  PRIMARY KEY (ID)
) WITH "ATOMICITY=ATOMIC";
SELECT FOR UPDATE Cümlesi
Elimizde şöyle bir SQL olsun.
CREATE TABLE IF NOT EXISTS MYSEQUENCE (
  SEQ_NAME VARCHAR2(100),
  SEQ_VALUE NUMBER(10,0),
  PRIMARY KEY (SEQ_NAME)
) WITH "ATOMICITY=TRANSACTIONAL_SNAPSHOT";

INSERT INTO MYSEQUENCE(SEQ_NAME, SEQ_VALUE) VALUES ('SEQ1', 1);
Bu tabloda TRANSACTIONAL_SNAPSHOT kullanıldığı için SELECT FOR UPDATE yapılabilir. Şöyle yaparız
String SQL_QUERY = "SELECT SEQ_NAME, SEQ_VALUE FROM MYSEQUENCE WHERE SEQ_NAME = ? FOR UPDATE ";
try (PreparedStatement selectStatement = conn.prepareStatement(SQL_QUERY)) {
  ...
}
Eğer tabloyu TRANSACTIONAL_SNAPSHOT olarak yaratmazsak exception alırız. Exception şöyle
SELECT FOR UPDATE query requires transactional cache with MVCC enabled.
SELECT FOR UPDATE ile bir başka transaction bizim kaydımızı halen okuyabiliyor ancak güncelleyemez.


 


TcpDiscoveryVmIpFinder Sınfı

Giriş
Şu satırı dahil ederiz
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
setAddresses metodu
Örnek
Şöyle yaparız
TcpDiscoverySpi localDiscovery() {
  TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
  discoverySpi.setLocalPort(48500);

  TcpDiscoveryVmIpFinder firstIpFinder = new TcpDiscoveryVmIpFinder();
  firstIpFinder.setAddresses(Collections.singletonList("127.0.0.1:48500..48520"));
  discoverySpi.setIpFinder(firstIpFinder);
  return discoverySpi;
}


21 Ekim 2021 Perşembe

ignitevisorcmd kabuğu

cache -a 
SIZE sütunu verinin cluster'da nasıl dağıldığını gösterir.

Maven

Giriş
Apache Ignite ve GridGain kullanabilmek için farklı dependency'ler eklemek gerekiyor.

Ignite
Şöyle yaparız
<dependencies>

  <dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-core</artifactId>
    <version>2.11.0</version>
  </dependency>

 <dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-spring</artifactId>
    <version>2.11.0</version>
  </dependency>
</dependencies>

Baseline Topology Ne Demek

Giriş
Açıklaması şöyle Baseline Topology (BTL) veriyi diskte saklayan yani native persistence kullanan düğümler demek
Ignite Baseline Topology, or BLT, represents a set of server nodes in the cluster that persists data on disk.
BLT düğümler aynı zamanda veriyi bellekte de saklayabilir. BLT olmayan düğümler de olabilir. Açıklaması şöyle
The nodes from the baseline topology are part of a regular server node that stores data in-memory and on the disk, and also participates in computing tasks. 
Ignite clusters can have different nodes that are not a part of the baseline topology, such as:

- Server nodes that are not used in Ignite native persistence to persist data on disk. Usually, they store data in memory or persist data to a third-party database or NoSQL. In the above equitation, node N3 or N4 might be one of them.

- Client nodes that do not store shared data.
Ignite veriyi BTL düğümler arasında dengeli şekilde dağıtmaya çalışır. Eğer BLT topolojisindeki bir düğüm çalışmıyorsa ve backup yani yedeği de yoksa, bazı veriyi güncelleyemediğine dair hata verir.

Ignite'ı Çalıştırırken BTL bilgileri de yazılır. 
Örnek
İlk düğümü çalıştırınca çıktı olarak şunu alırız. servers=1 yazar
________ ________________ / _/ ___/ |/ / _/_ __/ __/
_///(77 /// ///_/ /___/\___/_/|_/___/ /_/ /___/
ver. 2.6.0#20180710-sha1:669feacc
2018 Copyright(C) Apache Software Foundation
Ignite documentation: http://ignite.apache.org Quiet mode.
^-- Logging to file '/usr/ignite/2.6.0-s1/work/log/ignite-f0ef6ecc.0.log'
Topology snapshot [ver=1, servers=1, clients=0, CPUs=8, offheap=3.2GB, heap=1.\
^-- Node [id=F0EF6ECC-D692-4862-9414-709039FE00CD, clusterState=INACTIVE] Data Regions Configured:
^-- default [initSize=256.0 MiB, maxSize=3.2 GiB, persistenceEnabled=true]
İkinci düğümü çalıştırınca çıktı olarak şunu alırız. Topology snapshot sürümü artar ve servers=2 yazar
Topology snapshot [ver=2, servers=2, clients=0, CPUs=8, offheap=6.4GB, heap=2.\ 0GB]
^-- Node [id=6DB02F31-115C-41E4-BECC-FDB6980F8143, clusterState=INACTIVE] [16:13:35] Data Regions Configured:
^-- default [initSize=256.0 MiB, maxSize=3.2 GiB, persistenceEnabled=true]

XML CacheConfiguration Bean

dataStorageConfiguration Alanı
Örnek
Şöyle yaparız
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="cacheConfiguration">
      <list>
        <bean class="org.apache.ignite.configuration.CacheConfiguration">
          <property name="name" value="TestCache"/>
          <property name="atomicityMode" value="ATOMIC"/>
          <property name="backups" value="1"/>
        </bean>
      </list>
    </property>
    <!-- Enabling Apache Ignite Persistent Store. -->
     <property name="dataStorageConfiguration">
       <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
         <property name="defaultDataRegionConfiguration">
           <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
             <property name="persistenceEnabled" value="true"/>
             <property name="metricsEnabled" value="true"/>
           </bean>
         </property>
       </bean>
    </property>

    <property name="discoverySpi">
     ...
    </property>
  </bean>
</beans>

20 Ekim 2021 Çarşamba

DataRegionConfiguration Sınıfı

Giriş
Şu satırı dahil ederiz
import org.apache.ignite.configuration.DataRegionConfiguration;
setPageEvictionMode metodu
Açıklaması şöyle
Eviction works with data pages (not with single entries). Eviction uses only data page update timestamp to decide what data page will be evicted.

setPersistenceEnabled metodu
Örnek
Şöyle yaparız
IgniteConfiguration igniteCfg = new IgniteConfiguration();

DataStorageConfiguration dataStorageCfg = new DataStorageConfiguration();
dataStorageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);
igniteCfg.setDataStorageConfiguration(dataStorageCfg);


Ignite ignite = Ignition.start(igniteCfg);


@QuerySqlField Anotasyonu

Giriş
Eğer veri bellekte saklanıyorsa ve belli alanlara göre arama yapmak gerekiyorsa, verinin indekslenecek alanlarını bu anotasyonla işaretlemek gerekir. Bu anotasyonu kullanabilmek için Maven'a şu satırı ekleriz
<properties>
  <gridgain.version>8.8.9</gridgain.version>
</properties>

<dependency>
  <groupId>org.gridgain</groupId>
  <artifactId>ignite-indexing</artifactId>
  <version>${gridgain.version}</version>
</dependency>
Örnek
Şöyle yaparız
public class Person implements Serializable {
  //Indexed field. Will be visible to the SQL engine.
  @QuerySqlField(index = true)
  private long id;

  //Queryable field. Will be visible to the SQL engine.
  @QuerySqlField
  private String name;

  //Will NOT be visible to the SQL engine.
  private int age;

  //Indexed field sorted in descending order. Will be visible to the SQL engine.
  @QuerySqlField(index = true, descending = true)
  private float salary;
}



snapshot-utility komutu

Giriş
Açıklaması şöyle. Eğer GridGain kullanıyorsak sadece Ultimate Edition ile geliyor. Community Edition 'da yok. Bu araç yerine GridGain Web Console da kullanılabilir.
GridGain Ultimate Edition includes a command line tool that simplifies snapshot creation, recovery, and the management of related tasks.

The script that starts the tool is called snapshot-utility and is located in the {GRIDGAIN_HOME}/bin/ folder. The script is available for Unix-based systems (snapshot-utility.sh) and for Windows (snapshot-utility.bat).

The tool supports the following commands:

HELP
LIST
INFO
SNAPSHOT
RESTORE
CHECK
DELETE
MOVE
STATUS
CATALOG
CANCEL
SCHEDULE

19 Ekim 2021 Salı

SQL - CREATE TABLE WITH TEMPLATE

Giriş
Açıklaması şöyle. Hazır iki tane template var. Bunlar PARTITIONED ve REPLICATED. Eğer hiç bir şey tanımlamazsak PARTITIONED kullanılır
TEMPLATE=<cache’s template name> - case-sensitive​ name of a cache template. A template is an instance of the CacheConfiguration class registered by calling Ignite.addCacheConfiguration().

Use predefined TEMPLATE=PARTITIONED or TEMPLATE=REPLICATED templates to create the cache with the corresponding replication mode. The rest of the parameters will be those that are defined in the CacheConfiguration object. By default, TEMPLATE=PARTITIONED is used if the template is not specified explicitly.
1. Partitioned Ne Demek?
Açıklaması şöyle
PARTITIONED means data is spread across nodes by a key, like sharding in MongoDB, or partitioning in Kafka and Cassandra.
Ne Zaman Partitioned Kullanılır?
Açıklaması şöyle
Partitioned caches are ideal when working with large data sets and updates are frequent.
Partitioned ve Backup Sayısı
Açıklaması şöyle
Additionally to the PARTITIONED mode, you can setup the number of backups. This is the number of nodes backing up the primary node, but not serving any requests. Writes to backup copies can be done synchronously or asynchronously.
2. REPLICATED Ne Demek?
Açıklaması şöyle
REPLICATED is about storing all data on each node.
Ne Zaman Replicated Kullanılır?
Açıklaması şöyle
This mode is ideal for scenarios where cache reads are a lot more frequent than cache writes, and data sets are small.

Örnek - replicated
Açıklaması şöyle
By default, the template mode is PARTITIONED. To specify the number of copies of the data we can also specify BACKUPS parameter here, which is 0 by default.
Şöyle yaparız
CREATE TABLE Employee (
id LONG PRIMARY KEY, name VARCHAR, isEmployed tinyint(1) ) WITH "template=replicated";
Örnek - partitioned
Şöyle yaparız
CREATE TABLE 'city' (
 'ID' INT(11),
 'Name' CHAR(35),
 'CountryCode' CHAR(3),
 PRIMARY KEY('ID','CountryCode')
) WITH "template=partitioned, backups=1, affinityKey=CountryCode";

SQL - Data Definition Language (DDL)

Giriş
DDL için şu SQL cümleleri kullanılabilir
CREATE INDEX
CREATE USER

ALTER TABLE
ALTER USER

DROP INDEX
DROP TABLE
DROP USER

ANALYZE

Snapshot

Giriş
Açıklaması şöyle. Snapshot sistem canlı iken de alınabilir.
Snapshots can be taken online, when the cluster is active and accessible to users. An Ignite snapshot includes a cluster-wide copy of all data records that exist at the moment the snapshot is started. All snapshots are consistent — in terms of concurrent, cluster-wide operations as well as in terms of ongoing changes in Ignite Persistence data, index, schema, binary metadata, marshaller, and other files on nodes.
Aslında bu işleme backup ta denilebilirdi ancak Açıklaması şöyle
The main reason why GridGain snapshots are not called "backups" is to avoid confusion with Apache Ignite backup copies of data stored in the cluster. 
GridGain ve Apache Ignite snapshot için farklı komutlar kullanıyorlar. GridGain snapshot-utility komutunu kullanıyor. Apache Ignite ise control komutunu kullanıyor

Snapshot Türleri
 GridGain Ultimate Edition ve Apache Ignite farklı Snapshot yeteneklerine sahipler. Karşılaştırmayı gösteren bir tablo burada

Ve de şu kavramları bilmek gerekiyor.

Full Snapshot
Incremental Snapshot
Per-Cache Snapshot
Point-in-Time Recovery
Network Backup
Heterogeneous Recovery

Apache Ignite Snapshot
Örnek
Şöyle yaparız
#Create a cluster snapshot:
control.(sh|bat) --snapshot create snapshot_name

#Cancel a running snapshot:
control.(sh|bat) --snapshot cancel snapshot_name

#Kill a running snapshot:
control.(sh|bat) --kill SNAPSHOT snapshot_name
Örnek
Şöyle yaparız
// Start snapshot operation.
ignite.snapshot().createSnapshot("snapshot_02092020").get();
Örnek
Benim yaptığım denemelerde thick client bile olsa persistence yeteneğini eklemek gerekti. Yoksa şöyle bir exception fırlatıyordu
SEVERE: Cluster-wide snapshot operation failed: 
class org.apache.ignite.IgniteException: Create snapshot request has been rejected. Snapshots on an in-memory clusters are not allowed
Kod şöyle
IgniteConfiguration cfg = new IgniteConfiguration();

DataStorageConfiguration dataStorageConfiguration = new DataStorageConfiguration();
DataRegionConfiguration defaultDataRegionConfiguration = dataStorageConfigurationa
  .getDefaultDataRegionConfiguration();
defaultDataRegionConfiguration.setPersistenceEnabled(true);

cfg.setDataStorageConfiguration(dataStorageConfiguration);

cfg.setClientMode(true);


// Setting up an IP Finder to ensure the client can locate the servers.
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setAddresses(Collections.singletonList("127.0.0.1:47500..47509"));
cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(ipFinder));

// Starting the node
Ignite ignite = Ignition.start(cfg);
IgniteSnapshot snapshot = ignite.snapshot();
IgniteFuture<Void> future = snapshot.createSnapshot("mysnapshot");
future.get();

GG Snapshot
Örnek - Full Snapshot
Şöyle yaparız
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
  
  // Get a reference to GridGain plugin.
  GridGain gg = ignite.plugin(GridGain.PLUGIN_NAME);

  // Get a reference to the Snapshots.
  GridSnapshot storage = gg.snapshot();

  // Create the snapshot. Data of all the caches will be added to the snapshot.
  SnapshotFuture future = storage.createFullSnapshot(null,"Snapshot has been created!");

  // Wait while the snapshot is being created.
  future.get();
}

18 Ekim 2021 Pazartesi

sqlline komutu seçenekleri

Giriş
Eğer MalformedInputException alıyorsak ~/sqlline/history dosyasını silmek gerekiyor. Windows'ta şu dizinde
C:\Users\acelya\sqlline

Seçenekler
Tüm seçenekler şöyle
-u <database url>               the JDBC URL to connect to
-n <username>                   the username to connect as
-p <password>                   the password to connect as
-d <driver class>               the driver class to use
-nn <nickname>                  nickname for the connection
-f <file>                       script file to execute (same as --run)
--color=[true/false]            control whether color is used for display
--showHeader=[true/false]       show column names in query results
--headerInterval=ROWS           the interval between which headers are displayed
--fastConnect=[true/false]      skip building table/column list for tab-completion
--autoCommit=[true/false]       enable/disable automatic transaction commit
--verbose=[true/false]          show verbose error messages and debug info
--showTime=[true/false]         display execution time when verbose
--showWarnings=[true/false]     display connection warnings
--showNestedErrs=[true/false]   display nested errors
--numberFormat=[pattern]        format numbers using DecimalFormat pattern
--force=[true/false]            continue running script even after errors
--maxWidth=MAXWIDTH             the maximum width of the terminal
--maxColumnWidth=MAXCOLWIDTH    the maximum width to use when displaying columns
--silent=[true/false]           be more silent
--autosave=[true/false]         automatically save preferences
--outputformat=[table/vertical/csv/tsv]   format mode for result display
--isolation=LEVEL               set the transaction isolation level
--run=/path/to/file             run one script and then exit
--color seçeneği
Eğer terminalimiz ANSI renk kodlarını destekliyorsa kullanabiliriz. Şöyle yaparız. Windows'ta desteklenmeyebilir.
sqlline.bat --color=true --verbose=true -u jdbc:ignite:thin://127.0.0.1/ADV/
-u seçeneği
Örnek
Şöyle yaparız. -u ile veri tabanı, -n ile kullanıcı ismi, -p ile şifre belirtiliyor.
#!/bin/env bash
VARIABLE="testvalue"

SQL="SELECT '${VARIABLE}' from sys.version;"

sqlline -u jdbc:drill: -n cmatta -p xxxx <<< $SQL

SQL - MERGE INTO

Örnek
Şöyle yaparız
MERGE INTO FOO VALUES ('mykey','myvalue');

17 Ekim 2021 Pazar

sqlline Kabuğu

Giriş
sqlline başlatıldıktan sonra kabuk açılır. Kabuk içinde komutlar çalıştırılabilir.

Schema belirtmek
Farklı bir schema'daki tabloya erişmek için "scheme"."cachename" şeklinde yani çift tırnak ile kullanırız.
Örnek
Şöyle yaparız
0: jdbc:ignite:thin://127.0.0.1/> select count(*) from "eventCache"."EVENTCACHEPOJO";
+--------------------------------+
|            COUNT(*)            |
+--------------------------------+
| 2619705                        |
+--------------------------------+

!run komutu
Bir sql dosyasını çalıştırabilir.
Örnek
Şöyle yaparızz
!run D:\gridgain\gridgain-community-8.8.9\bin\ddl\fill\FILL_FOO.SQL

Ignite Transaction Kullanımı

Giriş Bir tablo 3 tane atomicity değerinden birisine sahip olabilir. 1. ATOMIC 2. TRANSACTIONAL 3. TRANSACTIONAL_SNAPSHOT ATOMIC Açıklaması ...