Быстрый старт

Запуск узла

Запустить узел можно из командной строки, используя конфигурацию по умолчанию, либо положив в директорию Ignite кастомный файл конфигурации.
Запускать можно несколько узлов сразу. Они автоматически обнаружат друг друга.
Для запуска узла необходимо сделать следующее:
  1. Из командной строки войдите в директорию bin в установочной директории Ignite. Команда для входа должна выглядеть примерно так:
    cd {IGNITE_HOME}/bin/
  2. Запустите узел, используя кастомный файл конфигурации, который будет передан в ignite.sh|bat в качестве параметра, например:
    ./ignite.sh ../examples/config/example-ignite.xml ignite.bat ../examples/config/example-ignite.xml
    После запуска узла появится следующий вывод:
    Console type=sh
    [08:53:45] Ignite node started OK (id=7b30bc8e)
    [08:53:45] Topology snapshot [ver=1, locNode=7b30bc8e, servers=1, clients=0, state=ACTIVE, CPUs=4, offheap=1.6GB, heap=2.0GB]
    
  3. Откройте новое окно командной строки и снова запустите команду, описанную в шаге 2.
  4. Убедитесь в том, что в выводе содержится строка Topology snapshot:
    Console type=sh
    [08:54:34] Ignite node started OK (id=3a30b7a4)
    [08:54:34] Topology snapshot [ver=2, locNode=3a30b7a4, servers=2, clients=0, state=ACTIVE, CPUs=4, offheap=3.2GB, heap=4.0GB]
    
    По умолчанию ignite.sh|bat запускает узел, используя конфигурационный файл по умолчанию: config/default-config.xml.

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

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

Java

Для запуска на Java 11 и новее выполните следующее:
  1. Установите в качестве значения переменной среды JAVA_HOME директорию установки Java.
  2. Ignite использует SDK API, недоступные по умолчанию. Чтобы эти API стали доступны для использования, необходимо передать в JVM определенные атрибуты. Если для запуска Ignite используется скрипт ignite.sh, то делать ничего не требуется, так как скрипт уже содержит эти атрибуты. В ином случае - в JVM необходимо передать следующие параметры:
    Console type=sh
    --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
    
  3. TLSv1.3, доступный в Java 11, в настоящий момент не поддерживается. Если соединение между узлами осуществляется по протоколу SSL, то необходимо добавить в конфигурацию параметр ‑Djdk.tls.client.protocols=TLSv1.2.

Запуск первого приложения

После запуска кластера можно запустить простое приложение HelloWorld:
  1. Создайте новый проект Maven и добавьте в файл pom.xml следующие зависимости:
    pom.xml type=xml
    <properties>
        <ignite.version>2.10.0</ignite.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.apache.ignite</groupId>
            <artifactId>ignite-core</artifactId>
            <version>${ignite.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ignite</groupId>
            <artifactId>ignite-spring</artifactId>
            <version>${ignite.version}</version>
        </dependency>
    </dependencies>
    
  2. Создайте класс HelloWorld.java. Ниже приведен пример простого класса HelloWorld.java, который выводит строчку 'Hello World' и некоторую информацию об окружении на всех серверных узлах кластера. Пример ниже показывает, как можно сконфигурировать кластер, используя Java API, создать кэш с данными в нем и исполнить кастомную Java-логику на серверных узлах.
    HelloWorld.java type=java
    public class HelloWorld {
        public static void main(String[] args) throws IgniteException {
            // Preparing IgniteConfiguration using Java APIs
            IgniteConfiguration cfg = new IgniteConfiguration();
    
            // The node will be started as a client node.
            cfg.setClientMode(true);
    
            // Classes of custom Java logic will be transferred over the wire from this app.
            cfg.setPeerClassLoadingEnabled(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);
    
            // Create an IgniteCache and put some values in it.
            IgniteCache<Integer, String> cache = ignite.getOrCreateCache("myCache");
            cache.put(1, "Hello");
            cache.put(2, "World!");
    
            System.out.println(">> Created the cache and add the values.");
    
            // Executing custom Java compute task on server nodes.
            ignite.compute(ignite.cluster().forServers()).broadcast(new RemoteTask());
    
            System.out.println(">> Compute task is executed, check for output on the server nodes.");
    
            // Disconnect from the cluster.
            ignite.close();
        }
    
        /**
         * A compute tasks that prints out a node ID and some details about its OS and JRE.
         * Plus, the code shows how to access data stored in a cache from the compute task.
         */
        private static class RemoteTask implements IgniteRunnable {
            @IgniteInstanceResource
            Ignite ignite;
    
            @Override public void run() {
                System.out.println(">> Executing the compute task");
    
                System.out.println(
                    "   Node ID: " + ignite.cluster().localNode().id() + "\n" +
                    "   OS: " + System.getProperty("os.name") +
                    "   JRE: " + System.getProperty("java.runtime.name"));
    
                IgniteCache<Integer, String> cache = ignite.cache("myCache");
    
                System.out.println(">> " + cache.get(1) + " " + cache.get(2));
            }
        }
    }
    
    Внимание:
    • Не забудьте добавить import для класса HelloWorld.java.
    • Если среда разработки использует Java-компилятор до версии 1.8, то в pom.xml потребуется добавить следующие настройки:
    pom.xml type=xml
    <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>
    
  3. Запустите класс HelloWorld.java. После запуска класса будет выведена строка 'Hello World' и информация об окружении на всех серверных узлах кластера.

Python

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

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

После установки необходимо установить тонкий клиент Python (pyignite). Для этого выполните следующую команду:
pip3 install pyignite pip install pyignite
Перед подключением через тонкий клиент Python необходимо запустить хотя бы один узел кластера.

Запуск первого приложения

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

 client = Client()
 client.connect('127.0.0.1', 10800)

 #Create cache
 my_cache = client.create_cache('my cache')

 #Put value in cache
 my_cache.put(1, 'Hello World')

 #Get value from cache
 result = my_cache.get(1)
 print(result)
Для запуска необходимо сохранить пример в качестве текстового файла (например, hello.py) и запустить его из командной строки:
python3 hello.py
Примечание: можно ввести этот пример в интерпретатор или оболочку Python (например, IDLE для Windows) и изменить или исполнить его там.

SQL

Если необходимо просто запустить кластер и добавить строки с данными без запуска Java и настройки IDE, можно использовать SQL.
Утилита sqlline позволяет подключиться к узлу и начать вводить строки данных. Она находится в директории /bin инсталляции Ignite SE.
  1. Откройте новое окно командной строки и убедитесь, что вы находитесь в директории {IGNITE_HOME}\bin.
  2. При помощи утилиты sqlline подключитесь к кластеру:
    $ ./sqlline.sh -u jdbc:ignite:thin://127.0.0.1/ $ sqlline -u jdbc:ignite:thin://127.0.0.1
  3. Создайте две таблицы, запустив следующие команды в утилите sqlline:
    Create_Table type=sql
    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";
    
  4. Вставьте строки с данными, скопировав и вставив указанные ниже команды:
    Insert type=sql
    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);
    
  5. Запустите базовые запросы:
    Queries type=sql
    SELECT * FROM City;
    
    +--------------------------------+--------------------------------+
    |               ID               |              NAME              |
    +--------------------------------+--------------------------------+
    | 1                              | Forest Hill                    |
    | 2                              | Denver                         |
    | 3                              | St. Petersburg                 |
    +--------------------------------+--------------------------------+
    3 rows selected (0.05 seconds)
    
  6. Запустите запросы с распределенными JOIN:
    Queries type=sql
    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)
    

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

Пример использования плагина безопасности Ignite SE

У плагина безопасности, входящего в поставку Ignite SE, имеется открытый 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 – это версия Ignite.
После этого класс 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
Предыдущий раздел
1.3 Key-value СУБД (in-memory)
Следующий раздел
Использование SSL/TLS для тонких клиентов и JDBC/ODBC-п...
Была ли страница полезной?