Установка 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» завершена.
Спасибо! Как всегда, нюансы помогают устранить проблемы. У меня все полетело))