Hi all,
We are trying to roughly double our sustained indexing throughput so we can 
safely absorb approximately 2× tomorrow's incoming update volume without the 
indexing pipeline falling behind.
I am looking primarily for advice on the write/indexing path (merge policy, 
merge scheduler, commit strategy, indexing buffers, replication cost, and 
client-side batching/concurrency).
Architecture

  *
SolrCloud 9.6.1
  *
Hosted on GCP Compute Engine
  *
10 Solr nodes
     *
Mixed memory sizes (~48 GB on 8 Nodes and ~94 GB RAM on 2 Nodes)
     *
Solr heap: 12 GB/node
     *
Default GC (no explicit tuning)
     *
CPU:
        *
16 logical cores on 8 Nodes
        *
24 logical cores on 2 Nodes
  *
3-node ZooKeeper

Collections:

  *
Products
     *
~180M documents
     *
~62 shards
     *
Total Index Size: 245 GB
  *
Leads
     *
~70M documents
     *
~62 shards
     *
Total Index Size: 200 GB

Routing is custom (implicit routing, not compositeId).
Replication factor is mostly 1, with 3 shards currently at RF=2.
Indexing Jobs Writing Flow
Products collection — two-stage pipeline (DB → CSV → Solr)

  1.
DB → CSV: Two batch jobs each read up to 300k changed rows from a changelog 
table per run (600k rows/cycle combined) and write pipe-delimited CSV files 
containing 5,000 rows each.
  2.
CSV → Solr: A separate batch job drains up to 120 CSV files per run and indexes 
them via SolrJ, sending update batches of 4,000 documents per request.

Leads collection — single-stage pipeline (DB → Solr)

  1.
One batch job reads up to 600k changed rows directly from the database (no CSV 
intermediate) and indexes them via SolrJ, sending update batches of 3,000 
documents per request on a near-continuous (every-minute) schedule.

Indexing Configuration
The following indexing configuration is currently in use for both collections:
Setting
Value
ramBufferSizeMB
200
Merge Policy
TieredMergePolicyFactory
maxMergeAtOnce
5
segmentsPerTier
5
floorSegmentMB
10
deletesPctAllowed
20
noCFSRatio
0
Merge Scheduler
Default ConcurrentMergeScheduler
useCompoundFile
FALSE
Hard Commit
Every 30 minutes (openSearcher=false)
Soft Commit
Every 15 minutes
Update Log
Enabled (numVersionBuckets=65536)
Directory Factory
StandardDirectoryFactory (MMapDirectory)
Update Request Processor
Default update request processor chain

Indexing Client Configuration
Setting
Value
Client
SolrJ 8.10.0
Server Version
Solr 9.6.1

Workload
Most indexing is performed by Spring Batch + SolrJ using large batched update 
requests rather than individual document writes.
Daily incoming update volume

  *
Products collection: ~20 million documents/day
  *
Leads collection: ~45 million documents/day

Current indexing capacity

  *
Products collection: ~25 million documents/day
  *
Leads collection: ~25 million documents/day

We also have live incoming search requests on the two collections which have a 
peak request count of 6 Lakhs search request per hour.
The Products indexing pipeline currently has sufficient headroom, while the 
Leads pipeline is the bottleneck. We need to increase sustained indexing 
throughput to comfortably handle approximately 45 million documents/day for the 
Leads collection (with additional operational headroom) without the indexing 
jobs falling behind.
Questions
If your goal were approximately 2x to 3x sustained indexing throughput with 
this workload, what would you prioritize first?

  1.
Increasing ramBufferSizeMB or adjusting TieredMergePolicy?
  2.
Explicitly tuning ConcurrentMergeScheduler instead of relying on Lucene 
defaults?
  3.
Changing the 30-minute hard commit interval (balancing tlog growth versus 
commit overhead)?
  4.
Using more TLOG replicas (or different replica types) to reduce write-path cost?
  5.
Increasing client-side concurrency versus increasing batch size?
  6.
Any known indexing bottlenecks with StandardDirectoryFactory/MMapDirectory on 
GCP persistent disks at this scale?

If there are other areas you'd investigate first before touching merge policy 
or commit settings, I'd appreciate any guidance.
Happy to provide additional configuration or metrics if useful.
Thanks!
Govind Kumar



Reply via email to