¸üÐÂʱ¼ä:2017Äê12ÔÂ18ÈÕ16ʱ32·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
Ò»¡¢ ELK¹¤×÷Õ»¼ò½é
1. ¼ò½é
ELK Stack ÊÇ Elasticsearch¡¢Logstash¡¢Kibana Èý¸ö¿ªÔ´Èí¼þµÄ×éºÏ¡£ÔÚʵʱÊý¾Ý¼ìË÷ºÍ·ÖÎö³¡ºÏ£¬ÈýÕßͨ³£ÊÇÅäºÏ¹²Ó㬶øÇÒÓÖ¶¼ÏȺó¹éÓÚ Elastic.co ¹«Ë¾ÃûÏ£¬¹ÊÓд˼ò³Æ¡£
ELK Stack ÔÚ×î½üÁ½ÄêѸËÙáÈÆð£¬³ÉΪ»úÆ÷Êý¾Ý·ÖÎö£¬»òÕß˵ʵʱÈÕÖ¾´¦ÀíÁìÓò£¬¿ªÔ´½çµÄµÚһѡÔñ¡£ºÍ´«Í³µÄÈÕÖ¾´¦Àí·½°¸Ïà±È£¬ELK Stack ¾ßÓÐÈçϼ¸¸öÓŵ㣺
´¦Àí·½Ê½Áé»î¡£Elasticsearch ÊÇʵʱȫÎÄË÷Òý£¬²»ÐèÒªÏñ storm ÄÇÑùÔ¤Ïȱà³Ì²ÅÄÜʹÓÃ;
ÅäÖüòÒ×ÉÏÊÖ¡£Elasticsearch È«²¿²ÉÓà JSON ½Ó¿Ú£¬Logstash ÊÇ Ruby DSL Éè¼Æ£¬¶¼ÊÇĿǰҵ½ç×îͨÓõÄÅäÖÃÓï·¨Éè¼Æ;
¼ìË÷ÐÔÄܸßЧ¡£ËäȻÿ´Î²éѯ¶¼ÊÇʵʱ¼ÆË㣬µ«ÊÇÓÅÐãµÄÉè¼ÆºÍʵÏÖ»ù±¾¿ÉÒԴﵽȫÌìÊý¾Ý²éѯµÄÃë¼¶ÏìÓ¦;
¼¯ÈºÏßÐÔÀ©Õ¹¡£²»¹ÜÊÇ Elasticsearch ¼¯Èº»¹ÊÇ Logstash ¼¯Èº¶¼ÊÇ¿ÉÒÔÏßÐÔÀ©Õ¹µÄ;
ǰ¶Ë²Ù×÷ìÅÀö¡£Kibana ½çÃæÉÏ£¬Ö»ÐèÒªµã»÷Êó±ê£¬¾Í¿ÉÒÔÍê³ÉËÑË÷¡¢¾ÛºÏ¹¦ÄÜ£¬Éú³ÉìÅÀöµÄÒDZí°å¡£
µ±È»£¬ELK Stack Ò²²¢²»ÊÇʵʱÊý¾Ý·ÖÎö½çµÄÁ鵤ÃîÒ©¡£ÔÚ²»Ç¡µ±µÄ³¡¾°£¬·´¶ø»áʱ¶¹¦°ë¡£ÎÒ×Ô 2014 Äê³õ¿ª QQ Ⱥ½»Á÷ ELK Stack£¬·¢ÏÖÍøÓÑÃÇ¶Ô ELK Stack µÄÔÀí¸ÅÄ³£ÓÐÎó½âÎóÓÃ;¶ÔʵÏÖµÄЧ¹û£¬ÓÖ¶àÓв»ÄÜÀí½â»òÕß¹ý¶àÆÚÍû¶øÊ§ÍûÖ®´¦¡£¸üÁîÎÒ¾ªÆæµÄÊÇ£¬ÍøÓÑÃǹ㷺·Ö²¼ÔÚ´«Í³ÆóÒµºÍ»¥ÁªÍø¹«Ë¾¡¢¿ª·¢ºÍÔËάÁìÓò¡¢Linux ºÍ Windows ƽ̨£¬´ó¼Ò¶Ô·Çר¾«ÁìÓòµÄ֪ʶ£¬Ò»°ã¶¼È±·¦Á˽⣬ÕâÒ²³ÉΪʹÓà ELK Stack ʱµÄÒ»¸öÕϰ¡£
¶þ¡¢ LogstashÊý¾Ý²É¼¯¹¤¾ß°²×°ºÍʹÓÃ
1. ¹Ù·½ÍøÕ¾
https://www.elastic.co/products/logstash#
2. ¼ò½é
LogstashÊÇÒ»¿îÇáÁ¿¼¶µÄÈÕÖ¾ËѼ¯´¦Àí¿ò¼Ü£¬¿ÉÒÔ·½±ãµÄ°Ñ·ÖÉ¢µÄ¡¢¶àÑù»¯µÄÈÕÖ¾ËѼ¯ÆðÀ´£¬²¢½øÐÐ×Ô¶¨ÒåµÄ´¦Àí£¬È»ºó´«Êäµ½Ö¸¶¨µÄλÖ㬱ÈÈçij¸ö·þÎñÆ÷»òÕßÎļþ¡£
3. °²×°
ÏÂÔØºóÖ±½Ó½âѹ£¬¾Í¿ÉÒÔÁË¡£
4. hellowordʹÓÃ
ͨ¹ýÃüÁîÐУ¬½øÈëµ½logstash/binĿ¼£¬Ö´ÐÐÏÂÃæµÄÃüÁ
logstash -e ""
¿ÉÒÔ¿´µ½ÌáʾÏÂÃæÐÅÏ¢(Õâ¸öÃüÁîÉÔºó½éÉÜ)£¬ÊäÈëhello world!

¿ÉÒÔ¿´µ½logstashβÎÒÃÇ×Ô¶¯Ìí¼ÓÁ˼¸¸ö×ֶΣ¬Ê±¼ä´Á@timestamp£¬°æ±¾@version£¬ÊäÈëµÄÀàÐÍtype£¬ÒÔ¼°Ö÷»úÃûhost¡£
4.1. ¼òµ¥µÄ¹¤×÷ÔÀí
LogstashʹÓùܵÀ·½Ê½½øÐÐÈÕÖ¾µÄËѼ¯´¦ÀíºÍÊä³ö¡£ÓеãÀàËÆ*NIXϵͳµÄ¹ÜµÀÃüÁî xxx | ccc | ddd£¬xxxÖ´ÐÐÍêÁË»áÖ´ÐÐccc£¬È»ºóÖ´ÐÐddd¡£
ÔÚlogstashÖУ¬°üÀ¨ÁËÈý¸ö½×¶Î:
ÊäÈëinput --> ´¦Àífilter(²»ÊDZØÐëµÄ) --> Êä³öoutput

ÿ¸ö½×¶Î¶¼ÓɺܶàµÄ²å¼þÅäºÏ¹¤×÷£¬±ÈÈçfile¡¢elasticsearch¡¢redisµÈµÈ¡£
ÿ¸ö½×¶ÎÒ²¿ÉÒÔÖ¸¶¨¶àÖÖ·½Ê½£¬±ÈÈçÊä³ö¼È¿ÉÒÔÊä³öµ½elasticsearchÖУ¬Ò²¿ÉÒÔÖ¸¶¨µ½stdoutÔÚ¿ØÖÆÌ¨´òÓ¡¡£
ÓÉÓÚÕâÖÖ²å¼þʽµÄ×éÖ¯·½Ê½£¬Ê¹µÃlogstash±äµÃÒ×ÓÚÀ©Õ¹ºÍ¶¨ÖÆ¡£
4.2. ÃüÁîÐÐÖг£ÓõÄÃüÁî
-f£ºÍ¨¹ýÕâ¸öÃüÁî¿ÉÒÔÖ¸¶¨LogstashµÄÅäÖÃÎļþ£¬¸ù¾ÝÅäÖÃÎļþÅäÖÃlogstash

-e£ººóÃæ¸ú×Å×Ö·û´®£¬¸Ã×Ö·û´®¿ÉÒÔ±»µ±×ölogstashµÄÅäÖÃ(Èç¹ûÊÇ“” ÔòĬÈÏʹÓÃstdin×÷ΪÊäÈ룬stdout×÷ΪÊä³ö)

-l£ºÈÕÖ¾Êä³öµÄµØÖ·(ĬÈϾÍÊÇstdoutÖ±½ÓÔÚ¿ØÖÆÌ¨ÖÐÊä³ö)
-t£º²âÊÔÅäÖÃÎļþÊÇ·ñÕýÈ·£¬È»ºóÍ˳ö¡£

4.3. ÅäÖÃÎļþ˵Ã÷
Ç°Ãæ½éÉܹýlogstash»ù±¾ÉÏÓÉÈý²¿·Ö×é³É£¬input¡¢outputÒÔ¼°Óû§ÐèÒª²ÅÌí¼ÓµÄfilter£¬Òò´Ë±ê×¼µÄÅäÖÃÎļþ¸ñʽÈçÏ£º
input {...}
filter {...}
output {...}

ÔÚÿ¸ö²¿·ÖÖУ¬Ò²¿ÉÒÔÖ¸¶¨¶à¸ö·ÃÎÊ·½Ê½£¬ÀýÈçÎÒÏëÒªÖ¸¶¨Á½¸öÈÕÖ¾À´Ô´Îļþ£¬Ôò¿ÉÒÔÕâÑùд£º
input {
file { path =>"/var/log/messages" type =>"syslog"}
file { path =>"/var/log/apache/access.log" type =>"apache"}
}
ÀàËÆµÄ£¬Èç¹ûÔÚfilterÖÐÌí¼ÓÁ˶àÖÖ´¦Àí¹æÔò£¬Ôò°´ÕÕËüµÄ˳ÐòÒ»Ò»´¦Àí£¬µ«ÊÇÓÐһЩ²å¼þ²¢²»ÊÇḬ̈߳²È«µÄ¡£
±ÈÈçÔÚfilterÖÐÖ¸¶¨ÁËÁ½¸öÒ»ÑùµÄµÄ²å¼þ£¬ÕâÁ½¸öÈÎÎñ²¢²»Äܱ£Ö¤×¼È·µÄ°´Ë³ÐòÖ´ÐУ¬Òò´Ë¹Ù·½Ò²ÍƼö±ÜÃâÔÚfilterÖÐÖØ¸´Ê¹Óòå¼þ¡£
˵ÍêÕâЩ£¬¼òµ¥µÄ´´½¨Ò»¸öÅäÖÃÎļþµÄСÀý×Ó¿´¿´£º
input {
file {
#Ö¸¶¨¼àÌýµÄÎļþ·¾¶£¬×¢Òâ±ØÐëÊǾø¶Ô·¾¶
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/test.log"
start_position => beginning
}
}
filter {
}
output {
stdout {}
}
ÈÕÖ¾´óÖÂÈçÏ£º×¢Òâ×îºóÓÐÒ»¸ö¿ÕÐС£
1 hello,this is first line in test.log!
2 hello,my name is xingoo!
3 goodbye.this is last line in test.log!
4
Ö´ÐÐÃüÁîµÃµ½ÈçÏÂÐÅÏ¢£º

5. ×î³£ÓõÄinput²å¼þ——file¡£
Õâ¸ö²å¼þ¿ÉÒÔ´ÓÖ¸¶¨µÄĿ¼»òÕßÎļþ¶ÁÈ¡ÄÚÈÝ£¬ÊäÈëµ½¹ÜµÀ´¦Àí£¬Ò²ËãÊÇlogstashµÄºËÐIJå¼þÁË£¬´ó¶àÊýµÄʹÓó¡¾°¶¼»áÓõ½Õâ¸ö²å¼þ£¬Òò´ËÕâÀïÏêϸ½²Êöϸ÷¸ö²ÎÊýµÄº¬ÒåÓëʹÓá£
5.1. ×îС»¯µÄÅäÖÃÎļþ
ÔÚLogstashÖпÉÒÔÔÚ input{} ÀïÃæÌí¼ÓfileÅäÖã¬Ä¬ÈϵÄ×îС»¯ÅäÖÃÈçÏ£º
input {
file {
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
}
}
filter {
}
output {
stdout {}
}
µ±È»Ò²¿ÉÒÔ¼àÌý¶à¸öÄ¿±êÎļþ£º
input {
file {
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
}
}
filter {
}
output {
stdout {}
}
5.2. ÆäËûµÄÅäÖÃ
ÁíÍ⣬´¦ÀípathÕâ¸ö±ØÐëµÄÏîÍ⣬file»¹ÌṩÁ˺ܶàÆäËûµÄÊôÐÔ£º
input {
file {
#¼àÌýÎļþµÄ·¾¶
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#Åųý²»Ïë¼àÌýµÄÎļþ
exclude => "1.log"
#Ìí¼Ó×Ô¶¨ÒåµÄ×Ö¶Î
add_field => {"test"=>"test"}
#Ôö¼Ó±êÇ©
tags => "tag1"
#ÉèÖÃÐÂʼþµÄ±êÖ¾
delimiter => "\n"
#ÉèÖö೤ʱ¼äɨÃèĿ¼£¬·¢ÏÖÐÂÎļþ
discover_interval => 15
#ÉèÖö೤ʱ¼ä¼ì²âÎļþÊÇ·ñÐÞ¸Ä
stat_interval => 1
#¼àÌýÎļþµÄÆðʼλÖã¬Ä¬ÈÏÊÇend
start_position => beginning
#¼àÌýÎļþ¶ÁÈ¡ÐÅÏ¢¼Ç¼µÄλÖÃ
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#ÉèÖö೤ʱ¼ä»áдÈë¶ÁÈ¡µÄλÖÃÐÅÏ¢
sincedb_write_interval => 15
}
}
filter {
}
output {
stdout {}
}
ÆäÖÐÖµµÃ×¢ÒâµÄÊÇ£º
1 path
ÊDZØÐëµÄÑ¡Ïÿһ¸öfileÅäÖ㬶¼ÖÁÉÙÓÐÒ»¸öpath
2 exclude
ÊDz»Ïë¼àÌýµÄÎļþ£¬logstash»á×Ô¶¯ºöÂÔ¸ÃÎļþµÄ¼àÌý¡£ÅäÖõĹæÔòÓëpathÀàËÆ£¬Ö§³Ö×Ö·û´®»òÕßÊý×飬µ«ÊÇÒªÇó±ØÐëÊǾø¶Ô·¾¶¡£
3 start_position
ÊǼàÌýµÄλÖã¬Ä¬ÈÏÊÇend£¬¼´Ò»¸öÎļþÈç¹ûûÓмǼËüµÄ¶ÁÈ¡ÐÅÏ¢£¬Ôò´ÓÎļþµÄĩβ¿ªÊ¼¶ÁÈ¡£¬Ò²¾ÍÊÇ˵£¬½ö½ö¶ÁÈ¡ÐÂÌí¼ÓµÄÄÚÈÝ¡£¶ÔÓÚһЩ¸üеÄÈÕÖ¾ÀàÐ͵ļàÌý£¬Í¨³£Ö±½ÓʹÓÃend¾Í¿ÉÒÔÁË;Ïà·´£¬beginning¾Í»á´ÓÒ»¸öÎļþµÄÍ·¿ªÊ¼¶ÁÈ¡¡£µ«ÊÇÈç¹û¼Ç¼¹ýÎļþµÄ¶ÁÈ¡ÐÅÏ¢£¬Õâ¸öÅäÖÃÒ²¾Íʧȥ×÷ÓÃÁË¡£
4 sincedb_path
Õâ¸öÑ¡ÏîÅäÖÃÁËĬÈϵĶÁÈ¡ÎļþÐÅÏ¢¼Ç¼ÔÚÄĸöÎļþÖУ¬Ä¬ÈÏÊǰ´ÕÕÎļþµÄinodeµÈÐÅÏ¢×Ô¶¯Éú³É¡£ÆäÖмǼÁËinode¡¢Ö÷É豸ºÅ¡¢´ÎÉ豸ºÅÒÔ¼°¶ÁÈ¡µÄλÖá£Òò´Ë£¬Èç¹ûÒ»¸öÎļþ½ö½öÊÇÖØÃüÃû£¬ÄÇôËüµÄinodeÒÔ¼°ÆäËûÐÅÏ¢¾Í²»»á¸Ä±ä£¬Òò´ËÒ²²»»áÖØÐ¶ÁÈ¡ÎļþµÄÈκÎÐÅÏ¢¡£ÀàËÆµÄ£¬Èç¹û¸´ÖÆÁËÒ»¸öÎļþ£¬¾ÍÏ൱ÓÚ´´½¨ÁËÒ»¸öеÄinode£¬Èç¹û¼àÌýµÄÊÇÒ»¸öĿ¼£¬¾Í»á¶ÁÈ¡¸ÃÎļþµÄËùÓÐÐÅÏ¢¡£
5 ÆäËûµÄ¹ØÓÚɨÃèºÍ¼ì²âµÄʱ¼ä£¬°´ÕÕĬÈϵÄÀ´¾ÍºÃÁË£¬Èç¹ûƵ·±´´½¨ÐµÄÎļþ£¬ÏëÒª¿ìËÙ¼àÌý£¬ÄÇô¿ÉÒÔ¿¼ÂÇËõ¶Ì¼ì²âµÄʱ¼ä¡£
6 add_field
¾ÍÊÇÔö¼ÓÒ»¸ö×ֶΣ¬ÀýÈ磺
file {
add_field => {"test"=>"test"}
path => "D:/tools/logstash/path/to/groksample.log"
start_position => beginning
}

6. ¡¡KafkaÓëLogstashµÄÊý¾Ý²É¼¯¶Ô½Ó
»ùÓÚLogstashÅÜͨKafka»¹ÊÇÐèҪעÒâºÜ¶à¶«Î÷£¬×îÖØÒªµÄ¾ÍÊÇÀí½âKafkaµÄÔÀí¡£
6.1. Logstash¹¤×÷ÔÀí
ÓÉÓÚKafka²ÉÓýâñîµÄÉè¼ÆË¼Ï룬²¢·ÇÔʼµÄ·¢²¼¶©ÔÄ£¬Éú²úÕ߸ºÔð²úÉúÏûÏ¢£¬Ö±½ÓÍÆË͸øÏû·ÑÕß¡£¶øÊÇÔÚÖмä¼ÓÈë³Ö¾Ã»¯²ã——broker,Éú²úÕß°ÑÊý¾Ý´æ·ÅÔÚbrokerÖУ¬Ïû·ÑÕß´ÓbrokerÖÐÈ¡Êý¾Ý¡£ÕâÑù¾Í´øÀ´Á˼¸¸öºÃ´¦:
1 Éú²úÕߵĸºÔØÓëÏû·ÑÕߵĸºÔؽâñî
2 Ïû·ÑÕß°´ÕÕ×Ô¼ºµÄÄÜÁ¦fetchÊý¾Ý
3 Ïû·ÑÕß¿ÉÒÔ×Ô¶¨ÒåÏû·ÑµÄÊýÁ¿
ÁíÍ⣬ÓÉÓÚbroker²ÉÓÃÁËÖ÷Ìâtopic-->·ÖÇøµÄ˼Ï룬ʹµÃij¸ö·ÖÇøÄÚ²¿µÄ˳Ðò¿ÉÒÔ±£Ö¤ÓÐÐòÐÔ£¬µ«ÊÇ·ÖÇø¼äµÄÊý¾Ý²»±£Ö¤ÓÐÐòÐÔ¡£ÕâÑù£¬Ïû·ÑÕß¿ÉÒÔÒÔ·ÖÇøÎªµ¥Î»£¬×Ô¶¨Òå¶ÁÈ¡µÄλÖ×—offset¡£
Kafka²ÉÓÃzookeeper×÷Ϊ¹ÜÀí£¬¼Ç¼ÁËproducerµ½brokerµÄÐÅÏ¢£¬ÒÔ¼°consumerÓëbrokerÖÐpartitionµÄ¶ÔÓ¦¹ØÏµ¡£Òò´Ë£¬Éú²úÕß¿ÉÒÔÖ±½Ó°ÑÊý¾Ý´«µÝ¸øbroker£¬brokerͨ¹ýzookeeper½øÐÐleader-->followersµÄÑ¡¾Ù¹ÜÀí;Ïû·ÑÕßͨ¹ýzookeeper±£´æ¶ÁÈ¡µÄλÖÃoffsetÒÔ¼°¶ÁÈ¡µÄtopicµÄpartition·ÖÇøÐÅÏ¢¡£

ÓÉÓÚÉÏÃæµÄ¼Ü¹¹Éè¼Æ£¬Ê¹µÃÉú²úÕßÓëbrokerÏàÁ¬;Ïû·ÑÕßÓëzookeeperÏàÁ¬¡£ÓÐÁËÕâÑùµÄ¶ÔÓ¦¹ØÏµ£¬¾ÍÈÝÒײ¿Êðlogstash-->kafka-->logstashµÄ·½°¸ÁË¡£
½ÓÏÂÀ´£¬°´ÕÕÏÂÃæµÄ²½Öè¾Í¿ÉÒÔʵÏÖlogstashÓëkafkaµÄ¶Ô½ÓÁË¡£

6.2. Æô¶¯kafka
Æô¶¯zookeeper£º
$zookeeper/bin/zkServer.sh start
Æô¶¯kafka£º
$kafka/bin/kafka-server-start.sh $kafka/config/server.properties &
6.3. ´´½¨Ö÷Ìâ
´´½¨Ö÷Ìâ:
$kafka/bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --topic hello --replication-factor 1 --partitions 1
²é¿´Ö÷Ìâ:
$kafka/bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe
6.4. ²âÊÔ»·¾³
Ö´ÐÐÉú²úÕ߽ű¾:
$kafka/bin/kafka-console-producer.sh --broker-list 10.0.67.101:9092 --topic hello
Ö´ÐÐÏû·ÑÕ߽ű¾£¬²é¿´ÊÇ·ñдÈë:
$kafka/bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --from-beginning --topic hello
6.5. ÏòkafkaÖÐÊä³öÊý¾Ý
input{
stdin{}
}
output{
kafka{
topic_id => "hello"
bootstrap_servers => "192.168.0.4:9092,172.16.0.12:9092"
# kafkaµÄµØÖ·
batch_size => 5
codec => plain {
format => "%{message}"
charset => "UTF-8"
}
}
stdout{
codec => rubydebug
}
}
6.6. ´ÓkafkaÖжÁÈ¡Êý¾Ý
logstashÅäÖÃÎļþ:
input{
kafka {
codec => "plain"
group_id => "logstash1"
auto_offset_reset => "smallest"
reset_beginning => true
topic_id => "hello"
zk_connect => "192.168.0.5:2181"
}
}
output{
stdout{
codec => rubydebug
}
}
7. Filter
7.1. ¹ýÂ˲å¼þgrok×é¼þ
#ÈÕÖ¾
55.3.244.1 GET /index.html 15824 0.043
bin/logstash -e '
input { stdin {} }
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output { stdout {codec => rubydebug} }'
7.2. ·Ö¸î²å¼þsplit
filter {
mutate {
split => { "message" => " " }
add_field => {
"event_type" => "%{message[3]}"
"current_map" => "%{message[4]}"
"current_X" => "%{message[5]}"
"current_y" => "%{message[6]}"
"user" => "%{message[7]}"
"item" => "%{message[8]}"
"item_id" => "%{message[9]}"
"current_time" => "%{message[12]}"
}
remove_field => [ "message" ]
}
}
Èý¡¢ ElasticSearchË÷Òý·þÎñ°²×°ºÍʹÓÃ
1. ¼ò½é
ElasticSearchÊÇÒ»¸ö»ùÓÚLuceneµÄËÑË÷·þÎñÆ÷¡£ËüÌṩÁËÒ»¸ö·Ö²¼Ê½¶àÓû§ÄÜÁ¦µÄÈ«ÎÄËÑË÷ÒýÇæ£¬»ùÓÚRESTful web½Ó¿Ú¡£ElasticsearchÊÇÓÃJava¿ª·¢µÄ£¬²¢×÷ΪApacheÐí¿ÉÌõ¿îϵĿª·ÅÔ´Âë·¢²¼£¬Êǵ±Ç°Á÷ÐÐµÄÆóÒµ¼¶ËÑË÷ÒýÇæ¡£Éè¼ÆÓÃÓÚÔÆ¼ÆËãÖУ¬Äܹ»´ïµ½ÊµÊ±ËÑË÷£¬Îȶ¨£¬¿É¿¿£¬¿ìËÙ£¬°²×°Ê¹Ó÷½±ã¡£
ÎÒÃǽ¨Á¢Ò»¸öÍøÕ¾»òÓ¦ÓóÌÐò£¬²¢ÒªÌí¼ÓËÑË÷¹¦ÄÜ£¬ÁîÎÒÃÇÊÜ´ò»÷µÄÊÇ£ºËÑË÷¹¤×÷ÊǺÜÄѵġ£ÎÒÃÇÏ£ÍûÎÒÃǵÄËÑË÷½â¾ö·½°¸Òª¿ì£¬ÎÒÃÇÏ£ÍûÓÐÒ»¸öÁãÅäÖúÍÒ»¸öÍêÈ«Ãâ·ÑµÄËÑË÷ģʽ£¬ÎÒÃÇÏ£ÍûÄܹ»¼òµ¥µØÊ¹ÓÃJSONͨ¹ýHTTPµÄË÷ÒýÊý¾Ý£¬ÎÒÃÇÏ£ÍûÎÒÃǵÄËÑË÷·þÎñÆ÷ʼÖÕ¿ÉÓã¬ÎÒÃÇÏ£ÍûÄܹ»Ò»Ì¨¿ªÊ¼²¢À©Õ¹µ½Êý°Ù£¬ÎÒÃÇҪʵʱËÑË÷£¬ÎÒÃÇÒª¼òµ¥µÄ¶à×â»§£¬ÎÒÃÇÏ£Íû½¨Á¢Ò»¸öÔÆµÄ½â¾ö·½°¸¡£ElasticsearchÖ¼ÔÚ½â¾öËùÓÐÕâЩÎÊÌâºÍ¸ü¶àµÄÎÊÌâ¡£
2. ES¸ÅÄî
cluster
´ú±íÒ»¸ö¼¯Èº£¬¼¯ÈºÖÐÓжà¸ö½Úµã£¬ÆäÖÐÓÐÒ»¸öΪÖ÷½Úµã£¬Õâ¸öÖ÷½ÚµãÊÇ¿ÉÒÔͨ¹ýÑ¡¾Ù²úÉúµÄ£¬Ö÷´Ó½ÚµãÊǶÔÓÚ¼¯ÈºÄÚ²¿À´ËµµÄ¡£esµÄÒ»¸ö¸ÅÄî¾ÍÊÇÈ¥ÖÐÐÄ»¯£¬×ÖÃæÉÏÀí½â¾ÍÊÇÎÞÖÐÐĽڵ㣬ÕâÊǶÔÓÚ¼¯ÈºÍⲿÀ´ËµµÄ£¬ÒòΪ´ÓÍⲿÀ´¿´es¼¯Èº£¬ÔÚÂß¼ÉÏÊǸöÕûÌ壬ÄãÓëÈκÎÒ»¸ö½ÚµãµÄͨÐźÍÓëÕû¸öes¼¯ÈºÍ¨ÐÅÊǵȼ۵ġ£
shards
´ú±íË÷Òý·ÖƬ£¬es¿ÉÒÔ°ÑÒ»¸öÍêÕûµÄË÷Òý·Ö³É¶à¸ö·ÖƬ£¬ÕâÑùµÄºÃ´¦ÊÇ¿ÉÒÔ°ÑÒ»¸ö´óµÄË÷Òý²ð·Ö³É¶à¸ö£¬·Ö²¼µ½²»Í¬µÄ½ÚµãÉÏ¡£¹¹³É·Ö²¼Ê½ËÑË÷¡£·ÖƬµÄÊýÁ¿Ö»ÄÜÔÚË÷Òý´´½¨Ç°Ö¸¶¨£¬²¢ÇÒË÷Òý´´½¨ºó²»Äܸü¸Ä¡£
replicas
´ú±íË÷Òý¸±±¾£¬es¿ÉÒÔÉèÖöà¸öË÷ÒýµÄ¸±±¾£¬¸±±¾µÄ×÷ÓÃÒ»ÊÇÌá¸ßϵͳµÄÈÝ´íÐÔ£¬µ±Ä³¸ö½Úµãij¸ö·ÖƬË𻵻ò¶ªÊ§Ê±¿ÉÒÔ´Ó¸±±¾Öлָ´¡£¶þÊÇÌá¸ßesµÄ²éѯЧÂÊ£¬es»á×Ô¶¯¶ÔËÑË÷ÇëÇó½øÐиºÔؾùºâ¡£
recovery
´ú±íÊý¾Ý»Ö¸´»ò½ÐÊý¾ÝÖØÐ·ֲ¼£¬esÔÚÓнڵã¼ÓÈë»òÍ˳öʱ»á¸ù¾Ý»úÆ÷µÄ¸ºÔضÔË÷Òý·ÖƬ½øÐÐÖØÐ·ÖÅ䣬¹ÒµôµÄ½ÚµãÖØÐÂÆô¶¯Ê±Ò²»á½øÐÐÊý¾Ý»Ö¸´¡£
river
´ú±íesµÄÒ»¸öÊý¾ÝÔ´£¬Ò²ÊÇÆäËü´æ´¢·½Ê½(È磺Êý¾Ý¿â)ͬ²½Êý¾Ýµ½esµÄÒ»¸ö·½·¨¡£ËüÊÇÒÔ²å¼þ·½Ê½´æÔÚµÄÒ»¸öes·þÎñ£¬Í¨¹ý¶ÁÈ¡riverÖеÄÊý¾Ý²¢°ÑËüË÷Òýµ½esÖУ¬¹Ù·½µÄriverÓÐcouchDBµÄ£¬RabbitMQµÄ£¬TwitterµÄ£¬WikipediaµÄ¡£
gateway
´ú±íesË÷Òý¿ìÕյĴ洢·½Ê½£¬esĬÈÏÊÇÏȰÑË÷Òý´æ·Åµ½ÄÚ´æÖУ¬µ±ÄÚ´æÂúÁËʱÔٳ־û¯µ½±¾µØÓ²ÅÌ¡£gateway¶ÔË÷Òý¿ìÕÕ½øÐд洢£¬µ±Õâ¸öes¼¯Èº¹Ø±ÕÔÙÖØÐÂÆô¶¯Ê±¾Í»á´ÓgatewayÖжÁÈ¡Ë÷Òý±¸·ÝÊý¾Ý¡£esÖ§³Ö¶àÖÖÀàÐ͵Ägateway£¬Óб¾µØÎļþϵͳ(ĬÈÏ)£¬·Ö²¼Ê½Îļþϵͳ£¬HadoopµÄHDFSºÍamazonµÄs3ÔÆ´æ´¢·þÎñ¡£
discovery.zen
´ú±íesµÄ×Ô¶¯·¢ÏÖ½Úµã»úÖÆ£¬esÊÇÒ»¸ö»ùÓÚp2pµÄϵͳ£¬ËüÏÈͨ¹ý¹ã²¥Ñ°ÕÒ´æÔڵĽڵ㣬ÔÙͨ¹ý¶à²¥ÐÒéÀ´½øÐнڵãÖ®¼äµÄͨÐÅ£¬Í¬Ê±Ò²Ö§³Öµã¶ÔµãµÄ½»»¥¡£
Transport
´ú±íesÄÚ²¿½Úµã»ò¼¯ÈºÓë¿Í»§¶ËµÄ½»»¥·½Ê½£¬Ä¬ÈÏÄÚ²¿ÊÇʹÓÃtcpÐÒé½øÐн»»¥£¬Í¬Ê±ËüÖ§³ÖhttpÐÒé(json¸ñʽ)¡¢thrift¡¢servlet¡¢memcached¡¢zeroMQµÈµÄ´«ÊäÐÒé(ͨ¹ý²å¼þ·½Ê½¼¯³É)¡£
3. °²×°
1¡¢ ´´½¨Óû§
esÆô¶¯Ê±ÐèҪʹÓ÷ÇrootÓû§£¬ËùÒÔ´´½¨Ò»¸öîëÍÓû§
2¡¢ °²×°jdk(jdkÒªÇó1.8.20»ò1.7.55ÒÔÉÏ)
3¡¢ ÉÏ´«es°²×°°ü
4¡¢ tar -zxvf elasticsearch-2.3.1.tar.gz -C /bigdata/
5¡¢ ÐÞ¸ÄÅäÖÃ
vi /bigdata/elasticsearch-2.3.1/config/elasticsearch.yml
#¼¯ÈºÃû³Æ£¬Í¨¹ý×é²¥µÄ·½Ê½Í¨ÐÅ£¬Í¨¹ýÃû³ÆÅжÏÊôÓÚÄĸö¼¯Èº
cluster.name: bigdata
#½ÚµãÃû³Æ£¬ÒªÎ¨Ò»
node.name: es-1
#Êý¾Ý´æ·ÅλÖÃ
path.data: /data/es/data
#ÈÕÖ¾´æ·ÅλÖÃ
path.logs: /data/es/logs
#es°ó¶¨µÄipµØÖ·
network.host: 172.16.0.14
#³õʼ»¯Ê±¿É½øÐÐÑ¡¾ÙµÄ½Úµã
discovery.zen.ping.unicast.hosts: ["node-4.itcast.cn", "node-5.itcast.cn", "node-6.itcast.cn"]
6¡¢ ʹÓÃscp¿½±´µ½ÆäËû½Úµã
scp -r elasticsearch-2.3.1/ node-5.itcast.cn:$PWD
scp -r elasticsearch-2.3.1/ node-6.itcast.cn:$PWD
7¡¢ ÔÚÆäËû½ÚµãÉÏÐÞ¸ÄesÅäÖã¬ÐèÒªÐ޸ĵÄÓÐnode.nameºÍnetwork.host
8¡¢ Æô¶¯es(/bigdata/elasticsearch-2.3.1/bin/elasticsearch -h²é¿´°ïÖúÎĵµ)
/bigdata/elasticsearch-2.3.1/bin/elasticsearch –d
9¡¢ ÓÃä¯ÀÀÆ÷·ÃÎÊesËùÔÚ»úÆ÷µÄ9200¶Ë¿Ú
http://172.16.0.14:9200/
{
"name" : "es-1",
"cluster_name" : "bigdata",
"version" : {
"number" : "2.3.1",
"build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
"build_timestamp" : "2016-04-04T12:25:05Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
kill `ps -ef | grep Elasticsearch | grep -v grep | awk '{print $2}'`
4. es°²×°²å¼þÏÂÔØes²å¼þ
/bigdata/elasticsearch-2.3.1/bin/plugin install mobz/elasticsearch-head
#±¾µØ·½Ê½°²×°head²å¼þ
./plugin install file:///home/bigdata/elasticsearch-head-master.zip
#·ÃÎÊhead¹ÜÀíÒ³Ãæ
http://172.16.0.14:9200/_plugin/head
5. esµÄRESTful½Ó¿Ú²Ù×÷
RESTful½Ó¿ÚURLµÄ¸ñʽ£º
http://localhost:9200/
ÆäÖÐindex¡¢typeÊDZØÐëÌṩµÄ¡£
idÊÇ¿ÉÑ¡µÄ£¬²»Ìṩes»á×Ô¶¯Éú³É¡£
index¡¢type½«ÐÅÏ¢½øÐзֲ㣬ÀûÓÚ¹ÜÀí¡£
index¿ÉÒÔÀí½âΪÊý¾Ý¿â;typeÀí½âΪÊý¾Ý±í;idÏ൱ÓÚÊý¾Ý¿â±íÖмǼµÄÖ÷¼ü£¬ÊÇΨһµÄ¡£
#ÏòstoreË÷ÒýÖÐÌí¼ÓһЩÊé¼®
curl -XPUT 'http://172.16.0.14:9200/store/books/1' -d '{
"title": "Elasticsearch: The Definitive Guide",
"name" : {
"first" : "Zachary",
"last" : "Tong"
},
"publish_date":"2015-02-06",
"price":"49.99"
}'
#ͨ¹ýä¯ÀÀÆ÷²éѯ
http://172.16.0.14:9200/store/books/1
#ÔÚlinuxÖÐͨ¹ýcurlµÄ·½Ê½²éѯ
curl -XGET 'http://172.16.0.14:9200/store/books/1'
#ÔÚÌí¼ÓÒ»¸öÊéµÄÐÅÏ¢
curl -XPUT 'http://172.16.0.14:9200/store/books/2' -d '{
"title": "Elasticsearch Blueprints",
"name" : {
"first" : "Vineeth",
"last" : "Mohan"
},
"publish_date":"2015-06-06",
"price":"35.99"
}'
# ͨ¹ýID»ñµÃÎĵµÐÅÏ¢
curl -XGET 'http://172.16.0.14:9200/bookstore/books/1'
#ÔÚä¯ÀÀÆ÷Öв鿴
http://172.16.0.14:9200/bookstore/books/1
# ͨ¹ý_source»ñȡָ¶¨µÄ×Ö¶Î
curl -XGET 'http://172.16.0.14:9200/store/books/1?_source=title'
curl -XGET 'http://172.16.0.14:9200/store/books/1?_source=title,price'
curl -XGET 'http://172.16.0.14:9200/store/books/1?_source'
#¿ÉÒÔͨ¹ý¸²¸ÇµÄ·½Ê½¸üÐÂ
curl -XPUT 'http://172.16.0.14:9200/store/books/1' -d '{
"title": "Elasticsearch: The Definitive Guide",
"name" : {
"first" : "Zachary",
"last" : "Tong"
},
"publish_date":"2016-02-06",
"price":"99.99"
}'
# »òÕßͨ¹ý _update APIµÄ·½Ê½µ¥¶À¸üÐÂÄãÏëÒª¸üеÄ
curl -XPOST 'http://172.16.0.14:9200/store/books/1/_update' -d '{
"doc": {
"price" : 88.88
}
}'
curl -XGET 'http://172.16.0.14:9200/store/books/1'
#ɾ³ýÒ»¸öÎĵµ
curl -XDELETE 'http://172.16.0.14:9200/store/books/1'
# ×î¼òµ¥filter²éѯ
# SELECT * FROM books WHERE price = 35.99
# filtered ²éѯ¼Û¸ñÊÇ35.99µÄ
curl -XGET 'http://172.16.0.14:9200/store/books/_search' -d '{
"query" : {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"term" : {
"price" : 35.99
}
}
}
}
}'
#Ö¸¶¨¶à¸öÖµ
curl -XGET 'http://172.16.0.14:9200/store/books/_search' -d '{
"query" : {
"filtered" : {
"filter" : {
"terms" : {
"price" : [35.99, 88.88]
}
}
}
}
}'
# SELECT * FROM books WHERE publish_date = "2015-02-06"
curl -XGET 'http://172.16.0.14:9200/store/books/_search' -d '{
"query" : {
"filtered" : {
"filter" : {
"term" : {
"publish_date" : "2015-02-06"
}
}
}
}
}'
# bool¹ýÂ˲éѯ£¬¿ÉÒÔ×ö×éºÏ¹ýÂ˲éѯ
# SELECT * FROM books WHERE (price = 35.99 OR price = 99.99) AND (publish_date != "2016-02-06")
# ÀàËÆµÄ£¬ElasticsearchÒ²ÓÐ and, or, notÕâÑùµÄ×éºÏÌõ¼þµÄ²éѯ·½Ê½
# ¸ñʽÈçÏ£º
# {
# "bool" : {
# "must" : [],
# "should" : [],
# "must_not" : [],
# }
# }
#
# must: Ìõ¼þ±ØÐëÂú×㣬Ï൱ÓÚ and
# should: Ìõ¼þ¿ÉÒÔÂú×ãÒ²¿ÉÒÔ²»Âú×㣬Ï൱ÓÚ or
# must_not: Ìõ¼þ²»ÐèÒªÂú×㣬Ï൱ÓÚ not
curl -XGET 'http://172.16.0.14:9200/bookstore/books/_search' -d '{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"price" : 35.99}},
{ "term" : {"price" : 99.99}}
],
"must_not" : {
"term" : {"publish_date" : "2016-02-06"}
}
}
}
}
}
}'
# ǶÌײéѯ
# SELECT * FROM books WHERE price = 35.99 OR ( publish_date = "2016-02-06" AND price = 99.99 )
curl -XGET 'http://172.16.0.14:9200/bookstore/books/_search' -d '{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"price" : 35.99}},
{ "bool" : {
"must" : [
{"term" : {"publish_date" : "2016-02-06"}},
{"term" : {"price" : 99.99}}
]
}}
]
}
}
}
}
}'
# range·¶Î§¹ýÂË
# SELECT * FROM books WHERE price >= 20 AND price < 100
# gt : > ´óÓÚ
# lt : < СÓÚ
# gte : >= ´óÓÚµÈÓÚ
# lte : <= СÓÚµÈÓÚ
curl -XGET 'http://172.16.0.14:9200/store/books/_search' -d '{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"price" : {
"gt" : 20.0,
"lt" : 100
}
}
}
}
}
}'
# ÁíÍâÒ»ÖÖ and£¬ or£¬ not²éѯ
# ûÓÐbool, Ö±½ÓʹÓÃand , or , not
# ×¢Òâ: ²»´øboolµÄÕâÖÖ²éѯ²»ÄÜÀûÓûº´æ
# ²éѯ¼Û¸ñ¼ÈÊÇ35.99£¬publish_dateÓÖΪ"2015-02-06"µÄ½á¹û
curl -XGET 'http://172.16.0.14:9200/bookstore/books/_search' -d '{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"price":59.99
}
},
{
"term": {
"publish_date":"2015-02-06"
}
}
]
},
"query": {
"match_all": {}
}
}
}
}'
6. Logstash¶ÁÈ¡fileдÈëes
input {
file {
path => "/var/nginx_logs/*.log"
codec => "json"
discover_interval => 5
start_position => "beginning"
}
}
output {
elasticsearch {
index => "flow-%{+YYYY.MM.dd}"
hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
}
}
7. Logstash+kafka+es
input {
kafka {
type => "accesslogs"
codec => "plain"
auto_offset_reset => "smallest"
group_id => "elas1"
topic_id => "accesslogs"
zk_connect => "172.16.0.11:2181,172.16.0.12:2181,172.16.0.13:2181"
}
kafka {
type => "gamelogs"
auto_offset_reset => "smallest"
codec => "plain"
group_id => "elas2"
topic_id => "gamelogs"
zk_connect => "172.16.0.11:2181,172.16.0.12:2181,172.16.0.13:2181"
}
}
filter {
if [type] == "accesslogs" {
json {
source => "message"
remove_field => [ "message" ]
target => "access"
}
}
if [type] == "gamelogs" {
mutate {
split => { "message" => " " }
add_field => {
"event_type" => "%{message[3]}"
"current_map" => "%{message[4]}"
"current_X" => "%{message[5]}"
"current_y" => "%{message[6]}"
"user" => "%{message[7]}"
"item" => "%{message[8]}"
"item_id" => "%{message[9]}"
"current_time" => "%{message[12]}"
}
remove_field => [ "message" ]
}
}
}
output {
if [type] == "accesslogs" {
elasticsearch {
index => "accesslogs"
codec => "json"
hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
}
}
if [type] == "gamelogs" {
elasticsearch {
index => "gamelogs"
codec => plain {
charset => "UTF-16BE"
}
hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
}
}
}
ËÄ¡¢ Kibana±¨±í¹¤¾ßµÄ°²×°ºÍʹÓÃ
1. ¼ò½é
Logstash ÔçÆÚÔø¾×Ô´øÁËÒ»¸öÌØ±ð¼òµ¥µÄ logstash-web ÓÃÀ´²é¿´ ES ÖеÄÊý¾Ý¡£Æä¹¦ÄÜÌ«¹ý¼òµ¥£¬ÓÚÊÇ Rashid Khan Óà PHP дÁËÒ»¸ö¸üºÃÓÃµÄ web£¬È¡Ãû½Ð Kibana¡£Õâ¸ö PHP °æ±¾µÄ Kibana ·¢²¼Ê±¼äÊÇ 2011 Äê 12 Ô 11 ÈÕ¡£
Kibana ѸËÙÁ÷ÐÐÆðÀ´£¬²»¾ÃµÄ 2012 Äê 8 Ô 19 ÈÕ£¬Rashid Khan Óà Ruby ÖØÐ´ÁË Kibana£¬Ò²±»½Ð×ö Kibana2¡£ÒòΪ Logstash Ò²ÊÇÓà Ruby дµÄ£¬ÕâÑù Kibana ¾Í¿ÉÒÔÌæ´úÔÏÈÄǸö¼òªµÄ logstash-web Ò³ÃæÁË¡£
ĿǰÎÒÃÇ¿´µ½µÄ angularjs °æ±¾ kibana ÆäʵÔÃû½Ð elasticsearch-dashboard£¬µ«¸ú Kibana2 ×÷ÕßÊÇͬһ¸öÈË£¬»»¾ä»°Ëµ£¬kibana ±È logstash »¹Ôç¾Í½øÁË elasticsearch ÃûÏ¡£Õâ¸öÏîÄ¿¸ÄÃû Kibana ÊÇÔÚ 2014 Äê 2 Ô£¬Ò²±»½Ð×ö Kibana3¡£È«ÐµÄÉè¼ÆÒ»ÏÂ×Ó·çÃÒ DevOps ½ç¡£ËæºóÆäËûÉçÇø·×·×½è¼ø£¬Graphite Ŀǰ×îÁ÷ÐÐµÄ Grafana ½çÃæ¾ÍÊÇÓɴ˶øÀ´£¬ÖÁ½ñ´úÂëÖл¹Áô´æÓÐÊ®Óà´¦ kbn ×ÖÑù¡£
2014 Äê 4 Ô£¬Kibana3 Í£Ö¹¿ª·¢£¬ES ¹«Ë¾¼¯ÖÐÈËÁ¦¿ªÊ¼ Kibana4 µÄÖØ¹¹£¬ÔÚ 2015 Äê³õ·¢²¼ÁËʹÓà JRuby ×öºó¶ËµÄ beta °æºó£¬ÓÚ 3 ÔÂÕýÊ½ÍÆ³öʹÓà node.js ×öºó¶ËµÄÕýʽ°æ¡£ÓÉÓÚÉè¼ÆË¼Â·ÉϵIJî±ð£¬Ò»Ð© K3 ÊÊÒ˵ij¡¾°²¢²»ÔÚ K4 ¿¼ÂÇ·¶Î§ÄÚ£¬ËùÒÔ£¬ÖÁ½ñ K3 ºÍ K4 ²¢´æÊ¹Óá£
2. °²×°
½âѹºó£¬ÐÞ¸Äkibanna.yml£¬Ìí¼Óelasticsearch.url: "http://172.16.0.14:9200"ÐÅÏ¢£¬È»ºóÆô¶¯¡£
3. µ¼ÈëÊý¾Ý
ÎÒÃǽ«Ê¹ÓÃɯʿ±ÈÑÇÈ«¼¯×÷ΪÎÒÃǵÄʾÀýÊý¾Ý¡£Òª¸üºÃµÄʹÓà Kibana£¬ÄãÐèҪΪ×Ô¼ºµÄÐÂË÷ÒýÓ¦ÓÃÒ»¸öÓ³É伯(mapping)¡£ÎÒÃÇÓÃÏÂÃæÕâ¸öÓ³É伯´´½¨"ɯʿ±ÈÑÇÈ«¼¯"Ë÷Òý¡£Êµ¼ÊÊý¾ÝµÄ×ֶαÈÕâÒª¶à£¬µ«ÊÇÎÒÃÇÖ»ÐèÒªÖ¸¶¨ÏÂÃæÕâЩ×ֶεÄÓ³Éä¾Í¿ÉÒÔÁË¡£×¢Òâµ½ÎÒÃÇÉèÖÃÁË¶Ô speaker ºÍ play_name ²»·ÖÎö¡£ÔÒò»áÔÚÉÔºó½²Ã÷¡£
ÔÚÖÕ¶ËÔËÐÐÏÂÃæÃüÁ
curl -XPUT http://localhost:9200/shakespeare -d '
{
"mappings" : {
"_default_" : {
"properties" : {
"speaker" : {"type": "string", "index" : "not_analyzed" },
"play_name" : {"type": "string", "index" : "not_analyzed" },
"line_id" : { "type" : "integer" },
"speech_number" : { "type" : "integer" }
}
}
}
}
';
ÎÒÃÇÕâ¾Í´´½¨ºÃÁËË÷Òý¡£ÏÖÔÚÐèÒª×öµÄʱµ¼ÈëÊý¾Ý¡£É¯Ê¿±ÈÑÇÈ«¼¯µÄÄÚÈÝÎÒÃÇÒѾÕûÀí³ÉÁË elasticsearch ÅúÁ¿ µ¼ÈëËùÐèÒªµÄ¸ñʽ£¬Äã¿ÉÒÔͨ¹ýshakeseare.jsonÏÂÔØ¡£
ÓÃÈçÏÂÃüÁîµ¼ÈëÊý¾Ýµ½Äã±¾µØµÄ elasticsearch ½ø³ÌÖС£
curl -XPUT localhost:9200/_bulk --data-binary @shakespeare.json
4. ·ÃÎÊ Kibana ½çÃæ
´ò¿ªä¯ÀÀÆ÷£¬·ÃÎÊÒѾ·¢²¼ÁË Kibana µÄ±¾µØ·þÎñÆ÷¡£

Èç¹ûÄã½âѹ·¾¶ÎÞÎó(ÒëÕß×¢£ºÊ¹Óà github Ô´ÂëµÄ¶ÁÕß¼Çס·¢²¼Ä¿Â¼Ó¦¸ÃÊÇ kibana/src/ ÀïÃæ)£¬ÄãÒѾ¾Í¿ÉÒÔ¿´µ½ÉÏÃæÕâ¸ö¿É°®µÄ»¶ÓÒ³Ãæ¡£µã»÷ Sample Dashboard Á´½Ó

ºÃÁË£¬ÏÖÔÚÏÔʾµÄ¾ÍÊÇÄãµÄ sample dashboard!Èç¹ûÄãÊÇÓÃÐ嵀 elasticsearch ½ø³Ì¿ªÊ¼±¾½Ì³ÌµÄ£¬Äã»á¿´µ½Ò»¸ö°Ù·Ö±ÈÕ¼±ÈºÜÖØµÄ±ýͼ¡£ÕâÀïÏÔʾµÄÊÇÄãµÄË÷ÒýÖУ¬ÎĵµÀàÐ͵ÄÇé¿ö¡£ÈçÄãËù¼û£¬99% ¶¼ÊÇ lines£¬Ö»ÓÐÉÙÁ¿µÄ acts ºÍscenes¡£
ÔÙÏÂÃæ£¬Äã»á¿´µ½Ò»³¤¶Î JSON ¸ñʽµÄɯʿ±ÈÑÇÊ«ÎÄ¡£
5. µÚÒ»´ÎËÑË÷
Kibana ÔÊÐíʹÓÃÕß²ÉÓà Lucene Query String Óï·¨ËÑË÷ Elasticsearch ÖеÄÊý¾Ý¡£ÇëÇó¿ÉÒÔÔÚÒ³Ãæ¶¥²¿µÄÇëÇóÊäÈë¿òÖÐÊéд¡£

ÔÚÇëÇó¿òÖÐÊäÈëÈçÏÂÄÚÈÝ¡£È»ºó²é¿´±í¸ñÖеÄǰ¼¸ÐÐÄÚÈÝ¡£
friends, romans, countrymen

¹ØÓÚËÑË÷ÇëÇóµÄÓï·¨£¬ÇëÔĶÁÉÔºó Query ºÍ Filtering С½Ú¡£
6. ÅäÖÃÁíÒ»¸öË÷Òý
Ŀǰ Kibana Ö¸ÏòµÄÊÇ Elasticsearch Ò»¸öÌØÊâµÄË÷Òý½Ð _all¡£ _all ¿ÉÒÔÀí½âΪȫ²¿Ë÷ÒýµÄ´ó¼¯ºÏ¡£Ä¿Ç°ÄãÖ»ÓÐÒ»¸öË÷Òý£¬ shakespeare£¬µ«Î´À´Äã»áÓиü¶àÆäËû·½ÃæµÄË÷Òý£¬Äã¿Ï¶¨²»Ï£Íû Kibana ÔÚÄãÖ»ÏëËÑ¡¶Âó¿Ë°×¡·ÀïÐİ®µÄ¾ä×ÓµÄʱºò»¹ÒªËÑË÷È«²¿ÄÚÈÝ¡£
ÅäÖÃË÷Òý£¬µã»÷ÓÒÉϽǵÄÅäÖð´Å¥£º

ÔÚÕâÀÄã¿ÉÒÔÉèÖÃÄãµÄË÷ÒýΪ shakespeare £¬ÕâÑù Kibana ¾ÍÖ»»áËÑË÷ shakespeare Ë÷ÒýµÄÄÚÈÝÁË¡£


ÕâÊÇÒòΪ ES1.4 ÔöÇ¿ÁËȨÏÞ¹ÜÀí¡£ÄãÐèÒªÔÚ ES ÅäÖÃÎļþ elasticsearch.yml ÖÐÌí¼ÓÏÂÁÐÅäÖò¢ÖØÆô·þÎñºó²ÅÄÜÕý³£·ÃÎÊ£º
http.cors.enabled: true
http.cors.allow-origin: "*"
¼Çס kibana3 Ò³ÃæÒ²ÒªË¢Ð»º´æ²ÅÐС£
´ËÍ⣬Èç¹ûÄã¿ÉÒÔºÜÃ÷È·×Ô¼º kibana ÒÔÍâûÓÐÆäËû http ·ÃÎÊ£¬¿ÉÒÔ°Ñ kibana µÄÍøÖ·Ð´ÔÚhttp.cors.allow-origin ²ÎÊýµÄÖµÖС£±ÈÈ磺
http.cors.allow-origin: "/https?:\/\/kbndomain/"
±±¾©Ð£Çø