Elasticsearch搜索系统线上部署配置规划

2023-11-11

问题导读:

1.es安装包的目录结构是怎样的?
2. zen discovery集群发现机制的设置规划及其原理是怎样的?
3. es默认参数调优如何进行?


1. ES部署须知

1.1 包结构

es安装包的目录结构大致如下:
 

  • bin:存放es的一些可执行脚本,比如用于启动进程的elasticsearch命令,以及用于安装插件的elasticsearch-plugin插件
  • conf:用于存放es的配置文件,比如elasticsearch.yml
  • data:用于存放es的数据文件,就是每个索引的shard的数据文件
  • logs:用于存放es的日志文件
  • plugins:用于存放es的插件
  • script:用于存放一些脚本文件


1.2 zen discovery集群发现机制
 

  • 默认情况下,es进程会绑定在自己的回环地址上,也就是127.0.0.1,然后扫描本机上的9300~9305端口号,尝试跟那些端口上启动的其他es进程进行通信,然后组成一个集群。这对于在本机上搭建es集群的开发环境是很方便的。但是对于生产环境下的集群是不行的,需要将每台es进程绑定在一个非回环的ip地址上,才能跟其他节点进行通信,同时需要使用集群发现机制来跟其他节点上的es node进行通信。

 

1

2

3

elasticsearch.yml

network.host:服务主机ip

http.port:9200


 

  • 在生产环境中的多台机器上部署es集群,就涉及到了es的discovery机制,也就是集群中各个节点互相发现然后组成一个集群的机制,同时discovery机制也负责es集群的master选举。

 

  • ES是一种peer to peer,也就是p2p点对点的分布式系统架构,不是hadoop生态普遍采用的那种master-slave主从架构的分布式系统。集群中的每个node是直接跟其他节点进行通信的,而不是hadoop生态系统中的那种master-slave分布式系统架构。几乎所有的API操作,比如index,delete,search,等等,都不是说client跟master通信,而是client跟任何一个node进行通信,那个node再将请求转发给对应的node来进行执行。

 

  • 两个角色,master node,data node。正常情况下,就只有一个master node。master node的责任就是负责维护整个集群的状态信息,也就是一些集群元数据信息,同时在node加入集群或者从集群中下线时,重新分配shard,或者是创建或删除了一个索引。包括每次cluster state如果有改变的化,那么master都会负责将集群状态同步给所有的node。

 

  • master node负责接收所有的cluster state相关的变化信息,然后将这个改变后的最新的cluster state推动给集群中所有的data node,集群中所有的node都有一份完整的cluster state。只不过master node负责维护而已。其他的node,除了master之外的node,就是负责数据的存储和读写的,写入索引,搜索数据,data node。

 

  • 如果要让多个node组成一个es集群,首先第一个要设置的参数,就是cluster.name,多个node的cluster.name如果一样,才满足组成一个集群的基本条件。这个cluster.name的默认值是elasticsearch,在生产环境中,一定要修改这个值,否则可能会导致未知的node无端加入集群,造成集群运行异常。

 

1

2

3

elasticsearch.yml

cluster.name:cluster-elasticearch-prod

node.name:node-01


 

  • 而es中默认的discovery机制,就是zen discovery机制,zen discovery机制提供了unicast discovery集群发现机制,集群发现时的节点间通信是依赖的transport module,也就是es底层的网络通信模块和协议。

 

  • es默认配置为使用unicast集群发现机制,以让经过特殊配置的节点可以组成一个集群,而不是随便哪个节点都可以组成一个集群。但是默认配置下,unicast是本机,也就是localhost,因此只能在一台机器上启动多个node来组成一个集群。

 

  • 虽然es还是会提供multicast plugin作为一个发现机制,但是已经不建议在生产环境中使用了。虽然我们可能想要multicast的简单性,就是所有的node可以再接收到一条multicast ping之后就立即自动加入集群。但是multicast机制有很多的问题,而且很脆弱,比如网络有轻微的调整,就可能导致节点无法发现对方。

 

  • 因此现在建议在生产环境中用unicast机制,提供一个es种子node作为中转路由节点就可以了。


1.3 zen discovery集群设置规划
 

  • 给集群规划出专门的master eligible node和data node
  • master node,master eligible node,data node
  • 你配置的时候,是配置多个node变成master eligible node,但是只是说,从这些master eligible node选举一个node出来作为master node,其他master eligible node只是接下来有那个master node故障的时候,接替他的资格,但是还是作为data node去使用的
  • 一般建议master eligible node给3个即可:node.master: true,node.data: false
  • 剩下的node都设置为data node:node.master: false,node.data: true
  • 但是如果一个小集群,就10个以内的节点,那就所有节点都可以作为master eligible node以及data node即可,超过10个node的集群再单独拆分master和data node吧,如果你的节点数量小于10个,小集群,那所有的node,就不要做额外的配置了,master eligible node,同时也是data node
  • 默认情况下,es会将自己绑定到127.0.0.1上,对于运行一个单节点的开发模式下的es是ok的。但是为了让节点间可以互相通信以组成一个集群,需要让节点绑定到一个ip地址上,非会换的地址,一般会配置:network.host: 192.168.1.10。一旦我们配置了network.host,那么es就会认为我们从开发模式迁移到生产模式,同时会启用一系列的bootstrap check。


1.4 zen discovery发现机制原理

1.4.1 ping机制

ping是一个node用discovery机制来发现其他node的一个过程。

1.4.2 unicast机制
 

  • unicast discovery集群发现机制是要求配置一个主机列表,用来作为gossip(流言式)通信协议的路由器。这些机器如果通过hostname来指定,那么在ping的时候会被解析为ip地址。unicast discovery机制最重要的两个配置如下所示:
  • hosts:用逗号分割的主机列表
  • hosts.resolve_timeout:hostname被DNS解析为ip地址的timeout等待时长
  • 简单来说,如果要让多个节点发现对方并且组成一个集群,那么就得有一个中间的公共节点,然后不同的节点就发送请求到这些公共节点,接着通过这些公共节点交换各自的信息,进而让所有的node感知到其他的node存在,并且进行通信,最后组成一个集群。这就是基于gossip流言式通信协议的unicast集群发现机制。
  • 当一个node与unicast node list中的一个成员通信之后,就会接收到一份完整的集群状态,这里会列出集群中所有的node。接着那个node再通过cluster state跟master通信,并且加入集群中。这就意味着,我们的unicast list node是不需要列出集群中的所有节点的。只要提供少数几个node,比如3个,让新的node可以连接上即可。如果我们给集群中分配了几个节点作为专门的master节点,那么只要列出我们那三个专门的master节点即可。

 

1

2

elasticsearch.yml

discovery.zen.ping.unicast.hosts: ["host1", "host2"]



1.4.3 unicast机制总体流程

(1)初步配置好后,各个节点,首先通过network.host绑定到了非回环的ip地址,从而可以跟其他节点通信
(2)通过discovery.zen.ping.unicast.hosts配置了一批unicast中间路由的node
(3)所有node都可以发送ping消息到路由node,再从路由node获取cluster state回来
(4)接着所有node会选举出一个master
(5)所有node都会跟master进行通信,然后加入master的集群
(6)要求cluster.name必须一样,才能组成一个集群
(7)node.name就标识出了每个node我们自己设置的一个名称

1.4.4 master选举
 

  • 在ping发现过程中,为集群选举出一个master也是很重要的,es集群会自动完成这个操作。这里建议设置discovery.zen.ping_timeout参数(默认是3s),如果因为网络慢或者拥塞,导致master选举超时,那么可以增加这个参数,确保集群启动的稳定性。
  • 在完成一个集群的master选举之后,每次一个新的node加入集群,都会发送一个join request到master node,可以设置discovery.zen.join_timeout保证node稳定加入集群,增加join的timeout等待时长,如果一次join不上,默认会重试20次。
  • 如果master node被停止了,或者自己宕机了,那么集群中的node会再次进行一次ping过程,并且选举出一个新的master。如果discovery.zen.master_election.ignore_non_master_pings设置为了true,那么会强制区分master候选节点,如果node的node.master设置为了false,还来发送ping请求参与master选举,那么这些node会被忽略掉,因为他们没有资格参与。
  • discovery.zen.minimum_master_nodes参数用于设置对于一个新选举的master,要求必须有多少个master候选node去连接那个新选举的master。而且还用于设置一个集群中必须拥有的master候选node。如果这些要求没有被满足,那么master node就会被停止,然后会重新选举一个新的master。这个参数必须设置为我们的master候选node的quorum数量。一般避免说只有两个master候选node,因为2的quorum还是2。如果在那个情况下,任何一个master候选节点宕机了,集群就无法正常运作了。


1.4.5 集群故障的探查
 

  • es有两种集群故障探查机制,第一种是通过master进行的,master会ping集群中所有的其他node,确保它们是否是存活着的。第二种,每个node都会去ping master node来确保master node是存活的,否则就会发起一个选举过程。

 

  • 有下面三个参数用来配置集群故障的探查过程:

 

1

2

3

ping_interval:每隔多长时间会ping一次node,默认是1s

ping_timeout:每次ping的timeout等待时长是多长时间,默认是30s

ping_retries:如果一个node被ping多少次都失败了,就会认为node故障,默认是3



1.4.6 集群状态更新
 

  • master node是集群中唯一一个可以对cluster state进行更新的node。master node每次会处理一个集群状态的更新事件,应用这次状态更新,然后将更新后的状态发布到集群中所有的node上去。每个node都会接收publish message,ack这个message,但是不会应用这个更新。如果master没有在discovery.zen.commit_timeout指定的时间内(默认是30s),从至少discovery.zen.minimum_master_nodes个节点获取ack响应,那么这次cluster state change事件就会被reject,不会应用。

 

  • 但是一旦在指定时间内,指定数量的node都返回了ack消息,那么cluster state就会被commit,然后一个message会被发送给所有的node。所有的node接收到那个commit message之后,接着才会将之前接收到的集群状态应用到自己本地的状态副本中去。

 

  • 接着master会等待所有节点再次响应是否更新自己本地副本状态成功,在一个等待超时时长内,如果接收到了响应,那么就会继续处理内存queue中保存的下一个更新状态。discovery.zen.publish_timeout默认是30s,这个超时等待时长是从plublish cluster state开始计算的。


1.4.6 master宕机阻塞策略配置
 

  • 如果要让集群正常运转,那么必须有一个master,还有discovery.zen.minimum_master_nodes指定数量的master候选node,都在运行。discovery.zen.no_master_block可以控制当master宕机时,什么样的操作应该被拒绝。有下面两个选项:

 

1

2

all:一旦master宕机,那么所有的操作都会被拒绝

write:这是默认的选项,所有的写操作都会被拒绝,但是读操作是被允许的



2 默认参数调优

2.1 集群名称和节点名称

默认情况下,es会启动一个名称为elasticsearch的集群。通常建议一定要将自己的集群名称重新进行命名,主要是避免公司网络环境中,也许某个开发人员的开发机会无意中加入你的集群。比如说将你的集群名称命名为elasticsearch_production。在elasticsearch.yml中,可以设置集群名称:cluster.name: elasticsearch_production。

2.2 默认参数

es的默认参数是非常好的,适合绝大多数的情况,尤其是一些性能相关的配置。因此刚开始部署一个生产环境下的es集群时,几乎所有的配置参数都可以用默认的设置。有很多的生产环境场景下,都是因为es集群管理人员自己去调整es的某些配置,结果导致集群出现了严重的故障,那些es集群管理员甚至还以为做出那些调节可以将es性能提升一百倍以上。但是,采用SSD盘不会差。

2.3 文件路径
 

  • 默认情况下,es会将plugin,log,还有data ,config,file都放在es的安装目录中。这有一个问题,就是在进行es升级的时候,可能会导致这些目录被覆盖掉。导致我们丢失之前安装好的plugin,已有的log,还有已有的数据,以及配置好的配置文件。

 

  • 所以一般建议在生产环境中,必须将这些重要的文件路径,都重新设置一下,放在es安装目录之外。path.data用于设置数据文件的目录,path.logs用于设置日志文件的目录,path.plugins用于设置插件存放的目录。

 

  • path.data可以指定多个目录,用逗号分隔即可。如果多个目录在不同的磁盘上,那么这就是一个最简单的RAID 0的方式,将数据在本地进行条带化存储了,可以提升整体的磁盘读写性能。es会自动将数据在多个磁盘的多个目录中条带化存储数据。

 

  • 一般建议的目录地址是:

 

01

02

03

04

05

06

07

08

09

10

11

mkdir -p /var/log/elasticsearch

mkdir -p /var/data/elasticsearch

mkdir -p /var/plugin/elasticsearch

mkdir -p /etc/elasticsearch

 

elasticsearch.yml

path.logs: /var/log/elasticsearch

path.data: /var/data/elasticsearch

path.plugins: /var/plugin/elasticsearch

 

config:/etc/elasticsearch


 

  • 在RAID 0的存储级别下,每个磁盘上会存储一部分数据,但是如果一个磁盘故障了,那么可能导致这台机器上的部分数据就丢失了。如果我们的es是有replica的,那么在其他机器上还是会有一份副本的。
  • 如果data file指定了多个目录,为了尽量减少数据丢失的风险,es会将某个shard的数据都分配到一个磁盘上去。这就意味着每个shard都仅仅会放在一个磁盘上。es不会将一个shard的数据条带化存储到多个磁盘上去,因为如果一个磁盘丢失了,就会导致整个shard数据丢失。
  • 但是这又引入了性能的问题,如果我们给一个机器添加更多的磁盘来提升单个索引的读写性能,是没有效果的。因为这个索引在这个机器上的shard仅仅存在于一个磁盘上。因此data file指定多个目录,仅仅对于你的一台机器上存储了多个index的多个shard时,才会有效果的。因为不同index的shard可能就被存储到不同的磁盘上去了,对多个index的shard读写可以走不同磁盘,提升了性能。
  • 虽然multiple data path是一个很有用的功能,但是es毕竟不是一个专门的RAID软件。如果我们要对RAID存储策略进行更多的配置,提高存储的健壮性以及灵活性,还是要用专门的RAID软件来进行机器的磁盘数据存储,而不是用multiple data path策略。综上所述,multiple data path功能在实际的生产环境中,其实是较少使用的。


2.4 配置文件目录

es有两个配置文件,elasticsearch.yml,用于配置es,还有一个log4j.properties用来配置es日志打印。这些文件都被放在config目录下,默认就是ES_HOME/config。可以通过下面的命令来重新设置:

1

./bin/elasticsearch -Epath.conf=/path/to/my/config/。



配置文件的格式是yaml格式的,比如下面这种格式:

1

2

3

4

5

6

path:

    data: /var/lib/elasticsearch

    logs: /var/log/elasticsearch

         

path.data: /var/lib/elasticsearch

path.logs: /var/log/elasticsearch



2.5 日志配置
 

  • es使用log4j2来记录日志,log4j2可以通过log4j2.properties文件来进行配置。比如下面的这份配置文件:


  

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

appender.rolling.type = RollingFile

  appender.rolling.name = rolling

  appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log

  appender.rolling.layout.type = PatternLayout

  appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n

  appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log

  appender.rolling.policies.type = Policies

  appender.rolling.policies.time.type = TimeBasedTriggeringPolicy

  appender.rolling.policies.time.interval = 1

  appender.rolling.policies.time.modulate = true

 

  appender.rolling.type = RollingFile,就配置了appender类型是RollingFile

   

  appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log,就配置了日志路径是/var/log/elasticsearch/production.log

   

  appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log,就配置了将日志每天写一份到/var/log/elasticsearch/production-2017-01-01.log文件中

   

  appender.rolling.policies.time.type = TimeBasedTriggeringPolic,这里配置了用基于时间的roll策略

   

  appender.rolling.policies.time.interval = 1,这个设置了每天一份日志文件

   

  appender.rolling.policies.time.modulate = true,这个设置了根据自然天来划分文件,而不是24小时


还可以配置将日志文件保留一段时间内,同时删除之前的日志文件

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

appender.rolling.strategy.type = DefaultRolloverStrategy

 appender.rolling.strategy.action.type = Delete

 appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}

 appender.rolling.strategy.action.condition.type = IfLastModified

 appender.rolling.strategy.action.condition.age = 7D

 appender.rolling.strategy.action.PathConditions.type = IfFileName

 appender.rolling.strategy.action.PathConditions.glob = ${sys:es.logs.cluster_name}-*

 

 第一行是配置了默认的DefaultRolloverStrategy

 第二行是配置了Delete action,在rollover之后,就会删除文件

 第三行是配置了es log的基础路径

 第四行是配置了rollover发生的条件,是基于IfLastModified

 第五行是配置了保留的天数,这里是7

 第六行是配置了删除匹配7天前的文件

 第七行是配置了一个删除文件的格式,这样就只是删除过期日志文件,但是不要删除慢查询日志

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch搜索系统线上部署配置规划 的相关文章

  • AWS Elasticsearch 和 CORS

    我正在试用 AWS Elasticsearch 服务 https aws amazon com elasticsearch service https aws amazon com elasticsearch service 设置非常简单
  • 未能向 master 发送加入请求

    我使用的是elasticsearch版本1 3 0 重启数据节点后 无法检测到主节点 我收到错误failed to send join request to master 在错误日志中 app101 dGRBqTFTQfae76IFCjsM
  • 将 pandas 数据框索引到 Elasticsearch 中,无需使用 elasticsearch-py

    我想将一堆大型 Pandas 数据帧 大约数百万行和 50 列 索引到 Elasticsearch 中 在寻找如何执行此操作的示例时 大多数人会使用elasticsearch py 的批量辅助方法 https elasticsearch p
  • 使elasticsearch中的所有对象嵌套对象

    是否可以让elasticsearch中的所有嵌套对象自动映射到默认嵌套的类型 而不是对象 是的 您可以使用以下方法来做到这一点动态模板 https www elastic co guide en elasticsearch referenc
  • match_none 有什么用?

    我浏览了docs https www elastic co guide en elasticsearch reference current query dsl match all query html query dsl match no
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • 如何在 kibana 中自动配置索引模式

    是否可以在 kibana 中自动配置索引模式 要么通过一些设置文件 要么通过rest api 安装后可以手动完成 Kibana 5 x 公开了这样的 API 来管理索引模式 要创建索引模式 可以发出以下命令来 kibana 访问 url 只
  • 弹性搜索模糊匹配,精确匹配首先显示

    我想在查询中使用模糊匹配 但精确匹配显示在结果的顶部 我已经尝试过以下方法 return this gt client gt search array index gt self INDEX type gt self TYPE body g
  • ElasticSearch JavaAPI (SearchScroll)- search_context_missing_exception","re​​ason":"找不到 id 的搜索上下文

    我正在获取超过100k使用一个索引中的文档searchScroll并在所有字段中再添加一个字段100K文件 然后再次将这些文档插入到另一个新索引中 我正在使用SearchScrollapi 也在设置大小searchSourceBuilder
  • Elasticsearch:如何查询连接数?

    如何询问我的 Elasticsearch 服务器现在有多少个连接 这与插座数量相同吗 我也不知道如何获得这些数字 这与客户端的数量不同 对吧 因为每个客户端可能打开多个连接 找不到任何相关信息 但我确实发现您可以在 Elasticsearc
  • 全文搜索 DynamoDB

    以下情况 我正在为我的客户将元素存储在 DyanmoDb 中 HashKey 是元素 ID Range Key 是客户 ID 除了这些字段之外 我还存储一个字符串数组 gt 标签 例如 Pets House 和多行文本 我想在我的应用程序中
  • 在 Elastic 搜索中加载示例数据集时出错

    您好 我正在尝试加载示例数据集参考弹性搜索文档 https www elastic co guide en elasticsearch reference current exploring your data html但是当我尝试运行指示
  • 我们可以同时使用拼音标记和同义词吗?

    我正在尝试同时启用语音分析器和同义词 这似乎不起作用 它们一起使用有错吗 在下面的实现中 我希望使用同义词转换搜索查询 然后使用语音分析器来检索结果 但我的同义词在这里完全被忽略了 如果我在创建索引时删除语音分析器 那么同义词就可以正常工作
  • 无法使用 java 8 在 Windows 10 上安装 elasticsearch 5.1.1

    我正在尝试在安装了 java 8 111 的 Windows 10 笔记本电脑上安装 ElasticSearch 5 1 1 当我尝试安装 Elastic search 时触发错误 C Users 用户名 Downloads elastic
  • 如何使用ElasticSearch来实现社交搜索?

    我正在尝试使用 ElasticSearch 创建具有社交功能的商业搜索 我有一个企业目录 用户可以通过不同的方式与这些企业进行交互 通过查看它们 检查它们等 当用户搜索商家时 我希望能够在结果顶部向他们显示他们的朋友与之互动过的商家 或根据
  • 弹性搜索 - search_after 参数

    我读了这个doc https www elastic co guide en elasticsearch reference 5 0 search request search after html要理解 search after 并有两个
  • Elastic Beanstalk 添加多个 ssl 证书

    我有一个 Docker Django api 应用程序 可以从多个域 abc xyx com 或 def lmn com 调用 我已从 Elastic beanstalk 中的配置控制台成功添加了 abc xyz com 的 ssl 证书
  • ElasticSearch 映射对分组文档进行折叠/执行操作的结果

    有一个对话列表 每个对话都有一个消息列表 每条消息都有不同的字段和action场地 我们需要考虑到在对话的第一条消息中使用了动作A 在几条消息之后有使用的动作A 1过了一会儿A 1 1等等 有一个聊天机器人意图列表 对对话的消息操作进行分组
  • NEST 1.0:请参阅 Fiddler 上的请求

    我刚刚更新到 NEST 1 0 我在远程服务器 不是本地主机 上有 Elastic Search 通常我在使用 Fiddler 发送和接收请求时没有任何问题 更新后 bammm 没有检测到任何请求 但我的应用程序发出这些请求没有任何问题 你
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re

随机推荐

  • 等保2.0.2021版综合测评得分计算实例

    文章目录 公式回顾 单个测评对象的计算 多个测评对象的计算 小结 未经许可 严禁转载 公式输入请参考 在线Latex公式 接上篇的 等保2 0 2021版等级测评报告模板修订总结 这次根据一个实际案例来看看2021版综合测评得分如何计算 2
  • 搭建学校oj平台-后端设置JWT与用户操作

    后端设置JWT与用户操作 gitee仓库代码在文章尾部 Mysql新建user表 create table user id int auto increment username varchar 100 null password varc
  • 【unity3D】TimeLine(详细图解)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇关于unity的TimeLine TimeLine 介绍 打开TimeLine面板的方式 创建TimeLine 创建Track的两种方式 Track的详解 Ti
  • win10使用技巧02--系统端口被占用怎么查看

    1 打开命令提示符 管理员模式 2 输入netstat ano命令 回车后 能看到所有端口的情况 3 如果我们知道具体的端口号的话 输入netstat aon findstr 8080 其中8080加英文双引号 按回车键就可以找到占用808
  • Spark环境搭建(保姆级教程)

    文章目录 一 环境准备 二 Spark环境搭建 1 Spark部署方式 2 安装spark 1 下载Spark 关于版本的选择 2 安装Spark 上传安装包 解压并创建软链接 Spark的目录结构 配置环境变量 配置Hadoop信息 修改
  • 飞行姿态解算(三)

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情
  • CSS响应式设计——(视口/网格视图/媒体查询/图像/视频)看这一篇就够了

    目录 响应式网页设计 简介 什么是响应式网页设计 为所有用户获得最佳体验的设计 响应式网页设计 视口 什么是视口 设置视口 把内容调整到视口的大小 响应式网页设计 网格视图 什么是网格视图 构建响应式网格视图 实例 CSS CSS HTML
  • windows 使用 wget——Wget for windows

    wget是一个强力方便的命令行下的下载工具 windows 如果使用需要安装 Wget for windows 地址 Link 下载压缩包 ZIP 解压到一个常用的安装位置 然后按照下面的步骤 配置环境变量 系统属性 此电脑右击选择属性 左
  • Vim安装配置和常用技巧

    第一章 安装 在命令行运行vim 如果找不到程序 需要自己安装 1 1 下载 从官方网站ftp ftp vim org pub vim unix 中选择一个版本下载 我这里使用的是vim 7 3 tar bz2 1 2 解压程序 tar x
  • 如何用js动态添加css

    转自 微点阅读 https www weidianyuedu com 为了节省代码和写出更兼容的代码 有时我们需要用Javascript动态的增加CSS样式 IE下 我们可以使用 document createStyleSheet 方法 而
  • C/C++实现strstr函数、KMP算法查找子串

    C C 实现strstr KMP算法查找子串 目录 C C 实现strstr KMP算法查找子串 1 字符串形式 2 字节流形式 1 字符串形式 代码实现 char my strstr const char src const char d
  • 反射改进简单工厂(含代码)

    一 简单工厂代码 父类Car public class Car public void CreateCar 子类ElectricityCar public class ElectricityCar extends Car Override
  • 使用mysql数据库与go进行交互

    database sql database sql是golang的标准库之一 它提供了一系列接口方法 用于访问关系数据库 它并不会提供数据库特有的方法 那些特有的方法交给数据库驱动去实现 database sql库提供了一些type 这些类
  • 线性代数(2)——矩阵

  • [完]机器学习实战 第十四章 利用SVD简化数据

    本章内容 SVD矩阵分解 推荐引擎 利用SVD提升推荐引擎的性能 餐馆可分为很多类别 不同的专家对其分类可能有不同依据 实际中 我们可以忘掉专家 从数据着手 可对记录用户关于餐馆观点的数据进行处理 并从中提取出其背后的因素 这些因素可能会与
  • 快速排序算法 (c/c++)

    快速排序 QuickSort Code 1 中间元素为基准 Code 1示例结果 Code 2 第一元素为基准 Code 2示例结果 算法分析 QuickSort 通过一趟排序将要排序的数据分隔成独立的两部分 其中一部分的所有数据都要比另一
  • Mental ray 渲染器常用设置

    Mental ray 渲染器常用设置 Mental ray是一个专业的3D渲染引擎 它可以生成令人难以置信的高质量真实感图象 现在你可以在3D Studio的高性能网络渲染中直接控制Mental ray 它在电影领域得到了广泛的应用和认可
  • 用python怎样做学生管理系统用类的形式-Python配置管理的几种方式

    一 为什么要使用配置 如果我们在较复杂的项目中不使用配置文件 我们可能会面临下面的情况 你决定更改你的项目中数据库的 host 因为你要将项目从测试环境转移到实际的上产环境中 如果你的项目中多个位置用到了这个 host 那你不得不一个一个找
  • CS336视觉伺服

    笔记 动力学模型 机械臂动力学的研究方法 拉格朗日 牛顿 欧拉 高斯 凯恩方法 机械臂的动力学主要是两个问题 正向运动学和逆向运动学 视觉伺服 视觉伺服的基本思想 基于视觉的伺服控制方法的目的是最小化一个图像误差 该误差可以定义为 e t
  • Elasticsearch搜索系统线上部署配置规划

    问题导读 1 es安装包的目录结构是怎样的 2 zen discovery集群发现机制的设置规划及其原理是怎样的 3 es默认参数调优如何进行 1 ES部署须知1 1 包结构es安装包的目录结构大致如下 bin 存放es的一些可执行脚本 比