Установка Apache Cassandra кластера в Unix/Linux

Установка Apache Cassandra кластера в Unix/Linux

Apache Cassandra — это распределённая noSQL система для управления БД которая позволяет создавать высоко- нагруженные и масштабируемые, а так же надежные хранилища больших массивов с данными в виде хэшей. Данный проект, в свое время разрабатывался в компании  Facebook ( до 2009 года), после чего был передан на разработку и поддержку Apache Software Foundation которая и продолжает развитие Cassandra. Данное ПО используют такие гиганты как Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Apple и Twitter.

Установка Apache Cassandra кластера в Unix/Linux

Данная СУБД, дает возможность создавать линейную масштабируемость ( если объём данных растет). Для хранения данных,  Cassandra юзает ColumnFamily. Данная можель отличается от memcachedb (которые хранят данные только в связке ключ/значение). Cassandra относится к категории хранилищ, повышенно устойчивых к сбоям: помещённые в БД данные автоматически реплицируются на несколько узлов распредёленной сети или даже равномерно распределяются в нескольких дата-центрах. Когда выходит нода из строя, ее функционал подхватывают другие. Добавление новых узлов в кластер и обновление версии Cassandra производится на лету, без дополнительного ручного вмешательства и переконфигурации других узлов. Для упрощения взаимодействия с БД поддерживается язык формирования структурированных запросов CQL (Cassandra Query Language).

Недавно, я описывал простую установку Apache Cassandra в Unix/Linux (для одной ноды):

Установка Apache Cassandra в Unix/Linux

Пришло время описать установку для нескольких нод с Apache Cassandra, которые представляют собой кластер.

Настройка Apache Cassandra кластера в Unix/Linux

Имеется следующие данные о серверах:

  • 192.168.13.163 — Apache_Cassandra_01 (centos 6)
  • 192.168.13.145 — Apache_Cassandra_02 (kali linux 2)
  • 192.168.13.147 — Apache_Cassandra_03 (Debian 8)

Далее редактируем конфиги на каждой их нод.

-===НОДА_1===-

Редактируем конфиги на нодах будущего кластера на 192.168.13.163:

# vim /etc/cassandra/conf/cassandra.yaml

В данном конфиги нужно изменить (прописать) следующее:

  • cluster_name — Имя кластера
    cluster_name: 'cassandra_cluster'
  • seeds — Прописываем адреса нод кластера
    seeds: "192.168.13.163, 192.168.13.145, 192.168.13.147"
  • listen_address — адрес самой ноды
    listen_address: 192.168.13.163
  • rpc_address — адрес самой ноды
    rpc_address: 192.168.13.163

Выполняем настройку следующего файла:

# vim /etc/cassandra/conf/cassandra-topology.properties

И прописываем в него:

# Cassandra Node IP=Data Center:Rack
192.168.13.163=dc1:rac1
192.168.13.145=dc1:rac1
192.168.13.147=dc1:rac1


# default for unknown nodes
default=DC1:r1

И переходим к другим нодам.

-===НОДА_2===-

Редактируем конфиги на нодах будущего кластера на 192.168.13.145:

# vim /etc/cassandra/cassandra.yaml

В данном конфиги нужно изменить (прописать) следующее:

  • cluster_name — Имя кластера
    cluster_name: 'cassandra_cluster'
  • seeds — Прописываем адреса нод кластера
    seeds: "192.168.13.163, 192.168.13.145, 192.168.13.147"
  • listen_address — адрес самой ноды
    listen_address: 192.168.13.145
  • rpc_address — адрес самой ноды
    rpc_address: 192.168.13.145

Выполняем настройку следующего файла:

# vim /etc/cassandra/cassandra-topology.properties

И прописываем в него:

# Cassandra Node IP=Data Center:Rack
192.168.13.163=dc1:rac1
192.168.13.145=dc1:rac1
192.168.13.147=dc1:rac1


# default for unknown nodes
default=DC1:r1

И переходим к другим нодам.

-===НОДА_3===-

Редактируем конфиги на нодах будущего кластера на 192.168.13.147:

# vim /etc/cassandra/cassandra.yaml

В данном конфиги нужно изменить (прописать) следующее:

  • cluster_name — Имя кластера
    cluster_name: 'cassandra_cluster'
  • seeds — Прописываем адреса нод кластера
    seeds: "192.168.13.163, 192.168.13.145, 192.168.13.147"
  • listen_address — адрес самой ноды
    listen_address: 192.168.13.147
  • rpc_address — адрес самой ноды
    rpc_address: 192.168.13.147

Выполняем настройку следующего файла:

# vim /etc/cassandra/cassandra-topology.properties

И прописываем в него:

# Cassandra Node IP=Data Center:Rack
192.168.13.163=dc1:rac1
192.168.13.145=dc1:rac1
192.168.13.147=dc1:rac1


# default for unknown nodes
default=DC1:r1

И переходим к другим нодам если они имеются.

Тестирование Cassandra кластера

Все ноды настроены и объединены в кластер и для запуска, можно использовать следующий вариант:

$ cassandra

Данное действие необходимо выполнить на всех узлах кластера!

Чтобы проверить статус созданного кластера, есть команда, которую стоит запустить:

$ nodetool status

Получил ошибку:

nodetool: Failed to connect to '127.0.0.1:7199' - ConnectException: 'Connection refused (Connection refused)'.

Исправлением служит следующие действия…. Находим файл cassandra-env.sh и нужно его отредактировать:

# vim /etc/cassandra/conf/cassandra-env.sh

PS: можно заюзать locate для поиска этого файла — Установка locate и updatedb в Unix/Linux

Находим в нем:

# JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<public name>"

И приводим к виду ( пример):

JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=192.168.13.163"

И так на каждой из нод.

На одной из нод, получил еще ошибку:

ERROR 13:20:47 Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: Cannot change the number of tokens from 256 to 255
	at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:896) ~[apache-cassandra-2.2.8.jar:2.2.8]
	at org.apache.cassandra.service.StorageService.initServer(StorageService.java:647) ~[apache-cassandra-2.2.8.jar:2.2.8]
	at org.apache.cassandra.service.StorageService.initServer(StorageService.java:518) ~[apache-cassandra-2.2.8.jar:2.2.8]
	at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:310) [apache-cassandra-2.2.8.jar:2.2.8]
	at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:532) [apache-cassandra-2.2.8.jar:2.2.8]
	at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:641) [apache-cassandra-2.2.8.jar:2.2.8]
WARN  13:20:47 No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown

Решение:

# nodetool flush

Потом:

# service cassandra stop

И:

# rm -rf /var/lib/cassandra/data/system/*

Запускаем кассандру и выполняем сново проверку:

$ nodetool status

Получаем:

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens       Owns (effective)  Host ID                               Rack
UN  192.168.13.145  128.89 KB  256          62.4%             1a360230-95c7-44ec-a61f-f314e374da6e  rack1
UN  192.168.13.163  89.97 KB   256          67.4%             e92cc1f5-69e2-4fe0-bf4b-28c1bf5b0131  rack1
UN  192.168.13.147  147.77 KB  256          70.2%             27f5040b-072f-4ec7-bb7c-62021a454e39  rack1

Крутотенюшки, все завелось и работает.

PS: Нужно отключить или настроить SELinux:

Как отключить SELinux на CentOS

И, если используется IPtables, то настроить его:

$ iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 7199 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 9160 -j ACCEPT

Основы работы с cqlsh и языком CQL

Выполняем подключение на одну из нод:

$ cqlsh 192.168.13.145

Начнем с того, что создадим ДБ, но правильней всего — стоит называть —  keyspace:

cqlsh> create keyspace example with replication ={'class':'SimpleStrategy','replication_factor':2};
cqlsh> use example;

Данными действиями, я создал кейспейс с названием example. И сейчас, создаем некоторую структуру таблиц:

cqlsh:example> create table my_table ( id int primary key, description text );

Заполняем данными для тестов:

cqlsh:example> insert into my_table (id, description) values (1,'Item 1');
cqlsh:example> insert into my_table (id, description) values (2,'Item 2');
cqlsh:example> insert into my_table (id, description) values (3,'Item 3');

Создали, а теперь проверим что получилось:

cqlsh:example> select * from my_table;

id | description
-----+-------------
1 | Item 1
2 | Item 2
3 | Item 3

(3 rows)

В кассандре нельзя выбрать строку по описанию ( как в мускуле):

cqlsh:example> select id from my_table where description = 'Item 1';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes
on the restricted columns support the provided operators: "

Строим вторичный индекс:

cqlsh:example> create index on my_table (description);

Вот теперь можно:

cqlsh:example> select id from my_table where description = 'Item 1';

id
-----
1

(1 rows)

Можно вкл\выкл трассировку запросов:

cqlsh:example> tracing on;
Now Tracing is enabled

cqlsh:example> tracing off;
Disabled Tracing.

Чтобы получить инфу о вашем кейспейсе или таблице, используйте:

cqlsh:example> desc table my_table;

... skiped ...

cqlsh:example> desc keyspace example;

... skiped ...

Чтобы удалить строку, используем:

cqlsh:example> delete from my_table where id = 1;

Чтобы удалить таблицу, используем:

cqlsh:example> drop table my_table;

Чтобы удалить кейспейс, используем:

cqlsh:example> drop keyspace example;

Для выхода, используем:

cqlsh:example> exit

Или:

cqlsh:example> quit

Вот и все, статья «Установка Apache Cassandra кластера в Unix/Linux» завершена.

One thought on “Установка Apache Cassandra кластера в Unix/Linux

  1. Спасибо! Как всегда, нюансы помогают устранить проблемы. У меня все полетело))

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.