Удалённая таблица в Manticore Search представлена префиксом agent в определении распределённой таблицы. Распределённая таблица может включать сочетание локальных и удалённых таблиц. Если локальные таблицы не указаны, распределённая таблица будет полностью удалённой и будет выступать только как прокси. Например, у вас может быть экземпляр Manticore, который слушает несколько портов и обслуживает разные протоколы, а затем перенаправляет запросы на серверы backend, которые принимают соединения только через внутренний бинарный протокол Manticore, используя постоянные соединения для уменьшения накладных расходов при установлении соединений.
Хотя распределённая таблица, состоящая только из удалённых, сама не содержит локальных таблиц, она всё равно потребляет ресурсы машины, поскольку должна выполнять окончательные вычисления, такие как слияние результатов и вычисление итоговых агрегированных значений.
agent = address1 [ | address2 [...] ][:table-list]
agent = address1[:table-list [ | address2[:table-list [...] ] ] ]
Директива agent объявляет удаленные агенты, которые опрашиваются каждый раз при поиске по охватывающей распределенной таблице. Эти агенты, по сути, являются указателями на сетевые таблицы. Указанное значение включает адрес и также может включать несколько альтернатив (зеркала агента) либо только для адреса, либо для адреса и списка таблиц. См. Зеркалирование для синтаксиса зеркал и Балансировка нагрузки для информации о том, как выбираются зеркальные агенты.
Спецификация адреса должна быть одной из следующих:
address = hostname[:port] # eg. server2:9312
address = /absolute/unix/socket/path # eg. /var/run/manticore2.sock
hostname — это имя удаленного хоста, port — номер удаленного TCP-порта, table-list — это список имен таблиц, разделенных запятыми, а квадратные скобки [] обозначают необязательную часть. Для TCP-соединений этот порт является портом удаленного агента/API (обычно 9312), а не портом MySQL (9306).
Если имя таблицы опущено, предполагается, что это та же таблица, где определена эта строка. Другими словами, при определении агентов для распределённой таблицы 'mycoolindex' можно просто указать адрес, и будет предполагаться, что запрос идёт к таблице mycoolindex на конечных точках агента.
Если номер порта опущен, считается, что он равен 9312. Если он задан, но недопустим (например, 70000), агент будет пропущен.
Вы можете направлять каждого агента к одной или нескольким удалённым таблицам, расположенным на одном или нескольких сетевых серверах без ограничений. Это позволяет несколько различных режимов использования:
- Шардинг по нескольким серверам агентов и создание произвольной топологии кластера
- Шардирование по нескольким серверам-агентам с зеркалированием для обеспечения высокой доступности и балансировки нагрузки (см. Зеркалирование и Балансировка нагрузки)
- Шардинг внутри localhost для использования нескольких ядер (хотя проще использовать несколько локальных таблиц)
Чтобы избежать путаницы:
- Одна запись
agent='host1|host2:table'означает один удаленный шард с зеркальными бэкендами. - Несколько записей
agent='...'означают несколько удаленных шардов.
Все агенты опрашиваются параллельно. Список индексов передаётся удалённому агенту без изменений. Точный способ поиска по этому списку в агенте (последовательно или параллельно) зависит только от конфигурации агента (см. настройку threads). Мастер не управляет этим удалённо.
Важно отметить, что опция LIMIT игнорируется в запросах к агентам. Это связано с тем, что каждый агент может содержать разные таблицы, и ответственность за применение ограничения к итоговому набору результатов лежит на клиенте. Поэтому запрос к физической таблице отличается от запроса к распределённой таблице, если смотреть в логах запросов. Запрос не может быть простой копией исходного запроса, так как это приведёт к некорректным результатам.
Например, если клиент делает запрос SELECT ... LIMIT 10, 10, а существует два агента, при этом второй агент содержит только 10 документов, трансляция исходного запроса LIMIT 10, 10 приведёт к тому, что от второго агента будут получены 0 документов. Однако запрос LIMIT 10,10 должен вернуть документы с 10 по 20 из итогового набора. Чтобы решить эту проблему, запрос отправляют агентам с более широким ограничением, например, используя значение max_matches по умолчанию 1000.
Например, если есть распределённая таблица dist, которая ссылается на удалённую таблицу user, запрос клиента SELECT * FROM dist LIMIT 10,10 будет преобразован в запрос SELECT * FROM user LIMIT 0,1000 и отправлен удалённой таблице user. После получения результата распределённая таблица применит LIMIT 10,10 и вернёт запрашиваемые 10 документов.
SELECT * FROM dist LIMIT 10,10;
запрос будет преобразован в:
SELECT * FROM user LIMIT 0,1000
Кроме того, значение может содержать опции для каждого отдельного агента, такие как:
- ha_strategy -
random,roundrobin,nodeads,noerrors(переопределяет глобальную настройкуha_strategyдля конкретного агента; см. также Зеркалирование) conn-pconn, persistent (эквивалентно установкеagent_persistentна уровне таблицы)blackhole0,1(идентично настройке agent_blackhole для агента)retry_countцелочисленное значение (соответствует agent_retry_count, но заданное значение не умножается на число зеркал)
agent = address1:table-list[[ha_strategy=value, conn=value, blackhole=value]]
Пример:
# config on box1
# sharding a table over 3 servers
agent = box2:9312:shard1
agent = box3:9312:shard2
# config on box2
# sharding a table over 3 servers
agent = box1:9312:shard2
agent = box3:9312:shard3
# config on box3
# sharding a table over 3 servers
agent = box1:9312:shard1
agent = box2:9312:shard3
# per agent options
agent = box1:9312:shard1[ha_strategy=nodeads]
agent = box2:9312:shard2[conn=pconn]
agent = box2:9312:shard2[conn=pconn,ha_strategy=nodeads]
agent = test:9312:any[blackhole=1]
agent = test:9312|box2:9312|box3:9312:any2[retry_count=2]
agent = test:9312|box2:9312:any2[retry_count=2,conn=pconn,ha_strategy=noerrors]
Удаленные таблицы могут быть определены либо в конфигурационном файле, либо с помощью SQL на распределенной таблице.
- Config
- SQL
table products_dist {
type = distributed
agent = 127.0.0.1:9312|127.0.0.1:9313:products
}CREATE TABLE products_dist type='distributed'
agent='127.0.0.1:9312:products|127.0.0.1:9313:products';Предположим, что удаленные таблицы уже существуют, например:
- SQL
CREATE TABLE products_dist type='distributed'
agent='127.0.0.1:9312:products|127.0.0.1:9313:products'
ha_strategy='roundrobin'
agent_connect_timeout='200ms'
agent_query_timeout='500ms'
mirror_retry_count='2';Используйте распределенную таблицу на мастере точно так же, как любую другую таблицу, а затем проверьте, как она была сохранена.
- SQL
SELECT id, title, node FROM products_dist;
SHOW CREATE TABLE products_dist;+------+------------+-------+
| id | title | node |
+------+------------+-------+
| 1 | same title | node1 |
+------+------------+-------+
+---------------+----------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+----------------------------------------------------------------------------------+
| products_dist | CREATE TABLE products_dist type='distributed' agent='127.0.0.1:9312:products|... |
+---------------+----------------------------------------------------------------------------------+Для оптимальной производительности рекомендуется помещать удалённые таблицы, расположенные на одном сервере, в одну запись. Например, вместо:
agent = remote:9312:idx1
agent = remote:9312:idx2
следует предпочесть:
agent = remote:9312:idx1,idx2
- Config
agent_persistent = remotebox:9312:index2Опция agent_persistent позволяет устанавливать постоянное соединение с агентом, то есть соединение не закрывается после выполнения запроса. Синтаксис этой директивы такой же, как у директивы agent. Однако вместо открытия нового соединения с агентом для каждого запроса и последующего его закрытия мастер будет поддерживать открытое соединение и повторно использовать его для последующих запросов. Максимальное количество постоянных соединений на хост агента задаётся опцией persistent_connections_limit в секции searchd.
Важно отметить, что значение persistent_connections_limit должно быть больше 0 для использования постоянных соединений с агентом. Если оно не определено, по умолчанию равно 0, и директива agent_persistent будет работать так же, как agent.
Использование постоянных соединений мастер-агент снижает нагрузку на TCP-порты и экономит время на установку соединений, делая процесс более эффективным.
Директива agent_blackhole позволяет перенаправлять запросы удаленным агентам без ожидания или обработки их ответов. Это полезно для отладки или тестирования рабочих кластеров, так как вы можете настроить отдельный экземпляр для отладки/тестирования и перенаправлять ему запросы с рабочего мастера (агрегатора), не мешая рабочему процессу. Master searchd попытается подключиться к агенту-черной дыре и отправить запросы как обычно, но не будет ждать или обрабатывать никакие ответы, а все сетевые ошибки на агентах-черных дырах будут игнорироваться. Формат значения идентичен формату обычной директивы agent.
- Config
agent_blackhole = testbox:9312:testindex1,testindex2Опции, связанные с удаленными агентами, поддерживаются не во всех областях видимости одновременно. На этой странице основное внимание уделяется семантике удаленных таблиц и отдельных агентов. Для поведения, специфичного для зеркал, см. Зеркалирование и Балансировка нагрузки. Для полного поведения на уровне демона используйте связанные справочные страницы в Настройках Searchd.
| Опция | Для всего экземпляра | На таблицу | На запрос | На агента | Полные детали |
|---|---|---|---|---|---|
ha_strategy |
да | да | нет | да | Балансировка нагрузки, Удаленные таблицы: agent |
agent_connect_timeout |
да | да | нет | нет | Searchd: agent_connect_timeout |
agent_query_timeout |
да | да | да | нет | Searchd: agent_query_timeout |
agent_retry_count / mirror_retry_count / retry_count |
да (agent_retry_count) |
да (agent_retry_count или mirror_retry_count) |
да (OPTION retry_count=...) |
да (agent=...[retry_count=...]) |
Searchd: agent_retry_count, Удаленные таблицы: mirror_retry_count, Удаленные таблицы: agent |
agent_retry_delay |
да | нет | да | нет | Searchd: agent_retry_delay |
per-agent conn |
нет | нет | нет | да | Удаленные таблицы: agent |
per-agent blackhole |
нет | нет | нет | да | Удаленные таблицы: agent_blackhole |
agent_connect_timeout определяет, сколько времени Manticore ждет установления соединения с удаленным агентом. Поддерживается как глобальная настройка по умолчанию для экземпляра и для каждой распределенной таблицы. Полные детали на уровне демона находятся в Searchd: agent_connect_timeout.
- Config
- SQL
agent_connect_timeout = 300msCREATE TABLE products_dist type='distributed'
agent='127.0.0.1:9312:products|127.0.0.1:9313:products'
agent_connect_timeout='300ms';agent_query_timeout определяет, сколько времени Manticore ждет, пока подключенный удаленный агент завершит выполнение запроса. Поддерживается как глобальная настройка по умолчанию для экземпляра, для каждой распределенной таблицы и для каждого запроса как OPTION agent_query_timeout=.... Полные детали на уровне демона находятся в Searchd: agent_query_timeout.
Если достигается agent_query_timeout, запрос не повторяется автоматически; вместо этого выводится предупреждение. Поведение также зависит от reset_network_timeout_on_packet.
- Config
- SQL
agent_query_timeout = 10000 # our query can be long, allow up to 10 secSELECT * FROM products_dist OPTION agent_query_timeout=750;agent_retry_count определяет, сколько раз Manticore попытается подключиться к удаленным агентам и выполнить запросы в распределенной таблице, прежде чем сообщить о фатальной ошибке запроса. Имя параметра зависит от области применения: используйте
agent_retry_countкак настройку уровня экземпляра,agent_retry_countили его псевдонимmirror_retry_countдля распределенной таблицы,OPTION retry_count=...для каждого запроса,- и
[retry_count=...]внутри отдельного объявленияagent=....
Полные детали на уровне демона приведены в разделе Searchd: agent_retry_count.
Если вы используете зеркала агентов, сервер выбирает другое зеркало перед каждой попыткой подключения в соответствии с ha_strategy, а agent_retry_count суммируется по всем зеркалам.
mirror_retry_count служит той же цели, что и agent_retry_count, но только как настройка распределенной таблицы. Если указаны оба значения, приоритет имеет mirror_retry_count.
- Config
- SQL
table products_dist {
type = distributed
agent = 127.0.0.1:9312|127.0.0.1:9313:products[retry_count=2]
}SELECT * FROM products_dist OPTION retry_count=1;agent_retry_delay определяет задержку между повторными попытками. Он поддерживается как глобальная настройка экземпляра по умолчанию и как OPTION retry_delay=... для каждого запроса, но не для распределенной таблицы. Полные детали на уровне демона приведены в разделе Searchd: agent_retry_delay.
Эта опция актуальна только тогда, когда повторные попытки включены через agent_retry_count или OPTION retry_count=....
- Config
- SQL
agent_retry_delay = 500msSELECT * FROM products_dist OPTION retry_count=2, retry_delay=300;Опция client_timeout устанавливает максимальное время ожидания между запросами при использовании постоянных соединений. Это глобальная настройка searchd уровня экземпляра, а не настройка отдельной таблицы. Значение выражается в секундах или с временным суффиксом. Значение по умолчанию составляет 5 минут. Полные детали на уровне демона приведены в разделе Searchd: client_timeout.
- Config
client_timeout = 1hОпция hostname_lookup определяет стратегию обновления имён хостов. По умолчанию IP-адреса host-имён агентов кешируются при запуске сервера, чтобы избежать чрезмерного обращения к DNS. Однако в некоторых случаях IP может динамически меняться (например, облачный хостинг), и может быть необходимо не кешировать IP. Установка этой опции в request отключает кеширование и выполняет запросы к DNS при каждом запросе. IP-адреса также можно обновлять вручную с помощью команды FLUSH HOSTNAMES.
Опция listen_tfo позволяет использовать флаг TCP_FASTOPEN для всех слушателей. По умолчанию она управляется системой, но может быть явно отключена, установив значение '0'.
Для получения дополнительной информации о расширении TCP Fast Open, пожалуйста, обратитесь к Wikipedia. Кратко, оно позволяет исключить один круг обмена TCP при установлении соединения.
На практике использование TFO может оптимизировать сетевую эффективность клиент-агента, аналогично использованию agent_persistent, но без удержания активных соединений и без ограничений на максимальное количество соединений.
Большинство современных операционных систем поддерживают TFO. Linux (как одна из самых прогрессивных) поддерживает его с 2011 года, начиная с ядра 3.7 (для серверной стороны). Windows поддерживает его с некоторых сборок Windows 10. Другие системы, такие как FreeBSD и MacOS, также участвуют.
Для систем Linux сервер проверяет переменную /proc/sys/net/ipv4/tcp_fastopen и действует соответственно. Бит 0 управляет клиентской стороной, а бит 1 управляет слушателями. По умолчанию система имеет этот параметр, установленный в 1, то есть клиенты включены, а слушатели отключены.
persistent_connections_limit = 29 # assume that each host of agents has max_connections = 30 (or 29).
Опция persistent_connections_limit определяет максимальное количество одновременных постоянных соединений с удалёнными постоянными агентами. Это настройка на уровне экземпляра и должна быть определена в секции конфигурации searchd. Каждый раз при установлении соединения с агентом, определённым в agent_persistent, происходит попытка повторно использовать существующее соединение (если оно есть) или создать новое и сохранить его для будущего использования. Однако в некоторых случаях может потребоваться ограничить количество постоянных соединений. Эта директива задаёт лимит и влияет на количество соединений с каждым хостом агента для всех распределённых таблиц.
Рекомендуется установить это значение равным или меньшим, чем опция max_connections в конфигурации агента.
Особый случай распределённой таблицы — одна локальная и несколько удалённых, которая используется исключительно для создания распределённых сниппетов, когда сниппеты берутся из файлов. В этом случае локальная таблица может выступать в роли "шаблонной" таблицы, обеспечивая настройки для токенизации при построении сниппетов.
snippets_file_prefix = /mnt/common/server1/
Опция snippets_file_prefix — это необязательный префикс, который можно добавить к именам локальных файлов при генерации сниппетов. Значение по умолчанию — текущая рабочая папка.
Чтобы узнать больше о создании распределённых сниппетов, смотрите CALL SNIPPETS.
Вы можете создать распределённую таблицу из нескольких перколяционных таблиц. Синтаксис построения такого типа таблиц такой же, как и для других распределённых таблиц, и может включать несколько local таблиц, а также agents.
Для DPQ операции перечисления сохранённых запросов и поиска по ним (с использованием CALL PQ) прозрачны и работают так, как если бы все таблицы были одной локальной таблицей. Однако операции манипуляции данными, такие как insert, replace, truncate, отсутствуют.
Если в список агентов включить не перколяционную таблицу, поведение будет неопределённым. Если неправильный агент имеет ту же схему, что и внешняя схема PQ таблицы (id, query, tags, filters), это не вызовет ошибку при перечислении сохранённых правил PQ и может засорить список фактических правил PQ, хранящихся в PQ таблицах, собственными не-PQ строками. В результате будьте осторожны и понимаете путаницу, которую это может вызвать. Вызов CALL PQ к такому неправильному агенту вызовет ошибку.
Для получения дополнительной информации о выполнении запросов к распределённой перколяционной таблице смотрите выполнение запросов к распределённой перколяционной таблице.
ПРИМЕЧАНИЕ: Автошардирование требует Manticore Buddy. Если автошардирование не работает, убедитесь, что Buddy установлен и запущен.
Manticore позволяет создавать шардированные таблицы — особый тип таблиц (type='shard'), который прозрачно распределяет чтение и запись между несколькими физическими шардами. Эта возможность особенно полезна при масштабировании данных. Можно создавать как локальные шардированные таблицы на одном сервере, так и реплицированные шардированные таблицы в многонодовом репликационном кластере, чтобы оптимизировать распределение данных.
Шардированные таблицы дают несколько ключевых преимуществ для высокопроизводительных приложений:
- Они обеспечивают более высокую производительность записи, потому что данные пишутся сразу в несколько шардов параллельно, а системные ресурсы используются эффективнее. Такая параллельная запись дает более высокую скорость индексации по сравнению с одной большой таблицей.
- Шардированные таблицы поддерживают репликацию из коробки, повышая доступность системы. Вам не нужно настраивать репликацию вручную. Просто задайте коэффициент репликации при создании шардированной таблицы, и система сама все сделает. Такая встроенная репликация обеспечивает непрерывный доступ к данным даже при отказе части узлов.
shards='N'— число физических шардов, которые нужно создать. Обязательный параметр. Должно быть положительным целым числом, максимум 3000.rf='M'— коэффициент репликации: число копий, которое хранится для каждого шарда. Обязательный параметр. На одном узле он должен быть1; в репликационном кластере — от 1 до числа узлов в кластере.timeout='S'— сколько времени в секундах ждать подготовки шардов при создании. По умолчанию30. Увеличьте значение, если создаете много шардов на большом числе узлов.
Значения нужно указывать в кавычках (shards='10', а не shards=10). Имена параметров не чувствительны к регистру.
Чтобы создать локальную шардированную таблицу, создайте таблицу как обычно и добавьте shards='N' и rf='1'. shards — это число физических шардов, которые будут созданы за таблицей. rf — коэффициент репликации. На одном сервере он должен быть 1.
Вот пример, который создает таблицу с 10 шардами и автоматически распределяет данные между ними:
CREATE TABLE local_sharded shards='10' rf='1'
После этого запроса вы получаете одну шардированную таблицу, у которой все шарды уже настроены. Физические шарды находятся в базе system и скрыты из SHOW TABLES; вы работаете с шардированной таблицей по ее публичному имени, а система автоматически направляет операции к нужным шардам.
Чтобы защититься от отказов сервера, настройте репликационный кластер на тех узлах, которые должны участвовать. Далее в этой документации мы будем считать, что созданный вами кластер называется c. Добавьте все нужные узлы, следуя инструкциям по репликации, а затем создайте таблицу с нужным коэффициентом репликации.
Например, допустим, у вас есть 3-узловой репликационный кластер и вы хотите таблицу, разбитую на 10 шардов, с одной копией каждого шарда на каждом узле. При участии трех узлов нужно задать rf='3':
CREATE TABLE c:cluster_sharded shards='10' rf='3'
После этого можно работать с таблицей по ее обычному имени на любом узле кластера — для INSERT, SELECT, UPDATE и DELETE не нужен префикс кластера. Префикс кластера (c:) используется только для DDL, например CREATE TABLE и DROP TABLE.
Стандартное время ожидания завершения всех процессов подготовки шардов при создании — 30 секунд. Иногда при создании большого числа шардов в репликационном кластере с несколькими узлами это занимает чуть больше времени из-за сетевой задержки. При необходимости это время можно увеличить с помощью параметра timeout:
CREATE TABLE c:cluster_sharded shards='10' rf='3' timeout='60'
Если время ожидания будет превышено, создание таблицы завершится с ошибкой, и вам придется повторить попытку с большим значением timeout.
Чтобы удалить шардированную таблицу, используйте стандартную команду DROP TABLE. В кластерной среде указывайте имя кластера в имени таблицы, чтобы точно обратиться к нужной таблице. Поддерживается IF EXISTS.
Чтобы удалить локальную шардированную таблицу:
DROP TABLE local_sharded
DROP TABLE IF EXISTS local_sharded
Чтобы удалить реплицированную шардированную таблицу:
DROP TABLE c:cluster_sharded
DROP TABLE IF EXISTS c:cluster_sharded
DESC <table> возвращает пользовательскую схему полей шардированной таблицы (те столбцы, которые вы объявили).
SHOW CREATE TABLE <table> возвращает пользовательское определение с shards='N' rf='M' — внутренняя топология type='shard' (клаузулы local=/agent= для каждого шарда и репликационный кластер с md5-именем) намеренно скрыта. Чтобы посмотреть раскрытую внутреннюю топологию для диагностики, используйте SHOW CREATE TABLE <table> OPTION force=1.
Для проверки состояния подсистемы шардирования предусмотрены две дополнительные команды:
-
SHOW SHARDING STATUS [[<cluster>:]<table>]— показывает размещение и состояние каждого шарда. Без аргументов выводит все шардированные таблицы; с именем таблицы (при желании с префиксом кластера) фильтрует вывод только по ней. Возвращаемые столбцы:table,shard,node,status(active/inactive),cluster,replication_cluster,rfиrf_status(ok/degraded/broken).SHOW SHARDING STATUS SHOW SHARDING STATUS cluster_sharded SHOW SHARDING STATUS c:cluster_sharded -
SHOW SHARDING MASTER— показывает, на каком узле сейчас запущен процесс sharding master, и находится ли он в состоянииactiveилиinactive.SHOW SHARDING MASTER
При работе с шардированными таблицами учитывайте следующие ограничения:
-
Локальные и кластерные шардированные таблицы не могут сосуществовать на одних и тех же узлах: На наборе узлов, входящих в кластер репликации, нельзя смешивать:
- Локальные шардированные таблицы (созданные без префикса кластера:
create table s ... shards='N' rf='1') - Кластерные шардированные таблицы (созданные с префиксом кластера:
create table c:r ... shards='N' rf='M')
Пример: рассмотрим кластер из 2 узлов, где:
- Таблица
sбыла создана независимо на каждом узле как локальная шардированная таблица - Таблица
rреплицируется на оба узла через кластер
В этой конфигурации попытка создать кластерную шардированную таблицу (
create table c:r ... shards='N' rf='2') на тех же узлах завершится ошибкой. - Локальные шардированные таблицы (созданные без префикса кластера:
-
Согласованность имени кластера:
- Подсистема шардирования при первом использовании привязывается к одному имени кластера; все кластерные шардированные таблицы на этих узлах должны использовать это же имя кластера.
- После выбора имени кластера оно применяется ко всем последующим созданиям кластерных шардированных таблиц.
Пример: если первую кластерную шардированную таблицу вы создаете так:
create table c:users ... shards='N' rf='M'Все последующие кластерные шардированные таблицы должны использовать кластер
c:create table c:orders ... shards='N' rf='M' -- works create table d:items ... shards='N' rf='M' -- fails -
Изменение таблиц не поддерживается:
- После создания шардированной таблицы ее структуру нельзя изменить с помощью
ALTER TABLE. - Чтобы изменить схему, нужно:
- Создать новую шардированную таблицу с нужной структурой
- Скопировать данные в новую таблицу
- Удалить старую таблицу
- После создания шардированной таблицы ее структуру нельзя изменить с помощью
-
Ограничение на число шардов:
- Не более 3,000 шардов на одну шардированную таблицу.
- Это ограничение действует независимо от конфигурации кластера и размера таблицы.
- Планируйте стратегию шардирования с учетом этого лимита.
-
rfиshardsдолжны быть целыми числами в кавычках:- Оба параметра требуют заключенного в кавычки числового значения (
shards='10',rf='2'); значения без кавычек, нечисловые, пустые или дробные значения отклоняются. - На автономном (не кластерном) сервере
rfдолжен быть равен'1'. - В кластере репликации
rfдолжен быть от1до числа узлов в кластере.
- Оба параметра требуют заключенного в кавычки числового значения (
Manticore Search имеет одноуровневую иерархию для таблиц.
В отличие от других СУБД, в Manticore нет концепции группировки таблиц в базы данных. Однако для совместимости с диалектами SQL, Manticore принимает операторы SHOW DATABASES для совместимости с диалектом SQL, но оператор не возвращает никаких результатов.
Общий синтаксис:
SHOW TABLES [ LIKE pattern ]
Оператор SHOW TABLES выводит список всех активных в данный момент таблиц вместе с их типами. Существующие типы таблиц: local, distributed, rt, percolate и template.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
SHOW TABLES;POST /sql?mode=raw -d "SHOW TABLES"$client->nodes()->table();utilsApi.sql('SHOW TABLES')await utilsApi.sql('SHOW TABLES')res = await utilsApi.sql('SHOW TABLES');utilsApi.sql("SHOW TABLES", true)utilsApi.Sql("SHOW TABLES", true)utils_api.sql("SHOW TABLES", Some(true)).await+----------+-------------+
| Таблица | Тип |
+----------+-------------+
| dist | distributed |
| plain | local |
| pq | percolate |
| rt | rt |
| template | template |
+----------+-------------+
5 rows in set (0.00 sec)[
{
"columns": [
{
"Table": {
"type": "string"
}
},
{
"Type": {
"type": "string"
}
}
],
"data": [
{
"Table": "dist",
"Type": "distributed"
},
{
"Table": "plain",
"Type": "local"
},
{
"Table": "pq",
"Type": "percolate"
},{
"Table": "rt",
"Type": "rt"
},{
"Table": "template",
"Type": "template"
}
],
"total": 5,
"error": "",
"warning": ""
}
]Array
(
[dist1] => distributed
[rt] => rt
[products] => rt
){u'columns': [{u'Table': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'dist1', u'Type': u'distributed'},
{u'Index': u'rt', u'Type': u'rt'},
{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'dist1', u'Type': u'distributed'},
{u'Index': u'rt', u'Type': u'rt'},
{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{"columns":[{"Index":{"type":"string"}},{"Type":{"type":"string"}}],"data":[{"Index":"products","Type":"rt"}],"total":0,"error":"","warning":""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error=, warning=}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}Поддерживается необязательное предложение LIKE для фильтрации таблиц по имени.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
SHOW TABLES LIKE 'pro%';POST /sql?mode=raw -d "SHOW TABLES LIKE 'pro%';"$client->nodes()->table(['body'=>['pattern'=>'pro%']]);utilsApi.sql('SHOW TABLES LIKE \'pro%\'');await utilsApi.sql('SHOW TABLES LIKE \'pro%\'');utilsApi.sql('SHOW TABLES LIKE \'pro%\'')utilsApi.sql("SHOW TABLES LIKE 'pro%'", true)utilsApi.Sql("SHOW TABLES LIKE 'pro%'", true)utils_api.sql("SHOW TABLES LIKE 'pro%'", Some(true)).await+----------+-------------+
| Index | Type |
+----------+-------------+
| products | distributed |
+----------+-------------+
1 row in set (0.00 sec)[
{
"columns": [
{
"Table": {
"type": "string"
}
},
{
"Type": {
"type": "string"
}
}
],
"data": [
{
"Table": "products",
"Type": "distributed"
}
],
"total": 1,
"error": "",
"warning": ""
}
]Array
(
[products] => distributed
){u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{"columns":[{"Index":{"type":"string"}},{"Type":{"type":"string"}}],"data":[{"Index":"products","Type":"rt"}],"total":0,"error":"","warning":""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error=, warning=}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{DESC | DESCRIBE} table_name [ LIKE pattern ]
Оператор DESCRIBE выводит столбцы таблицы и их связанные типы. Столбцы включают ID документа, полнотекстовые поля и атрибуты. Порядок соответствует тому, в котором поля и атрибуты ожидаются операторами INSERT и REPLACE. Типы столбцов включают field, integer, timestamp, ordinal, bool, float, bigint, uuid, string и mva. Столбец ID по умолчанию имеет тип bigint, а для таблицы реального времени, объявленной с id uuid, используется uuid. Пример:
mysql> DESC rt;
+---------+---------+
| Field | Type |
+---------+---------+
| id | bigint |
| title | field |
| content | field |
| gid | integer |
+---------+---------+
4 rows in set (0.00 sec)
Поддерживается необязательное предложение LIKE. Подробности о его синтаксисе см. в разделе SHOW META.
Вы также можете просмотреть схему таблицы, выполнив запрос select * from <table_name>.@table. Преимущество этого метода в том, что вы можете использовать предложение WHERE для фильтрации:
- SQL
- JSON
select * from tbl.@table where type='text';POST /sql?mode=raw -d "select * from tbl.@table where type='text';"+------+-------+------+----------------+
| id | field | type | properties |
+------+-------+------+----------------+
| 2 | title | text | indexed stored |
+------+-------+------+----------------+
1 row in set (0.00 sec)[{
"columns":[{"id":{"type":"long long"}},{"field":{"type":"string"}},{"type":{"type":"string"}},{"properties":{"type":"string"}}],
"data":[
{"id":2,"field":"title","type":"text","properties":"indexed stored"}
],
"total":1,
"error":"",
"warning":""
}]Вы также можете выполнять множество других действий с <your_table_name>.@table, рассматривая его как обычную таблицу Manticore со столбцами, состоящими из целочисленных и строковых атрибутов.
- SQL
select field from tbl.@table;
select field, properties from tbl.@table where type in ('text', 'uint');
select * from tbl.@table where properties any ('stored');SHOW CREATE TABLE table_name [ OPTION output_words = 'list' | 'file' ]
Выводит оператор CREATE TABLE, использованный для создания указанной таблицы.
Если таблица была создана с помощью SQL-ярлыка profile=..., SHOW CREATE TABLE выводит развернутые настройки вместо самого имени профиля.
Опция output_words позволяет управлять отображением настроек внешних файлов (таких как stopwords, exceptions, wordforms, hitless_words):
'list'(по умолчанию): Отображает содержимое файлов в виде встроенных списков с использованием опций*_list(например,stopwords_list='word1; word2').'file': Отображает пути к файлам с использованием исходных опций (например,stopwords='/path/to/file').
- SQL
- JSON
SHOW CREATE TABLE tbl\GPOST /sql?mode=raw -d "SHOW CREATE TABLE tbl" Table: tbl
Create Table: CREATE TABLE tbl (
f text indexed stored
) charset_table='non_cont,cont' morphology='icu_chinese'
1 row in set (0.00 sec)[{
"columns":[{"Table":{"type":"string"}},{"Create Table":{"type":"string"}}],
"data":[
{"Table":"tbl","Create Table":"CREATE TABLE tbl (\nf text)"}
],
"total":1,
"error":"",
"warning":""
}]Если вы используете оператор DESC для перколяционной таблицы, он отобразит внешнюю схему таблицы, которая является схемой хранимых запросов. Эта схема статична и одинакова для всех локальных перколяционных таблиц:
mysql> DESC pq;
+---------+--------+
| Field | Type |
+---------+--------+
| id | bigint |
| query | string |
| tags | string |
| filters | string |
+---------+--------+
4 rows in set (0.00 sec)
Если вы хотите просмотреть ожидаемую схему документа, используйте следующую команду:
DESC <pq table name> table:
mysql> DESC pq TABLE;
+-------+--------+
| Field | Type |
+-------+--------+
| id | bigint |
| title | text |
| gid | uint |
+-------+--------+
3 rows in set (0.00 sec)
Также поддерживается desc pq table like ..., и он работает следующим образом:
mysql> desc pq table like '%title%';
+-------+------+----------------+
| Field | Type | Properties |
+-------+------+----------------+
| title | text | indexed stored |
+-------+------+----------------+
1 row in set (0.00 sec)