Контекстное и текущее состояние
Мы переносим наш кластер из Cassandra в полный кластер ElasticSearch. Мы индексируем документы в среднем ~ 250-300 док в секунду. В ElasticSearch 1.2.0 он представляет ~ 8Go в день.
{
"generic":
{
"id": "twi471943355505459200",
"type": "twitter",
"title": "RT @YukBerhijabb: The Life is Choice - https://m.facebook.com/story.php?story_fbid=637864496306297&id=100002482564531&refid=17",
"content": "RT @YukBerhijabb: The Life is Choice - https://m.facebook.com/story.php?story_fbid=637864496306297&id=100002482564531&refid=17",
"source": "<a href=\"https://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>",
"geo": null,
"link": "http://twitter.com/rosi_sifah/status/471943355505459200",
"lang": "en",
"created_at": 1401355038000,
"author": {
"username": "rosi_sifah",
"name": "Rosifah",
"id": 537798506,
"avatar": "http://pbs.twimg.com/profile_images/458917673456238592/Im22zoIV_normal.jpeg",
"link": "http://twitter.com/rosi_sifah"
}
},
"twitter": {
// a tweet JSON
}
}
Наши пользователи сохраняют запросы в нашей базе данных SQL, и когда они запрашивают свою панель мониторинга, мы хотели бы запросить наш ES-кластер с их запросом (извлеченным из базы данных) и сделать некоторую агрегацию поверх него, используя новая структура агрегации ES.
Каждая панель мониторинга отображается с явным, выбранным пользователем диапазоном дат, поэтому мы всегда используем
"range": {
"generic.created_at": {
"from": 1401000000000,
"to": 1401029019706
}
}
вместе с запросом ES.
Мы указали _routing следующим образом:
"_routing":{
"required":true,
"path":"generic.id"
},
и _id:
"_id": {
"index": "not_analyzed",
"store": "false",
"path": "generic.id"
}
В течение примерно 5 дней мы хранили 67 миллионов документов (около 40Go) внутри одного индекса. Мы узнали о хорошей практике разделения индекса на день. Итак, теперь наши индексы разделены днем ([имя-индекс] - [ГГГГ-ММ-ДД]).
В настоящее время каждый индекс имеет 5 осколков и 1 реплику, у нас есть кластер, состоящий из 3 машин с 8 ядрами, 16 ГБ оперативной памяти и 8-дюймовым жестким диском. Мы планируем использовать другую машину в качестве шлюза (8 ядер, 16Go RAM, 1To HDD).
Мы установили конфигурацию ES по умолчанию, кроме конфигурации кластера.
Вопросы
- Для каждого документа, который мы хотим индексировать, мы говорим явно, какой индекс использовать. В настоящее время мы используем дату дня. Должна ли мы использовать дату документ, чтобы предотвратить горячую точку? Потому что в настоящее время означает, что документы из разных дней (указанные в их created_at) может жить в том же индексе текущего дня.
- Достаточно ли 5 осколков (или слишком много) для 21 600 000 документов днем?
- Если мы хотим, чтобы все наши агрегированные запросы обрабатывались менее чем за 1 секунду, сколько реплик мы должны настроить?
- Должны ли мы изменить нашу маршрутизацию? Поскольку мы не знаем заранее, какие документы будут обработаны до агрегации для каждого запроса, который мы делаем в кластере (поскольку запрос определяется пользователем)
- Какое аппаратное обеспечение (сколько машин, какая конфигурация) мы должны помещать внутри этого кластера для поддержки 6 месяцев документов?
[Обновление]
Вот пример запросов:
Облако слов
GET idx-2014-05-01/stream/_search?search_type=count
{
"query":{
"bool": {
"must": [{
"query_string" : {
"query" : "(generic.lang:fr OR generic.lang:en) AND (generic.content:javascript)"
}},{
"range": {
"generic.created_at": {
"from": 1401000000000,
"to": 1401029019706
}
}}
]
}
},
"aggs":{
"words":{
"terms":{
"field": "generic.content",
"size": 40
}
}
}
}
Гистограмма
GET idx-2014-05-01/stream/_search?search_type=count
{
"query":{
"bool": {
"must": [{
"query_string" : {
"query" : "generic.content:apple"
}},{
"range": {
"generic.created_at": {
"from": 1401000000000,
"to": 1401029019706
}
}}
]
}
},
"aggs":{
"volume":{
"date_histogram":{
"field": "generic.created_at",
"interval":"minute"
}
}
}
}
Должен использоваться язык
GET idx-2014-05-01/stream/_search?search_type=count
{
"query":{
"bool": {
"must": [{
"query_string" : {
"query" : "(generic.lang:fr OR generic.lang:en) AND (generic.content:javascript)"
}},{
"range": {
"generic.created_at": {
"from": 1401000000000,
"to": 1401029019706
}
}}
]
}
},
"aggs":{
"top_source":{
"terms":{
"field": "generic.lang"
}
}
}
}