Изменение алгоритма UUID в CouchDB

#algorithm #couchdb #uuid

#алгоритм #couchdb #uuid

Вопрос:

Этот вопрос ссылается на couchdb версии 1.5.0

Для целей моей среды я хочу иметь возможность эффективно упорядочивать документы в базе данных для последующего извлечения на основе какого-либо временного индекса. Я прочитал в Интернете, что в couchdb существует четыре алгоритма для создания uuid.

Документация, в которой показаны алгоритмы, которые можно использовать при генерации uuid, приведена здесь: http://couchdb.readthedocs.org/en/latest/config/misc.html#uuids-configuration

Я подозреваю, что настройка алгоритма uuid по умолчанию является «последовательной», при выдаче a http://couchdb:5984/_uuids?count=50 и я вижу, что для большой части из них (если не для всех) первые 26 цифр идентичны, а последние 6 уникальны.

Я попытался изменить алгоритм на один из параметров utc (будет работать либо «utc_random», либо «utc_id»), где первые 16 бит — это время в микросекундах от эпохи Unix в шестнадцатеричном формате.

Метод, который я использовал для изменения алгоритма UUID, заключался в том, чтобы перейти в local.ini файл и добавить следующую строфу (ранее ее там не было):

[uuids]
algorithm = utc_random

Затем я перезапускаю службу couchdb

service couchdb restart

Когда я снова запрашиваю пакет UUID, я все равно получаю то, что кажется результатом, указывающим на то, что генерируемые uuid все еще находятся в последовательном алгоритме. (когда я запрашиваю 50 uuid во второй раз после этого, замечается «последовательное» поведение алгоритма)

Я делаю что-то не так? Любая помощь, которая может быть предложена, будет с благодарностью принята!

Обновить

Попробовав команду curl, предложенную Акшатом Дживаном Шармой, я вернулся к файлам конфигурации и нашел default.ini файл. Это файл, в котором, по-видимому, задан параметр uuids, и я заменил «последовательный» на «utc_random», перезапустил службу couchdb, и все работает, как ожидалось. Чтобы найти файлы конфигурации для couchdb, я использовал простую командную строку couchdb -c Еще раз спасибо за вашу помощь, вы, ребята, потрясающие!

Комментарии:

1. Можете ли вы проверить, действительно ли couchdb принимает изменения, внесенные в конфигурационный файл? попробовать curl http://localhost:5984/_config/uuids ?

2. Спасибо, Акшат! По-видимому, я поместил конфигурацию не в тот файл, это мне действительно помогло.

Ответ №1:

Есть несколько вещей, которые вы можете проверить.

  1. Вы добавили еще один файл конфигурации? Вы можете связать конфигурационные файлы в couchdb, и если вы это сделаете, будут использоваться только изменения из последнего файла в цепочке.

  2. Выполните вызов http://localhost:5984/_config/uuids , чтобы получить информацию об алгоритме uuid, который используется couchdb. Вы должны получить результат, подобный

{"algorithm":"utc_random","max_count":"1000"}

и вы можете проверить, принял ли couchdb вашу конфигурацию или нет.

Также вы можете изменять файлы конфигурации через rest api. Это поможет в отладке, поскольку вам не нужно снова перезапускать couchdb. Преимущество этого метода заключается в том, что будет изменен только соответствующий файл конфигурации.

вот как вы можете это сделать

curl -X PUT http://localhost:5984/_config/uuids/algorithm -d '"utc_random"'

Имейте в виду, однако, если у вас есть опечатка в параметре, который вы хотите изменить, например ramdom , вместо random (я на самом деле набрал это!), couch db выдаст исключение во время выполнения, и вам придется прибегнуть к ручному изменению файлов конфигурации.

Комментарии:

1. Еще раз спасибо, Акшат, это в конечном итоге помогло мне решить мою проблему, хотя в итоге я сделал это вручную в файлах конфигурации.

Ответ №2:

В качестве несколько иного подхода к вашей проблеме вы можете установить свой собственный _id в каждом документе перед их написанием. Я бы предложил такой подход, а не доверять алгоритму автоматической генерации CouchDB, чтобы получить правильный порядок.

Например, вы могли бы использовать генератор UUID в вашей клиентской системе и добавить свой индекс к сгенерированному UUID. В python я бы использовал библиотеку UUID. Вы должны быть в состоянии найти генератор UUID практически для каждого языка, который я думаю.

_id будет выглядеть как < Значение индекса> _ < UUID >

Пока это новый документ, вы можете выбрать любое значение _id, которое хотите.

Я часто использовал детерминированные идентификаторы документов для документов, которые также могут быть связаны. Представьте, что у меня может быть документ «Клиент» с некоторой информацией о клиенте, и я также храню документ «История клиентов» с историей транзакций этого клиента. Я мог бы предоставить моему клиенту документ в форме

Customer_14567ad352f-351979ffe12 а затем сделайте его документ истории

Customer_14567ad352f-351979ffe12_History

Другой подход, поскольку вы сказали: «Я хочу иметь возможность эффективно упорядочивать документы в базе данных для последующего извлечения на основе какого-то временного индекса»

Именно для этого используются представления. Таким образом, вы могли бы написать представление для организации документов по индексу времени, который вы хотите. Наиболее простым из возможных способов сделать это было бы:

 function(doc)
{
    emit( doc.TimeIndex, null );
}
  

Комментарии:

1. Спасибо за ваш ответ, но я действительно не хочу этого делать. Это также невозможно для моей текущей среды. Я хочу, чтобы couchdb работал!

2. конечно, это справедливо. Добавлен еще один ответ, который может быть проблемой?

3. Спасибо за другой ответ, я ценю ваш вклад и буду использовать его в ближайшее время. Вопрос, ваш другой ответ… можете ли вы использовать это для работы с несколькими базами данных couchdb одновременно или только с одной?

4. Ну, вы можете поместить одно и то же представление в каждую базу данных, в которой вы хотели бы его использовать. Представления на самом деле просто хранятся как особый тип документа в базе данных, который сообщает БД о создании представления. Представления — это то, что вы используете для организации и индексации данных в БД различными интересными способами. Они очень удобны и лежат в основе разработки данных CouchDB. Вы должны прочитать о них wiki.apache.org/couchdb/Introduction_to_CouchDB_views