Есть ли способ удалить набор из пространства имен (Aerospike) из AQL или CLI???
Мой набор также содержит Ldts.
Пожалуйста, предложите мне способ удалить весь набор из LDT
Есть ли способ удалить набор из пространства имен (Aerospike) из AQL или CLI???
Мой набор также содержит Ldts.
Пожалуйста, предложите мне способ удалить весь набор из LDT
Вы можете удалить набор, используя
asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"
Эта ссылка объясняет больше о том, как набор удаляется
http://www.aerospike.com/docs/operations/manage/sets/#deleting-a-set-in-a-namespace
Существует новый и лучший способ сделать это в версии Aerospike Server 3.12.0, выпущенной в марте 2017 года:
asinfo -v "truncate:namespace=namespace_name;set=set_name"
Эта предыдущая команда устарела и работает только до версии Aerospike 3.12.1, выпущенной в апреле 2017 года:
asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"
Новая команда лучше по нескольким параметрам:
Я использовал его в таких условиях (во время миграции, пока данные записывались, на 1 узле) и он работал очень быстро. Набор из 30 миллионов записей был уменьшен до 1000 записей примерно за 6 секунд. (Эти 1000 записей предположительно были записаны за эти 6 секунд)
Подробности здесь
Начиная с версии Aerospike 3.12, выпущенной в марте 2017 года, в базе данных теперь поддерживается функция удаления всех данных в наборе или пространстве имен.
См. следующую документацию: http://www.aerospike.com/docs/reference/info#truncate
Которая предоставляет команду командной строки, которая выглядит так: asinfo truncate:namespace=;set=;lut=
Его также можно урезать из клиентских API, вот документация по java: http://www.aerospike.com/apidocs/java/com/aerospike/client/AerospikeClient.html и прокрутите вниз до метода "truncate".
Обратите внимание, что эта функция может дополнительно указывать время. Это позволяет вам удалять записи, а затем начинать вставлять новые записи. Поскольку используются временные метки, убедитесь, что часы вашего сервера правильно синхронизированы.
Вы также можете удалить набор с помощью Java-клиента следующим образом:
(1) Используйте клиентский метод «выполнить», который применяет UDF ко всем запрошенным строкам.
AerospikeClient.execute(WritePolicy policy, Statement statement, String packageName, String functionName, Value... functionArgs) throws AerospikeException
(2) Определите оператор, чтобы включить все строки данного набора:
Statement statement = new Statement();
statement.setNamespace("my_namespace");
statement.setSetName("my_set");
(3) Укажите UDF, который удаляет данную запись:
function delete_rec(rec)
aerospike:remove(rec)
end
(4) Вызовите метод:
ExecuteTask task = AerospikeClient.execute(null, statement, "myUdf", "delete_rec")
task.waitTillComplete(timeout);
Это производительно? Неясно, но я предполагаю, что asinfo
лучше. Но очень удобно для тестирования/отладки/настройки.
Вы не можете удалить набор, но вы можете удалить все записи, которые существуют в наборе, отсканировав все записи и удалив их одну за другой. Пример кода C#, который сделает свое дело:
AerospikeClient.ScanAll(null, AerospikeNameSpace, category, DeleteAllRecordsCallBack);
Здесь DeleteAllRecordsCallBack
— это функция обратного вызова, в которой вы можете удалять записи одну за другой. Эта функция обратного вызова вызывается для всех записей.
private void DeleteAllRecordsCallBack(Key key, Record record)
{
AerospikeClient.Delete(null, key);
}
Использование AQL:
TRUNCATE namespace_name.set_name
https://www.aerospike.com/docs/tools/aql/aql-help.html
Позаботьтесь о том, чтобы вам нужно было перезапустить свои узлы (один за другим, чтобы избежать простоев), потому что вместо этого вы не получите оставшееся место в корзинах.
Я имею в виду, что максимальное количество бинов в Aerospike составляет 32 767. Если вы просто несколько раз удаляете и воссоздаете свой набор, если он создает, например, 10000 бинов каждый раз, вы не сможете создать более 2767 бинов в четвертый раз, потому что счетчик бинов хранится в оперативной памяти.
Если вы перезапустите свой кластер, он будет освобожден.
Вы не можете динамически удалить набор из пространства имен, например "удалить таблицу" в RDMS.
Следующая команда, использующая asinfo, только лениво удаляет данные внутри набора:
asinfo -v "set-config:context=namespace;id=namespace_name;set=set_name;set-delete=true;"
Об этом есть сообщение на сайте обсуждения aerospike, и я не увидеть прогресс по этой проблеме еще.
По нашему производственному опыту специальная утилита удаления Java работает достаточно хорошо даже без недавно введенного устойчивое удаление. Собираешь из исходников, ставишь где-то рядом с кластером и запускаешь так:
java -jar delete-set-1.0.0-jar-with-dependencies.jar -h <aerospike_host> -p 3000 -s <set_to_delete> -n <namespace_name>
В нашей производственной среде холодные перезагрузки происходят довольно редко, в основном при сбое aerospike. И поток данных довольно высок, поэтому дефрагментация начинается раньше, и у нас даже нет проблемы с записью зомби.
Кстати, asinfo
способ, упомянутый ранее, у нас не сработал. Записи пролежали там пару дней, поэтому воспользовались утилитой delete-set
, которая сработала сразу.