Руководство прикладного разработчика#

Термины и определения#

Термин/Аббревиатура

Определение

JDK

Java Development Kit, комплект разработчика приложений на языке Java

ОС

Операционная система

Системные требования#

Platform V DataGrid можно безопасно использовать при следующей конфигурации среды:

Требование

Описание

JDK

Oracle JDK 8 и новее, Open JDK 8 и новее, IBM JDK 8 и новее

ОС

Linux (любой версии), macOS (10.6 и новее), Windows (XP и новее), Windows Server (2008 и новее), Oracle Solaris, z/OS

Архитектура

x86, x64, SPARC, PowerPC

Сеть

Ограничения отсутствуют (рекомендуется 10 Гбит/с)

Специальных рекомендаций по настройке ОС нет. Настройки ОС и окружения определяются внутренними политиками безопасности на стороне клиента.

Подключение и конфигурирование#

Подключение и конфигурирование программного продукта описывается в документе «Руководство по системному администрированию».

Миграция на текущую версию#

Описание роли для миграции на текущую версию находится в разделе «Обновление Platform V DataGrid» документа «Руководство по установке».

Разработка первого приложения с использованием программного продукта#

Руководство по первому запуску Platform V DataGrid соотстветствует руководству по первому запуску Apache Ignite.

Java#

В данном разделе содержится информация о том, как запустить простой пример приложения Hello World, используя Java.

Запуск Platform V DataGrid на Java 11 и новее#

Для запуска Platform V DataGrid на Java 11 и новее необходимо сделать следующее:

  1. Установить в качестве значения переменной среды JAVA_HOME директорию установки Java.

  2. Ignite использует SDK API, недоступные по умолчанию. Чтобы эти API стали доступны для использования, необходимо передать в JVM определенные атрибуты. Если для запуска Platform V DataGrid вы используете скрипт ignite.sh, то делать ничего не придется, так как скрипт уже содержит эти атрибуты. В ином случае в JVM необходимо передать следующие параметры:

--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED
--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED
--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
--illegal-access=permit

Внимание

TLSv1.3, доступный в Java 11, в настоящий момент не поддерживается. Если соединение между узлами осуществляется по протоколу SSL, необходимо добавить в конфигурацию параметр ‑Djdk.tls.client.protocols=TLSv1.2.

Создание первого приложения#

  1. Для начала необходимо подключиться к кластеру. Подключение к кластеру описан в предыдущем разделе данного курса.

  2. После запуска кластера можно создать простое приложение HelloWorld. Для этого необходимо:

    • Добавить Maven-зависимости. Это самый простой способ начать работать с Platform V DataGrid на Java. Необходимо создать новый проект Maven и добавить в файл pom.xml следующие зависимости:

    <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>com.sbt.ignite</groupId>
        <artifactId>Your_Project_Name</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <ignite.se.version>4.2100.0</ignite.se.version>
            <ignite.version>2.10</ignite.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.sbt.ignite</groupId>
                <artifactId>ignite-core</artifactId>
                <version>${ignite.se.version}</version>
            </dependency>
            <dependency>
                <groupId>com.sbt.sbergrid</groupId>
                <artifactId>security-core</artifactId>
                <version>${ignite.se.version}</version>
            </dependency>
    
            <!-- Зависимости commons-lang&jaxb-api требуются при использовании толстого клиента -->
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
            </dependency>
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.0</version>
            </dependency>
    
            <!-- Зависимости для REST API-->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.13</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.11.0</version>
            </dependency>
        </dependencies>
    
        <!-- Указанные ниже настройки необходимо добавлять при использовании Java-компилятора до версии 1.8 -->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

Внимание

В случае, если maven-зависимости не подгружаются, нужно проверить, какие репозитории указаны в файле settings.xml. Обычно он находится по пути ~/Users/user/.m2/settings.xml.

Файл settings.xml должен выглядеть так:

<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>internal</id>
            <username>[username]</username> <!--имя пользователя и пароль от репозиториев в Nexus-->
            <password>[userpass]</password>
        </server>
        <server>
            <id>corp-releases</id>
            <username>[username]</username> <!--имя пользователя и пароль от репозиториев в Nexus-->
            <password>[userpass]</password>
        </server>
    </servers>
    <mirrors>
        <mirror>
            <id>Mirror of central</id>
            <name>Mirror of central</name>
            <url>http://nexus.sigma.sbrf.ru:8099/nexus/content/groups/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central-nexus</id>
                    <name>central</name>
                    <url>http://nexus.sigma.sbrf.ru:8099/nexus/content/groups/public</url>
                </repository>
                <repository>
                    <id>internal</id>
                    <name>internal</name>
                    <url>http://nexus.sigma.sbrf.ru:8099/nexus/content/groups/internal</url>
                </repository>
                <repository>
                    <id>corp-releases</id>
                    <name>corp-releases</name>
                    <url>http://nexus.sigma.sbrf.ru:8099/nexus/content/repositories/corp-releases</url>
                </repository>
            </repositories>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>
  • Создать класс ThinClient.java. Ниже приведен пример простого класса ThinClient.java, который выводит строчку 'Hello World'. Пример ниже показывает, как можно сконфигурировать кластер, используя Java API, создать кэш с данными в нем и исполнить кастомную Java-логику на серверных узлах:

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.client.ClientCache;
import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.lang.IgniteRunnable;
import org.apache.ignite.resources.IgniteInstanceResource;
import org.apache.ignite.ssl.SslContextFactory;
import java.security.cert.CertificateEncodingException;
import static org.apache.ignite.client.SslMode.REQUIRED;

public class ThinClient {

    private static final String CLIENT_KEY_STORE = "path/to/keystore.jks";  //jks в письме
    private static final String TRUST_STORE = "path/to/dev-truststore.jks";  //jks в письме
    private static final String CLIENT_KEY_STORE_PWD = "keystorepass";  //пароль в письме
    private static final String TRUST_STORE_PWD = "truststorepass";  //пароль в письме
    private static final String DFLT_ADDR = "0.0.0.0:10800"; //адреса в письме
    private static final String CLIENT_LOGIN = "login";  //логин в письме
    private static final String CLIENT_PWD = "password";  // пароль задается при заказе кластера в ДИ
    private static final String TEST_CACHE = "THIN_TEST_CACHE";  //имя создаваемого кеша

    /**
     * @param args Args.
     */
    public static void main(String[] args) throws Exception {

        IgniteClient client = Ignition.startClient(getIgniteClientConfiguration());
        ClientCache<String, String> clntCache = client.getOrCreateCache(TEST_CACHE);
        clntCache.put("key", "Hello");
        clntCache.put("key1","World!" );

        System.out.println(">> Created cache and added values.");

        System.out.println(">> Receiving data...");

        System.out.println(clntCache.get("key") + " " + clntCache.get("key1"));

        System.out.println(">> Data received from cache successfully");

        client.close();

    }

    private static ClientConfiguration getIgniteClientConfiguration() throws CertificateEncodingException {
        return new ClientConfiguration()
                .setSslContextFactory(createSslCtxFactory())
                .setAddresses(DFLT_ADDR, "10.53.220.23")
                .setSslMode(REQUIRED)
                .setUserName(CLIENT_LOGIN)
                .setUserPassword(CLIENT_PWD)
                .setPartitionAwarenessEnabled(true)
                .setBinaryConfiguration(new BinaryConfiguration().setCompactFooter(true));
    }

    private static SslContextFactory createSslCtxFactory() {
        SslContextFactory sslCtxFactory = new SslContextFactory();
        sslCtxFactory.setKeyStoreFilePath(ThinClient.CLIENT_KEY_STORE);
        sslCtxFactory.setKeyStorePassword(CLIENT_KEY_STORE_PWD.toCharArray());
        sslCtxFactory.setTrustStoreFilePath(TRUST_STORE);
        sslCtxFactory.setTrustStorePassword(TRUST_STORE_PWD.toCharArray());

        return sslCtxFactory;
    }
}
  • Запустить класс ThinClient.java. После запуска класса вы увидите строчку 'Hello World' и информацию об окружении на всех серверных узлах кластера.

Примечание

За работу с клиентами (IgniteClient, JDBC, ODBC), подключающимися через протокол тонкого клиента со стороны узла отвечает класс ClientConnectorConfiguration. Он является частью конфигурации узла. Настройка этого класса может влиять на параметры подключения. Ниже приведен пример конфигурации класса:

ClientConnectorConfiguration clientConCfg = new ClientConnectorConfiguration();
 clientConCfg.setUseIgniteSslContextFactory(false);
 clientConCfg.setSslEnabled(true);
 clientConCfg.setJdbcEnabled(true);
 clientConCfg.setSslClientAuth(true);
 clientConCfg.setSslContextFactory(sslCtxFactory);
  
 SslContextFactory sslCtxFactory = new SslContextFactory();
 sslCtxFactory.setKeyStoreFilePath(SERVER_KEY_STORE);
 sslCtxFactory.setKeyStorePassword(PWD.toCharArray());
 sslCtxFactory.setTrustStoreFilePath(TRUST_STORE);
 sslCtxFactory.setTrustStorePassword(PWD.toCharArray());
 sslCtxFactory.setCipherSuites(
             "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
             "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
             "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
             "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
             "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
             "TLS_RSA_WITH_AES_256_GCM_SHA384",
             "TLS_RSA_WITH_AES_128_GCM_SHA256"
         );

Python#

В данном разделе содержится информация о запуске кластера, а также о том, как запустить простой пример приложения Hello World, используя тонкий клиент для Python.

Подключение и конфигурирование#

После установки Platform V DataGrid необходимо установить тонкий клиент Python. Для этого необходимо выполнить следующую команду:

  • pip

pip install pyignite
  • pip3

pip3 install pyignite

Создание первого приложения#

После запуска кластера вы можете использовать тонкий клиент Python для работы с кэшами.

Предположим, что серверный узел запущен локально. Ниже приведен пример приложения HelloWorld, которое передает значения в кэш и забирает их оттуда:

from pyignite import Client
from pyignite.datatypes.prop_codes import PROP_NAME, PROP_STATISTICS_ENABLED

username = 'username' # Логин в письме от ДИ
password = 'userpass' # Пароль от ise_client задается при заказе кластера в ДИ

ssl_params = {
    'use_ssl': True,
    'ssl_keyfile': '/path/to/dev-ise_client.key',   #Сертифиакт в письме от ДИ
    'ssl_certfile': '/path/to/dev-ise_client-pub.key',  #Сертификат в письме от ДИ
    'ssl_ciphers': 'HIGH:!DH:!aNULL'
}

nodes = [
    ('0.0.0.0', 10800), # IP-адреса серверов в письме от ДИ
    ('0.0.0.0.', 10800),
]

client = Client(username=username, password=password, **ssl_params, compact_footer='true')
with client.connect(nodes):
    my_cache = client.get_or_create_cache({
        PROP_NAME: 'cache_name',
        PROP_STATISTICS_ENABLED: 'true'
    }
    )
    my_cache.put('key', 'Hello')

    print ('Key "key" is put into cache successfully')

    my_cache.put('key1', 'World!')

    print ('Key "key1" is put into cache successfully')

    print(my_cache.get('key') + " " + my_cache.get('key1'))

    print ('Information is successfully received from cache')

Для запуска необходимо сохранить пример в качестве текстового файла (например, hello.py) и запустить его из терминала (командной строки):

python3 hello.py

Примечание

Вы также можете ввести этот пример в интерпретатор или оболочку Python (например, IDLE для Windows) и изменить или исполнить его там.

SQL#

Если вам необходимо просто запустить кластер и добавить строки с данными без запуска Java и настройки IDE, можно использовать SQL.

Чтобы сделать это, необходимо использовать утилиту sqlline.sh, которая находится в директории /bin вашей инсталляции Platform V DataGrid. О том, как работать с утилитой, можно узнать из раздела «Использование утилиты sqlline" ниже.

Использование утилиты sqlline#

Утилита sqlline.sh позволит вам подключиться к узлу и начать вводить строки данных.

Для этого необходимо:

  1. Открыть новое окно командной строки и убедиться, что вы находитесь в директории $IGNITE_HOME.

  2. При помощи утилиты sqlline подключиться к кластеру: /bin/ise-sqlline.sh -u "jdbc:ignite:thin://127.0.0.1/?sslMode=require&sslClientCertificateKeyStoreUrl=/opt/ignite/server/config/dev-ise_client-keystore.jks&sslTrustCertificateKeyStoreUrl=//opt/ignite/server/config/dev-truststore.jks" -n ise_client

  3. Ввести пароль от хранилища ключей.

  4. Ввести пароль от truststore.

    Примечание

    Файлы сертификатов keystore.jks и dev-truststore.jks находятся на виртуальной машине. Утилита ise-sqlline.sh ссылается именно на них. Для работы с SQL наличие сертификатов на вашей локальной машине не обязательно.

  5. Ввести пароль от учетной записи клиента.

  6. Создать две таблицы, запустив две следующие команды в утилите sqlline:

    CREATE TABLE City (id LONG PRIMARY KEY, name VARCHAR) WITH "template=replicated";
    CREATE TABLE Person (id LONG, name VARCHAR, city_id LONG, PRIMARY KEY (id, city_id)) WITH "backups=1, affinityKey=city_id";
    
  7. Вставить строки с данными, скопировав и вставив указанные ниже команды:

    INSERT INTO City (id, name) VALUES (1, 'Forest Hill');
    INSERT INTO City (id, name) VALUES (2, 'Denver');
    INSERT INTO City (id, name) VALUES (3, 'St. Petersburg');
    INSERT INTO Person (id, name, city_id) VALUES (1, 'John Doe', 3);
    INSERT INTO Person (id, name, city_id) VALUES (2, 'Jane Roe', 2);
    INSERT INTO Person (id, name, city_id) VALUES (3, 'Mary Major', 1);
    INSERT INTO Person (id, name, city_id) VALUES (4, 'Richard Miles', 2);
    
  8. Запустить базовые запросы (здесь показан пример с выводом):

    SELECT * FROM City;
    
    +--------------------------------+--------------------------------+
    |               ID               |              NAME              |
    +--------------------------------+--------------------------------+
    | 1                              | Forest Hill                    |
    | 2                              | Denver                         |
    | 3                              | St. Petersburg                 |
    +--------------------------------+--------------------------------+
    3 rows selected (0.05 seconds)
    

    Примечание

    Запрос SELECT является проверкой того, что таблица создана.

  9. Запустить запросы с распределенными JOIN (здесь показан пример с выводом):

    SELECT p.name, c.name FROM Person p, City c WHERE p.city_id = c.id;
    
    +--------------------------------+--------------------------------+
    |              NAME              |              NAME              |
    +--------------------------------+--------------------------------+
    | Mary Major                     | Forest Hill                    |
    | Jane Roe                       | Denver                         |
    | John Doe                       | St. Petersburg                 |
    | Richard Miles                  | Denver                         |
    +--------------------------------+--------------------------------+
    4 rows selected (0.011 seconds)
    

Примечание

Под каждую таблицу создается отдельный кэш. Кэш создается одновременно с созданием таблицы. Таблица физически сохраняется на диске в отдельном каталоге с названием этой таблицы.

В этих руководствах можно найти дополнительную информацию о системных требованиях, установке, а также написанию первого приложения с использованием одного из API Platform V DataGrid.

Использование программного продукта#

Пример использования плагина безопасности Platform V DataGrid#

У плагина безопасности, входящего в поставку Platform V DataGrid, имеется открытый API.

Этот API представлен в виде java-класса SecurityDataManager. Данный класс читает и вносит изменения в distributed metastorage. Это касается тех записей, которые относятся к пользователям и ролям. Именно на его основе строится администрирование пользователей и прав.

API работает следующим образом:

  1. Сущность IgniteClient подключается к кластеру с правами администратора безопасности.

  2. После подключения IgniteClient пользователь сможет выполнять различные действия, например, добавлять пользователей (addUser) или изменять пароль (changePassword).

Разработчик может подключить данный интерфейс к своему приложению, взяв из Nexus артефакт com.sbt.security.ignite:ignite-security-plugin:(ise-version), где ise-version – это версия Platform V DataGrid.

После этого, класс SecurityDataManager будет доступен для использования.

Описание методов класса, доступных пользователю#

Метод

Описание

Входные данные

Типы входных данных

Примечания

addUser()

Добавляет пользователя

login (задает логин пользователя),
pwdSaltedHash (задает «соленый» хеш пароля),
salt (задает «соль»)

String

addRole()

Добавляет роль

roleName(Задает имя роли),
SecurityPermissionSet set (Всегда имеет значение null)

Serializable
@Nullable

Если значение типа @Nullable не null или оно вызывает метод defaultAllowAll(), метод вернет исключение PROHIBIT_ALLOW_ALL_MESSAGE. В остальных случаях возвращает класс RoleAddTask и создает новый метод RoleAddTaskArgument(), использующий переменные roleName и set типов Serializable и @Nullable

removeUser()

Удаляет пользователя

key (Задает ключ)

Serializable

Значение переменной key не может быть null

removeRole()

Удаляет роль

key (Задает ключ)

Serializable

Значение переменной key не может быть null

updatePassword()

Обновляет пароль

login (Задает логин),
curPwd (Задает существующий пароль),
newPwd (Задает новый пароль)

String

Возвращает новый метод UserUpdatePasswordTaskArgument() c этими тремя параметрами. Переменные не должны иметь значения null

setUserPassword()

Позволяет задать пароль пользователя

login (Задает логин),
pwd (Задает пароль),
pwdSaltedHash (Задает «соленый» хеш пароля),
salt (Задает «соль»)

String

Часто встречающиеся проблемы и пути их устранения#

Раздел предусмотрен для будущих обновлений.