为增加搜索功能,最近在自己的服务器上部署elasticsearch,折腾一下,把注意的问题记录一下。
1. 因为最近的es5.5.2要求java1.8,所以确保java版本正确.
2. 我的服务器只有1G内存,如果使用默认elasticsearch设置,会出现内存不足的情况,所以需要把jvm的内存调小:
在elasticsearch-5.5.2/config/jvm.options内把jvm初始堆和最大使用内存大小都设为512m:
-Xms512m
-Xmx512m
这个时候可以正常启动es了。
以下部分是扩展.
3. 我的博客数据存在mysql,要把里面的数据同步给es索引,用到logstash-jdbc,这是一个单独的组件,最新也是5.5.2,同样的,把logstash 的jvm的内存调小:
在logstash-5.5.2/config/jvm.options 内设为如下:
-Xms512m
-Xmx512m
4. 在logstash-5.5.2/bin/下建立配置文件:jdbc.conf
# The # character at the beginning of a line indicates a comment. Use # comments to describe your configuration. input { jdbc { # mysql jdbc connection string to our backup databse 后面的test对应mysql中的test数据库 jdbc_connection_string => "jdbc:mysql://localhost:3306/blog" # the user we wish to excute our statement as jdbc_user => "root" jdbc_password => "密码" # the path to our downloaded jdbc driver jdbc_driver_library => "/var/mysql-connector-java-5.1.44-bin.jar" # the name of the driver class for mysql jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "50000" #以下对应着要执行的sql的绝对路径。 statement_filepath => "/var/ogstash-5.5.2/bin/jdbc.sql" #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出) schedule => "* * * * *" #设定ES索引类型 type => "article" } } filter { mutate { gsub => ["content", "(<.+?>)", ""] gsub => ["content", " ", ""] } } output { elasticsearch { #ESIP地址与端口 hosts => "localhost:9200" #ES索引名称(自己定义的) index => "tornado-blog" #自增ID编号 document_id => "%{id}" } stdout { #以JSON格式输出 codec => json_lines } }
这里需要注意的是在filter里的配置,要把html标签去除掉再去给es索引。
其中,指定的jdbc.sql内容如下:
select * from article where date_add(up_date, interval -8 hour) >= :sql_last_value
之所以要用date_add函数把时间差8个小时,是因为es里是用的utc标准时间,所以为了增加更新,需要把时间也变成utc时间,不然时间总是比上次同步的时间大,es会每次都会索引。
5. 启动es,logstash
./elasticsearch > log.txt 2>&1 & ./logstash -f jdbc.conf > log.txt 2>&1 &
之所以不用-d选项,是因为在使用中发现使用-d会使的服务器频繁使用swap分区,造成服务器反应慢,反而是这种&方式不会引起服务器变慢的问题.