elasticsearch中文分词插件IK使用

大数据/云计算采菊篱下 发表了文章 • 0 个评论 • 1594 次浏览 • 2015-09-21 11:40 • 来自相关话题

ES支持中文的前提是安装正确的分词组件,比如elasticsearch-analysis-ik。
版本支持如下:





安装

# git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1
# cd elasticsearch-analysis-ik/
# mvn package
# unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip
OR# git clone https://github.com/medcl/elasticsearch-analysis-ik
# cd elasticsearch-analysis-ik
# mvn compile
# mvn package
# plugin --install analysis-ik --url file:///#{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-1.3.0.zipzip解压得到5个jar包:
[]- elasticsearch-analysis-ik-1.2.9.jar[/][]- httpclient-4.3.5.jar[/][]- httpcore-4.3.2.jar[/][]- commons-logging-1.1.3.jar[/][]- commons-codec-1.6.jar[/]
 
返回ES目录,新建路径./plugins/analysis-ik并把上述jar包全部移进去。
第二步,把elasticsearch-analysis-ik/config/ik文件夹(IK自带的词典)复制到ES目录的./config路径下。
第三步,在./config/elasticsearch.yml文件的最后加上:index:
analysis:
analyzer:
ik:
alias: [news_analyzer_ik,ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

index.analysis.analyzer.default.type : "ik"
OR[b]index.analysis.analyzer.ik.type : "ik"[/b]注意配置分词组件必须在创建索引之前,否则是无效的。

Example

1.create a index# curl -XPUT http://localhost:9200/index2.create a mapping# curl -XPUT http://localhost:9200/index
create a mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"term_vector": "no",
"store": "false"
},
"properties": {
"content": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"include_in_all": "true",
"boost": 8
}
}
}
}'3.index some docs# curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'# curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}
'# curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
' # curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'4.query with highlighting# curl -XPOST http://localhost:9200/index/fulltext/_search -d'
{
"query" : { "term" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'Result{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中国</tag1>渔船 "
]
}
}
]
}
} 查看全部
eslogo.png

ES支持中文的前提是安装正确的分词组件,比如elasticsearch-analysis-ik
版本支持如下:
ik1.png


安装


# git clone https://github.com/medcl/elasticsearch-analysis-ik.git --depth 1
# cd elasticsearch-analysis-ik/
# mvn package
# unzip ./target/releases/elasticsearch-analysis-ik-1.2.9.zip

OR
# git clone https://github.com/medcl/elasticsearch-analysis-ik
# cd elasticsearch-analysis-ik
# mvn compile
# mvn package
# plugin --install analysis-ik --url file:///#{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-1.3.0.zip
zip解压得到5个jar包:
    []- elasticsearch-analysis-ik-1.2.9.jar[/][]- httpclient-4.3.5.jar[/][]- httpcore-4.3.2.jar[/][]- commons-logging-1.1.3.jar[/][]- commons-codec-1.6.jar[/]

 
返回ES目录,新建路径./plugins/analysis-ik并把上述jar包全部移进去。
第二步,把elasticsearch-analysis-ik/config/ik文件夹(IK自带的词典)复制到ES目录的./config路径下。
第三步,在./config/elasticsearch.yml文件的最后加上:
index:
analysis:
analyzer:
ik:
alias: [news_analyzer_ik,ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

index.analysis.analyzer.default.type : "ik"

OR
[b]index.analysis.analyzer.ik.type : "ik"[/b]
注意配置分词组件必须在创建索引之前,否则是无效的。


Example


1.create a index
# curl -XPUT http://localhost:9200/index
2.create a mapping
# curl -XPUT http://localhost:9200/index
create a mapping
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"term_vector": "no",
"store": "false"
},
"properties": {
"content": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"indexAnalyzer": "ik",
"searchAnalyzer": "ik",
"include_in_all": "true",
"boost": 8
}
}
}
}'
3.index some docs
# curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}
'
# curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}
'
# curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
# curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
'
4.query with highlighting
# curl -XPOST http://localhost:9200/index/fulltext/_search  -d'
{
"query" : { "term" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'
Result
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中国</tag1>驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中国</tag1>渔船 "
]
}
}
]
}
}

Elasticsearch索引存储类型

大数据/云计算采菊篱下 发表了文章 • 0 个评论 • 2346 次浏览 • 2015-09-20 16:59 • 来自相关话题

文件系统存储类型
    基于文件系统的存储是默认索引存储方式。有不同的实现或存储类型。最好的一个操作系统的自动选择是:mmapfs使用在Windows的64bit系统上,simplefs使用在windows的32bit系统上,除此之外默认是用(hybrid niofs 和 mmapfs)。
 
    你可以通过修改配置文件elasticsearch.yml来指定存储类型:index.store.type: niofs    当然你也可以在创建索引的时候指定:curl -XPUT localhost:9200/my_index -d '{
"settings": {
"index.store.type": "niofs"
}
}';    下面是所有支持的不同存储类型:

Simple FS(简单文件系统)

Simplefs类型是一个简单的实现随机访问文件的文件存储系统(映射到Lucene SimpleFsDirectory的)。该实现的并发性能较差(多线程是个瓶颈)。当你需要将索引持久化,最好使用niofs。

NIO FS(NIO文件系统)

niofs类型是通过NIO将分片索引文件写到文件系统上(映射到Lucene NIOFSDirectory)。它允许多线程同时读取文件。不建议在Windows系统上使用,由于SUN JAVA实现上的一个错误。

MMap FS(内存映射文件系统)

mmapfs类型存储分片索引到文件系统上(映射到Lucene MMapDirectory)通过映射文件到内存中(MMAP)。内存映射的过程中将划分出与被映射文件大小一样的虚拟内存空间。使用这个类之前,请确保您有足够的虚拟地址空间。Linux下虚拟内存设置:
# sysctl -w vm.max_map_count=262144
永久生效:
update the vm.max_map_count setting in /etc/sysctl.conf.
# echo "vm.max_map_count=262144" >> /etc/sysctl.conf && sysctl -p

Hybrid MMap / NIO FS

默认类型存储碎片索引在文件系统中根据不同的文件类型的文件映射到内存(mmap)或使用Java NIO。目前只Lucene术语字典和doc值文件内存映射到减少对操作系统的影响。所有其他文件都使用Lucene NIOFSDirectory打开。
内存
    内存类型索引存储在主内存,使用Lucene的RamIndexStore。
    
    也有节点级别的设置来控制高速缓存(重要的,当使用直接缓冲区):




参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html#store-memory
           https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html#file-descriptors 查看全部
eslogo.png


文件系统存储类型
    基于文件系统的存储是默认索引存储方式。有不同的实现或存储类型。最好的一个操作系统的自动选择是:mmapfs使用在Windows的64bit系统上,simplefs使用在windows的32bit系统上,除此之外默认是用(hybrid niofs 和 mmapfs)。
 
    你可以通过修改配置文件elasticsearch.yml来指定存储类型:
index.store.type: niofs
    当然你也可以在创建索引的时候指定:
curl -XPUT localhost:9200/my_index -d '{
"settings": {
"index.store.type": "niofs"
}
}';
    下面是所有支持的不同存储类型:


Simple FS(简单文件系统)


Simplefs类型是一个简单的实现随机访问文件的文件存储系统(映射到Lucene SimpleFsDirectory的)。该实现的并发性能较差(多线程是个瓶颈)。当你需要将索引持久化,最好使用niofs。


NIO FS(NIO文件系统)


niofs类型是通过NIO将分片索引文件写到文件系统上(映射到Lucene NIOFSDirectory)。它允许多线程同时读取文件。不建议在Windows系统上使用,由于SUN JAVA实现上的一个错误。


MMap FS(内存映射文件系统)


mmapfs类型存储分片索引到文件系统上(映射到Lucene MMapDirectory)通过映射文件到内存中(MMAP)。内存映射的过程中将划分出与被映射文件大小一样的虚拟内存空间。使用这个类之前,请确保您有足够的虚拟地址空间。
Linux下虚拟内存设置:
# sysctl -w vm.max_map_count=262144
永久生效:
update the vm.max_map_count setting in /etc/sysctl.conf.
# echo "vm.max_map_count=262144" >> /etc/sysctl.conf && sysctl -p


Hybrid MMap / NIO FS


默认类型存储碎片索引在文件系统中根据不同的文件类型的文件映射到内存(mmap)或使用Java NIO。目前只Lucene术语字典和doc值文件内存映射到减少对操作系统的影响。所有其他文件都使用Lucene NIOFSDirectory打开。

内存
    内存类型索引存储在主内存,使用Lucene的RamIndexStore。
    
    也有节点级别的设置来控制高速缓存(重要的,当使用直接缓冲区):
estore.png

参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-store.html#store-memory
           https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html#file-descriptors

mysql的ERROR 2006 (HY000): MySQL server has gone away错误分析

数据库Ansible 发表了文章 • 0 个评论 • 674 次浏览 • 2015-09-19 20:43 • 来自相关话题

MySQL下当我导入一个比较大的SQL文件时出现了ERROR 2006 (HY000): MySQL server has gone away错误,具体情况如下:> ll *.sql
-rwxr-xr-x@ 1 bohan staff 27M Mar 26 18:08 91620_all.sql

[quote] mysql test < 91620_all.sql
ERROR 2006 (HY000) at line 17128: MySQL server has gone away上面可以看到,文件大小为27M导入的时候会报这个错误。
 
错误原因

If you are using the mysql client program, its default max_allowed_packet variable is 16MB. To set a larger value, start mysql like this:

shell> mysql --max_allowed_packet=32M

That sets the packet size to 32MB.

我们通过MySQL相关文档可以发现默认大小是16M。
 
解决方法
所有大于16M的SQL文件都会报这个错误,我们可以直接通过命令后增加--max_allowed_packet=32M解决或者登录MySQL客户端,修改系统变量:> ssh mysql
mysql> set GLOBAL max_allowed_packet=32[i]1024[/i]1024;我们也可以通过修改MySQL配置my.cnf文件,在最后一行增加max_allowed_packet=32M就可以了
 
MySQL配置文件的位置:Windows下 C:\ProgamData\MySQL\MySQL Server5.6
Linux下 /etc/mysql
Mac下通过brew安装 /usr/local/Cellar/mysql/5.6.23原文地址:开源技术社区分享[/quote] 查看全部
MySQL下当我导入一个比较大的SQL文件时出现了ERROR 2006 (HY000): MySQL server has gone away错误,具体情况如下:
>  ll *.sql
-rwxr-xr-x@ 1 bohan staff 27M Mar 26 18:08 91620_all.sql

[quote] mysql test < 91620_all.sql
ERROR 2006 (HY000) at line 17128: MySQL server has gone away
上面可以看到,文件大小为27M导入的时候会报这个错误。
 
错误原因


If you are using the mysql client program, its default max_allowed_packet variable is 16MB. To set a larger value, start mysql like this:


shell> mysql --max_allowed_packet=32M


That sets the packet size to 32MB.


我们通过MySQL相关文档可以发现默认大小是16M。
 
解决方法
所有大于16M的SQL文件都会报这个错误,我们可以直接通过命令后增加--max_allowed_packet=32M解决或者登录MySQL客户端,修改系统变量:
> ssh mysql
mysql> set GLOBAL max_allowed_packet=32[i]1024[/i]1024;
我们也可以通过修改MySQL配置my.cnf文件,在最后一行增加max_allowed_packet=32M就可以了
 
MySQL配置文件的位置:
Windows下 C:\ProgamData\MySQL\MySQL Server5.6
Linux下 /etc/mysql
Mac下通过brew安装 /usr/local/Cellar/mysql/5.6.23
原文地址:开源技术社区分享[/quote]

R语言学习文档资料大全

学习资源OpenSkill 发表了文章 • 0 个评论 • 751 次浏览 • 2015-09-19 17:12 • 来自相关话题

    现在对R语言感兴趣人的人越来越多,很多人都想快速掌握R语言,然而,由于现在大部分学校没有开设R语言课程,社会上相对培训R语言的机构也较少,导致很多人不知道如何着手学习R语言。

    所以这次开源技术社区给大家分享一份R语言资料,希望对你有帮助!
    文档资料下载地址:http://pan.baidu.com/s/1pJwzUxP
 
    开源技术社区QQ群号:372476089  欢迎加入互相学习
    扫码关注微信号: 查看全部
    现在对R语言感兴趣人的人越来越多,很多人都想快速掌握R语言,然而,由于现在大部分学校没有开设R语言课程,社会上相对培训R语言的机构也较少,导致很多人不知道如何着手学习R语言。

    所以这次开源技术社区给大家分享一份R语言资料,希望对你有帮助!
    文档资料下载地址:http://pan.baidu.com/s/1pJwzUxP
 
    开源技术社区QQ群号:372476089  欢迎加入互相学习
    扫码关注微信号:
opsk.jpg

elasticsearch特点介绍

大数据/云计算采菊篱下 发表了文章 • 0 个评论 • 1362 次浏览 • 2015-09-19 16:07 • 来自相关话题

    Elasticsearch是分布式,REST风格,搜索和分析系统。具有实时数据,实时分析,分布式,高可用性,多租户,全文搜索,面向文档,冲突管理,自由模式,rest风格API,每个操作的持久性,Apache 2的开源许可证,基于Apache Lucene之上的特点。

实时数据

数据流进入的系统后,数据怎么能够快速的可视化。用elasticsearch,所有数据立即可用被搜索和分析。




实时分析

结合搜索的速度与分析的力量,改变你的关系与你的数据。交互搜索,发现和分析,以获得改善你的产品或简化您的业务。




分布式

Elasticsearch允许你开始小规模使用,但是随着你使用数据的增长,它可以建立在横向扩展的开箱即用。当你需要更多的容量,只需添加更多的节点,并让集群重组,只需要增加额外的硬件,让集群自动利用额外的硬件。




高可用

Elasticsearch集群弹性-他们将发现新的或失败的节点,重组和重新平衡数据,确保您的数据是安全的和可访问的。




多租户

集群可以托管多个索引,可独立或作为一个组进行查询。索引别名允许你过滤视图时添加索引,可以透明地更新您的应用程序。




全文搜索

Elasticsearch在后台使用Lucene来提供最强大的全文检索,提供任何开源产品的能力。搜索自带的多语言支持,强大的查询语言,地理位置支持,上下文感知的建议,自动完成和搜索片段。




面向文档

存储复杂的真实世界的实体在Elasticsearch结构化JSON文件。所有的字段都被默认索引,所有的索引可以使用一个单一的查询,以方便快速的返回复杂的结果。




模式自由

Elasticsearch允许你快速上手。简单的指定一个JSON文档将自动检测数据的结构和类型,创建一个索引,并使你的数据检索。您还拥有完全控制,以自定义您的数据是如何被索引的。




友好的RESTful API

Elasticsearch是API驱动。几乎任何动作都可以用一个简单的RESTful API使用JSON基于HTTP请求。客户库可使用多种编程语言。




操作持久化

Elasticsearch把你的数据安全第一。文档改变被记录在群集上的多个节点上的事务日志(transaction logs)中记录,以减少任何数据丢失的机会。




Apache 2开源许可证

Elasticsearch可以下载,使用和免费修改。它是基于Apache 2的开源许可证,最灵活的开源许可证。




基于Apache Lucene之上

Apache Lucene是一个用Java编写的高性能,功能齐全信息检索库。elasticsearch内部利用lucene来构建的分布式和分析功能。




冲突管理

乐观的版本控制,可以使用在需要的地方,多个进程的冲突变化,开放式版本控制可以确保数据不会丢失。



英文地址:原文地址 查看全部
es1.jpeg

    Elasticsearch是分布式,REST风格,搜索和分析系统。具有实时数据,实时分析,分布式,高可用性,多租户,全文搜索,面向文档,冲突管理,自由模式,rest风格API,每个操作的持久性,Apache 2的开源许可证,基于Apache Lucene之上的特点。


实时数据


数据流进入的系统后,数据怎么能够快速的可视化。用elasticsearch,所有数据立即可用被搜索和分析。
elasticsearch1.png


实时分析


结合搜索的速度与分析的力量,改变你的关系与你的数据。交互搜索,发现和分析,以获得改善你的产品或简化您的业务。
elasticsearch2.png


分布式


Elasticsearch允许你开始小规模使用,但是随着你使用数据的增长,它可以建立在横向扩展的开箱即用。当你需要更多的容量,只需添加更多的节点,并让集群重组,只需要增加额外的硬件,让集群自动利用额外的硬件。
elasticsearch3.png


高可用


Elasticsearch集群弹性-他们将发现新的或失败的节点,重组和重新平衡数据,确保您的数据是安全的和可访问的。
elasticsearch4.png


多租户


集群可以托管多个索引,可独立或作为一个组进行查询。索引别名允许你过滤视图时添加索引,可以透明地更新您的应用程序。
elasticsearch5.png


全文搜索


Elasticsearch在后台使用Lucene来提供最强大的全文检索,提供任何开源产品的能力。搜索自带的多语言支持,强大的查询语言,地理位置支持,上下文感知的建议,自动完成和搜索片段。
elasticsearch6.png


面向文档


存储复杂的真实世界的实体在Elasticsearch结构化JSON文件。所有的字段都被默认索引,所有的索引可以使用一个单一的查询,以方便快速的返回复杂的结果。
elasticsearch7.png


模式自由


Elasticsearch允许你快速上手。简单的指定一个JSON文档将自动检测数据的结构和类型,创建一个索引,并使你的数据检索。您还拥有完全控制,以自定义您的数据是如何被索引的。
elasticsearch8.png


友好的RESTful API


Elasticsearch是API驱动。几乎任何动作都可以用一个简单的RESTful API使用JSON基于HTTP请求。客户库可使用多种编程语言。
elasticsearch9.png


操作持久化


Elasticsearch把你的数据安全第一。文档改变被记录在群集上的多个节点上的事务日志(transaction logs)中记录,以减少任何数据丢失的机会。
elasticsearch10.png


Apache 2开源许可证


Elasticsearch可以下载,使用和免费修改。它是基于Apache 2的开源许可证,最灵活的开源许可证。
elasticsearch11.png


基于Apache Lucene之上


Apache Lucene是一个用Java编写的高性能,功能齐全信息检索库。elasticsearch内部利用lucene来构建的分布式和分析功能。
elasticsearch12.png


冲突管理


乐观的版本控制,可以使用在需要的地方,多个进程的冲突变化,开放式版本控制可以确保数据不会丢失。
elasticsearch13.png

英文地址:原文地址

elasticsearch不能触碰的配置

大数据/云计算采菊篱下 发表了文章 • 0 个评论 • 1025 次浏览 • 2015-09-19 14:17 • 来自相关话题

    有几个elasticsearch的热点配置,似乎没有办法避免调整。我们熟知的:配置按钮都希望被打开。然而把所有的配置项都打开,你觉得就可以息事宁人了吗。这些配置常常被滥用,将会导致糟糕的稳定性和糟糕的性能问题,乃至这两种问题。

垃圾收集器(Garbage Collector)

    在这里简单介绍了垃圾收集器基本认识,JVM使用垃圾收集器来释放回收内存。这个技巧确实是最后一个技巧的延伸,但是值得强调的是:
    不要更改默认的垃圾收集器配置!Elasticsearh默认的GC是CMS。让GC并发的运行应用程序,以便最大限度的减少暂停时间。然而它有两个stop-the-world阶段,在回收大量的heaps。

尽管有这些缺点,它是目前对于像Elasticsearch低延迟服务器软件的最佳的GC。 官方建议使用CMS。

有一个新的GC叫垃圾第一GC(g1gc)。这个新的GC的设计是为了尽量减少停顿比CMS更大的堆,和操作。它的工作原理是将堆分割成区域,预测区域包含最可回收的空间。通过收集这些区域(第一),它可以最大限度地减少暂停和操作非常大的堆。

听起来很棒!不幸的是,g1gc仍然是新的,和新的漏洞被发现的常规。这些错误通常会导致各种各样的段错误,硬盘崩溃。Lucene的测试套件是残酷的GC算法,似乎g1gc没有扭结的工作了。

我们想总有一天会推荐g1gc,但现在,它只是不够稳定满足Elasticsearch和Lucene的要求





线程池(Threadpoolsedit)

每个人都喜欢好的线程池。不管出于什么原因,人们似乎无法抗拒增加线程数。索引很多?更多线程!搜索很多?更多线程!节点空闲时间95%的时间?更多线程!

在Elasticsearch默认的线程池的设置是非常明智的。 对于所有的线程池(除了search )的经纬被设置为CPU核心的数量。 如果你有八个核心,你可以同时运行的只有八个线程。 它有道理仅分配八个线程在任何特定的线程池。

搜索得到一个较大的线程池,并且被配置为 # cores * 3

你可能会争辩说,一些线程可以阻止(如在一个磁盘上IO操作),这就是为什么你需要更多的线程。这不是一个问题:在Elasticsearch的磁盘I/O是由Lucene的线程处理,不是Elasticsearch。

此外,合作的线程池通过传递彼此之间的工作。 您不必再担心网络线程阻塞,因为它正在等待磁盘写入。 联网线程都有,因为另一个线程池转交给了工作单位长期得到回网络。

最后,你的程序的计算能力是有限的。 有更多的线程只是迫使处理器切换线程上下文。 处理器可以一次运行只有一个线程,因此当它需要切换到一个不同的线程,它存储了当前的状态(寄存器,等等),并装载另一个线程。 如果你是幸运的,交换机将发生在相同的核心。 如果你运气不好,开关可能会迁移到不同的核心,并要求运输核间通信总线上。

这个上下文切换吃掉周期只需做管理清洁; 估计能挂它高达对现代的CPU为30μs。 所以,除非该线程将被阻塞比为30μs长,极有可能是那个时候会被更好地用刚刚加工和提早完成。

人们通常设置线程池错误的值。 八核的机器,我们已经与60,100,甚至1000个线程运行在整个的configs。 这些设置将让CPU大于得到真正的工作要做。

所以。 下次你要调整一个线程池,请不要。 如果你绝对无法抗拒 ,请保持你的核心数量在心中,也许设置数量增加一倍。 更重要的是仅仅是一种浪费。
原文地址:https://www.elastic.co/guide/en/elasticsearch/guide/current/_don_8217_t_touch_these_settings.html 查看全部
eslogo.png

    有几个elasticsearch的热点配置,似乎没有办法避免调整。我们熟知的:配置按钮都希望被打开。然而把所有的配置项都打开,你觉得就可以息事宁人了吗。这些配置常常被滥用,将会导致糟糕的稳定性和糟糕的性能问题,乃至这两种问题。


垃圾收集器(Garbage Collector)


    在这里简单介绍了垃圾收集器基本认识,JVM使用垃圾收集器来释放回收内存。这个技巧确实是最后一个技巧的延伸,但是值得强调的是:
    不要更改默认的垃圾收集器配置!
Elasticsearh默认的GC是CMS。让GC并发的运行应用程序,以便最大限度的减少暂停时间。然而它有两个stop-the-world阶段,在回收大量的heaps。

尽管有这些缺点,它是目前对于像Elasticsearch低延迟服务器软件的最佳的GC。 官方建议使用CMS。

有一个新的GC叫垃圾第一GC(g1gc)。这个新的GC的设计是为了尽量减少停顿比CMS更大的堆,和操作。它的工作原理是将堆分割成区域,预测区域包含最可回收的空间。通过收集这些区域(第一),它可以最大限度地减少暂停和操作非常大的堆。

听起来很棒!不幸的是,g1gc仍然是新的,和新的漏洞被发现的常规。这些错误通常会导致各种各样的段错误,硬盘崩溃。Lucene的测试套件是残酷的GC算法,似乎g1gc没有扭结的工作了。

我们想总有一天会推荐g1gc,但现在,它只是不够稳定满足Elasticsearch和Lucene的要求





线程池(Threadpoolsedit)


每个人都喜欢好的线程池。不管出于什么原因,人们似乎无法抗拒增加线程数。索引很多?更多线程!搜索很多?更多线程!节点空闲时间95%的时间?更多线程!    

在Elasticsearch默认的线程池的设置是非常明智的。 对于所有的线程池(除了search )的经纬被设置为CPU核心的数量。 如果你有八个核心,你可以同时运行的只有八个线程。 它有道理仅分配八个线程在任何特定的线程池。

搜索得到一个较大的线程池,并且被配置为 # cores * 3

你可能会争辩说,一些线程可以阻止(如在一个磁盘上IO操作),这就是为什么你需要更多的线程。这不是一个问题:在Elasticsearch的磁盘I/O是由Lucene的线程处理,不是Elasticsearch。

此外,合作的线程池通过传递彼此之间的工作。 您不必再担心网络线程阻塞,因为它正在等待磁盘写入。 联网线程都有,因为另一个线程池转交给了工作单位长期得到回网络。

最后,你的程序的计算能力是有限的。 有更多的线程只是迫使处理器切换线程上下文。 处理器可以一次运行只有一个线程,因此当它需要切换到一个不同的线程,它存储了当前的状态(寄存器,等等),并装载另一个线程。 如果你是幸运的,交换机将发生在相同的核心。 如果你运气不好,开关可能会迁移到不同的核心,并要求运输核间通信总线上。

这个上下文切换吃掉周期只需做管理清洁; 估计能挂它高达对现代的CPU为30μs。 所以,除非该线程将被阻塞比为30μs长,极有可能是那个时候会被更好地用刚刚加工和提早完成。

人们通常设置线程池错误的值。 八核的机器,我们已经与60,100,甚至1000个线程运行在整个的configs。 这些设置将让CPU大于得到真正的工作要做。

所以。 下次你要调整一个线程池,请不要。 如果你绝对无法抗拒 ,请保持你的核心数量在心中,也许设置数量增加一倍。 更重要的是仅仅是一种浪费。
原文地址:https://www.elastic.co/guide/en/elasticsearch/guide/current/_don_8217_t_touch_these_settings.html

Nginx源码安装错误分析一则

运维技术Geek小A 发表了文章 • 0 个评论 • 648 次浏览 • 2015-09-19 00:19 • 来自相关话题

    最近跟一个公司合作,要把我们的应用安装在他们的服务器上,不过问题来了。他们为了他们自己服务器安全,不给我们root权限,只给了我们普通用户权限,所有的程序都要装在规定的路径里,限制可不少。没办法装吧~~~
 
    我登录到服务器上一看傻了,rpm -qa 一查 需要的包没装几个。一个个下源码包就装吧~~ 到源码站下载了一大堆包开始装,pcre openssl xml mhash mcrypt等等一步步开始装,磕磕绊绊少什么装什么终于装到了nginx 结果make的时候报错了:make -f objs/Makefile
make[1]: Entering directory `/data/source/nginx'
cd /usr/local/ufo/lib/pcre \
&& if [ -f Makefile ]; then make distclean; fi \
&& CC="gcc" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
./configure --disable-shared
/bin/sh: ./configure: No such file or directory
make[1]: *** [/usr/local/services/lib/pcre/Makefile] Error 127
make[1]: Leaving directory `/data/source/nginx-0.7.61'
make: *** [build] Error 2    我明明指定了 pcre的路径啊 我又仔细看了看路径是不是有问题!没问题啊,奇怪了我指定了路径怎么会 出现这样的过程呢 cd /usr/local/ufo/lib/pcre 他去安装目录 运行什么 ./configure 啊!
 
    这时我的一个同事仔细看了看 ./configure --help 然后让我看看下面这条
    原来是这样啊~~嗨--with-pcre force PCRE library usage
--with-pcre=DIR set path to PCRE library sources    原来这个路径指定的是 源码包所在的路径啊~~~晕,nginx为什么要去自己重现编译pcre 呢?

    指定源码包的路径吧 ./configure ...... --with-pcre=/data/source/pcre

    再次make OK 一切顺利,终于装上了。
 
    我在网上搜索的时候发现很多朋友遇到了这个问题,但是没有什么好的办法 (当然,因为没有root权限是没法安装rpm包的,其实只要装上pcre-devel包就好了)
    
    呵呵,希望遇到这种情况的朋友能看到我的这篇帖子O(∩_∩)O~
    原文地址:开源技术社区转载分享 查看全部
nginx_logo.png

    最近跟一个公司合作,要把我们的应用安装在他们的服务器上,不过问题来了。他们为了他们自己服务器安全,不给我们root权限,只给了我们普通用户权限,所有的程序都要装在规定的路径里,限制可不少。没办法装吧~~~
 
    我登录到服务器上一看傻了,rpm -qa 一查 需要的包没装几个。一个个下源码包就装吧~~ 到源码站下载了一大堆包开始装,pcre openssl xml mhash mcrypt等等一步步开始装,磕磕绊绊少什么装什么终于装到了nginx 结果make的时候报错了:
make -f objs/Makefile
make[1]: Entering directory `/data/source/nginx'
cd /usr/local/ufo/lib/pcre \
&& if [ -f Makefile ]; then make distclean; fi \
&& CC="gcc" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
./configure --disable-shared
/bin/sh: ./configure: No such file or directory
make[1]: *** [/usr/local/services/lib/pcre/Makefile] Error 127
make[1]: Leaving directory `/data/source/nginx-0.7.61'
make: *** [build] Error 2
    我明明指定了 pcre的路径啊 我又仔细看了看路径是不是有问题!没问题啊,奇怪了我指定了路径怎么会 出现这样的过程呢 cd /usr/local/ufo/lib/pcre 他去安装目录 运行什么 ./configure 啊!
 
    这时我的一个同事仔细看了看 ./configure --help 然后让我看看下面这条
    原来是这样啊~~嗨
--with-pcre                     force PCRE library usage
--with-pcre=DIR set path to PCRE library sources
    原来这个路径指定的是 源码包所在的路径啊~~~晕,nginx为什么要去自己重现编译pcre 呢?

    指定源码包的路径吧 ./configure ...... --with-pcre=/data/source/pcre

    再次make OK 一切顺利,终于装上了。
 
    我在网上搜索的时候发现很多朋友遇到了这个问题,但是没有什么好的办法 (当然,因为没有root权限是没法安装rpm包的,其实只要装上pcre-devel包就好了)
    
    呵呵,希望遇到这种情况的朋友能看到我的这篇帖子O(∩_∩)O~
    原文地址:开源技术社区转载分享

Mysql主从复制

数据库koyo 发表了文章 • 0 个评论 • 953 次浏览 • 2015-09-18 18:01 • 来自相关话题

一. mysql的主从原理

mysql主从架构是当前比较成熟的高可用架构,配置也比较简单。实现原理是:mysql主服务器将自己的操作记录例如增删改查等写入到binlog文件中去,而mysql从服务器,则开启两个线程
Slave_IO_Running和Slave_SQL_Running,IO线程是负责读取master的日志文件并写入到slave中的relay-log文件中,而sql线程则负责解析relay-log日志文件,将日志文件解析成
mysql从服务器可以执行的sql语句,写入到mysql从的库中,从而完成mysql的主从复制

二. mysql的基础知识

a. mysql中最常见的存储引擎为MyISAM和Innodb,其中innodb是支持事务,MyISAM不支持事务,支持事务是支持回归
b. myISAM中的每个库的每张表都会有3个文件.frm .myd .myi,其中frm文件为存放元数据信息,myd为存放数据,myi为存放索引的文件
c. innodb中如果是独享表空间的话,每个表一个ibd文件,而共享表空间的话,则所有表共同用ibdata文件
d. mysql主从复制中,在slave端存放的master.info文件是存放了该slave的master的相关信息,比如master机的IP,用户名,密码等信息而mysql-relay-bin文件是slave的IO线程从
master的binlog中读取到的信息,读取后在由slave的sql线程去解析此日志,并在slave端执行语句,完成主从复制,而relay-log.info文件和master.info文件的功能类似,此文件存放了
slave通过IO线程写入到slave的relay-log的相关信息
e. 在my.cnf配置文件中,有很多中括号,这里的每个中括号定义了针对每个组件使用的参数,例如mysqld组则是定义了mysql的启动参数,而mysqldump则是定义了在使用mysqldmp命令时要
用到的参数等等
f. mysql是一个模块化的组织结构,每个功能都是由相对应的功能模块来完成的,这里面有个query cache模块,就是完成了查询的缓存功能,当客户端提交了query请求后,如果服务器端在内
存中有此query的缓存结果则直接返回给客户端,如果没有缓存,则去执行此query 还有一个模块就是存储引擎模块,比如MyISAM和innodb在mysql中都是以模块的形式存在的,这个是mysql
独有的功能

三. mysql主从的实现

在主上的my.cnf文件中配置:

[mysqld]
log-bin=mysql-bin
server-id=1
在主上执行命令:
grant replication slave on [i].[/i] to 'sync'@'192.168.0.2' identified by '123456';
flush privileges;
show master status; 记录此命令打印出来的两个值
mysqldump -u root -p master> master.sql #备份master数据库,此命令在shell中执行在从上的my.cnf文件中配置:
[mysqld]
server-id=2
在从上执行命令:
此处的master_log_file和master_log_pos两个值就是show master status中打印出来的两个值
stop slave;
change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;
create database master;
mysql -u root -p master < master.sql #在从上导入master数据库,此命令在shell中执行
start slave;

四. mysql主从的验证

在从上执行命令:
show slave status; #如果显示 Slave_IO_Running和Slave_SQL_Running都是YES状态的话,则表明线程正常

五. MySQL主从同步实例 (这里的命令执行的位置不在标明)

背景: 两台MySQL配置了主从同步,由于MySQL从机的硬盘报警,现需要将MySQL从机迁移到一台新服务器上,两个MySQL都是5.1.37版本 迁移步骤:
[list=1]
[*]由于两台MySQL都是线上服务器,而且都已经在运行且实时同步,所以在迁移的过程中,既要不影响使用,又要保证数据的完整性[/*]
[*]在从机上操作(出故障的机器):[/*]
[/list] stop slave;
show slave status; #记录此处打印出的binlog的文件名和position两个值
scp -r /var/lib/mysql/db_monitor_service root@1.2.3.4:/usr/local/src
scp /etc/my.cnf root@1.2.3.4:/usr/local/src
[list=1]
[*]在需要重新部署从库的机器上操作:[/*]
[/list] 编译安装mysql5.1.37,且完成初始化和目录权限配置
在编译的时候,有一个地方需要注意,使用如下编译参数:
./configure --prefix=/usr/local/mysql5-3309 --enable-thread-safe-client --with-plugins=max-no-ndb --enable-assembler --with-tcp-port=3309 --
with-unix-socket-path=/usr/local/mysql5-3309/var/mysql.sock
在make的时候会有一个报错,解决这个错误需要修改Makefile文件,将文件的最后几行中的do_abi_check:后面的语句一直到done都全部删除,但do_abi_check:需要保留,保存后执行
make和make install安装
rm -f /etc/mysql/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbutu)
rm -f /etc/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbuntu) 初始化:/usr/local/mysql5-3309/bin/mysql_install_db --basedir=/usr/local/mysql5-3309 --datadir=/usr/local/mysql5-3309/var --user=mysql
mkdir /data1/var_3309/
chown -R mysql:mysql /data1/var_3309/启动MySQL: /usr/local/mysql5-3309/bin/mysqld_safe --defaults-file=/usr/local/mysql5-3309/etc/my.cnf停止MySQL: /usr/local/mysql5-3309/bin/mysqladmin -u root -p shutdown
mv /usr/local/src/db_monitor_service /var/lib/mysql/
mv /usr/local/src/my.cnf /etc/my.cnf
change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;
start slave;
show slave status; #验证可用性和数据的完整性通过select语句查看最新数据是否和主库完成了同步 查看全部


一. mysql的主从原理


mysql主从架构是当前比较成熟的高可用架构,配置也比较简单。
实现原理是:mysql主服务器将自己的操作记录例如增删改查等写入到binlog文件中去,而mysql从服务器,则开启两个线程 
Slave_IO_Running和Slave_SQL_Running,IO线程是负责读取master的日志文件并写入到slave中的relay-log文件中,而sql线程则负责解析relay-log日志文件,将日志文件解析成
mysql从服务器可以执行的sql语句,写入到mysql从的库中,从而完成mysql的主从复制


二. mysql的基础知识


a. mysql中最常见的存储引擎为MyISAM和Innodb,其中innodb是支持事务,MyISAM不支持事务,支持事务是支持回归 
b. myISAM中的每个库的每张表都会有3个文件.frm .myd .myi,其中frm文件为存放元数据信息,myd为存放数据,myi为存放索引的文件
c. innodb中如果是独享表空间的话,每个表一个ibd文件,而共享表空间的话,则所有表共同用ibdata文件
d. mysql主从复制中,在slave端存放的master.info文件是存放了该slave的master的相关信息,比如master机的IP,用户名,密码等信息而mysql-relay-bin文件是slave的IO线程从
master的binlog中读取到的信息,读取后在由slave的sql线程去解析此日志,并在slave端执行语句,完成主从复制,而relay-log.info文件和master.info文件的功能类似,此文件存放了
slave通过IO线程写入到slave的relay-log的相关信息
e. 在my.cnf配置文件中,有很多中括号,这里的每个中括号定义了针对每个组件使用的参数,例如mysqld组则是定义了mysql的启动参数,而mysqldump则是定义了在使用mysqldmp命令时要
用到的参数等等
f. mysql是一个模块化的组织结构,每个功能都是由相对应的功能模块来完成的,这里面有个query cache模块,就是完成了查询的缓存功能,当客户端提交了query请求后,如果服务器端在内
存中有此query的缓存结果则直接返回给客户端,如果没有缓存,则去执行此query 还有一个模块就是存储引擎模块,比如MyISAM和innodb在mysql中都是以模块的形式存在的,这个是mysql
独有的功能


三. mysql主从的实现


在主上的my.cnf文件中配置:

[mysqld]
log-bin=mysql-bin
server-id=1
在主上执行命令:
grant replication slave on [i].[/i] to 'sync'@'192.168.0.2' identified by '123456';
flush privileges;
show master status; 记录此命令打印出来的两个值
mysqldump -u root -p master> master.sql #备份master数据库,此命令在shell中执行
在从上的my.cnf文件中配置:
[mysqld]
server-id=2
在从上执行命令:
此处的master_log_file和master_log_pos两个值就是show master status中打印出来的两个值
stop slave;
change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;
create database master;
mysql -u root -p master < master.sql #在从上导入master数据库,此命令在shell中执行
start slave;


四. mysql主从的验证


在从上执行命令:
show slave status; #如果显示 Slave_IO_Running和Slave_SQL_Running都是YES状态的话,则表明线程正常


五. MySQL主从同步实例 (这里的命令执行的位置不在标明)


背景: 两台MySQL配置了主从同步,由于MySQL从机的硬盘报警,现需要将MySQL从机迁移到一台新服务器上,两个MySQL都是5.1.37版本 
迁移步骤:
[list=1]
[*]由于两台MySQL都是线上服务器,而且都已经在运行且实时同步,所以在迁移的过程中,既要不影响使用,又要保证数据的完整性[/*]
[*]在从机上操作(出故障的机器):[/*]
[/list] stop slave;
show slave status; #记录此处打印出的binlog的文件名和position两个值
scp -r /var/lib/mysql/db_monitor_service root@1.2.3.4:/usr/local/src
scp /etc/my.cnf root@1.2.3.4:/usr/local/src
[list=1]
[*]在需要重新部署从库的机器上操作:[/*]
[/list] 编译安装mysql5.1.37,且完成初始化和目录权限配置
在编译的时候,有一个地方需要注意,使用如下编译参数:
./configure --prefix=/usr/local/mysql5-3309 --enable-thread-safe-client --with-plugins=max-no-ndb --enable-assembler --with-tcp-port=3309 --
with-unix-socket-path=/usr/local/mysql5-3309/var/mysql.sock
在make的时候会有一个报错,解决这个错误需要修改Makefile文件,将文件的最后几行中的do_abi_check:后面的语句一直到done都全部删除,但do_abi_check:需要保留,保存后执行
make和make install安装
rm -f /etc/mysql/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbutu)
rm -f /etc/my.cnf #如果有就删掉,删之前确认此机器上没有别的mysql实例(unbuntu)
初始化:
/usr/local/mysql5-3309/bin/mysql_install_db --basedir=/usr/local/mysql5-3309 --datadir=/usr/local/mysql5-3309/var --user=mysql
mkdir /data1/var_3309/
chown -R mysql:mysql /data1/var_3309/
启动MySQL:
 /usr/local/mysql5-3309/bin/mysqld_safe --defaults-file=/usr/local/mysql5-3309/etc/my.cnf
停止MySQL:
 /usr/local/mysql5-3309/bin/mysqladmin -u root -p shutdown
mv /usr/local/src/db_monitor_service /var/lib/mysql/
mv /usr/local/src/my.cnf /etc/my.cnf
change master to master_host='192.168.0.1',master_user='sync',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=23;
start slave;
show slave status; #验证可用性和数据的完整性
通过select语句查看最新数据是否和主库完成了同步

elasticsearch配置文件详解

大数据/云计算OpenSkill 发表了文章 • 0 个评论 • 943 次浏览 • 2015-09-18 11:26 • 来自相关话题

elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。下面主要讲解下elasticsearch.yml这个文件中可配置的东西:

cluster.name: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。

node.name: "Franz Kafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。

node.master: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。

node.data: true
指定该节点是否存储索引数据,默认为true。

index.number_of_shards: 5
设置默认索引分片个数,默认为5片。

index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。

path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。

path.data: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
path.data: /path/to/data1,/path/to/data2

path.work: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。

path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹

path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹

bootstrap.mlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。

network.bind_host: 192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。


network.publish_host: 192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。

network.host: 192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。

transport.tcp.port: 9300
设置节点间交互的tcp端口,默认是9300。

transport.tcp.compress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。

http.port: 9200
设置对外服务的http端口,默认为9200。

http.max_content_length: 100mb
设置内容的最大容量,默认100mb

http.enabled: false
是否使用http协议对外提供服务,默认为true,开启。

gateway.type: local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。

gateway.recover_after_nodes: 1
设置集群中N个节点启动时进行数据恢复,默认为1。

gateway.recover_after_time: 5m
设置初始化数据恢复进程的超时时间,默认是5分钟。

gateway.expected_nodes: 2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。

cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化数据恢复时,并发恢复线程的个数,默认为4。

cluster.routing.allocation.node_concurrent_recoveries: 2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。

indices.recovery.max_size_per_sec: 0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。

indices.recovery.concurrent_streams: 5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。

discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)

discovery.zen.ping.timeout: 3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。

discovery.zen.ping.multicast.enabled: false
设置是否打开多播发现节点,默认是true。

discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。

下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace: 200ms 查看全部
es1.jpg
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。
下面主要讲解下elasticsearch.yml这个文件中可配置的东西:

cluster.name: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。

node.name: "Franz Kafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。

node.master: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。

node.data: true
指定该节点是否存储索引数据,默认为true。

index.number_of_shards: 5
设置默认索引分片个数,默认为5片。

index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。

path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。

path.data: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
path.data: /path/to/data1,/path/to/data2

path.work: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。

path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹

path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹

bootstrap.mlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。

network.bind_host: 192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0。


network.publish_host: 192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。

network.host: 192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。

transport.tcp.port: 9300
设置节点间交互的tcp端口,默认是9300。

transport.tcp.compress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。

http.port: 9200
设置对外服务的http端口,默认为9200。

http.max_content_length: 100mb
设置内容的最大容量,默认100mb

http.enabled: false
是否使用http协议对外提供服务,默认为true,开启。

gateway.type: local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。

gateway.recover_after_nodes: 1
设置集群中N个节点启动时进行数据恢复,默认为1。

gateway.recover_after_time: 5m
设置初始化数据恢复进程的超时时间,默认是5分钟。

gateway.expected_nodes: 2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。

cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化数据恢复时,并发恢复线程的个数,默认为4。

cluster.routing.allocation.node_concurrent_recoveries: 2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。

indices.recovery.max_size_per_sec: 0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。

indices.recovery.concurrent_streams: 5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。

discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)

discovery.zen.ping.timeout: 3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。

discovery.zen.ping.multicast.enabled: false
设置是否打开多播发现节点,默认是true。

discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。

下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace: 200ms

openstack nova集成docker

大数据/云计算Geek小A 发表了文章 • 0 个评论 • 1430 次浏览 • 2015-09-16 19:31 • 来自相关话题

    docker已经可以作为compute driver来使用,脱离了原来HEAT的模式,可以做到真正地使用nova来启动容器.这里记录一下openstack Kilo + docker 1.8的集成过程.所有组件环境基于centos7. 
架构图如下: 





安装docker

    在compute node节点上安装docker,强烈建议安装docker-engine 1.8,需要linux3.1的kernal版本,拥有较高的生产稳定性,并且有启动用户组,旧版的docker-io是没有用户组,集成的时候docker.sock的权限每次都是手工修改很不方便.# curl -sSL https://get.docker.com/ | sh
# usermod -aG docker nova
# systemctl enable docker.service
# systemctl start docker.service

安装novadocker

直接从github上clone安装# pip install -e git+https://github.com/stackforge/nova-docker#egg=novadocker
# cp -R src/etc/nova/rootwrap.d /etc/nova/
# chmod -R root.nova /etc/nova/rootwrap.d
# cd src/novadocker/
# python setup.py install

配置nova调用docker驱动

# vi /etc/nova/nova.conf
compute_driver = novadocker.virt.docker.DockerDriver

配置glance支持容器格式

# vi /etc/glance/glance-api.conf (修改后重启glance-api服务)
container_formats = ami,ari,aki,bare,ovf,docker

Fix bug设置

    由于novadocker开发的版本是基于nova比较新的版本,在现在发行的版本中使用会有一个BUG,下面是修复记录.
    
1.重启openstack-nova-compute服务时提示没有找到oslo_log模块# pip install oslo.log2.重启openstack-nova-compute服务时提示没有找到hv_type模块通过代码定位发现目前的版本中模块是nova.compute.hvtype
修改/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py
把from nova.compute import hv_type 改为 from nova.compute import hvtype3.直接导入driver测试提示报错,CONF没有’my_ip’这个opt配置通过代码排查发现目前的openstack是使用oslo.config这个模块包来做cfg的导入和导出
但是在novadocker整个项目里面使用的oslo_config这个独立的模块
修改driver.py, client.py, hostinfo.py, vifs.py模块
from oslo_config import cfg 改为 from oslo.config import cfg4.直接导入driver测试提示继续报错,没有找到hvtype.DOCKER属性修改 /usr/lib/python2.7/site-packages/nova/compute/hvtype.py
在# specific ‘baremetal’ & ‘fake’ then added in.下面增加
DOCKER=’docker’    此时启动openstack-nova-compute已经正常

glance导入docker镜像

# docker pull hipache
# docker save hipache | glance image-create --is-public=True --container-format=docker --disk-format=raw --name hipache    需要注意的是glance导入后的名字一定要和docker images下显示的名字一模一样,否则创建时会提示无法找到镜像

启动容器实例

nova boot --image hipache --flavor 1 --nic net-id=342a0eef-e03d-4fd8-af3c-1ed485bee989 docker



1.此时启动容器实例报错失败,从nova-compute.log的日志看异常信息是”attach vif error”,具体是无法使用nova-rootwrap来提权进入namespace创建实例的网络接口google找到的这个BUG的解决是禁用compute节点的selinux2.继续下一个BUG,日志抛出一个Python异常是没有找到hardware.InstanceInfo模块进入目录/usr/lib/python2.7/site-packages/nova/virt
查看hardware.py的代码的确没有找到这个类或者函数,在github上找到nova项目的最新代码可以看到是有的.



把这个类的代码复制到本地的hardware.py里面
 
3.重启启动一个实例后,异常继续保持 



异常提示InstanceInfo没有getitem这个内置方法
根据driver.py里面的调用可以发现get_info调用的时候是hardware.InstanceInfo是返回一个字典
删除刚才在hardware.py复制的代码,重写InstanceInfodef InstanceInfo(state=None, max_mem_kb=0, mem_kb=0, num_cpu=0,cpu_time_ns=0, id=None):
Info={}
Info['state'] = state
Info['max_mem_kb'] = max_mem_kb
Info['self.mem_kb'] = mem_kb
Info['num_cpu'] = num_cpu
Info['cpu_time_ns'] = cpu_time_ns
Info['id'] = id
return Info此时启动实例正常无报错[root@openstack-k ~]# nova list
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
| c9d7ef23-f0fe-488d-88b1-3b5650901820 | hipache | ACTIVE | - | Running | admin_private=192.168.0.101, 172.24.4.228 |
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
[root@openstack-k ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14583d5d6308 hipache "supervisord -n" 5 hours ago Up 5 hours nova-c9d7ef23-f0fe-488d-88b1-3b5650901820
[root@openstack-k ~]#参考连接:https://wiki.openstack.org/wiki/Docker
http://docs.docker.com/installation/centos/
https://bugs.launchpad.net/nova-docker/+bug/1480246
https://github.com/openstack/nova/
https://github.com/stackforge/nova-docker原文链接:原文地址 查看全部
opdock1.png

    docker已经可以作为compute driver来使用,脱离了原来HEAT的模式,可以做到真正地使用nova来启动容器.这里记录一下openstack Kilo + docker 1.8的集成过程.所有组件环境基于centos7. 
架构图如下: 
openstack1.png


安装docker


    在compute node节点上安装docker,强烈建议安装docker-engine 1.8,需要linux3.1的kernal版本,拥有较高的生产稳定性,并且有启动用户组,旧版的docker-io是没有用户组,集成的时候docker.sock的权限每次都是手工修改很不方便.
# curl -sSL https://get.docker.com/ | sh
# usermod -aG docker nova
# systemctl enable docker.service
# systemctl start docker.service


安装novadocker


直接从github上clone安装
# pip install -e git+https://github.com/stackforge/nova-docker#egg=novadocker
# cp -R src/etc/nova/rootwrap.d /etc/nova/
# chmod -R root.nova /etc/nova/rootwrap.d
# cd src/novadocker/
# python setup.py install


配置nova调用docker驱动


# vi /etc/nova/nova.conf
compute_driver = novadocker.virt.docker.DockerDriver


配置glance支持容器格式


# vi /etc/glance/glance-api.conf (修改后重启glance-api服务)
container_formats = ami,ari,aki,bare,ovf,docker


Fix bug设置


    由于novadocker开发的版本是基于nova比较新的版本,在现在发行的版本中使用会有一个BUG,下面是修复记录.
    
1.重启openstack-nova-compute服务时提示没有找到oslo_log模块
# pip install oslo.log
2.重启openstack-nova-compute服务时提示没有找到hv_type模块
通过代码定位发现目前的版本中模块是nova.compute.hvtype 
修改/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py
把from nova.compute import hv_type 改为 from nova.compute import hvtype
3.直接导入driver测试提示报错,CONF没有’my_ip’这个opt配置
通过代码排查发现目前的openstack是使用oslo.config这个模块包来做cfg的导入和导出 
但是在novadocker整个项目里面使用的oslo_config这个独立的模块
修改driver.py, client.py, hostinfo.py, vifs.py模块
from oslo_config import cfg 改为 from oslo.config import cfg
4.直接导入driver测试提示继续报错,没有找到hvtype.DOCKER属性
修改 /usr/lib/python2.7/site-packages/nova/compute/hvtype.py 
在# specific ‘baremetal’ & ‘fake’ then added in.下面增加
DOCKER=’docker’
    此时启动openstack-nova-compute已经正常


glance导入docker镜像


# docker pull hipache
# docker save hipache | glance image-create --is-public=True --container-format=docker --disk-format=raw --name hipache
    需要注意的是glance导入后的名字一定要和docker images下显示的名字一模一样,否则创建时会提示无法找到镜像


启动容器实例


nova boot --image hipache --flavor 1 --nic net-id=342a0eef-e03d-4fd8-af3c-1ed485bee989 docker
openstack2.png

1.此时启动容器实例报错失败,从nova-compute.log的日志看异常信息是”attach vif error”,具体是无法使用nova-rootwrap来提权进入namespace创建实例的网络接口
google找到的这个BUG的解决是禁用compute节点的selinux
2.继续下一个BUG,日志抛出一个Python异常是没有找到hardware.InstanceInfo模块
进入目录/usr/lib/python2.7/site-packages/nova/virt 
查看hardware.py的代码的确没有找到这个类或者函数,在github上找到nova项目的最新代码可以看到是有的.
openstack3.png

把这个类的代码复制到本地的hardware.py里面
 
3.重启启动一个实例后,异常继续保持 
openstack4.png
异常提示InstanceInfo没有getitem这个内置方法 
根据driver.py里面的调用可以发现get_info调用的时候是hardware.InstanceInfo是返回一个字典
删除刚才在hardware.py复制的代码,重写InstanceInfo
def InstanceInfo(state=None, max_mem_kb=0, mem_kb=0, num_cpu=0,cpu_time_ns=0, id=None):
Info={}
Info['state'] = state
Info['max_mem_kb'] = max_mem_kb
Info['self.mem_kb'] = mem_kb
Info['num_cpu'] = num_cpu
Info['cpu_time_ns'] = cpu_time_ns
Info['id'] = id
return Info
此时启动实例正常无报错
[root@openstack-k ~]# nova list
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
| c9d7ef23-f0fe-488d-88b1-3b5650901820 | hipache | ACTIVE | - | Running | admin_private=192.168.0.101, 172.24.4.228 |
+--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+
[root@openstack-k ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14583d5d6308 hipache "supervisord -n" 5 hours ago Up 5 hours nova-c9d7ef23-f0fe-488d-88b1-3b5650901820
[root@openstack-k ~]#
参考连接:
https://wiki.openstack.org/wiki/Docker 
http://docs.docker.com/installation/centos/
https://bugs.launchpad.net/nova-docker/+bug/1480246
https://github.com/openstack/nova/
https://github.com/stackforge/nova-docker
原文链接:原文地址