# Replica Selection in Elasticsearch

**URL:** <https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783>\
**Category:** Elasticsearch\
**Created:** [September 7, 2015, 3:24pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783 "2015-09-07T15:24:07Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![mbbce](https://avatars.discourse-cdn.com/v4/letter/m/f6c823/32.png) [@mbbce](https://discuss.elastic.co/u/mbbce)\
**Post date:** [September 7, 2015, 3:24pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/1 "2015-09-07T15:24:07Z")

</div>

What is the replica selection mechanism used in elastic search? I tried to look it up and search in the documentation but couldn't find it.

Thanks 🙂

---

<div class="post-metadata">

**Author:** ![magnusbaeck](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/magnusbaeck/32/44943_2.png) [@magnusbaeck](https://discuss.elastic.co/u/magnusbaeck)\
**Post date:** [September 7, 2015, 5:59pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/2 "2015-09-07T17:59:45Z")

</div>

Replicas are allocated with the same algorithm as primary shards. I think the code for that is in [BalancedShardsAllocator.java](https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/cluster/routing/allocation/allocator/BalancedShardsAllocator.java).

---

<div class="post-metadata">

**Author:** ![mbbce](https://avatars.discourse-cdn.com/v4/letter/m/f6c823/32.png) [@mbbce](https://discuss.elastic.co/u/mbbce)\
**Post date:** [September 7, 2015, 7:02pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/3 "2015-09-07T19:02:22Z")

</div>

Oops there was a typo in the question, my mistake. I meant to ask the replica selection mechanism i.e. on what basis a particular replica of a shard is selected in response to a query.

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [September 7, 2015, 9:26pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/4 "2015-09-07T21:26:50Z")

</div>

It just alternates between primary and replica, simple as that.

---

<div class="post-metadata">

**Author:** ![mbbce](https://avatars.discourse-cdn.com/v4/letter/m/f6c823/32.png) [@mbbce](https://discuss.elastic.co/u/mbbce)\
**Post date:** [September 8, 2015, 7:41am UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/5 "2015-09-08T07:41:20Z")

</div>

So it's simply a round robin replica selection mechanism. Can you point me to the second of code or class that deals with this, if possible? Thanks a lot.

---

<div class="post-metadata">

**Author:** ![colings86](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/colings86/32/44960_2.png) [@colings86](https://discuss.elastic.co/u/colings86)\
**Post date:** [September 8, 2015, 8:00am UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/6 "2015-09-08T08:00:37Z")

</div>

In practice its a bit more complex than a simple round robin selection due to taking into account the `preference` parameter and awareness attributes, although for the purposes of explanation it can be thought of that way. The TransportSearchTypeAction.BaseAsyncAction gets an iterator for each target shard containing the primary and replicas for that shard that match the preference and awareness criteria [here](https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/action/search/type/TransportSearchTypeAction.java#L129) and retrieves the replica to send the request to [here](https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/action/search/type/TransportSearchTypeAction.java#L146). The actually iterators are created in OperationRouting class [here](https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/cluster/routing/OperationRouting.java#L124).

Hope that helps

---

<div class="post-metadata">

**Author:** ![warkolm](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/warkolm/32/39224_2.png) [@warkolm](https://discuss.elastic.co/u/warkolm)\
**Post date:** [September 8, 2015, 8:04am UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/7 "2015-09-08T08:04:52Z")

</div>

Heh, I should have prefaced mine with a TLDR really 😛

---

<div class="post-metadata">

**Author:** ![mbbce](https://avatars.discourse-cdn.com/v4/letter/m/f6c823/32.png) [@mbbce](https://discuss.elastic.co/u/mbbce)\
**Post date:** [September 11, 2015, 10:51am UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/8 "2015-09-11T10:51:59Z")

</div>

Great, thanks. I will take a look 🙂

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 5, 2017, 11:50pm UTC](https://discuss.elastic.co/t/replica-selection-in-elasticsearch/28783/9 "2017-07-05T23:50:47Z")

</div>


