Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


6 questions online user: 10

0
votes
answers
91 views
+10

有沒有辦法僅通過Google Cloud Datastore更新單個屬性值?

0

我的項目有Article類。然後,有一種Block種。每個Block都有一個作爲父實體的文章;因此,每篇文章都由幾個Block實體組成。每個Block有一個訂單財產所以最終用戶可以訂購它們。有沒有辦法僅通過Google Cloud Datastore更新單個屬性值?

在前端,用戶可以添加新的Block或更新現有的。顯然,通過向上移動Block,它改變了它自己的順序,但是致命的是,它也改變了(+1)後續的每個實體Block

到目前爲止,對於用戶保存的每一次更新,我檢索所有Block實體的順序等於或大於新保存的實體,並更新它們中的每一個。

是否有辦法使用PHP庫簡單地更新一個屬性(order)?

沙发
0
0

不,你不能只更新一個實體的屬性,你必須更新整個實體。從Updating an entity

要更新現有的實體,修改先前檢索到的實體 的屬性,並存儲它用所述密鑰:

$transaction = $datastore->transaction(); 
$key = $datastore->key('Task', 'sampleTask'); 
$task = $transaction->lookup($key); 
$task['priority'] = 5; 
$transaction->upsert($task); 
$transaction->commit(); 

所提供的數據覆蓋現有的實體。必須將整個對象 發送到雲數據存儲。 [...]

**Note:** To delete a property, remove the property from the entity, then save the entity. 
0
votes
answers
105 views
+10

「where .. in」模擬elasticsearch與Java API

0

我是ElasticSearch的新手。 我在我的User類中有一個字符串字段,代表UserStatus,我需要搜索處於特定狀態的所有用戶。 在關係數據庫中,它完全是「where .. in」。「where .. in」模擬elasticsearch與Java API

我看到的例子,使用termsQuery在不同的組合,但我沒有設法使他們工作(查詢返回什麼都沒有)。

所以,問題是:有沒有鏈接,顯示整個例子或某人面臨這樣的問題? 任何幫助都很高興!

//實體本身

@AllArgsConstructor 
    @NoArgsConstructor 
    @Data 
    @Builder 
    @Document(indexName = "users", type = "user") 
    public class User { 

     @Id 
     private String id; 

     private String userStatus; 
     private String firstName; 
     private String lastName; 
     private Date dateCreated; 
    } 

//一個彈簧服務方法

@Override 
public List<User> findByParams(UserSearchRequest userSearchRequest) { 

    TermsQueryBuilder termsQueryBuilder = QueryBuilders 
      .termsQuery("userStatus", userSearchRequest.getUserStatuses()); 


    SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withQuery(boolQuery().must(termsQueryBuilder)) 
      .withPageable(new PageRequest(0, 100)) 
      .build(); 


    return Lists.newArrayList(userRepository.search(searchQuery)); 

} 

// REST請求對象

@AllArgsConstructor 
@NoArgsConstructor 
@Data 
public class UserSearchRequest { 
    private List<String> userStatuses; 
} 
+1

你嘗試運行直接查詢到elasticsearch(捲曲或某種基於Web的用戶界面),而不是通過Java ?通常這就是幫助我 – sfat

+0

我同意@sfat,嘗試與直接彈性搜索查詢。以下是基於特定條件檢索值的查詢。 – Sree

+0

下面是一個查詢{「query」:{「constant_score」:{「filter」:{「bool」:{「should」:[{「term」:{「employee」:「foo」}}]}} }}}。方法 - >發佈,網址 - > http:// localhost:9200///_search。 – Sree

沙发
0
0

檢查Elasticsearch的文檔"Finding Multiple Exact Values"

基本上,您需要將自己的術語搜索到一個常數分數查詢中。

從Elasticsearch DOC(保留給後人)

GET /my_store/products/_search 
{ 
    "query" : { 
     "constant_score" : { 
      "filter" : { 
       "terms" : { 
        "price" : [20, 30] 
       } 
      } 
     } 
    } 
} 

這個例子說,搜索的有價產品20或30

你需要的是搜索所有具有用戶userStatus您作爲List傳遞的任一值。

在你需要改變你的NativeSearchQueryBuilder在這樣的實施方面:

SearchQuery searchQuery = new NativeSearchQueryBuilder() 
       .withQuery(constantScoreQuery(termsQueryBuilder)) 
       .withPageable(new PageRequest(0, 100)) 
       .build(); 
0
votes
answers
97 views
+10

DynamoDB併發寫入

3

我有一個具有屬性的現有DynamoDB表說DynamoDB併發寫入

 
--------------------------------------------------------- 
hk(hash-key)| rk(range-key)| a1 | a2 | a3 | 
--------------------------------------------------------- 


我有一個現有的DynamoDb客戶端,只只A1更新現有記錄。我想創建第二個作家(DDB客戶端),它也將更新現有的記錄,但僅適用於a2和a3。
如果ddb客戶端同時嘗試更新相同的記錄(a1爲1,另一個爲a2和a3),那麼DynamoDb會保證所有a1 a2 a3都更新爲正確的值(全部三個新值)?是否使用保存行爲UPDATE_SKIP_NULL_ATTRIBUTES足夠用於此目的,還是我需要實現某種樂觀鎖定?如果沒有, DDB爲此提供了什麼?

沙发
0
-1

讀到DyanmoDB最終是一致的。 請參閱:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html

DynamoDB支持最終一致和強一致的讀取。

最終一致讀取

當你從一個DynamoDB表中讀取數據,響應可能不會 反映最近完成寫操作的結果。 響應可能包含一些陳舊的數據。如果您在短時間後重複閱讀 請求,則回覆應返回最新的 數據。

強一致性讀取

當你請求一個強烈一致的讀取,DynamoDB返回與最先進的最新數據 響應,反映了更新從 的是成功的所有先前的寫操作。如果存在網絡延遲或中斷,則可能無法使用強烈一致的 讀取。

注意DynamoDB使用最終一致的讀取,除非您另行指定 。讀操作(如GetItem,Query和Scan)提供了一個ConsistentRead參數 。如果將此參數設置爲true,則 DynamoDB在操作期間使用強烈一致的讀取。

基本上,你已經指定你閱讀時需要強有力的一致性數據。

而這應該可以解決你的問題。通過一致的讀取,您應該看到所有三個字段的更新。

請注意,對強一致性讀取有定價影響。

+0

我知道吞吐量消耗強烈一致的讀取。我只是問是否可以同時用兩個不同的作家寫同一個記錄,或者其中一個會一次成功,最後的記錄最終可能是a1 a2 a3或a1 a2 A'3。希望我能解釋我的問題。 –

板凳
0
0

如果您碰巧使用Dynamo Java SDK,那麼您很幸運,因爲SDK只支持Optimistic Locking。我不知道其他SDK是否支持類似的東西 - 我懷疑他們不支持。

樂觀鎖是爲了確保客戶端項目 正在更新(或刪除)是相同 DynamoDB項目的戰略。如果你使用這種策略,那麼你的數據庫寫入是 保護免受其他人的寫入覆蓋 - 反之亦然 。

+0

謝謝,讓我們看看樂觀鎖定是唯一的方法。 –

77
votes
answers
77 views
+10

是否需要使用ElasticSearch的負載均衡器?

我有一個在AWS EC2上運行的3個ElasticSearch節點的集群。這些節點使用OpsWorks / Chef進行設置。我的目的是將此集群設計為非常有彈性和彈性(節點可以在需要時進出)。

從我讀過的關於ElasticSearch的所有內容來看,似乎沒有人建議在集群前放置負載均衡器; 相反,似乎建議做兩件事之一:

  1. 將客戶端指向一個節點的URL / IP,讓ES為您執行負載平衡,並希望該節點永遠不會出現故障。

  2. 將所有節點的URL / IP硬編碼到客戶端應用程序中,讓應用程序處理故障轉移邏輯。

我的背景主要是在Web場中,創建大量自治Web服務器,在其前面拋出ELB並讓負載均衡器確定哪些節點存活或死亡,這是常識。為什麼ES似乎不支持這種相同的架構?

up vote 17 down vote accepted favorite
沙发
+170
+50

You don't need a load balancer — ES is already providing that functionality. You'd just another component, which could misbehave and which would add an unnecessary network hop.

ES will shard your data (by default into 5 shards), which it will try to evenly distribute among your instances. In your case 2 instances should have 2 shards and 1 just one, but you might want to change the shards to 6 for an equal distribution.

By default replication is set to "number_of_replicas":1, so one replica of each shard. Assuming you are using 6 shards, it could look something like this (R is a replicated shard):

  • node0: 1, 4, R3, R6
  • node1: 2, 6, R1, R5
  • node2: 3, 5, R2, R4

Assuming node1 dies, the cluster would change to the following setup:

  • node0: 1, 4, 6, R3 + new replicas R5, R2
  • node2: 3, 5, 2, R4 + new replicas R1, R6

Depending on your connection setting, you can either connect to one instance (transport client) or you could join the cluster (node client). With the node client you'll avoid double hops, since you'll always connect to the correct shard / index. With the transport client, your requests will be routed to the correct instance.

So there's nothing to load balance for yourself, you'd just add overhead. The auto-clustering is probably ES's greatest strength.

@xeraa那麼“節點”客戶端通過廣播或其他東西自動解析可用的彈性節點/集群? - Tuukka Mustonen 2014年9月15日11:25

這種方法的犧牲是,現在您的服務器拓撲上的客戶端直接依賴。而且,不,你不是“添加另一個網絡躍點”。您只是改變了域名解析的方式。除非你在談論甚至在客戶端配置中使用IP地址,在這種情況下......是的。 - GlenRSmith 2015年3月14日20:09

這不回答這個問題。這是關於ES如何在內部平衡數據的一個很好的文章,但是連接到ES集群的客戶端應用程序仍然需要一種機制,以便在node1失敗時切換到node2的IP。浮動IP或IP負載均衡器可以完成這項工作,但它不包含在ES中。 - 鹼性4月7日'16在4:01

+490

我相信負載平衡Elasticsearch集群是一個好主意(設計容錯系統,對單節點故障具有彈性。)

要構建您的集群,您需要有關Elasticsearch的兩個主要功能的背景知識:1。編寫和更新文檔以及2.查詢文檔。

在elasticsearch中編寫/索引文檔:

  1. 當新文檔進入Elasticsearch進行索引時,Elasticsearch使用“碎片路由算法”確定應將文檔分配給的“主分片”
  2. 與分片關聯的Lucene進程“映射”文檔中的字段;
  3. Lucene進程將文檔添加到shard的Lucene“倒排索引”
  4. 然後任何“複製碎片”都會收到該文件; 副本分片“映射”文檔並將文檔添加到副本分片的Lucene“倒排索引”

在Elasticsearch中查詢文檔:

  1. 默認情況下,當查詢發送到Elasticsearch時,查詢會命中一個節點 - 這將成為該查詢的“查詢節點”或“網關查詢節點”
  2. 節點將查詢廣播到索引中的每個分片(主要和副本)
  3. 每個分片對分片的本地Lucene倒排索引執行查詢。
  4. 每個分片返回前10 - 20個結果到“網關查詢節點”
  5. 然後,“網關查詢節點”對從其他分片返回的組合結果執行合併排序,
  6. 一旦合併排序完成,“網關查詢節點”並將結果返回給客戶端
    • merge-sort是CPU和內存資源很重

為寫入/索引/更新構建負載均衡器

Elasticsearch自我管理節點上的分片位置。“主節點”保持並更新“分片路由表”。“主節點”將分片路由表的副本提供給集群中的其他節點。

通常,您不希望主節點執行的操作遠遠超過群集的運行狀況檢查,更新路由表以及管理分片。

最好將負載均衡器指向“數據節點”(數據節點是包含數據=分片的節點)並讓數據節點使用其分片路由表來獲取對正確分片的寫入。

構建查詢

Elasticsearch創建了一個特殊的節點類型:“客戶端節點”,其中包含“無數據”,不能成為“主節點”。客戶端節點的功能是在查詢結束時執行最終資源重合併排序。

對於AWS,您可能使用c3或c4實例類型作為“客戶端節點”

最佳做法是將負載均衡器指向客戶機節點的查詢。

乾杯!

參考文獻:

  1. Elasticsearch節點類型
  2. Elasticsearch:分片路由算法
  3. Elasticsearch:Replica Shards
  4. Elasticsearch:群集狀態,即分片路由表
  5. ElasticHQ - Elasticsearch Video簡介
  6. Elasticsearch:分片數和群集縮放

感謝您的詳細報導! - 馬特2015年2月1日5:22

+110

您想要設計“故障轉移”是非常正確的,而在AWS中,我建議您這樣做。

1)限制群集中可以選為主節點的節點。其餘的,設置node.client:true。根據您有多少主可選節點選擇您可用於故障轉移的數量。

2)創建僅包含主可選節點的ELB。

3)在Route 53中,為您的群集創建一個CNAME,其值設置為ELB的DNS名稱。

38
votes
answers
73 views
+10

ElasticSearch作為主要數據存儲區與寫丟失,數據可用性等因素的可靠性如何

我正在開發一個項目,需要提供一個通用的儀表板,用戶可以在不同的領域進行不同類型的分組,過濾和深入分析。為此,我們正在尋找一個允許切片和數據切片的搜索商店。

將有多個數據源,並將其存儲在搜索存儲中。源數據可能需要一些預先計算,這可以由中間組件完成。

我查看了幾個博客,了解ES是否可以作為主數據存儲區可靠地使用。它主要取決於我們正在尋找的用例。有關我們使用的用例的一些信息:

  • 每年約有3億條記錄,1-2 KB。
  • 假設存儲1年的數據,我們現在有300 GB,但由於數據增長,用例可以達到400-500 GB。
  • 截至目前尚不確定,我們將如何推送數據,但粗略地說,它每5分鐘可以達到約2-3百萬條記錄。
  • 搜索請求很少,但需要復雜的查詢,可以搜索最近6周到6個月的數據。
  • 文檔將在文檔中的幾乎所有字段中編制索引。

一些博客稱它足夠可靠,可用作主要數據存儲 -

一些博客稱ES沒有什麼限制 -

有沒有人使用Elastic Search作為數據的唯一真相,而沒有像PostgreSQL,DynamoDB或RDS這樣的主存儲?我已經查明ES存在某些問題,例如分裂大腦和索引損壞,其中可能存在數據丟失問題。所以,我想知道是否有人使用過ES並且遇到了數據方面的麻煩

謝謝。

沙发
+320

簡短回答:這取決於您的使用案例,但您可能不希望將其用作主要商店。

更長的答案:您應該真正了解彈性和數據丟失可能出現的所有問題。Elastic在將這些問題用作主數據存儲之前,您應該真正了解這些問題此外,Aphyr關於該主題的帖子是一個很好的資源。

如果您了解您正在承擔的風險,並且您認為這些風險是可以接受的(例如,因為您的應用程序不會出現小數據丟失問題),那麼您應該隨意嘗試一下。

我不確定在彈性搜索中添加新數據的性能如何。由於所有內容都需要索引,因此應更新所有相關索引。但是,我們可以在其他No-SQL中手動指定我們需要的索引。Fox的例子,文件是{name:“ricky”,年齡:18}。我們只需要在No-SQL中更新'name'的索引,但我們需要在elastic-search中更新'name'和'age'。這可能是潛在的性能問題。如果我錯了,請弄明白。 - Ricky Jiao 2016年9月27日9:40

這是另一個與此主題相關的問題:stackoverflow.com/questions/27054954 / ... - Zsolt 17年10月7日在9:16

板凳
+60

設計冗餘數據存儲解決方案通常是個好主意。例如,它可能是一種快速可靠的方法,首先將所有內容作為平面數據推送到靜態存儲,如s3,然後從那裡獲取ES拉取和索引數據。如果你需要更多的靈活性來利用一些ORM,你可以在它們之間有一個RDS或Redshift層。這樣,數據總是可以在ES中重建。

這取決於您在冗餘和靈活性/性能之間如何設置平衡的需求和要求。如果涉及大量數據,您可以靜態存儲原始數據,並通過ES索引它的某些部分。

Amazon Lambda提供強大的功能:

許多開發人員在Amazon S3中存儲對象,同時使用Amazon DynamoDB存儲和索引對像元數據並啟用高速搜索。每次從Amazon S3添加或更新對象時,AWS Lambda都可以通過運行函數自動更新Amazon DynamoDB中的索引,從而輕鬆實現所有內容的同步。

0
votes
answers
80 views
+10

Mongodb:無法連接到127.0.0.1:27017,原因:錯誤:10061

這是我的mongod.cfg檔案: bind_ip = 127.0.0.1 dbpath = C:mongodbdatadb logpath = C:mongodblogmongo-server.log verbose=v 這是我的mongod服務命令: mongod -f c:mongodbmongod.cfg --install 我已經在一周前安裝了MongoDB並且一切正常,但是今天當我運行mongo命令時出現以下錯誤: Failed to connect to 127.0.0.1:27017, reason: errno:10061 No connection could be made because the target machine actively refused it 我該如何解決這個問題? 我使用Windows 8.1 解: 我忘了用這個命令啟動mongodb服務: net start mongodb 改進方案: 1)將目錄更改為根驅動器C:,並在管理員cmd提示窗口中鍵入以下命令, C:mongodbinmongod.exe --config c:mongodbmongod.cfg --install 2)然後鍵入,net start MongoDB之後您應該看到以下消息: "The Mongo DB service was started successfully" 3)然後轉到控制面板Start>Administrative Tools>Services,在服務列表中向下滾動到MongoDB,如果您願意,可以將啟動類型更改為自動。按確定。 4)最後鍵入C:mongodbinmongo.exe,你應該連接到Mongo測試數據庫。 參考:https://www.youtube.com/watch?v = -mik4dPArCU