你好技术人员,
假设我们有一个(PHP)网站,每月有数百万访问者,我们在网站上运行SolR索引,托管了400万个文档.Solr在4个独立的服务器上运行,其中一个服务器是主服务器,另外三个服务器是复制的.
有可以被插入数以千计的文件到Solr中每5分钟.除此之外,用户还可以更新他们的帐户,这也应该触发solr更新.
我正在寻找一种安全的策略来快速安全地重建索引,而不会丢失任何文档.并有一个安全的增量/更新策略.我已经考虑过一个策略,我想与专家分享这些策略以听取他们的意见,以及我是否应该采用这种方法,或者他们是否可以提出一些(完全)不同的建议.
Solr DataImport
对于所有操作,我想使用一个数据导入处理程序.我想将数据和delta导入混合到一个配置文件中,如DataImportHandlerDeltaQueryViaFullImport.我们使用MySQL数据库作为数据源.
重建指数
为了重建索引,我有以下几点; 我们在'live'核心附近创建了一个名为'reindex'的新核心.使用dataimporthandler,我们完全重建整个文档集(400万个文档),总共需要1-2个小时.在实时索引上,仍然每分钟都有一些更新,插入和删除.
重建后大约需要1-2个小时,新指数仍然不再是最新的.为了缩短延迟,我们对新核心进行一次'delta'导入,以提交过去1-2小时内的所有更改.完成后进行核心交换.每分钟运行一次的正常"delta"导入处理程序将选择这个新核心.
提交对活核心的更新
为了保持我们的实时核心,我们每分钟都会运行delta导入.由于核心交换,reindex核心(现在是活核心)将被跟踪并保持最新状态.我猜这个索引延迟几分钟不应该是一个问题,因为dataimport.properties也会被交换掉?delta-import已超过这些延迟时间,但应该是可能的.
我希望你了解我的情况和我的策略,并建议我是否以正确的方式在你眼中做到这一点.另外我想知道是否有任何瓶颈我没有想到?我们正在运行Solr 1.4版.
我有一些问题,复制怎么样?如果主服务器交换核心,那么如何处理这个?
在交换时丢失文件有什么风险吗?
提前致谢!
architecture solr high-availability high-traffic dataimporthandler
我正在努力解决以下问题,在实体类中我有一个preUpdate lifeCycleCallback,它必须在刷新auditTrail的更改之前保留一个新实体.
在preRemove和prePersist中,这可以很好地工作,但在preUpdate中没有任何事情发生.如果我自己调用flush,它会进入递归循环.
根据教学用户的谷歌组织将其放入onFlush应该是一个选项,但在那种情况下我无法访问实体的旧值以将此旧值保存在audittrail的新其他实体中.
我想要存档的一些小例子:
<?php
/**
* @Entity
* @HasLifeCycleCallbacks
*/
class someEntity {
... annotations ...
/**
* @PreUpdate
*/
public function addAuditTrail() {
$em = \Zend_Registry::get('doctrine')->getEntityManager();
$entity = new AuditTrail();
$entity->action = 'update';
$entity->someField = $this->someField;
$em->persist($entity); //this just doesn't do anything :-(
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这不是真正的代码,只是为了说明你想要的东西.我也尝试过这样的事情:
$em->getUnitOfWork()->computeChangeSet($em->getClassMetaData(get_class($entity)), $entity);
Run Code Online (Sandbox Code Playgroud)
哪个应该根据此主题工作:http://groups.google.com/group/doctrine-user/browse_thread/thread/bd9195f04857dcd4
如果我再次调用flush,但由于某些无限循环而导致Apache崩溃.
谁有想法给我?谢谢!
在我们的网站上,我们希望能够在多个域中共享会话.所有这些网站都在同一台服务器上,但其中一些网站有不同的IP地址.
我找到的可能解决方案是自己设置会话ID:
<?php
session_id($someUniqueHash);
?>
Run Code Online (Sandbox Code Playgroud)
如果我像md5('test')那样制作哈希,这就有效.在同一服务器上的另一个域上,我们再次进行会话.
问题是生成ID.我在互联网上看到一些使用microtime等的解决方案,但是当我使用这种方法时,我无法预测其他域/ PHP页面上的会话ID.
有没有人有想法?或者我们不应该实现这个?是否有其他选项可以在多个域上共享会话?(不是子域名!)
我正在运行 Ubuntu 服务器并尝试安装 SonarQube。问题是我在错误日志中没有得到任何有用的消息。
它托管在 Ubuntu Server 14.04 上
我基本上遵循了本教程。MySQL 已经安装好了,我暂时跳过了 Nginx。
日志:
--> Wrapper Started as Daemon
Launching a JVM...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
2017.06.16 08:29:43 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonar/temp
2017.06.16 08:29:43 TRACE app[][o.s.a.NodeLifecycle] tryToMoveTo from INIT to STARTING => true
2017.06.16 08:29:43 TRACE app[][o.s.a.p.Lifecycle] tryToMoveTo es from INIT to STARTING => true
2017.06.16 08:29:43 INFO app[][o.s.a.p.JavaProcessLauncherImpl] Launch process[es]: /usr/lib/jvm/java-8-oracle/jre/bin/java -Djava.awt.headless=true -Xmx1G -Xms1G -Xss256k -Djna.nosys=true …
Run Code Online (Sandbox Code Playgroud) architecture ×1
doctrine-orm ×1
high-traffic ×1
java ×1
jvm ×1
orm ×1
php ×1
session ×1
sessionid ×1
solr ×1
sonarqube ×1