.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. highlight:: ini

==========
Replicator
==========

.. _config/replicator:

Replicator Database Configuration
=================================

.. config:section:: replicator :: Replicator Database Configuration

    .. config:option:: max_jobs :: Maximum replications jobs

        .. versionadded:: 2.1

        Number of actively running replications.
        This value represents the threshold to trigger the automatic replication
        scheduler.
        The system will check every ``interval`` milliseconds how many replication
        jobs are running, and if there are more than ``max_jobs`` active jobs,
        the scheduler will pause-and-restart up to ``max_churn`` jobs in the
        scheduler queue.
        Making this value too high could cause performance issues, while making
        it too low could mean replications jobs might not have enough time to make
        progress before getting unscheduled again.
        This parameter can be adjusted at runtime and will take effect during next
        rescheduling cycle::

             [replicator]
             max_jobs = 500

    .. config:option:: interval :: Checking interval of replication jobs

        .. versionadded:: 2.1

        Scheduling interval in milliseconds.
        During each reschedule cycle the scheduler might start or stop up to ``max_churn``
        number of jobs::

             [replicator]
             interval = 60000

    .. config:option:: max_churn :: Maximum number of jobs to start and stop

        .. versionadded:: 2.1

        Maximum number of replication jobs to start and stop during rescheduling.
        This parameter, along with ``interval``, defines the rate of job replacement.
        During startup, however, a much larger number of jobs could be started
        (up to ``max_jobs``) in a short period of time::

             [replicator]
             max_churn = 20

    .. config:option:: max_history :: Maximum number of events recorded for each job

        Maximum number of events recorded for each job. This parameter defines
        an upper bound on the consecutive failure count for a job, and in turn
        the maximum backoff factor used when determining the delay before the job
        is restarted. The longer the length of the crash count, the longer the
        possible length of the delay::

             [replicator]
             max_history = 20

    .. config:option:: update_docs :: Update replication document with error and \
        triggered states

        .. versionadded:: 2.1

        When set to ``true`` replicator will update replication document with
        error and triggered states. This approximates pre-2.1 replicator
        behavior::

             [replicator]
             update_docs = false

    .. config:option:: worker_batch_size :: Batch size of workers

        With lower batch sizes checkpoints are done more frequently. Lower
        batch sizes also reduce the total amount of used RAM memory::

            [replicator]
            worker_batch_size = 500

    .. config:option:: worker_processes :: Number of worker processes

        More worker processes can give higher network throughput but can also
        imply more disk and network IO::

            [replicator]
            worker_processes = 4

    .. config:option:: http_connections :: Maximum number of HTTP connections

        Maximum number of HTTP connections per replication::

            [replicator]
            http_connections = 20

    .. config:option:: connection_timeout :: Per replication connection timeout

        HTTP connection timeout per replication.
        This is divided by three (3) when the replicator makes changes feed requests.
        Even for very fast/reliable networks it might need to be increased if
        a remote database is too busy::

            [replicator]
            connection_timeout = 30000

    .. config:option:: retries_per_request :: Number of retries per request

        .. versionchanged:: 2.1.1

        If a request fails, the replicator will retry it up to N times. The
        default value for N is 5 (before version 2.1.1 it was 10). The requests
        are retried with a doubling exponential backoff starting at 0.25
        seconds. So by default requests would be retried in 0.25, 0.5, 1, 2, 4
        second intervals. When number of retires is exhausted, the whole
        replication job is stopped and will retry again later::

            [replicator]
            retries_per_request = 5

    .. config:option:: socket_options :: Erlang socket options

        Some socket options that might boost performance in some scenarios:

        - ``{nodelay, boolean()}``
        - ``{sndbuf, integer()}``
        - ``{recbuf, integer()}``
        - ``{priority, integer()}``

        See the `inet`_ Erlang module's man page for the full list of options::

            [replicator]
            socket_options = [{keepalive, true}, {nodelay, false}]

        .. _inet: http://www.erlang.org/doc/man/inet.html#setopts-2

    .. config:option:: valid_socket_options :: Erlang socket options

        .. versionadded:: 3.3

        Valid socket options. Options not in this list are ignored. Most of
        those options are low level and setting some of them may lead to
        unintended or unpredictable behavior. See `inet`_ Erlang docs for the
        full list of options::

            [replicator]
            valid_socket_options = buffer,keepalive,nodelay,priority,recbuf,sndbuf

        .. _inet: http://www.erlang.org/doc/man/inet.html#setopts-2

    .. config:option:: ibrowse_options :: ibrowse options

        .. versionadded:: 3.4

         A non-default ibrowse setting is needed to support IPV6-only replication sources
         or targets:

         - ``{prefer_ipv6, boolean()}``

         See the `ibrowse`_ site for the full list of options::

            [replicator]
            ibrowse_options = [{prefer_ipv6, true}]

         .. _ibrowse: https://github.com/cmullaparthi/ibrowse/

    .. config:option:: valid_ibrowse_options :: ibrowse options

        .. versionadded:: 3.4

        Valid ibrowse options. Options not in this list are ignored::

            [replicator]
            valid_ibrowse_options = prefer_ipv6

    .. config:option:: valid_endpoint_protocols :: Replicator endpoint protocols

       .. versionadded:: 3.3

       Valid replication endpoint protocols. Replication jobs with endpoint
       urls not in this list will fail to run::

           [replicator]
           valid_endpoint_protocols = http,https

    .. config:option:: valid_endpoint_protocols_log :: Log security issues with endpoints

       .. versionadded:: 3.4

       When enabled, CouchDB will log any replication that uses the insecure http
       protocol::

           [replicator]
           valid_endpoint_protocols_log = true

    .. config:option:: verify_ssl_certificates_log :: Log security issues with endpoints

       .. versionadded:: 3.4

       When enabled, and if ``ssl_trusted_certificates_file`` is configured
       but ``verify_ssl_certificates`` is not, CouchDB will check the
       validity of the TLS certificates of all sources and targets (
       without causing the replication to fail) and log any issues::

           [replicator]
           verify_ssl_certificates_log = true

    .. config:option:: valid_proxy_protocols :: Replicator proxy protocols

        .. versionadded:: 3.3

        Valid replication proxy protocols. Replication jobs with proxy
        urls not in this list will fail to run::

            [replicator]
            valid_proxy_protocols = http,https,socks5

    .. config:option:: checkpoint_interval :: Replication checkpoint interval

        .. versionadded:: 1.6

        Defines replication checkpoint interval in milliseconds.
        :ref:`Replicator <replicator>` will :get:`requests </{db}>` from the
        Source database at the specified interval::

            [replicator]
            checkpoint_interval = 5000

        Lower intervals may be useful for frequently changing data, while
        higher values will lower bandwidth and make fewer requests for
        infrequently updated databases.

    .. config:option:: use_checkpoints :: Use checkpoints during replication

        .. versionadded:: 1.6

        If ``use_checkpoints`` is set to ``true``, CouchDB will make
        checkpoints during replication and at the completion of replication.
        CouchDB can efficiently resume replication from any of these
        checkpoints::

            [replicator]
            use_checkpoints = true

        .. note::
            Checkpoints are stored in :ref:`local documents <api/local>`
            on both the source and target databases (which requires write
            access).

        .. warning::
            Disabling checkpoints is **not recommended** as CouchDB will scan
            the Source database's changes feed from the beginning.

    .. config:option:: use_bulk_get :: Use ``_bulk_get`` to fetch docs from the source

        .. versionadded:: 3.3

        If ``use_bulk_get`` is ``true``, CouchDB will attempt to use the
        ``_bulk_get`` HTTP API endpoint to fetch documents from the source.
        Replicator should automatically fall back to individual doc GETs on
        on error; however, in some cases it may be useful to prevent spending
        time attempting to call ``_bulk_get`` altogether.

    .. config:option:: cert_file :: Path to user PEM certificate file

        Path to a file containing the user's certificate::

            [replicator]
            cert_file = /full/path/to/server_cert.pem

    .. config:option:: key_file :: Path to private user PEM file

        Path to file containing user's private PEM encoded key::

            [replicator]
            key_file = /full/path/to/server_key.pem

    .. config:option:: password :: Optional password for protected key file

        String containing the user's password. Only used if the private key file
        is password protected::

            [replicator]
            password = somepassword

    .. config:option:: verify_ssl_certificates :: Check peer certificates

        Set to true to validate peer certificates::

            [replicator]
            verify_ssl_certificates = false

    .. config:option:: ssl_trusted_certificates_file :: Trusted peer certificates

        File containing a list of peer trusted certificates (in the PEM
        format)::

            [replicator]
            ssl_trusted_certificates_file = /etc/ssl/certs/ca-certificates.crt

    .. config:option:: ssl_certificate_max_depth :: Maximum peer certificate \
        depth checking size

        Maximum peer certificate depth (must be set even if certificate
        validation is off)::

            [replicator]
            ssl_certificate_max_depth = 3

    .. config:option:: auth_plugins :: List of replicator client authentication plugins

        .. versionadded:: 2.2

        List of replicator client authentication plugins. Plugins will
        be tried in order and the first to initialize successfully will
        be used. By default there are two plugins available:
        `couch_replicator_auth_session` implementing session (cookie)
        authentication, and `couch_replicator_auth_noop` implementing basic
        authentication. For backwards compatibility, the no-op plugin should be used at
        the end of the plugin list::

          [replicator]
          auth_plugins = couch_replicator_auth_session,couch_replicator_auth_noop

    .. config:option:: usage_coeff :: Usage coefficient decay

        .. versionadded:: 3.2.0

        Usage coefficient decays historic fair share usage every
        scheduling cycle. The value must be between 0.0 and 1.0. Lower
        values will ensure historic usage decays quicker and higher
        values means it will be remembered longer::

            [replicator]
            usage_coeff = 0.5

    .. config:option:: priority_coeff :: Priority coefficient decays

       .. versionadded:: 3.2.0

       Priority coefficient decays all the job priorities such that they slowly
       drift towards the front of the run queue. This coefficient defines a maximum
       time window over which this algorithm would operate. For example, if this
       value is too small (0.1), after a few cycles quite a few jobs would end up at
       priority 0, and would render this algorithm useless. The default value of
       0.98 is picked such that if a job ran for one scheduler cycle, then didn't
       get to run for 7 hours, it would still have priority > 0. 7 hours was picked
       as it was close enough to 8 hours which is the default maximum error backoff
       interval::

            [replicator]
            priority_coeff = 0.98

.. _config/replicator.shares:

Fair Share Replicator Share Allocation
======================================

.. config:section:: replicator.shares :: Per-Database Fair Share Allocation

    .. config:option:: {replicator_db} :: Value for a replicator database

        .. versionadded:: 3.2.0

        Fair share configuration section. Higher share values results in a
        higher chance that jobs from that db get to run. The default
        value is 100, minimum is 1 and maximum is 1000. The
        configuration may be set even if the database does not exist.

        In this context the option ``{replicator_db}`` acts as a placeholder
        for your replicator database name. The default replicator database is
        ``_replicator``. Additional replicator databases can be created. To be
        recognized as such by the system, their database names should end with
        ``/_replicator``. See the :ref:`Replicator Database <replicator>`
        section for more info.

        ::

            [replicator.shares]
            _replicator = 50
            foo/_replicator = 25
            bar/_replicator = 25
