Uploaded image for project: 'Documentation'
  1. Documentation
  2. DOCS-13583

Investigate changes in SERVER-45624: Pre-split and distribute chunks of sessions collection

    XMLWordPrintable

    Details

      Description

      Description

      Downstream Change Summary

      This ticket introduces a mongod startup+runtime server parameter called "minNumChunksForSessionsCollection" (default: 1024, min: 1, max: 1,000,000). On a config server's primary, this parameter corresponds to the the target minimum number of config.system.sessions chunks for the balancer. Based on the comments in SERVER-45624, Atlas users do not have the privileges to do any administrative changes to the sessions collection so it is up to the DOCS team to decide whether this should be documented.

      Description of Linked Ticket

      Sessions records are small in size, so usually the sessions collection doesn't get automatically splitted by the auto-splitter and thus it is not balanced automatically. This can cause an high load on the primary shard of the sessions collection.

      Some context:
      The session collection is sharded by default on the `_id` field and a session record looks like this one:

      {
          "_id" : {
              "id" : UUID("48195d0c-aeb6-4271-8bda-1ff004ed3fda"),
              "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")
          },
          "lastUse" : ISODate("2020-01-16T13:46:28.049Z")
      }
      

      As you can see the `_id` field is an object itself and the internal `id` is of type UUID. In particular we use UUIDv4 that is a 128-bit randomly generated number. Since some of the internal bits are used to store the version and the variant, it is not possible to use normal integer arithmetics on this type. Fortunately we can still compare two UUID and sort them, this is necessary to use them as split points.

      I ran a syntethic benchmark to see how sessions get distributed on a partitioned collection. I partitioned the collection in 10 equally sized chunks and assigned each one to a different shard. I tried first to simulate 1000 sessions and then 100.000.


      As you can see from the graphs the truly random distribution of the generated UUID made possible to distribute them fairly among the shards.

      I've also created a js script that if executed on a mongos will partition the session collection and it will distribute one chunk to every shard.

      Scope of changes

      Impact to Other Docs

      MVP (Work and Date)

      Resources (Scope or Design Docs, Invision, etc.)

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              kay.kim Kay Kim (Inactive)
              Reporter:
              backlog-server-pm Backlog - Core Eng Program Management Team
              Participants:
              Last commenter:
              Backlog - Core Eng Program Management Team Backlog - Core Eng Program Management Team
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

                Dates

                Due:
                Created:
                Updated:
                Resolved:
                Days since reply:
                1 year, 21 weeks, 5 days ago
                Date of 1st Reply: