Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

개요

bsr은 데이터를 클러스터의 모든 노드에 복제하는 블록 장치를 구현합니다. 실제 데이터 및 관련 메타 데이터는 일반적으로 각 클러스터 노드의 "일반"블록 장치에 개별 저장됩니다. 복제 블록 장치는 기본적으로 /dev/drbd<minor>로 명명하거나 또는 장치의 심볼릭 링크(레터)로 직접 지정합니다. 리소스 당 하나 이상의 장치와 함께 리소스로 그룹화 되고 각각의 장치 간 복제는 순차적으로 수행됩니다. 리소스 내부의 장치를 볼륨이라고하며 bsr에서는 두 개 이상의 클러스터 노드간에 리소스를 복제 할 수 있습니다. 클러스터 노드 간 연결은 지점 간 링크이며 TCP 프로토콜을 사용합니다. bsr은 구성파일을 이해하고 처리하는 기본 구성요소 bsradm 과 저수준의 구성요소 bsrsetup, bsrmeta, bsrcon으로 구성됩니다. 기본적인 bsr 구성은 /etc/drbd.conf 및 여기에 포함 된 추가 파일(일반적으로 global_common.conf 및 /etc 경로의 안에 있는 모든 * .res 파일)로 구성됩니다. 보통 각 리소스를 etc/bsr.d /. 경로에서 별도의 * .res 파일에 정의하는 것이 유용합니다. 구성 파일은 각 클러스터 노드가 전체 클러스터 구성의 동일한 사본을 포함 할 수 있도록 설계되었습니다. 그러나 때로는 노드 별로 각기 다른 구성파일의 내용을 가져야 할 수도 있어서 절대적인 것은 아닙니다.

Code Block
resource r0 {
        net {
               protocol C;
        }
       disk {
              resync-rate 10M;
              c-plan-ahead 0;
       }
       on alice {
              volume 0 {
                       	device e minor 2;
						disk e;
						meta-disk f;
              }
             address 10.1.1.31:7789;
             node-id 0;
      }
      on bob {
            volume 0 {
                     disk e;
                     meta-disk f;
            }
           address 10.1.1.32:7789;
           node-id 1;
      }
}

이 예에서는 e 레터의 볼륨을 단일 복제 장치가 포함 된 리소스 r0로 정의합니다. 이 리소스는 각각 IPv4 주소 10.1.1.31 및 10.1.1.32와 노드 식별자 0 및 1을 가진 호스트 alice 및 bob 간의 복제를 수행합니다. 실제 데이터는 e 볼륨이지만 및 메타 데이터는 f 볼륨에 저장됩니다. 호스트 간 연결에는 프로토콜 C가 사용됩니다.

파일 포맷

구성 파일은 섹션 유형에 따라 다른 섹션 및 매개 변수를 포함하는 섹션으로 구성됩니다. 각 섹션은 하나 이상의 키워드, 때로는 섹션 이름, 여는 중괄호 ( "{"), 섹션의 내용 및 닫는 중괄호 ( "}")로 구성됩니다. 섹션 내의 매개 변수는 키워드와 하나 이상의 키워드 또는 값 및 세미콜론 ( ";")으로 구성됩니다. 일부 매개 변수 값에는 일반 숫자를 지정할 때 적용되는 기본 스케일이 있습니다 (예 : Kilo). 이러한 기본 스케일은 접미사 (예 : M의 경우 Mega)를 사용하여 재정의 할 수 있습니다. 공통 접미사는 K = 2 ^ 10 = 1024, M = 1024 K 및 G = 1024 M이 지원됩니다. 주석은 해시 기호 ( "#")로 시작하여 해당 줄 끝까지 기술할 수 있습니다. 또한, 모든 섹션에 키워드 skip을 접두어로 붙여서 섹션과 하위 섹션을 무시할 수 있습니다. 추가 파일은 include 파일 패턴 명령문에 포함될 수 있습니다. include 문은 섹션 외부에서만 허용됩니다.

아래에 기술한 섹션이 정의됩니다. 들여 쓰기된 섹션이 하위 섹션임을 표시합니다.

Code Block
common
   [disk]
   [handlers]
   [net]
   [options]
   [startup]
global
resource
   connection
      path
      net
        volume
           peer-device-options
      [peer-device-options]
   connection-mesh
      net
   [disk]
   floating
   handlers
   [net]
   on
      volume
         disk
         [disk]
   options
   stacked-on-top-of
   startup
 

괄호 안의 섹션은 구성의 다른 부분에 영향을 줍니다. common 섹션의 내용은 모든 리소스에 적용됩니다. resource 또는 resource 섹션의 disk 섹션은 해당 자원의 모든 볼륨에 적용되며 resource 섹션의 network 섹션은 해당 자원의 모든 connection에 적용됩니다. 이를 통해 각 자원, 연결 또는 볼륨에 대해 동일한 옵션을 반복하지 않아도됩니다. 리소스, 연결, 볼륨 또는 볼륨 섹션에서 보다 구체적인 옵션을 재정의 할 수 있습니다. peer-device 옵션은 resync-rate, c-plan-ahead, c-delay-target, c-fill-target, c-max-rate 및 c-min-rate 로 정의되며 이전 버전과의 호환성을 위해 모든 disk 섹션에서도 지정할 수 있습니다. 그것들은 모든 관련 연결로 상속됩니다. connection 섹션에 부여 된 경우 해당 connection의 모든 볼륨에 상속됩니다. "peer-device-options"섹션은 "disk"키워드로 시작됩니다.

섹션

common

이 섹션에는 각 disk, handler, network, options 및 startup 섹션이 포함될 수 있습니다. 모든 리소스들은 이 섹션의 매개 변수를 기본값으로 상속합니다.

connection [name]

Define a connection between two hosts. This section must contain two host parameters or multiple path sections. The optional name is used to refer to the connection in the system log and in other messages. If no name is specified, the peer's host name is used instead.

path

Define a path between two hosts. This section must contain two host parameters.

connection-mesh

Define a connection mesh between multiple hosts. This section must contain a hosts parameter, which has the host names as arguments. This section is a shortcut to define many connections which share the same network options.

disk

Define parameters for a volume. All parameters in this section are optional.

floating [address-family] addr:port

Like the on section, except that instead of the host name a network address is used to determine if it matches a floating section. The node-id parameter in this section is required. If the address parameter is not provided, no connections to peers will be created by default. The devicedisk, and meta-disk parameters must be defined in, or inherited by, this section.

global

Define some global parameters. All parameters in this section are optional. Only one global section is allowed in the configuration.

handlers

Define handlers to be invoked when certain events occur. The kernel passes the resource name in the first command-line argument and sets the following environment variables depending on the event's context: •For events related to a particular device: the device's minor number in DRBD_MINOR, the device's volume number in DRBD_VOLUME. •For events related to a particular device on a particular peer: the connection endpoints in DRBD_MY_ADDRESSDRBD_MY_AFDRBD_PEER_ADDRESS, and DRBD_PEER_AF; the device's local minor number in DRBD_MINOR, and the device's volume number in DRBD_VOLUME. •For events related to a particular connection: the connection endpoints in DRBD_MY_ADDRESSDRBD_MY_AFDRBD_PEER_ADDRESS, and DRBD_PEER_AF; and, for each device defined for that connection: the device's minor number in DRBD_MINOR_ volume-number. •For events that identify a device, if a lower-level device is attached, the lower-level device's device name is passed in DRBD_BACKING_DEV (or DRBD_BACKING_DEV_volume-number). All parameters in this section are optional. Only a single handler can be defined for each event; if no handler is defined, nothing will happen.

net

Define parameters for a connection. All parameters in this section are optional.

on host-name [...]

Define the properties of a resource on a particular host or set of hosts. Specifying more than one host name can make sense in a setup with IP address failover, for example. The host-name argument must match the Linux host name ( uname -n). Usually contains or inherits at least one volume section. The node-id and address parameters must be defined in this section. The devicedisk, and meta-disk parameters must be defined in, or inherited by, this section. A normal configuration file contains two or more on sections for each resource. Also see the floating section.

options

Define parameters for a resource. All parameters in this section are optional.

resource name

Define a resource. Usually contains at least two on sections and at least one connection section.

stacked-on-top-of resource

Used instead of an on section for configuring a stacked resource with three to four nodes. Starting with DRBD 9, stacking is deprecated. It is advised to use resources which are replicated among more than two nodes instead.

startup

The parameters in this section determine the behavior of a resource at startup time.

volume volume-number

Define a volume within a resource. The volume numbers in the various volume sections of a resource define which devices on which hosts form a replicated device.

Section connection Parameters

host name [address [address-family] address] [port port-number]

 

Defines an endpoint for a connection. Each host statement refers to an on section in a resource. If a port number is defined, this endpoint will use the specified port instead of the port defined in the on section. Each connection section must contain exactly two host parameters. Instead of two host parameters the connection may contain multiple path sections.

Section path Parameters

host name [address [address-family] address] [port port-number]

 

Defines an endpoint for a connection. Each host statement refers to an on section in a resource. If a port number is defined, this endpoint will use the specified port instead of the port defined in the on section. Each path section must contain exactly two host parameters.

Section connection-mesh Parameters

hosts name...

 

Defines all nodes of a mesh. Each name refers to an on section in a resource. The port that is defined in the on section will be used.

Section disk Parameters

al-extents extents

 

DRBD automatically maintains a "hot" or "active" disk area likely to be written to again soon based on the recent write activity. The "active" disk area can be written to immediately, while "inactive" disk areas must be "activated" first, which requires a meta-data write. We also refer to this active disk area as the "activity log". The activity log saves meta-data writes, but the whole log must be resynced upon recovery of a failed node. The size of the activity log is a major factor of how long a resync will take and how fast a replicated disk will become consistent after a crash. The activity log consists of a number of 4-Megabyte segments; the al-extents parameter determines how many of those segments can be active at the same time. The default value for al-extents is 1237, with a minimum of 7 and a maximum of 65536. Note that the effective maximum may be smaller, depending on how you created the device meta data, see also drbdmeta(8) The effective maximum is 919 * (available on-disk activity-log ring-buffer area/4kB -1), the default 32kB ring-buffer effects a maximum of 6433 (covers more than 25 GiB of data) We recommend to keep this well within the amount your backend storage and replication link are able to resync inside of about 5 minutes.

al-updates {yes | no}

 

With this parameter, the activity log can be turned off entirely (see the al-extents parameter). This will speed up writes because fewer meta-data writes will be necessary, but the entire device needs to be resynchronized opon recovery of a failed primary node. The default value for al-updates is yes.

disk-barrier,

 

disk-flushes,

 

disk-drain

DRBD has three methods of handling the ordering of dependent write requests:disk-barrierUse disk barriers to make sure that requests are written to disk in the right order. Barriers ensure that all requests submitted before a barrier make it to the disk before any requests submitted after the barrier. This is implemented using 'tagged command queuing' on SCSI devices and 'native command queuing' on SATA devices. Only some devices and device stacks support this method. The device mapper (LVM) only supports barriers in some configurations. Note that on systems which do not support disk barriers, enabling this option can lead to data loss or corruption. Until DRBD 8.4.1, disk-barrier was turned on if the I/O stack below DRBD did support barriers. Kernels since linux-2.6.36 (or 2.6.32 RHEL6) no longer allow to detect if barriers are supported. Since drbd-8.4.2, this option is off by default and needs to be enabled explicitly.disk-flushesUse disk flushes between dependent write requests, also referred to as 'force unit access' by drive vendors. This forces all data to disk. This option is enabled by default.disk-drainWait for the request queue to "drain" (that is, wait for the requests to finish) before submitting a dependent write request. This method requires that requests are stable on disk when they finish. Before DRBD 8.0.9, this was the only method implemented. This option is enabled by default. Do not disable in production environments. From these three methods, drbd will use the first that is enabled and supported by the backing storage device. If all three of these options are turned off, DRBD will submit write requests without bothering about dependencies. Depending on the I/O stack, write requests can be reordered, and they can be submitted in a different order on different cluster nodes. This can result in data loss or corruption. Therefore, turning off all three methods of controlling write ordering is strongly discouraged. A general guideline for configuring write ordering is to use disk barriers or disk flushes when using ordinary disks (or an ordinary disk array) with a volatile write cache. On storage without cache or with a battery backed write cache, disk draining can be a reasonable choice.

disk-timeout

If the lower-level device on which a DRBD device stores its data does not finish an I/O request within the defined disk-timeout, DRBD treats this as a failure. The lower-level device is detached, and the device's disk state advances to Diskless. If DRBD is connected to one or more peers, the failed request is passed on to one of them. This option is dangerous and may lead to kernel panic! "Aborting" requests, or force-detaching the disk, is intended for completely blocked/hung local backing devices which do no longer complete requests at all, not even do error completions. In this situation, usually a hard-reset and failover is the only way out. By "aborting", basically faking a local error-completion, we allow for a more graceful swichover by cleanly migrating services. Still the affected node has to be rebooted "soon". By completing these requests, we allow the upper layers to re-use the associated data pages. If later the local backing device "recovers", and now DMAs some data from disk into the original request pages, in the best case it will just put random data into unused pages; but typically it will corrupt meanwhile completely unrelated data, causing all sorts of damage. Which means delayed successful completion, especially for READ requests, is a reason to panic(). We assume that a delayed *error* completion is OK, though we still will complain noisily about it. The default value of disk-timeout is 0, which stands for an infinite timeout. Timeouts are specified in units of 0.1 seconds. This option is available since DRBD 8.3.12.

md-flushes

Enable disk flushes and disk barriers on the meta-data device. This option is enabled by default. See the disk-flushes parameter.

on-io-error handler

 

Configure how DRBD reacts to I/O errors on a lower-level device. The following policies are defined:pass_onChange the disk status to Inconsistent, mark the failed block as inconsistent in the bitmap, and retry the I/O operation on a remote cluster node.call-local-io-errorCall the local-io-error handler (see the handlers section).detachDetach the lower-level device and continue in diskless mode. 

read-balancing policy

Distribute read requests among cluster nodes as defined by policy. The supported policies are prefer-local (the default), prefer-remoteround-robinleast-pendingwhen-congested-remote32K-striping64K-striping128K-striping256K-striping512K-striping and 1M-striping. This option is available since DRBD 8.4.1.

resync-after res-name/volume

 

Define that a device should only resynchronize after the specified other device. By default, no order between devices is defined, and all devices will resynchronize in parallel. Depending on the configuration of the lower-level devices, and the available network and disk bandwidth, this can slow down the overall resync process. This option can be used to form a chain or tree of dependencies among devices.

rs-discard-granularity byte

When rs-discard-granularity is set to a non zero, positive value then DRBD tries to do a resync operation in requests of this size. In case such a block contains only zero bytes on the sync source node, the sync target node will issue a discard/trim/unmap command for the area. The value is constrained by the discard granularity of the backing block device. In case rs-discard-granularity is not a multiplier of the discard granularity of the backing block device DRBD rounds it up. The feature only gets active if the backing block device reads back zeroes after a discard command. The default value of is 0. This option is available since 8.4.7.

discard-zeroes-if-aligned {yes | no}

 

There are several aspects to discard/trim/unmap support on linux block devices. Even if discard is supported in general, it may fail silently, or may partially ignore discard requests. Devices also announce whether reading from unmapped blocks returns defined data (usually zeroes), or undefined data (possibly old data, possibly garbage). If on different nodes, DRBD is backed by devices with differing discard characteristics, discards may lead to data divergence (old data or garbage left over on one backend, zeroes due to unmapped areas on the other backend). Online verify would now potentially report tons of spurious differences. While probably harmless for most use cases (fstrim on a file system), DRBD cannot have that. To play safe, we have to disable discard support, if our local backend (on a Primary) does not support "discard_zeroes_data=true". We also have to translate discards to explicit zero-out on the receiving side, unless the receiving side (Secondary) supports "discard_zeroes_data=true", thereby allocating areas what were supposed to be unmapped. There are some devices (notably the LVM/DM thin provisioning) that are capable of discard, but announce discard_zeroes_data=false. In the case of DM-thin, discards aligned to the chunk size will be unmapped, and reading from unmapped sectors will return zeroes. However, unaligned partial head or tail areas of discard requests will be silently ignored. If we now add a helper to explicitly zero-out these unaligned partial areas, while passing on the discard of the aligned full chunks, we effectively achieve discard_zeroes_data=true on such devices. Setting discard-zeroes-if-aligned to yes will allow DRBD to use discards, and to announce discard_zeroes_data=true, even on backends that announce discard_zeroes_data=false. Setting discard-zeroes-if-aligned to no will cause DRBD to always fall-back to zero-out on the receiving side, and to not even announce discard capabilities on the Primary, if the respective backend announces discard_zeroes_data=false. We used to ignore the discard_zeroes_data setting completely. To not break established and expected behaviour, and suddenly cause fstrim on thin-provisioned LVs to run out-of-space instead of freeing up space, the default value is yes. This option is available since 8.4.7.

Section peer-device-options Parameters

Please note that you open the section with the disk keyword.c-delay-target delay_target,

 

c-fill-target fill_target,

 

c-max-rate max_rate,

 

c-plan-ahead plan_time

Dynamically control the resync speed. This mechanism is enabled by setting the c-plan-ahead parameter to a positive value. The goal is to either fill the buffers along the data path with a defined amount of data if c-fill-target is defined, or to have a defined delay along the path if c-delay-target is defined. The maximum bandwidth is limited by the c-max-rate parameter. The c-plan-ahead parameter defines how fast drbd adapts to changes in the resync speed. It should be set to five times the network round-trip time or more. Common values for c-fill-target for "normal" data paths range from 4K to 100K. If drbd-proxy is used, it is advised to use c-delay-target instead of c-fill-target. The c-delay-target parameter is used if the c-fill-target parameter is undefined or set to 0. The c-delay-target parameter should be set to five times the network round-trip time or more. The c-max-rate option should be set to either the bandwidth available between the DRBD-hosts and the machines hosting DRBD-proxy, or to the available disk bandwidth. The default values of these parameters are: c-plan-ahead = 20 (in units of 0.1 seconds), c-fill-target = 0 (in units of sectors), c-delay-target = 1 (in units of 0.1 seconds), and c-max-rate = 102400 (in units of KiB/s). Dynamic resync speed control is available since DRBD 8.3.9.

c-min-rate min_rate

A node which is primary and sync-source has to schedule application I/O requests and resync I/O requests. The c-min-rate parameter limits how much bandwidth is available for resync I/O; the remaining bandwidth is used for application I/O. A c-min-rate value of 0 means that there is no limit on the resync I/O bandwidth. This can slow down application I/O significantly. Use a value of 1 (1 KiB/s) for the lowest possible resync rate. The default value of c-min-rate is 4096, in units of KiB/s.

resync-rate rate

 

Define how much bandwidth DRBD may use for resynchronizing. DRBD allows "normal" application I/O even during a resync. If the resync takes up too much bandwidth, application I/O can become very slow. This parameter allows to avoid that. Please note this is option only works when the dynamic resync controller is disabled.

Section global Parameters

dialog-refresh time

 

The DRBD init script can be used to configure and start DRBD devices, which can involve waiting for other cluster nodes. While waiting, the init script shows the remaining waiting time. The dialog-refresh defines the number of seconds between updates of that countdown. The default value is 1; a value of 0 turns off the countdown.

disable-ip-verification

Normally, DRBD verifies that the IP addresses in the configuration match the host names. Use the disable-ip-verification parameter to disable these checks.

usage-count {yes | no | ask}

A explained on DRBD's Online Usage Counter[2] web page, DRBD includes a mechanism for anonymously counting how many installations are using which versions of DRBD. The results are available on the web page for anyone to see. This parameter defines if a cluster node participates in the usage counter; the supported values are yesno, and ask (ask the user, the default). We would like to ask users to participate in the online usage counter as this provides us valuable feedback for steering the development of DRBD.

udev-always-use-vnr

When udev asks drbdadm for a list of device related symlinks, drbdadm would suggest symlinks with differing naming conventions, depending on whether the resource has explicit volume VNR { } definitions, or only one single volume with the implicit volume number 0: 

Code Block
# implicit single volume without "volume 0 {}" block
DEVICE=drbd<minor>
SYMLINK_BY_RES=drbd/by-res/<resource-name>
SYMLINK_BY_DISK=drbd/by-disk/<backing-disk-name>

# explicit volume definition: volume VNR { }
DEVICE=drbd<minor>
SYMLINK_BY_RES=drbd/by-res/<resource-name>/VNR
SYMLINK_BY_DISK=drbd/by-disk/<backing-disk-name>

 

If you define this parameter in the global section, drbdadm will always add the .../VNR part, and will not care for whether the volume definition was implicit or explicit. For legacy backward compatibility, this is off by default, but we do recommend to enable it.

Section handlers Parameters

after-resync-target cmd

 

Called on a resync target when a node state changes from Inconsistent to Consistent when a resync finishes. This handler can be used for removing the snapshot created in the before-resync-target handler.

before-resync-target cmd

 

Called on a resync target before a resync begins. This handler can be used for creating a snapshot of the lower-level device for the duration of the resync: if the resync source becomes unavailable during a resync, reverting to the snapshot can restore a consistent state.

before-resync-source cmd

 

Called on a resync source before a resync begins.

out-of-sync cmd

 

Called on all nodes after a verify finishes and out-of-sync blocks were found. This handler is mainly used for monitoring purposes. An example would be to call a script that sends an alert SMS.

quorum-lost cmd

 

Called on a Primary that lost quorum. This handler is usually used to reboot the node if it is not possible to restart the application that uses the storage on top of DRBD.

fence-peer cmd

 

Called when a node should fence a resource on a particular peer. The handler should not use the same communication path that DRBD uses for talking to the peer.

unfence-peer cmd

 

Called when a node should remove fencing constraints from other nodes.

initial-split-brain cmd

 

Called when DRBD connects to a peer and detects that the peer is in a split-brain state with the local node. This handler is also called for split-brain scenarios which will be resolved automatically.

local-io-error cmd

 

Called when an I/O error occurs on a lower-level device.

pri-lost cmd

 

The local node is currently primary, but DRBD believes that it should become a sync target. The node should give up its primary role.

pri-lost-after-sb cmd

 

The local node is currently primary, but it has lost the after-split-brain auto recovery procedure. The node should be abandoned.

pri-on-incon-degr cmd

 

The local node is primary, and neither the local lower-level device nor a lower-level device on a peer is up to date. (The primary has no device to read from or to write to.)

split-brain cmd

 

DRBD has detected a split-brain situation which could not be resolved automatically. Manual recovery is necessary. This handler can be used to call for administrator attention.

Section net Parameters

after-sb-0pri policy

Define how to react if a split-brain scenario is detected and none of the two nodes is in primary role. (We detect split-brain scenarios when two nodes connect; split-brain decisions are always between two nodes.) The defined policies are:disconnectNo automatic resynchronization; simply disconnect.discard-younger-primarydiscard-older-primaryResynchronize from the node which became primary first ( discard-younger-primary) or last (discard-older-primary). If both nodes became primary independently, the discard-least-changes policy is used.discard-zero-changesIf only one of the nodes wrote data since the split brain situation was detected, resynchronize from this node to the other. If both nodes wrote data, disconnect.discard-least-changesResynchronize from the node with more modified blocks.discard-node-nodenameAlways resynchronize to the named node.

after-sb-1pri policy

Define how to react if a split-brain scenario is detected, with one node in primary role and one node in secondary role. (We detect split-brain scenarios when two nodes connect, so split-brain decisions are always among two nodes.) The defined policies are:disconnectNo automatic resynchronization, simply disconnect.consensusDiscard the data on the secondary node if the after-sb-0pri algorithm would also discard the data on the secondary node. Otherwise, disconnect.violently-as0pAlways take the decision of the after-sb-0pri algorithm, even if it causes an erratic change of the primary's view of the data. This is only useful if a single-node file system (i.e., not OCFS2 or GFS) with the allow-two-primaries flag is used. This option can cause the primary node to crash, and should not be used.discard-secondaryDiscard the data on the secondary node.call-pri-lost-after-sbAlways take the decision of the after-sb-0pri algorithm. If the decision is to discard the data on the primary node, call the pri-lost-after-sb handler on the primary node.

after-sb-2pri policy

Define how to react if a split-brain scenario is detected and both nodes are in primary role. (We detect split-brain scenarios when two nodes connect, so split-brain decisions are always among two nodes.) The defined policies are:disconnectNo automatic resynchronization, simply disconnect.violently-as0pSee the violently-as0p policy for after-sb-1pri.call-pri-lost-after-sbCall the pri-lost-after-sb helper program on one of the machines unless that machine can demote to secondary. The helper program is expected to reboot the machine, which brings the node into a secondary role. Which machine runs the helper program is determined by the after-sb-0pri strategy.

allow-two-primaries

 

The most common way to configure DRBD devices is to allow only one node to be primary (and thus writable) at a time. In some scenarios it is preferable to allow two nodes to be primary at once; a mechanism outside of DRBD then must make sure that writes to the shared, replicated device happen in a coordinated way. This can be done with a shared-storage cluster file system like OCFS2 and GFS, or with virtual machine images and a virtual machine manager that can migrate virtual machines between physical machines. The allow-two-primaries parameter tells DRBD to allow two nodes to be primary at the same time. Never enable this option when using a non-distributed file system; otherwise, data corruption and node crashes will result!

always-asbp

Normally the automatic after-split-brain policies are only used if current states of the UUIDs do not indicate the presence of a third node. With this option you request that the automatic after-split-brain policies are used as long as the data sets of the nodes are somehow related. This might cause a full sync, if the UUIDs indicate the presence of a third node. (Or double faults led to strange UUID sets.)

connect-int time

 

As soon as a connection between two nodes is configured with drbdsetup connect, DRBD immediately tries to establish the connection. If this fails, DRBD waits for connect-int seconds and then repeats. The default value of connect-int is 10 seconds.

cram-hmac-alg hash-algorithm

 

Configure the hash-based message authentication code (HMAC) or secure hash algorithm to use for peer authentication. The kernel supports a number of different algorithms, some of which may be loadable as kernel modules. See the shash algorithms listed in /proc/crypto. By default, cram-hmac-alg is unset. Peer authentication also requires a shared-secret to be configured.

csums-alg hash-algorithm

 

Normally, when two nodes resynchronize, the sync target requests a piece of out-of-sync data from the sync source, and the sync source sends the data. With many usage patterns, a significant number of those blocks will actually be identical. When a csums-alg algorithm is specified, when requesting a piece of out-of-sync data, the sync target also sends along a hash of the data it currently has. The sync source compares this hash with its own version of the data. It sends the sync target the new data if the hashes differ, and tells it that the data are the same otherwise. This reduces the network bandwidth required, at the cost of higher cpu utilization and possibly increased I/O on the sync target. The csums-alg can be set to one of the secure hash algorithms supported by the kernel; see the shash algorithms listed in /proc/crypto. By default, csums-alg is unset.

csums-after-crash-only

 

Enabling this option (and csums-alg, above) makes it possible to use the checksum based resync only for the first resync after primary crash, but not for later "network hickups". In most cases, block that are marked as need-to-be-resynced are in fact changed, so calculating checksums, and both reading and writing the blocks on the resync target is all effective overhead. The advantage of checksum based resync is mostly after primary crash recovery, where the recovery marked larger areas (those covered by the activity log) as need-to-be-resynced, just in case. Introduced in 8.4.5.

data-integrity-alg alg

DRBD normally relies on the data integrity checks built into the TCP/IP protocol, but if a data integrity algorithm is configured, it will additionally use this algorithm to make sure that the data received over the network match what the sender has sent. If a data integrity error is detected, DRBD will close the network connection and reconnect, which will trigger a resync. The data-integrity-alg can be set to one of the secure hash algorithms supported by the kernel; see the shash algorithms listed in /proc/crypto. By default, this mechanism is turned off. Because of the CPU overhead involved, we recommend not to use this option in production environments. Also see the notes on data integrity below.

fencing fencing_policy

 

Fencing is a preventive measure to avoid situations where both nodes are primary and disconnected. This is also known as a split-brain situation. DRBD supports the following fencing policies:dont-careNo fencing actions are taken. This is the default policy.resource-onlyIf a node becomes a disconnected primary, it tries to fence the peer. This is done by calling the fence-peer handler. The handler is supposed to reach the peer over an alternative communication path and call ' drbdadm outdate minor' there.resource-and-stonithIf a node becomes a disconnected primary, it freezes all its IO operations and calls its fence-peer handler. The fence-peer handler is supposed to reach the peer over an alternative communication path and call ' drbdadm outdate minor' there. In case it cannot do that, it should stonith the peer. IO is resumed as soon as the situation is resolved. In case the fence-peer handler fails, I/O can be resumed manually with ' drbdadm resume-io'.

ko-count number

 

If a secondary node fails to complete a write request in ko-count times the timeout parameter, it is excluded from the cluster. The primary node then sets the connection to this secondary node to Standalone. To disable this feature, you should explicitly set it to 0; defaults may change between versions.

max-buffers number

 

Limits the memory usage per DRBD minor device on the receiving side, or for internal buffers during resync or online-verify. Unit is PAGE_SIZE, which is 4 KiB on most systems. The minimum possible setting is hard coded to 32 (=128 KiB). These buffers are used to hold data blocks while they are written to/read from disk. To avoid possible distributed deadlocks on congestion, this setting is used as a throttle threshold rather than a hard limit. Once more than max-buffers pages are in use, further allocation from this pool is throttled. You want to increase max-buffers if you cannot saturate the IO backend on the receiving side.

max-epoch-size number

 

Define the maximum number of write requests DRBD may issue before issuing a write barrier. The default value is 2048, with a minimum of 1 and a maximum of 20000. Setting this parameter to a value below 10 is likely to decrease performance.

on-congestion policy,

 

congestion-fill threshold,

 

congestion-extents threshold

By default, DRBD blocks when the TCP send queue is full. This prevents applications from generating further write requests until more buffer space becomes available again. When DRBD is used together with DRBD-proxy, it can be better to use the pull-ahead on-congestion policy, which can switch DRBD into ahead/behind mode before the send queue is full. DRBD then records the differences between itself and the peer in its bitmap, but it no longer replicates them to the peer. When enough buffer space becomes available again, the node resynchronizes with the peer and switches back to normal replication. This has the advantage of not blocking application I/O even when the queues fill up, and the disadvantage that peer nodes can fall behind much further. Also, while resynchronizing, peer nodes will become inconsistent. The available congestion policies are block (the default) and pull-ahead. The congestion-fill parameter defines how much data is allowed to be "in flight" in this connection. The default value is 0, which disables this mechanism of congestion control, with a maximum of 10 GiBytes. The congestion-extents parameter defines how many bitmap extents may be active before switching into ahead/behind mode, with the same default and limits as the al-extents parameter. The congestion-extents parameter is effective only when set to a value smaller than al-extents. Ahead/behind mode is available since DRBD 8.3.10.

ping-int interval

 

When the TCP/IP connection to a peer is idle for more than ping-int seconds, DRBD will send a keep-alive packet to make sure that a failed peer or network connection is detected reasonably soon. The default value is 10 seconds, with a minimum of 1 and a maximum of 120 seconds. The unit is seconds.

ping-timeout timeout

 

Define the timeout for replies to keep-alive packets. If the peer does not reply within ping-timeout, DRBD will close and try to reestablish the connection. The default value is 0.5 seconds, with a minimum of 0.1 seconds and a maximum of 3 seconds. The unit is tenths of a second.

socket-check-timeout timeout

In setups involving a DRBD-proxy and connections that experience a lot of buffer-bloat it might be necessary to set ping-timeout to an unusual high value. By default DRBD uses the same value to wait if a newly established TCP-connection is stable. Since the DRBD-proxy is usually located in the same data center such a long wait time may hinder DRBD's connect process. In such setups socket-check-timeout should be set to at least to the round trip time between DRBD and DRBD-proxy. I.e. in most cases to 1. The default unit is tenths of a second, the default value is 0 (which causes DRBD to use the value of ping-timeout instead). Introduced in 8.4.5.

protocol name

Use the specified protocol on this connection. The supported protocols are:AWrites to the DRBD device complete as soon as they have reached the local disk and the TCP/IP send buffer.BWrites to the DRBD device complete as soon as they have reached the local disk, and all peers have acknowledged the receipt of the write requests.CWrites to the DRBD device complete as soon as they have reached the local and all remote disks. 

rcvbuf-size size

 

Configure the size of the TCP/IP receive buffer. A value of 0 (the default) causes the buffer size to adjust dynamically. This parameter usually does not need to be set, but it can be set to a value up to 10 MiB. The default unit is bytes.

rr-conflict policy

This option helps to solve the cases when the outcome of the resync decision is incompatible with the current role assignment in the cluster. The defined policies are:disconnectNo automatic resynchronization, simply disconnect.violentlyResync to the primary node is allowed, violating the assumption that data on a block device are stable for one of the nodes. Do not use this option, it is dangerous.call-pri-lostCall the pri-lost handler on one of the machines. The handler is expected to reboot the machine, which puts it into secondary role.

shared-secret secret

 

Configure the shared secret used for peer authentication. The secret is a string of up to 64 characters. Peer authentication also requires the cram-hmac-alg parameter to be set.

sndbuf-size size

 

Configure the size of the TCP/IP send buffer. Since DRBD 8.0.13 / 8.2.7, a value of 0 (the default) causes the buffer size to adjust dynamically. Values below 32 KiB are harmful to the throughput on this connection. Large buffer sizes can be useful especially when protocol A is used over high-latency networks; the maximum value supported is 10 MiB.

tcp-cork

By default, DRBD uses the TCP_CORK socket option to prevent the kernel from sending partial messages; this results in fewer and bigger packets on the network. Some network stacks can perform worse with this optimization. On these, the tcp-cork parameter can be used to turn this optimization off.

timeout time

 

Define the timeout for replies over the network: if a peer node does not send an expected reply within the specified timeout, it is considered dead and the TCP/IP connection is closed. The timeout value must be lower than connect-int and lower than ping-int. The default is 6 seconds; the value is specified in tenths of a second.

use-rle

 

Each replicated device on a cluster node has a separate bitmap for each of its peer devices. The bitmaps are used for tracking the differences between the local and peer device: depending on the cluster state, a disk range can be marked as different from the peer in the device's bitmap, in the peer device's bitmap, or in both bitmaps. When two cluster nodes connect, they exchange each other's bitmaps, and they each compute the union of the local and peer bitmap to determine the overall differences. Bitmaps of very large devices are also relatively large, but they usually compress very well using run-length encoding. This can save time and bandwidth for the bitmap transfers. The use-rle parameter determines if run-length encoding should be used. It is on by default since DRBD 8.4.0.

verify-alg hash-algorithm

Online verification (drbdadm verify) computes and compares checksums of disk blocks (i.e., hash values) in order to detect if they differ. The verify-alg parameter determines which algorithm to use for these checksums. It must be set to one of the secure hash algorithms supported by the kernel before online verify can be used; see the shash algorithms listed in /proc/crypto. We recommend to schedule online verifications regularly during low-load periods, for example once a month. Also see the notes on data integrity below.

Section on Parameters

address [address-family] address: port

 

Defines the address family, address, and port of a connection endpoint. The address families ipv4ipv6ssocks (Dolphin Interconnect Solutions' "super sockets"), sdp (Infiniband Sockets Direct Protocol), and sci are supported ( sci is an alias for ssocks). If no address family is specified, ipv4 is assumed. For all address families except ipv6, the address is specified in IPV4 address notation (for example, 1.2.3.4). For ipv6, the address is enclosed in brackets and uses IPv6 address notation (for example, [fd01:2345:6789:abcd::1]). The port is always specified as a decimal number from 1 to 65535. On each host, the port numbers must be unique for each address; ports cannot be shared.

node-id value

 

Defines the unique node identifier for a node in the cluster. Node identifiers are used to identify individual nodes in the network protocol, and to assign bitmap slots to nodes in the metadata. Node identifiers can only be reasssigned in a cluster when the cluster is down. It is essential that the node identifiers in the configuration and in the device metadata are changed consistently on all hosts. To change the metadata, dump the current state with drbdmeta dump-md, adjust the bitmap slot assignment, and update the metadata with drbdmeta restore-md. The node-id parameter exists since DRBD 9. Its value ranges from 0 to 16; there is no default.

Section options Parameters (Resource Options)

auto-promote bool-value

A resource must be promoted to primary role before any of its devices can be mounted or opened for writing. Before DRBD 9, this could only be done explicitly ("drbdadm primary"). Since DRBD 9, the auto-promote parameter allows to automatically promote a resource to primary role when one of its devices is mounted or opened for writing. As soon as all devices are unmounted or closed with no more remaining users, the role of the resource changes back to secondary. Automatic promotion only succeeds if the cluster state allows it (that is, if an explicit drbdadm primary command would succeed). Otherwise, mounting or opening the device fails as it already did before DRBD 9: the mount(2) system call fails with errno set to EROFS (Read-only file system); the open(2) system call fails with errno set to EMEDIUMTYPE (wrong medium type). Irrespective of the auto-promote parameter, if a device is promoted explicitly ( drbdadm primary), it also needs to be demoted explicitly (drbdadm secondary). The auto-promote parameter is available since DRBD 9.0.0, and defaults to yes.

cpu-mask cpu-mask

 

Set the cpu affinity mask for DRBD kernel threads. The cpu mask is specified as a hexadecimal number. The default value is 0, which lets the scheduler decide which kernel threads run on which CPUs. CPU numbers in cpu-mask which do not exist in the system are ignored.

on-no-data-accessible policy

Determine how to deal with I/O requests when the requested data is not available locally or remotely (for example, when all disks have failed). The defined policies are:io-errorSystem calls fail with errno set to EIO.suspend-ioThe resource suspends I/O. I/O can be resumed by (re)attaching the lower-level device, by connecting to a peer which has access to the data, or by forcing DRBD to resume I/O with drbdadm resume-io res. When no data is available, forcing I/O to resume will result in the same behavior as the io-error policy. This setting is available since DRBD 8.3.9; the default policy is io-error.

peer-ack-window value

 

On each node and for each device, DRBD maintains a bitmap of the differences between the local and remote data for each peer device. For example, in a three-node setup (nodes A, B, C) each with a single device, every node maintains one bitmap for each of its peers. When nodes receive write requests, they know how to update the bitmaps for the writing node, but not how to update the bitmaps between themselves. In this example, when a write request propagates from node A to B and C, nodes B and C know that they have the same data as node A, but not whether or not they both have the same data. As a remedy, the writing node occasionally sends peer-ack packets to its peers which tell them which state they are in relative to each other. The peer-ack-window parameter specifies how much data a primary node may send before sending a peer-ack packet. A low value causes increased network traffic; a high value causes less network traffic but higher memory consumption on secondary nodes and higher resync times between the secondary nodes after primary node failures. (Note: peer-ack packets may be sent due to other reasons as well, e.g. membership changes or expiry of the peer-ack-delay timer.) The default value for peer-ack-window is 2 MiB, the default unit is sectors. This option is available since 9.0.0.

peer-ack-delay expiry-time

 

If after the last finished write request no new write request gets issued for expiry-time, then a peer-ack packet is sent. If a new write request is issued before the timer expires, the timer gets reset to expiry-time. (Note: peer-ack packets may be sent due to other reasons as well, e.g. membership changes or the peer-ack-window option.) This parameter may influence resync behavior on remote nodes. Peer nodes need to wait until they receive an peer-ack for releasing a lock on an AL-extent. Resync operations between peers may need to wait for for these locks. The default value for peer-ack-delay is 100 milliseconds, the default unit is milliseconds. This option is available since 9.0.0.

quorum value

 

When activated, a cluster partition requires quorum in order to modify the replicated data set. That means a node in the cluster partition can only be promoted to primary if the cluster partition has quorum. Every node with a disk directly connected to the node that should be promoted counts. If a primary node should execute a write request, but the cluster partition has lost quorum, it will freeze IO or reject the write request with an error (depending on the on-no-quorum setting). Upon loosing quorum a primary always invokes the quorum-lost handler. The handler is intended for notification purposes, its return code is ignored. The option's value might be set to offmajorityall or a numeric value. If you set it to a numeric value, make sure that the value is greater than half of your number of nodes. Quorum is a mechanism to avoid data divergence, it might be used instead of fencing when there are more than two repicas. It defaults to off If all missing nodes are marked as outdated, a partition always has quorum, no matter how small it is. I.e. If you disconnect all secondary nodes gracefully a single primary continues to operate. In the moment a single secondary is lost, it has to be assumed that it forms a partition with all the missing outdated nodes. In case my partition might be smaller than the other, quorum is lost in this moment. In case you want to allow permanently diskless nodes to gain quorum it is recommendet to not use majority or all. It is recommended to specify an absolute number, since DBRD's heuristic to determine the complete number of diskfull nodes in the cluster is unreliable. The quorum implementation is available starting with the DRBD kernel driver version 9.0.7.

quorum-minimum-redundancy value

 

This option sets the minimal required number of nodes with an UpToDate disk to allow the partition to gain quorum. This is a different requirement than the plain quorum option expresses. The option's value might be set to offmajorityall or a numeric value. If you set it to a numeric value, make sure that the value is greater than half of your number of nodes. In case you want to allow permanently diskless nodes to gain quorum it is recommendet to not use majority or all. It is recommended to specify an absolute number, since DBRD's heuristic to determine the complete number of diskfull nodes in the cluster is unreliable. This option is available starting with the DRBD kernel driver version 9.0.10.

on-no-quorum {io-error | suspend-io}

 

By default DRBD freezes IO on a device, that lost quorum. By setting the on-no-quorum to io-error it completes all IO operations with an error if quorum ist lost. The on-no-quorum options is available starting with the DRBD kernel driver version 9.0.8.

Section startup Parameters

The parameters in this section define the behavior of DRBD at system startup time, in the DRBD init script. They have no effect once the system is up and running.degr-wfc-timeout timeout

 

Define how long to wait until all peers are connected in case the cluster consisted of a single node only when the system went down. This parameter is usually set to a value smaller than wfc-timeout. The assumption here is that peers which were unreachable before a reboot are less likely to be reachable after the reboot, so waiting is less likely to help. The timeout is specified in seconds. The default value is 0, which stands for an infinite timeout. Also see the wfc-timeout parameter.

outdated-wfc-timeout timeout

 

Define how long to wait until all peers are connected if all peers were outdated when the system went down. This parameter is usually set to a value smaller than wfc-timeout. The assumption here is that an outdated peer cannot have become primary in the meantime, so we don't need to wait for it as long as for a node which was alive before. The timeout is specified in seconds. The default value is 0, which stands for an infinite timeout. Also see the wfc-timeout parameter.

stacked-timeouts

On stacked devices, the wfc-timeout and degr-wfc-timeout parameters in the configuration are usually ignored, and both timeouts are set to twice the connect-int timeout. The stacked-timeouts parameter tells DRBD to use the wfc-timeout and degr-wfc-timeout parameters as defined in the configuration, even on stacked devices. Only use this parameter if the peer of the stacked resource is usually not available, or will not become primary. Incorrect use of this parameter can lead to unexpected split-brain scenarios.

wait-after-sb

This parameter causes DRBD to continue waiting in the init script even when a split-brain situation has been detected, and the nodes therefore refuse to connect to each other.

wfc-timeout timeout

 

Define how long the init script waits until all peers are connected. This can be useful in combination with a cluster manager which cannot manage DRBD resources: when the cluster manager starts, the DRBD resources will already be up and running. With a more capable cluster manager such as Pacemaker, it makes more sense to let the cluster manager control DRBD resources. The timeout is specified in seconds. The default value is 0, which stands for an infinite timeout. Also see the degr-wfc-timeout parameter.

Section volume Parameters

device /dev/drbdminor-number

 

Define the device name and minor number of a replicated block device. This is the device that applications are supposed to access; in most cases, the device is not used directly, but as a file system. This parameter is required and the standard device naming convention is assumed. In addition to this device, udev will create /dev/drbd/by-res/resource /volume and /dev/drbd/by-disk/lower-level-device symlinks to the device.

disk {[disk] | none}

 

Define the lower-level block device that DRBD will use for storing the actual data. While the replicated drbd device is configured, the lower-level device must not be used directly. Even read-only access with tools like dumpe2fs(8) and similar is not allowed. The keyword none specifies that no lower-level block device is configured; this also overrides inheritance of the lower-level device.

meta-disk internal,

 

meta-disk device,

 

meta-disk device [index]

 

Define where the metadata of a replicated block device resides: it can be internal, meaning that the lower-level device contains both the data and the metadata, or on a separate device. When the index form of this parameter is used, multiple replicated devices can share the same metadata device, each using a separate index. Each index occupies 128 MiB of data, which corresponds to a replicated device size of at most 4 TiB with two cluster nodes. We recommend not to share metadata devices anymore, and to instead use the lvm volume manager for creating metadata devices as needed. When the index form of this parameter is not used, the size of the lower-level device determines the size of the metadata. The size needed is 36 KiB + (size of lower-level device) / 32K * (number of nodes - 1). If the metadata device is bigger than that, the extra space is not used. This parameter is required if a disk other than none is specified, and ignored if disk is set to none. A meta-disk parameter without a disk parameter is not allowed.

NOTES ON DATA INTEGRITY

...

Table of Contents

개요

bsr은 로컬 노드의 데이터를 클러스터의 모든 다른 노드로 복제하는 블록 장치를 구현합니다. 여기서 실제 데이터 및 이와 관련한 메타 데이터는 각 클러스터 노드의 "일반"블록 장치 볼륨에 (일반적으로 외부메타일 경우)개별적으로 저장됩니다. 복제 블록 장치는 기본적으로 /dev/bsr<minor>형식으로 명명하거나 또는 장치의 심볼릭 링크(레터)로 직접 지정해야 합니다. 리소스 당 하나 이상의 장치들이 그룹화 되고 각각의 장치들을 병렬적으로 복제합니다. 리소스 내부의 장치를 volume으로 지정하며 두 개 이상의 클러스터 노드간에 리소스를 복제 할 수 있습니다. 클러스터 노드 간 연결은 지점 간 링크이며 TCP 프로토콜을 사용합니다. bsr은 구성파일을 이해하고 처리하는 기본 구성요소 bsradm 과 저수준의 구성요소 bsrsetup, bsrmeta, bsrcon으로 구성됩니다. 기본적인 bsr 구성은 /etc/bsr.conf 및 여기에 포함 된 추가 파일들(일반적으로 global_common.conf 및 /etc 경로의 안에 있는 모든 * .res 파일)로 구성됩니다. 보통 각 리소스를 etc/bsr.d/. 경로에서 별도의 * .res 파일들로 정의하는 것이 유용합니다. 구성 파일은 각 클러스터 노드가 전체 클러스터 구성의 동일한 사본을 포함하도록 설계되었습니다. 그러나 때로는 노드 별로 각기 다른 구성파일의 내용을 가져야 할 수도 있어서 절대적인 것은 아닙니다.

Code Block
resource r0 {
        net {
               protocol C;
        }
       disk {
              resync-rate 10M;
              c-plan-ahead 0;
              resync-ratio "1:1";
       }
       on alice {
              volume 0 {
                       	device e minor 2;
						disk e;
						meta-disk f;
              }
             address 10.1.1.31:7789;
             node-id 0;
      }
      on bob {
            volume 0 {
                     disk e;
                     meta-disk f;
            }
           address 10.1.1.32:7789;
           node-id 1;
      }
}

이 예에서는 e 레터의 볼륨을 단일 복제 장치가 포함 된 리소스 r0로 정의합니다. 이 리소스는 각각 IPv4 주소 10.1.1.31 및 10.1.1.32와 노드 식별자 0 및 1을 가진 호스트 alice 및 bob 간의 복제를 수행합니다. 실제 데이터는 e 볼륨이지만 및 메타 데이터는 f 볼륨에 저장됩니다. 호스트 간 연결에는 프로토콜 C가 사용됩니다.

형식

구성 파일은 섹션으로 구성되며, 섹션 유형에 따라 다른 섹션과 매개변수가 포함됩니다. 각 섹션은 하나 이상의 키워드, 섹션 이름, 여는 중괄호(“{”), 섹션의 내용, 닫는 중괄호(“}”)로 구성됩니다. 섹션 내의 매개변수는 키워드와 그 뒤에 하나 이상의 키워드 또는 값, 세미콜론(“;”)으로 구성됩니다. 일부 매개 변수 값에는 일반 숫자를 지정할 때 적용되는 기본 스케일이 있습니다 (예 : Kilo). 이러한 기본 스케일은 접미사 (예 : M의 경우 Mega)를 사용하여 재정의 할 수 있습니다. 공통 접미사는 K = 2 ^ 10 = 1024, M = 1024 K 및 G = 1024 M이 지원됩니다.

주석은 해시 기호(“#”)로 시작하여 줄 끝까지 인식됩니다. 또한 섹션 앞에 키워드 skip 을 붙이면 해당 섹션과 모든 하위 섹션이 무시됩니다. include “파일 패턴 “문에 추가 파일을 포함할 수 있습니다(파일 패턴에서 지원되는 표현식은 glob(7)을 참조하세요). include 문은 섹션 외부에서만 허용됩니다.

다음과 같이 섹션이 정의됩니다. 들여 쓰기 된 섹션이 하위 섹션 입니다.

Code Block
global
common
   [disk]
   [handlers]
   [net]
   [options]
   [startup]

resource
  options
  on
    options
    volume
      disk
      [disk]
      floating        
  connection
    path
    net
      volume
           peer-device-options
      [peer-device-options]
  connection-mesh
      net
  [disk]
  handlers
  [net]
  stacked-on-top-of
  startup 

위에서 대괄호 안의 섹션은 구성의 다른 부분에 영향을 줍니다. common 섹션의 내용은 모든 리소스에 적용됩니다. 리소스 또는 on 내의 디스크 섹션은 해당 리소스의 모든 볼륨에 적용되며, 리소스 섹션 내부의 net 섹션은 해당 리소스의 모든 연결에 적용됩니다. 이렇게 하면 각 resource, connection 또는 volume 에 대해 동일한 옵션이 반복되는 것을 방지할 수 있습니다. 보다 구체적인 옵션은 resource, connection, on 또는 volume 섹션에서 재정의할 수 있습니다. peer-device 옵션은 resync-ratio, resync-rate, c-plan-ahead, c-delay-target, c-fill-target, c-max-rate 및 c-min-rate 로 정의되며 이전 버전과의 호환성을 위해 모든 disk 섹션에서도 지정할 수 있습니다. 그것들은 모든 관련 연결로 상속됩니다. connection 섹션에 부여 된 경우 해당 connection의 모든 볼륨에 상속됩니다. "peer-device-options"섹션은 "disk"키워드로 시작됩니다.

섹션

global

전역 매개 변수를 정의합니다. 이 섹션의 모든 매개 변수는 선택 사항입니다. 구성에서 하나의 global 섹션만 허용됩니다.

dialog-refresh time

bsr 초기화 스크립트를 사용하여 장치를 구성하고 시작할 수 있습니다. 여기에는 다른 클러스터 노드 대기와 관련 될 수 있습니다. 기다리는 동안 init 스크립트는 남은 대기 시간을 보여줍니다. 대화 상자 새로 고침은 해당 카운트 다운 업데이트 사이의 시간 (초)을 정의하고 기본값은 1입니다. 값이 0이면 카운트 다운이 꺼집니다.

disable-ip-verification

일반적으로 bsr은 구성의 IP 주소가 호스트 이름과 일치하는지 확인합니다. disable-ip-verification 매개 변수를 사용하여 이러한 검사를 비활성화할 수 있습니다.

usage-count {yes | no | ask}

사용 통계를 취합하는 기능이지만 bsr 에서는 사용되지 않습니다.

hostname hostname-alias

호스트 이름의 별칭을 지정할 수 있습니다. 지정한 hostname-alias 를 on 섹션의 hostname 으로 사용하면 됩니다.

common

이 섹션에는 각 disk, handler, network, options 및 startup 섹션이 포함될 수 있습니다. 모든 리소스들은 이 섹션의 매개 변수를 기본값으로 상속합니다.

startup

이 섹션의 매개 변수는 시스템 시작시 bsr init 스크립트에서 bsr의 동작을 정의합니다. 시스템이 시작되어 bsr 이 실행되고 난 후엔 더이상 아무런 영향을 미치지 않습니다.

다만 이 섹션의 속성들은 하위 호환을 위해 존재하며 bsr에선 대부분 폐기되었습니다.

degr-wfc-timeout timeout 

클러스터가 단일 노드로 구성된 경우 시스템이 다운 될 때 모든 피어가 연결될 때까지 대기하는 시간을 정의합니다. 이 매개 변수는 일반적으로 wfc-timeout보다 작은 값으로 설정됩니다. 여기서는 리부팅 전에 도달 할 수없는 피어가 리부팅 후에 도달 할 가능성이 적으므로 대기하는 것이 도움이되지 않는다고 가정합니다. 시간 초과는 초 단위로 지정됩니다. 기본값은 0이며 무한 시간 초과를 나타냅니다. bsr에선 지원하지 않습니다.

outdated-wfc-timeout timeout

시스템이 다운 될 때 모든 피어가 outdated 이면 모든 피어가 연결될 때까지 대기하는 시간을 정의합니다. 이 매개 변수는 일반적으로 wfc-timeout보다 작은 값으로 설정됩니다. 여기서 outdated 피어는 그 동안 Primary 노드가 될 수 없으므로 이전에 존재 했던 노드 만큼 기다릴 필요가 없습니다. 시간 초과는 초 단위로 지정됩니다. 기본값은 0이며 무한 시간 초과를 나타냅니다. bsr에선 지원하지 않습니다.

stacked-timeouts

지원하지 않습니다.

wait-after-sb

이 매개 변수는 스플릿 브레인 상황이 감지 된 경우에도 bsr이 init 스크립트에서 계속 대기하도록 하여 노드가 서로 연결을 거부하게 합니다.

wfc-timeout timeout

모든 피어가 연결될 때까지 init 스크립트가 대기하는 시간을 정의 합니다. 이는 리소스를 관리 할 수 없는 클러스터 관리자와 결합하여 유용할 수 있습니다. 클러스터 관리자가 시작되면 리소스가 이미 실행 중입니다. 시간 초과는 초 단위로 지정됩니다. 기본 값은 0이며 무한 시간 초과를 나타냅니다. bsr에선 지원하지 않습니다.

resource

resource [name]

리소스를 정의합니다. 일반적으로 두 개 이상의 섹션과 하나 이상의 connection 섹션이 있습니다.

options

리소스에 대한 매개 변수를 정의합니다. 이 섹션의 모든 매개 변수는 선택 사항입니다.

auto-promote bool-value

지원하지 않습니다.

cpu-mask cpu-mask

지원하지 않습니다.

on-no-data-accessible policy

요청 된 데이터를 로컬에서 접근할 수 없는 경우(예 : 모든 디스크에 장애가 발생한 경우) I/O 요청을 처리하는 방법을 결정합니다. bsr 에선 지원하지 않습니다.

peer-ack-window value

각 노드와 각 장치에서 bsr은 각 피어 장치에 대한 로컬 데이터와 원격 데이터의 차이점에 대한 비트맵을 유지합니다. 예를 들어, 단일 장치가 있는 3노드 설정(노드 A, B, C)에서 모든 노드는 각 피어에 대해 하나의 비트맵을 유지합니다. 노드가 쓰기 요청을 받으면 쓰기 노드에 대한 비트맵을 업데이트하는 방법을 알고 있지만 다른 노드들 간의 비트맵을 업데이트하는 방법은 알지 못합니다. 예를 들어 쓰기 요청이 노드 A에서 B와 C로 전파 될 때 노드 B와 C는 노드 A와 동일한 데이터를 가지고 있지만 둘 다 동일한 데이터를 가지고 있는지 여부는 알지 못합니다. 이에 대한 해결책으로, 쓰기 노드는 때때로 peer-ack 패킷을 피어로 보내 서로에게 어떤 상태인지 알려줍니다. peer-ack-window 매개 변수는 peer-ack 패킷을 보내기 전에 Primary 노드가 전송할 수 있는 데이터의 양을 지정합니다. 값이 낮으면 네트워크 트래픽이 증가합니다. 값이 크면 네트워크 트래픽은 줄어들지 만 Secondary 노드의 메모리 소비는 증가하고 Primary 노드 장애 후 Secondary 노드 간의 재 동기화 시간이 길어집니다. 참고로 peer-ack 패킷은 다른 이유로 인해 전송 될 수도 있습니다(예 : 멤버쉽 변경 또는 “peer-ack-delay 타이머"의 만료). peer-ack-window의 기본 값은 2MiB이며, 기본 단위는 섹터입니다.

peer-ack-delay expiry-time

마지막으로 완료된 쓰기 요청 후에 만기 시간 동안 새로운 쓰기 요청이 발행되지 않으면 peer-ack 패킷이 전송됩니다. 타이머가 만료되기 전에 새로운 쓰기 요청이 발행되면 타이머는 만료 시간으로 재 설정됩니다. (참고 : 멤버십 변경 또는 "peer-ack-window"옵션과 같은 다른 이유로 peer-ack 패킷이 전송 될 수도 있습니다) 이 매개 변수는 원격 노드의 재 동기화 동작에 영향을 줄 수 있습니다. 피어 노드는 AL 익스텐트에서 잠금을 해제하기 위해 peer-ack 을 받을 때까지 기다려야 합니다. 피어 간의 재 동기화 작업이 이러한 잠금을 기다려야 할 수도 있습니다. peer-ack-delay의 기본 값은 100 밀리 초이며 기본 단위는 밀리 초입니다.

max-req-write-count

리소스에 허용될 수 있는 처리 중(inflight)인 쓰기 I/O 요청 최대 회수 입니다. 기본 값은 100000 입니다.

on-req-write-congestion

max-req-write-count 를 넘어서는 쓰기 req 가 발생할 경우 혼잡으로 간주하고 이에 대응하기 위한 정책을 지정합니다. disconnect, block 정책이 있으며 기본 disconnect 입니다.

accelbuf-size size

비동기 복제에서 로컬 쓰기 성능 향상을 위한 버퍼 크기 입니다. 기본 값은 10MB 입니다. accelbuf 하나의 버퍼를 할당하고 발생된 쓰기 버퍼 공간으로 부터 데이터를 복사하여 송신버퍼 측으로 복사하기 전에 빠르게 I/O 를 완료할 수 있습니다. (bsr 1.7 이후 지원)

max-accelbuf-blk-size size

accelbuf 버퍼의 대상 I/O 블럭 크기입니다. 기본 값은 4KB이며 4KB 이하의 쓰기 I/O에 대해서만 accelbuf를 적용합니다. (bsr 1.7 이 지원)

persist-role

리소스 역할 유지 속성입니다. yes 일 경우 리소스가 재시작되는 모든 시점에 명령줄에 의해 명시적으로 지정된 역할을 계속 유지 합니다. (기본값은 no, bsr 1.7.3 이상 지원)

on

on host-name [...]

특정 호스트 또는 호스트 집합에 있는 리소스의 속성을 정의합니다. 예를 들어 IP 주소 장애 조치와 같은 설정에서는 호스트 이름을 두 개 이상 지정하는 것이 유용할 수 있습니다. host-name 인수는 시스템의 호스트 이름(Linux 예, uname -n)과 일치해야 합니다. 일반적으로 하나 이상의 volume 섹션을 포함하거나 상속합니다. node-idaddress 매개 변수는 이 섹션에서 정의해야 합니다. device, diskmeta-disk 매개 변수는 이 섹션에 정의되거나 이 섹션에서 상속되어야 합니다. 일반 구성 파일에는 각 리소스에 대한 On 섹션이 2개 이상 포함됩니다. ip 주소 기반의 구성이 필요한 경우 floating 섹션으로 대체하여 작성합니다.

address [address-family] address: port

connection 엔드 포인트의 주소 패밀리, 주소 및 포트를 정의합니다. 주소 제품군 ipv4, ipv6 가 지원됩니다. 주소 패밀리를 지정하지 않으면 "ipv4"로 인식 됩니다. ipv6을 제외한 모든 주소 계열의 경우 주소는 IPV4 주소 표기법 (예 : 1.2.3.4)으로 지정됩니다. ipv6의 경우 주소는 괄호로 묶고 IPv6 주소 표기법을 사용합니다 (예 : [fd01 : 2345 : 6789 : abcd :: 1]). 포트는 항상 1에서 65535 사이의 10진수로 지정합니다. 각 호스트에서 포트 번호는 각 주소마다 고유해야 하고 포트를 공유 할 수 없습니다.

node-id value

클러스터에서 노드의 고유 노드 식별자를 정의합니다. 노드 식별자는 네트워크 프로토콜에서 개별 노드를 식별하고 메타 데이터의 노드에 비트맵 슬롯을 할당하는 데 사용됩니다. 클러스터가 작동 중지 된 경우에만 클러스터에서 노드 식별자를 재 지정할 수 있습니다. 구성 및 장치 메타 데이터의 노드 식별자는 모든 호스트에서 일관되게 변경 되어야 합니다. 메타 데이터를 변경하려면, bsrmeta dump-md로 현재 상태를 덤프하고 비트맵 슬롯 할당을 조정 한 다음, bsrmeta restore-md로 메타 데이터를 업데이트 하십시오. node-id 파라미터는 필수적으로 설정해야 합니다. 값의 범위는 0에서 16입니다. 기본 값은 없습니다.

options

svc-auto-up

bsr 서비스가 시작될 때 리소스를 자동으로 기동합니다. 기본 값은 yes 입니다.

svc-auto-down

bsr 서비스가 종료될 때 리소스를 자동으로 중지합니다. 기본 값은 yes 입니다.

target-only

yes 이면 타깃 전용 노드로 지정됩니다. 타깃 전용 노드는 항상 타깃의 역할만 수행하며 소스역할의 수행은 거부됩니다. (bsr 1.7.3 이상)

volume

volume volume-number

리소스 내에서 볼륨을 정의합니다. 리소스의 volume 섹션들에 있는 볼륨 번호는 호스트에서 어떤 장치가 복제 장치를 구성하는지 정의합니다.

device /dev/bsr minor-number

복제 블록 장치의 장치 이름과 부 번호를 정의합니다. 이것은 응용 프로그램이 액세스 해야 하는 장치입니다(리눅스에서). 대부분의 경우 장치를 직접 사용하지 않고 파일 시스템을 통해 제어합니다. 이 매개 변수는 필수이며 표준 장치 이름 지정 규칙을 사용해야 합니다.

disk {[disk] | none}

bsr이 실제 데이터를 저장하는 데 사용할 하위 레벨 블록 장치를 정의합니다. 복제 bsr장치가 구성되어있는 동안 하위 장치를 직접 사용해서는 안됩니다. dumpe2fs(8) 및 이와 유사한 도구를 사용한 읽기 전용 액세스도 허용되지 않습니다. 키워드 none은 하위 블록 장치가 구성되지 않았음을 나타냅니다. 이것은 또한 하위 수준 장치의 상속을 무시합니다.

meta-disk internal,

meta-disk device,

meta-disk device [index]

복제 블록 장치의 메타 데이터가 있는 위치를 정의합니다. 메타 데이터는 하위 수준 장치에 데이터와 메타 데이터가 모두 포함되거나 별도의 장치에 있을 수 있습니다. 이 매개 변수의 index 형식을 사용하면 여러 개의 복제 된 장치가 각각 별도의 인덱스를 사용하여 동일한 메타 데이터 장치를 공유 할 수 있습니다. 각 인덱스는 128MiB의 데이터를 차지하며, 이는 2개의 클러스터 노드가있는 최대 4TiB의 복제 된 장치 크기에 해당합니다. 그러나 볼륨확장 등 flexible 한 메타를 요구하는 기능을 사용해야 할 경우 제약이 될 수 있기 때문에 메타 데이터 장치를 공유하지 말고 lvm 볼륨 관리자를 사용하여 필요에 따라 메타 데이터 장치를 작성하는 것이 좋습니다. 이 매개 변수의 색인 형식을 사용하지 않으면 하위 장치의 크기에 따라 메타 데이터의 크기가 결정됩니다. 필요한 크기는 36 KiB + (하위 장치 크기) / 32K * (노드 수-1)입니다. 메타 데이터 장치가 이보다 큰 경우 추가 공간은 사용되지 않습니다. 이 매개 변수는 "none"이외의 "disk"가 지정된 경우에 필요하며 "disk"가 "none"으로 설정된 경우 무시됩니다.

floating

floating [address-family] addr:port

on 섹션과 마찬가지로 호스트 이름 대신 네트워크 주소가 floating 섹션과 일치하는지 확인합니다. node-id 매개 변수가 필요하고 주소 매개 변수가 제공되지 않으면 기본적으로 피어에 대한 연결이 생성되지 않습니다. device, diskmeta-disk 매개 변수를 반드시 이 섹션에서 정의하거나 상위로부터 상속해야 합니다.

connection

connection [name]

두 호스트 간의 연결을 정의합니다. 이 섹션에는 두 개의 호스트 매개 변수 또는 여러 경로 섹션이 포함되어야합니다. 선택적으로 사용할 수 있는 "name"은 시스템 로그 및 기타 다른 메시지들의 연결을 나타내는 데 사용됩니다. 이름을 지정하지 않으면 피어의 호스트 이름이 대신 사용됩니다.

host name [address [address-family] address] [port port-number]

연결에 대한 엔드포인트를 정의합니다. 각 host 구문은 리소스의 on 섹션을 나타냅니다. 포트 번호가 정의되면 이 엔드 포인트는 on 섹션에 정의 된 포트 대신 지정된 포트를 사용합니다. 각 connection 섹션에는 정확히 두 개의 host 매개 변수가 포함되어야합니다. 두 개의 host 매개 변수 대신 connection에 다중 path 섹션이 포함될 수 있습니다.

path

두 호스트 간의 path를 정의합니다. 이 섹션에는 두 개의 호스트 매개 변수가 포함되어야합니다.

host name [address [address-family] address] [port port-number]

연결에 대한 엔드포인트를 정의합니다. 각 host 구문은 리소스의 on 섹션을 나타냅니다. 포트 번호가 정의되면 이 엔드 포인트는 on섹션에 정의 된 포트 대신 지정된 포트를 사용합니다. 각 path 섹션에는 정확히 두 개의 host 매개 변수가 포함되어야합니다.

connection-mesh

여러 호스트들 간의 mesh 연결을 정의합니다. 이 섹션에는 호스트 이름을 인수로 갖는 "hosts"매개 변수가 포함되어야합니다. 이 섹션은 동일한 네트워크 옵션을 공유하는 많은 연결을 손쉽게 정의하는 방법입니다.

hosts name

메쉬의 모든 노드를 정의합니다. 각 이름은 자원의 on 섹션을 나타냅니다. on 섹션에 정의 된 포트가 사용됩니다.

disk

볼륨의 매개 변수를 정의합니다. 이 섹션의 모든 매개 변수는 선택 사항입니다.

al-extents extents

bsr은 최근 디스크 쓰기 작업을 근거로 쓰여진(active) 영역과 쓰여진 영역에 최근 다시 쓰여진(hot) 영역에 대해 관리합니다. 쓰기 I/O가 발생하면 active 영역은 디스크에 즉시 쓰면 되지만 inactive 디스크 영역은 먼저 activated 해야 하기 때문에 여기서 메타 데이터 쓰기가 필요합니다. 이 active 디스크 영역을 activity log 라고 합니다.

activity log에 메타 데이터 쓰기를 저장하지만 실패한 노드를 복구할 경우 전체 activity log에 대해 다시 동기화 해야 합니다. 따라서 activity log의 크기는 primary 크래쉬 후 재 동기화에 얼마나 오래 걸릴지, 얼마나 빨리 복제 디스크의 일관성을 맞출지의 주요 요인이 됩니다. activity log는 여러 개의 4MiB 단위 세그먼트로 구성됩니다. al-extents 매개 변수는 동시에 활성화 할 수있는 세그먼트 수를 결정합니다. al-extents의 기본값은 6001이며 최소 7과 최대 65536입니다. 장치 메타 데이터를 생성한 방법에 따라 유효한 최대 값이 더 작을 수도 있습니다 (bsrmeta 참조).

유효 최대 값은 919 * (사용 가능한 온 디스크 activity log 링 버퍼 영역 / 4kB -1)이며, 기본 32KB 링 버퍼에서 최대 6433 (25GiB 이상의 데이터 포함)이 됩니다. 백엔드 스토리지 및 복제 링크가 약 5 분 이내에 재 동기화 될 수있는 양 이내에서 activity log의 크기를 유지하는 게 좋습니다.

al-extents 의 크기를 변경하려면 리소스 중지(down)가 필요합니다.

al-updates {yes | no}

이 매개 변수를 no 로 설정하면 activity log를 완전히 끌 수 있습니다 (al-extents 매개 변수 참조). 메타 데이터 쓰기가 더 적게 필요하기 때문에 쓰기 속도가 빨라지지만, 실패한 기본 노드의 복구시 전체 장치를 재 동기화해야합니다. al-updats 의 기본값은 yes 입니다.

disk-barrier,

disk-flushes,

disk-drain

bsr에는 쓰기 요청의 순서를 처리하는 세 가지 방법이 있습니다.

  • disk-flush 디스크에 쓰기 I/O 를 수행한 후 flush 를 강제하여 모든 데이터를 디스크에 기록하도록 조치합니다. 플랫폼 또는 드라이버 공급 업체에 따라 flush 구현이 다를 수 있습니다. 예전 방식으로는 FUA(Force Unit Access)로 명명되는 디스크 캐쉬를 우회하는 기술을 사용하기도 했으나 최근에는 기본적으로 디스크 캐쉬를 비우는 작업을 통해 디스크 쓰기를 보장하는 방식으로 구현되고 있습니다. 이 옵션은 활성화되어 있었으나 flush 동작이 가끔 오랜 지연을 일으키는 경우가 많아서 최근 비활성 되었습니다. 만약 battery backed cache 가 없는 디스크 장비를 사용하고 있다면 disk-flush 를 활성화해서 사용하세요.

  • disk-barrier 이 옵션을 사용하여 쓰기 요청이 올바른 순서로 디스크에 기록 되도록 합니다. barrier는 barrier 이전에 제출 된 모든 요청이 이후에 제출 된 요청보다 앞서서 모두 디스크에 요청하도록 보장 합니다. 이는 SCSI 장치의 'tagged command queuing'과 SATA 장치의 'native command queuing'을 사용하여 구현됩니다. 일부 장치 및 장치 스택 만이 이 방법을 지원합니다. device mapper (LVM)는 일부 구성에서만 barrier를 지원합니다. disk-barrier을 지원하지 않는 시스템에서 이 옵션을 사용하면 데이터가 유실되거나 손상 될 수 있습니다. 이 옵션은 예전 리눅스 커널에서는 지원했지만 linux-2.6.36 (또는 2.6.32 RHEL6) 이후의 커널은 더 이상 disk-barrier가 지원되는지 감지할 수 없습니다. 이 옵션은 기본적으로 해제되어 있으며 명시적으로 활성화해야 합니다.

  • disk-drain 쓰기 요청을 제출하기 전에 요청 큐가 "드레인"될 때까지 즉, 요청이 완료 될 때까지 기다립니다. 이 방법을 사용하려면 요청이 완료될 때 까지 요청들이 디스크에서 안정적임이 보장되어야 합니다. 예전에는 이 옵션을 기본 활성화 하였지만 지금은 비활성화 되어 있습니다.

disk-timeout

데이터를 저장하는 하위 장치에 정의된 디스크 시간 내에 I/O 요청을 완료하지 못하면 bsr은 이를 실패로 처리합니다. 이 경우 하위 장치가 detach되고 장치의 디스크 상태가 diskless 상태가 됩니다. bsr이 하나 이상의 피어에 연결되어 있다면 실패한 요청이 그 중 하나에 전달됩니다. 이 옵션의 사용은 크리티컬하며 커널 패닉으로 이어질 수도 있습니다. 요청을 Abort 하고 강제로 디스크를 제거하는 것은 더 이상 요청을 완료하지도 않고 오류도 반환하지 않게 완전히 block되어 중지된 로컬 백업 장치를 처리하기 위한 조치입니다. 이 상황에서는 일반적으로 하드 리셋 및 페일 오버가 유일한 방법입니다. disk-timeout의 기본값은 0이며, 이는 무한 시간 초과를 나타냅니다. 시간 초과는 0.1 초 단위로 지정됩니다.

md-flushes

메타 데이터 장치에서 디스크 플러시 및 disk barrier을 활성화합니다. 이 옵션은 기본적으로 활성화되어 있습니다. disk-flush 매개 변수를 참조하십시오.

on-io-error handler

하위 레벨 장치에서 bsr이 I/O 오류에 대응하는 방식을 구성합니다. 다음과 같은 정책이 정의됩니다.

  • passthrough 하위 장치에서 오류가 반환될 경우 해당 블럭 계층을 OOS로 기록하고 상위 계층으로 오류를 전달합니다. 해당 오류 블럭은 보통 상위 계층에 의해 재시도 I/O가 발생 되고 재시도 시점에 성공할 경우 OOS 는 자연스럽게 해소되거나 그렇지 않을 경우 OOS 가 기록되어 남겨집니다. bsr 의 기본값 입니다.

  • call-local-io-error local-io-error 핸들러를 호출합니다 ( handlers 섹션을 참고하세요).

  • detach 하위레벨 장치를 분리하고 diskless 상태로 전환합니다. diskless 상태에서는 I/O가 수행될 수 없으며 즉시 failover가 필요합니다.

max-passthrough-count

on-io-error 가 패스스루 정책일 때, 일정 수 이상 패스스루가 반복될 경우 영구적 디스크 장애로 간주합니다. 여기의 임계점을 숫자로 지정합니다. 리눅스에서만 사용하고 기본값은 100 입니다.

resync-after res-name/volume

지정된 다른 장치가 동기화된 이후에만 장치를 재 동기화하도록 정의합니다. 기본적으로 장치간에는 동기화 순서가 정의되어 있지 않으며 모든 장치가 병렬로 재 동기화 됩니다. 하위 장치 구성, 사용 가능한 네트워크 및 디스크 대역폭에 따라 전체 재 동기화 프로세스가 느려질 수 있기 때문에 이 옵션을 사용하여 장치 간의 종속성 체인 또는 트리를 형성 할 수 있습니다.

disable-write-same {yes | no}

write same I/O 를 지원하지 않는 디스크 장치의 경우 yes 로 설정하여 bsr 이 해당 I/O의 유형을 오류로 처리하지 않도록 합니다.

peer-device-options

peer-device-options 섹션 이지만 disk 키워드로 이 섹션을 기술합니다. (예전 버전에서 사용하던 방식을 취하여 하위 호환을 유지하기 위함)

resync-rate rate

재 동기화에 사용할 수 있는 대역폭을 정의합니다. bsr은 재 동기화 중에도 일반적인 응용 프로그램 I/O를 허용합니다. 재 동기화가 너무 많은 대역폭을 차지하면 응용 프로그램 I/O가 매우 느려질 수 있으며 이 매개 변수를 사용하면 이를 피할 수 있습니다. 이 옵션은 고정대역 동기화 설정에서만 유효하며 가변대역 동기화일 경우는 재동기화의 초기 시도 값으로 사용됩니다.

c-plan-ahead plan_time

재 동기화 속도를 동적으로 제어합니다. 이 메카니즘은 c-plan-ahead 매개 변수를 양수 값으로 설정하여 사용할 수 있습니다. 최대 대역폭은 c-max-rate 매개 변수에 의해 제한됩니다. c-plan-ahead 매개 변수는 bsr이 재 동기화 속도의 변화에 ​​얼마나 빨리 적응하는 지를 정의합니다. 보통 네트워크 왕복 시간(RTT)의 5 배 이상으로 설정해야 합니다. c-fill-target이 정의되면 데이터 경로를 따라 정의 된 양의 데이터로 버퍼를 채우려고 하고 c-delay-target이 정의 된 경우 정의된 지연을 갖게 합니다. "정상" 데이터 경로에 대한 c-fill-target의 공통 값 범위는 4K ~ 100K입니다. drx를 사용하는 경우 c-fill-target 대신 c-delay-target을 사용하는 것이 좋습니다. 다소 간의 지연된 동기화 데이터의 전달은 DRX 복제 버퍼링에 부담을 덜어주긴 하겠지만 절대적인 것은 아닙니다. c-delay-target 매개 변수는 c-fill-target 매개 변수가 정의되지 않거나 0으로 설정된 경우에 사용됩니다. c-delay-target 매개 변수는 네트워크 왕복 시간의 5 배 이상으로 설정해야 합니다. c-max-rate 옵션은 bsr 호스트와 drx 를 호스팅하는 시스템간에 사용 가능한 대역폭 또는 사용 가능한 디스크 대역폭으로 설정해야 합니다. 이 매개 변수들의 기본 값은 다음과 같습니다. c-plan-ahead = 20 (0.1 초 단위), c-fill-target = 0 (섹터 단위), c-delay-target = 1 (0.1 초 단위) ) 및 c-max-rate = 102400 (KiB/s 단위).

c-min-rate min_rate

Primary 이고 동기화 소스 인 노드는 애플리케이션 I/O 요청과 동기화 요청을 스케줄링 해야 합니다. c-min-rate 매개 변수는 재 동기화 I/O에 사용하는 최소 대역폭을 설정합니다. 나머지 대역폭은 응용 프로그램 I/O의 복제에 사용됩니다. c-min-rate 값이 0이면 재 동기화 I/O 대역폭에 제한이 없음을 의미합니다. 이로 인해 응용 프로그램 I/O 속도가 크게 느려질 수 있습니다. 가장 낮은 재 동기화 속도를 위해서는 1 (1 KiB/s) 값을 사용하십시오. c-min-rate의 기본값은 KiB/s 단위로 250 입니다.

c-max-rate max_rate

재 동기화 I/O에 사용하는 최대 대역폭을 설정합니다. bsr 은 복제 대역과 절충하여 c-min-rate 에서 c-max-rate 까지의 동기화 대역을 유지합니다.

resync-ratio ratio

복제 수행 중 동기화가 병행 될 경우의 동기화 최소 대역폭 비율을 정의합니다. 만약 이 값이 높은 비율로 설정된다면 복제 대역의 비율이 상대적으로 낮아지고 그에 따라 응용 I/O 의 성능이 저하될 수 있으므로 이에 유의해야 합니다.

  • resync-ratio 설정은 동기화 최소 대역폭 비율 이므로 resync-ratio보다 실제 동기화 대역이 높을 경우 동기화 대역을 낮추지 않고 현 상태를 유지합니다.

  • resync-ratio 설정으로 얻은 동기화 대역폭 비율의 크기가 c-min-rate 설정보다 작다면 c-min-rate로 동기화 대역폭이 설정됩니다.

  • resync-ratio 설정은 복제 중 동기화 속도가 c-min-rate 보다 낮을 때 적용됩니다.

handlers

특정 이벤트가 발생할 때 호출 될 핸들러를 정의합니다. 커널은 핸들러의 첫 번째 명령 줄 인수에서 리소스 이름을 전달하고 이벤트 문맥에 따라 다음 환경 변수를 설정합니다.

  • 특정 device와 관련된 이벤트의 경우: 장치의 부 번호는 BSR_MINOR, 장치의 볼륨 번호는 BSR_VOLUME 에 있습니다.

  • 특정 peer의 특정 device와 관련된 이벤트의 경우: BSR_MY_ADDRESS, BSR_MY_AF, BSR_PEER_ADDRESS 및 BSR_PEER_AF에 connection 엔드 포인트가 있습니다; BSR_MINOR에 있는 장치의 로컬 부 번호 및 BSR_VOLUME에 장치의 볼륨 번호가 있습니다.

  • 특정 connection과 관련된 이벤트의 경우: BSR_MY_ADDRESS, BSR_MY_AF, BSR_PEER_ADDRESS 및, BSR_PEER_AF에 connection 엔드 포인트; 그리고 해당 connection에 대해 정의된 각 device의 장치 부 번호가 BSR_MINOR_volume-number에 있습니다.

  • 장치를 식별하는 이벤트의 경우 하위 장치가 연결되어 있으면 하위 장치의 장치 이름이 BSR_BACKING_DEV (또는 BSR_BACKING_DEV_volume-number)로 전달됩니다.

이 섹션의 모든 매개 변수는 선택 사항입니다. 각 이벤트에 대해 단일 핸들러만 정의 할 수 있습니다. 핸들러가 정의되어 있지 않으면 아무 일도 일어나지 않습니다.

after-resync-target cmd

재 동기화가 완료 될 때 노드 상태가 "Inconsistent"에서 "Consistent"로 변경되면 SyncTarget에서 호출됩니다. 예를 들어, 이 핸들러는 before-resync-target 핸들러에서 작성된 스냅 샷을 제거하는 데 사용할 수 있습니다.

before-resync-target cmd

재 동기화가 시작되기 전에 SyncTarget에서 호출됩니다. 이 핸들러는 재 동기화 기간 동안 하위 레벨 디바이스의 스냅 샷을 작성하는 데 사용할 수 있습니다. 재 동기화 중에 재 동기화 소스를 사용할 수없는 경우 스냅 샷으로 되돌리면 Consistent한 상태로 복원 할 수 있습니다.

before-resync-source cmd

재동기화를 시작하기 전 동기화 소스에서 호출됩니다.

out-of-sync cmd

정합성 검사를 수행 후 OOS 블록이 발견되면 모든 노드에서 호출됩니다. 이 핸들러는 주로 모니터링 목적으로 사용되며 관리자에게 경고를 주는 용도로 사용될 수 있습니다.

fence-peer cmd

노드가 특정 피어의 리소스를 차단해야 할 때 호출됩니다. 핸들러는 bsr이 피어와 통신하는 데 사용하는 동일한 통신 경로를 사용해서는 안됩니다.

unfence-peer cmd

노드가 다른 노드에서 펜싱 제약 조건을 제거해야 할 때 호출됩니다.

initial-split-brain cmd

스플릿 브레인 상태임을 감지하면 호출됩니다. 이 핸들러는 스플릿 브레인 자동 해결 시나리오에서도 호출됩니다.

local-io-error cmd

하위 장치에서 I/O 에러가 발생할 경우 호출됩니다.

pri-lost cmd

로컬 노드는 현재 Primary 노드이지만 bsr이 동기화 대상이 되어야 한다고 생각될 때 호출 됩니다. 이 경우 노드는 Primary 역할을 포기해야 합니다.

pri-lost-after-sb cmd

로컬 노드는 현재 Primary 노드이지만 스플릿 후 자동 복구 절차를 통해 잃었을 때 호출됩니다. 이 경우 노드는 버려야 합니다.

split-brain cmd

bsr이 자동으로 해결할 수 없는 스플릿 브레인 상황임을 감지했으며 수동 복구가 필요합니다. 이 핸들러는 관리자에게 주의를 주는 데 사용될 수 있습니다.

net

연결의 매개 변수를 정의합니다. 이 섹션의 모든 매개 변수는 선택 사항입니다.

after-sb-0pri policy

스플릿 브레인이 감지되고 두 노드 중 어느 것도 Primary 역할이 아닐 경우의 대응 방법을 정의합니다. 스플릿 브레인은 항상 두 노드 사이에서 결정되며 두 노드가 연결될 때 감지합니다. 정의 된 정책은 다음과 같습니다.

  • disconnect 단순히 연결을 끊습니다.

  • discard-younger-primary 최근에 Primary가 된 노드(younger primary)에 쓰여진 데이터를 취소하고 되돌립니다. younger primary를 판단할 수 없다면 discard-zero-changesdiscard-least-changes 순서로 동작하게 됩니다. 

  • discard-older-primary 처음 Primary 가 됬던 노드(older primary)를 폐기합니다. 만일 두 노드가 독립적으로 Primary 가 됐었다면 discard-least-changes 정책을 사용합니다.

  • discard-zero-changes 하나의노드에서만 데이터를 쓴 경우 해당 노드를 기준으로 재 동기화 합니다. 두 노드가 모두 데이터를 쓴 경우 연결을 끊습니다.

  • discard-least-changes 많은 데이터를 쓴 노드를 기준으로 동기화 합니다.

  • discard-node-nodename 명명된 노드를 항상 폐기합니다.

after-sb-1pri policy

Primary 노드 1 개와 Secondary 노드 1 개로 스플릿 브레인이 감지되는 경우 대처 방법을 정의합니다.

  • disconnect 단순히 연결을 끊습니다.

  • consensus 희생노드가 선택될 수 있다면 자동으로 해결합니다. 그렇지 않으면, disconnect처럼 동작합니다.

  • discard-secondary Secondary 의 노드를 폐기합니다.

after-sb-2pri policy

스플릿 브레인 시나리오가 감지되고 두 노드가 모두 Primary 역할을 하는 경우 대응 방법을 정의합니다.

  • disconnect 단순히 연결을 끊습니다. 2 primary 스플릿 브레인의 경우 disconnect 정책만 제공되며 수동 복구만 사용할 수 있습니다.

allow-two-primaries

bsr 에선 이중 primary 모드를 지원하지 않습니다.

connect-int time

bsrsetup connect로 두 노드 간 연결이 구성되는 즉시 연결 설정을 시도합니다. 이것이 실패하면 bsr은 connect-int초 동안 기다렸다가 반복합니다. connect-int의 기본값은 3초입니다.

csums-alg hash-algorithm

일반적으로 두 노드가 다시 동기화 되면 동기화 대상은 동기화 소스로부터 out-of-sync 데이터를 요청하고 동기화 소스는 데이터를 전송합니다.

많은 사용 패턴에서 볼 때 상당수의 블록이 실제로 동일합니다. csums-alg 알고리즘이 지정되면 동기화되지 않은 데이터를 요청할 때 동기화 대상도 현재 보유한 데이터의 해시를 전송합니다. 동기화 소스는이 해시를 자기의 데이터와 비교합니다. 해시가 다르면 동기화 대상에 새 데이터를 보내고 해시가 같으면 데이터가 동일하다는 것을 알려줍니다. 이렇게 하면 필요한 네트워크 대역폭이 줄어들지만 반면 CPU 사용률은 높아지고 SyncTarget의 읽기 I/O가 증가합니다 . csums-alg는 커널이 지원하는 보안 해시 알고리즘 중 하나로 설정 될 수 있습니다. /proc/crypto에 나열된 shash 알고리즘을 참조하십시오. 기본적으로 csums-alg는 설정되어 있지 않습니다.

data-integrity-alg alg

bsr은 일반적으로 TCP/IP 프로토콜에 내장 된 데이터 무결성 검사에 의존하지만, 데이터 무결성 알고리즘이 구성된 경우 이 알고리즘을 사용하여 네트워크를 통해 수신 된 데이터가 발신자가 보낸 것과 일치하는지 확인합니다. 데이터 무결성 오류가 감지되면 bsr은 네트워크 연결을 닫고 다시 연결하여 재 동기화를 트리거합니다. data-integrity-alg는 커널이 지원하는 보안 해시 알고리즘 중 하나로 설정 될 수 있습니다. /proc/crypto에 나열된 shash 알고리즘을 참조하십시오. 기본적으로이 메커니즘은 해제되어 있습니다. 관련된 CPU 오버 헤드로 인해 운영 환경에서는 이 옵션을 사용하지 않는 것이 좋습니다.

fencing fencing_policy

펜싱은 두 노드가 연결이 끊어져서 모두 Primary 가 되는 상황을 방지하기 위한 예방 조치입니다. 이것은 스플릿 브레인 상황 이라고도 합니다. bsr은 다음과 같은 펜싱 정책을 지원합니다.

  • dont-care 펜싱 조치가 수행되지 않습니다. 이것이 기본 정책입니다.

  • resource-only 노드가 연결이 끊긴 Primary 노드가 되면 피어를 차단하려고 합니다. 이것은 "fence-peer" 핸들러를 호출하여 수행됩니다. 핸들러는 대체 통신 경로를 통해 피어에 도달하여 'bsradm outdate minor'를 호출해야 합니다.

  • resource-and-stonith 노드가 연결이 끊긴 Primary 노드가 되면 모든 IO 작업을 중지하고 fence-peer 핸들러를 호출합니다. fence-peer 핸들러는 대체 통신 경로를 통해 피어에 도달하여 'bsradm outdate minor'를 호출해야 합니다. 그렇게 할 수없는 경우에는 상대방을 (전원 제어)차단해야 합니다. 상황이 해결 되자마자 IO가 재개됩니다. 펜스 피어 핸들러가 실패한 경우 잠재적으로 스플릿 브레인이 발생했다고 판단하고 수동으로 복구해야 합니다.

ko-count number

송신 버퍼링 시 데이터 전송지연 또는 실패에 대한 TX 노드 측의 송신 재 시도 회수를 정의합니다.

max-buffers number

수신 측 peer-request의 최대 버퍼 크기를 정의합니다. 단위는 PAGE_SIZE(대부분의 시스템에서 4KiB)입니다. 가능한 최소 설정은 32(= 128 KiB)로 지정되어 있습니다. 이 버퍼는 디스크에 쓰거나 디스크에서 읽는 동안 데이터 블록을 보유하는 데 사용됩니다. max-buffers 페이지 이상이 사용 중이면 이 풀의 추가 할당이 제한됩니다. 수신 측에서 I/O 부하를 감당할 수 없는 경우 max-buffers를 늘려야 합니다.

max-epoch-size number

쓰기 barrier을 발행하기 전에 bsr이 발행 할 수 있는 최대 쓰기 요청 수를 정의합니다. 기본 값은 2048이며 최소 1에서 최대 20000까지 지정 가능합니다. 이 매개 변수를 10 미만의 값으로 설정하면 성능이 저하 될 수 있습니다.

on-congestion policy,

congestion-fill threshold,

congestion-extents threshold

기본적으로 bsr은 TCP 송신 큐가 가득 찬 경우 대기합니다. 이럴 경우 송신 큐를 다시 사용할 수 있을 때까지 응용 프로그램에서 추가 쓰기 요청을 생성 할 수 없습니다. bsr을 프록시와 함께 사용하는 경우 전송 대기열이 가득 차기 전에 bsr을 Ahead/Behind 모드로 전환 할 수 있는 Pull-ahead 혼잡 정책을 사용하는 것이 좋습니다. 어헤드 모드에선 비트 맵에 자신과 피어의 차이점을 기록하고 복제는 일시 중지 됩니다. 버퍼 공간이 충분해져 다시 사용 가능 해지면 노드는 피어와 재 동기화하고 정상 복제로 다시 전환됩니다. 이는 요청 대기열이 가득 차더라도 응용 프로그램 I/O를 차단하지 않는 이점이 있지만 피어 노드가 원본에 비해 훨씬 더 뒤쳐 질 수 있다는 단점이 있습니다. 그리고 재 동기화하는 동안은 피어 노드가 Inconsistent 상태입니다.

사용 가능한 혼잡 정책은 blocking(기본값), disconnect, pull-ahead 입니다. congestion-fill 매개 변수는이 연결에서 복제 중인 데이터가 허용되는 양을 정의합니다. 기본 값은 0(혼잡 제어 메커니즘을 사용하지 않도록 설정합니다)이며 최대 1TB입니다. congestion-extents 매개 변수는 Ahead/Behind 모드로 전환하기 전에 활성화 될 수있는 비트맵 범위의 수를 정의합니다. congestion-extents 매개 변수는 al-extents 보다 작은 값으로 설정 한 경우에만 유효합니다.

ping-int interval

피어에 대한 TCP/IP 연결이 1 초 이상 유휴 상태 인 경우 bsr은 ping 패킷을 보내 실패한 피어 또는 네트워크 연결이 빨리 감지되도록 합니다. 기본값은 3초이며 최소 1과 최대 120 초입니다. 단위는 초입니다.

ping-timeout timeout

ping 패킷에 대한 회신 시간 초과를 정의합니다. 피어가 ping 시간 초과 내에 응답하지 않으면 bsr이 연결을 닫고 다시 연결하려고 시도합니다. 기본값은 3초이며 최소 0.1 초와 최대 3 초입니다. 단위는 10분의 1초입니다.

protocol name

복제 연결에 지정된 프로토콜을 정의합니다. 지원되는 프로토콜은 다음과 같습니다.

  • A 로컬 디스크 및 TCP/IP 전송 버퍼에 복사한 즉시 로컬 I/O 를 완료합니다.

  • B 로컬 디스크에 기록하고 피어에서 복제 데이터를 수신하는 즉시 ACK 를 반환합니다. 로컬에서 ACK 를 수신하면 I/O 를 완료 합니다.

  • C 로컬 디스크에 기록하고 피어에서 복제 데이터를 디스크에 기록한 후 쓰기 ACK 를 반환합니다. 로컬에서 쓰기 ACK 를 수신하면 I/O 를 완료합니다.

rcvbuf-size size

TCP/IP 수신 버퍼의 크기를 구성합니다. 값이 0(기본값)이면 버퍼 크기가 동적으로 조정됩니다. 이 매개 변수는 개발자 디버깅 및 튜닝 용도로 사용하며 일반적으로 사용하지 않습니다. 최대 10MiB의 값으로 설정할 수 있으며 기본 단위는 바이트입니다.

sndbuf-size size

송신 작업자 쓰레드에서 할당하는 TX 버퍼의 크기를 설정합니다. 최대 1TB 까지 설정할 수 있습니다.

tcp-cork

tcp-cork 옵션을 사용하여 커널이 작은 메시지에 대한 전송을 유보하여 네트워크 상에서 패킷을 최대한 크게 보냅니다. 이 최적화를 사용할 경우 네트워크 대역은 효율적으로 사용할 수 있지만 패킷을 모으는 시간 동안의 지연이 발생하므로 일부 네트워크 스택의 성능이 저하 될 수 있습니다. 기본 비활성화 되어 있습니다.

timeout time

네트워크를 통한 응답 시간 초과를 정의합니다. 피어 노드가 지정된 시간 초과 내에 예상 응답을 보내지 않으면 응답이 없는 것으로 간주하고 TCP/IP 연결을 닫습니다. 시간 초과 값은 connect-int보다 낮아야 하고 ping-int보다 작아야 합니다. 기본 값은 5초이고 10분의 1초로 단위로 지정됩니다.

use-rle

use-rle 매개 변수는 run length encoding 을 사용해야 하는지 결정합니다. 클러스터 노드의 각 복제 된 장치에는 각 피어 장치에 대한 별도의 비트맵이 있습니다. 비트맵은 로컬 장치와 피어 장치의 차이점을 추적하는 데 사용됩니다. 클러스터 상태에 따라 장치의 비트맵, 피어 장치의 비트맵 또는 두 비트맵에서 디스크 범위가 피어와 다른 것으로 표시 될 수 있습니다. 두 클러스터 노드가 연결되면 서로의 비트맵을 교환하고 각각 로컬 및 피어 비트맵의 합집합을 계산하여 전체 차이를 결정합니다. 매우 큰 장치의 경우 비트맵이 비교적 크기 때문에 일반적으로 run length encoding을 사용하여 압축률을 높이고 이를 통해 비트맵 전송에 필요한 시간과 대역폭을 절약 할 수 있습니다. 기본적으로 활성화 되어 있습니다.

verify-alg hash-algorithm

온라인 검증 (bsradm verify)은 디스크 블록 (즉, 해시값)의 체크섬을 계산하고 비교하여 서로 다른 지를 감지합니다. verify-alg 매개 변수는 이러한 체크섬에 사용할 알고리즘을 결정합니다. 온라인 검증을 사용하기 전에 커널이 지원하는 보안 해시 알고리즘 중 하나로 설정해야 합니다. /proc/ crypto에 나열된 shash 알고리즘을 참조하십시오.

stacked-on-top-of 

3-4 개의 노드로 스택 된 리소스를 구성하기 위해 on 섹션 대신 사용됩니다. bsr에선 더 이상 사용하지 않습니다.