rails sunspot solr如何使用主从模式Master/Slave

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎.
随着solr索引数量量的增大,更新时间以及索引时间,都会增加。
关于solr的集群主要分为主从和SolrCloud两种。这里主要介绍一下主从的配置。它主要实现:在master节点进行数据写操作,在slave节点进行读操作。当并发量大些,可以通过扩展slave节点数来应对,多个slave做一个反向代理和负载均衡。
主节点配置:solr/conf/solrconfig.xml

1
2
3
4
5
6
7
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="replicateAfter">startup</str>
<str name="confFiles">schema.xml,stopwords.txt,spellings.txt,synonyms.txt</str>
</lst>
</requestHandler>

master 标志该core 为主节点。复制的行为发生在commit、startup之后。cofFiles表示,向从节点复制的配置文件(记住,主从的solrconfig.xml配置不一样,不要把solrconfig.xml也复制到从节点了)。  
再看下slave从节点的配置:solr/conf/solrconfig.xml

1
2
3
4
5
6
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://192.168.1.100:8983/solr/default</str>
<str name="pollInterval">00:00:20</str>
</lst>
</requestHandler>

pollInterval 表示多久向master同步一次数据,数据格式{时}:{分}:{秒}。这个要根据你的业务场景。如果更新比较频繁,就把这个值调小点,反之,就调大些。在同步数据时,根据网络和机器配置等不同,slave之间的数据会存在不同步的情况。如果,你对此有要求,需要注意了。总之,任何一种集群方案都不是万能的。

在rails里,sunspot.yml配置如下:

1
2
3
4
5
6
7
8
9
10
11
production:
solr:
hostname: slave-solr-server
port: 8983
master_hostname: master-solr-server
master_port: 8983
log_level: WARNING
master_solr:
hostname: master-solr-server
port: 8983
log_level: WARNING

rails 性能优化以及代码质量

推荐几个gem,关于性能优化,以及项目代码质量的把关。

1、N+1查询检测

Gemfile添加

1
2
3
4
group :development, :test do
# notify you when you should add eager loading (N+1 queries)
gem 'bullet'
end

development.rb添加,更多的配置项可以参考官方文档

1
2
3
4
config.after_initialize do
Bullet.enable = true #是否开启
Bullet.alert = true #是否提示
end

解决的方式就是通过添加includes,关联加载的几种写法中文指南

2、检测代码质量

Gemfile添加

1
2
3
4
group :development, :test do
# rails_best_practices is a code metric tool to check the quality of Rails code.
gem 'rails_best_practices'
end

bundle之后在项目路径下执行

1
$ rails_best_practices .

可查看到具体的提示信息,根据提示优化代码格式。官方文档

3、显示页面加载时间,以及sql、view耗时情况官方文档

Gemfile添加

1
2
3
4
group :development, :test do
# Middleware that displays speed badge for every html page. Designed to work both in production and in development.
gem 'rack-mini-profiler'
end

可搭配其它插件一起使用,例如:

1
2
3
4
5
6
# For memory profiling
gem 'memory_profiler'
# For call-stack profiling flamegraphs
gem 'flamegraph'
gem 'stackprof'

gem详解

1. 执行命令,创建一个gem,rand_t就是你gem的名字,命名规范

1
bundle gem rand_t

执行完成之后,会生成如下文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MIT License enabled in config
Code of conduct enabled in config
create rand_t/Gemfile
create rand_t/.gitignore
create rand_t/lib/rand_t.rb
create rand_t/lib/rand_t/version.rb
create rand_t/rand_t.gemspec
create rand_t/Rakefile
create rand_t/README.md
create rand_t/bin/console
create rand_t/bin/setup
create rand_t/LICENSE.txt
create rand_t/CODE_OF_CONDUCT.md
Initializing git repo in /Users/tlt/gems/rand_t

bin路径下的两个文件是可执行文件

  • bin/setup相当于执行bundle install
  • bin/console 会加载rand_t,并进入irb模式,方便调试

lib路径下的文件,是我们的主目录

  • 其中 rand_t.rb 是我们的入口文件,当其他程序 require ‘rand_t’ 的时候,这个文件会被加载。
    入口文件 rand_t.rb 是为了加载 gem的依赖,这些依赖可以是内部的类,也可以是第三方的库。
  • rand_t文件夹下,是我们要实现功能代码的地方