Репликация и конфликты в LDAP-сервере: обнаружение и разрешение
Павел Полежаев













Exported on 2025-11-20 13:38:06
Table of Contents
1
2 Введение в репликацию LDAP
3 Типы конфликтов репликации
4 Обнаружение конфликтов репликации
5 Разрешение конфликтов
5.1 1. Ошибки типа "namingConflict (ADD)"
5.2 2. Другие типы конфликтов
6 Проверка работы репликации
7 Диагностика проблем репликации
8 Подготовка тестовой среды
9 Этап 1: Создаем namingConflict (ADD)
10 Этап 2: Создаем attribute/modification конфликт
11 Результат:
12 Практическое решение проблем репликации
13 Реинициализация реплики
13.1 Почему сразу не делать реинициализацию?
13.2 Что проверять при сравнении данных после реинициализации?
14 Полезные команды
15 Заключение
16 Моделирование ошибок репликации
16.1 Подготовка тестовой среды
16.2 Этап 1: Создаем namingConflict (ADD)
16.3 Этап 2: Создаем attribute/modification конфликт
16.4 Результат:

Введение в репликацию LDAP

Важно
При выполнении команд для работы с LDAP необходимо получить kerberos-билет администратора:

kinit admin


Термины
Репликация в LDAP-серверах - это процесс синхронизации данных между несколькими экземплярами серверов каталогов (КД), который обеспечивает отказоустойчивость, распределенную нагрузку и географическую доступность данных. В инфраструктуре FreeIPA и 389 Directory Server репликация играет ключевую роль, поддерживая согласованность данных между серверами.
DN (Distinguished Name, отличительное имя) - это уникальный, полный путь к записи в каталоге, который идентифицирует эту запись в иерархической структуре каталога
Доменный суффикс — это корневой DN LDAP-домена (например, `dc=example,dc=com`), определяющий иерархию каталога, пространство имен и границы репликации. Узнать его можно при помощи команды:

ldapsearch -Q -LLL -s base

awk '/^dn:/{print $2}'

Класс — это шаблон объектов (например, `inetOrgPerson`, `posixAccount`), определяющий обязательные (`MUST`) и допустимые (`MAY`) атрибуты для описания сущностей (пользователей, групп, устройств) в каталоге.
Атрибут — это именованное свойство объекта в LDAP (например, `uid`, `cn`, `mail`), хранящее данные (логин, имя, email) и их метаданные (синтаксис, правила сопоставления).
Схема данных в LDAP — это набор правил, определяющих структуру каталога, включая допустимые классы объектов (например, `user`, `group`), их атрибуты (например, `cn`, `uid`) и ограничения на значения (типы данных, уникальность, обязательность).|

Типы конфликтов репликации

При работе с репликацией могут возникать различные типы конфликтов:

  1. Naming conflicts (ADD) - возникают при попытке добавить запись с DN, который уже существует в каталоге
  2. Attribute conflicts - различия в атрибутах одной и той же записи на разных серверах
  3. Modification conflicts - одновременное изменение одной записи на разных серверах

Обнаружение конфликтов репликации

Для проверки наличия конфликтов выполните команду:

dsconf ldap://<имя_КД> -D "cn=Directory Manager" repl-conflict list <доменный_суффикс>

Эта команда выведет список всех записей, участвующих в конфликтах репликации.

Важно
Практические примеры представлены в главах 


Разрешение конфликтов

1. Ошибки типа "namingConflict (ADD)"

Для конфликтов добавления рекомендуется сохранять валидные записи и удалять конфликтующие:

dsconf ldap://<имя_КД> -D "cn=Directory Manager" repl-conflict delete <dn конфликтующей записи>

Валидными считаются записи:

Как определить:

  1. Сравните конфликтующие записи:

    dsconf ldap://<имя_КД> -D "cn=Directory Manager" repl-conflict compare <dn конфликтующей записи>

  2. Проверьте временные метки (атрибут modifyTimestamp)
  3. Учитывайте бизнес-логику (какая запись реально используется)

2. Другие типы конфликтов

Ситуации, где:

Пример: Одновременное изменение номера телефона пользователя на двух разных КД, где оба изменения технически корректны, но нужно выбрать актуальное.
Для таких случаев используйте поэтапный подход:

Чем отличается от обычной проверки: Обычный ldapsearch или dsconf показывает только данные, тогда как ds-replcheck анализирует внутренние механизмы репликации.

Диагностика проблем репликации

При обнаружении проблем можно включить расширенное логирование:

dsconf -D "cn=Directory Manager" ldap://<имя_КД> config replace nsslapd-errorlog-level=24576

И анализировать логи в /var/log/dirsrv/<имя_инстанса>/errors.
Например /var/log/dirsrv/slapd-EXAMPLE-COM/errors|
Моделирование ошибок описано в раскрывающемся меню: Моделирование ошибок репликации


Подготовка тестовой среды

  1. Создадим тестовую OU и пользователя (выполняем команду на 1КД):

    kinit admin
    suffix=$(ldapsearch -Q -LLL -s base

    grep 'dn: '

    cut -d ' ' -f2)
    dc=$(hostname -f)
    domain=$(hostname -d)
     
    ldapadd -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix
    objectClass: rbta-org-unit
    ou: test_repl
    displayName: test_repl
    EOF
     
    ipa user-add testuser \
    --first="Test" \
    --last="User" \
    --random
     
    ldapmodify -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: rbtadp
    rbtadp: ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix

  1. Проверим репликацию (выполняем команду на 2КД):

    kinit admin
    suffix=$(ldapsearch -Q -LLL -s base

    grep 'dn: '

    cut -d ' ' -f2)
    dc=$(hostname -f)
    domain=$(hostname -d)
    ldapsearch -h $dc -D "cn=Directory Manager" -W -b "ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix"


    Этап 1: Создаем namingConflict (ADD)

  1. На КД1 изменяем телефон
    ldapmodify -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: telephoneNumber
    telephoneNumber: +111111111
    EOF
     
  2. На КД2 изменяем email
    ldapmodify -h $5DC2.$domain -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: mail
    mail: test@example.com
    EOF|

2. Количественные расхождения

3. Конфликтующие записи
Обнаружено 2 конфликтующие записи (те, что мы создавали)
4. Отсутствующие записи
На реплике отсутствуют (9 записей):

На основном сервере отсутствуют (52 записи):

5. Несоответствия атрибутов
Для пользователя conflict_user:

Для компьютера journal.ald250.pro:

Для repl keep alive:

Для DNA-плагина:

Для пользователя testuser:

Практическое решение проблем репликации

Начнем с вывода и решения конфликтов, которые показывает dsconf:

dn: nsuniqueid=adc2dc01-71ea11f0-816fe86f-aa36b0da+uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
cn: conflicted User
displayName: conflicted User
gecos: conflicted User
gidNumber: 1213300500
givenName: conflicted
homeDirectory: /home/conflict_user
initials: cU
ipaNTSecurityIdentifier: S-152119632958532268353583389735258101500
ipaUniqueID: c173c7be-71ea-11f0-a685-02000a452904
krbCanonicalName: conflict_user@ALD250.PRO
krbExtraData:: AAI445Focm9vdC9hZG1pbkBBTEQyNTAuUFJPAA==
krbLastPwdChange: 20250805105552Z
krbPasswordExpiration: 20250805105552Z
krbPrincipalKey:: MIHeoAMCAQGhAwIBAaIDAgEBowMCAQGkgccwgcQwaKAbMBmgAwIBBKESBBBjQjo4PD1ZLVBIfEI0KitroUkwR6ADAgESoUAEPiAAXxsWn7SM64uMNXVBzUsCpN1JZOObIc/h+tt+/vlGqWrfFMcF2en4vgPJJo/qtKx0+886arhXPkdPAv4bMFigGzAZoAMCAQShEgQQNTBRWS07MXNTUFZpcCZVJKE5MDegAwIBEaEwBC4QAFnNxLdgMlcm6rpsMIqgh6CN2IWb/cTk6Jj/sKQYGZkU8KlkJHuelUVz0bSk
krbPrincipalName: conflict_user@ALD250.PRO
loginShell: /bin/bash
mail: conflict_user@ald250.pro
mepManagedEntry: cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
nsds5replconflict: namingConflict (ADD) uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: x-ald-user
objectClass: x-ald-user-parsec14
objectClass: x-ald-audit-policy
objectClass: rbta-unit
objectClass: rbta-address
objectClass: rbtaCustomUserAttrs
objectClass: rbta-inetorgperson-ext
objectClass: ruPostMailAccount
objectClass: rbtaUserMeta
objectClass: ipaSshGroupOfPubKeys
objectClass: ldapsubentry
objectClass: mepOriginEntry
objectClass: ipantuserattrs
proxyAddresses: SMTP:CONFLICT_USER@ALD250.PRO
rbtadp: ou=ald250.pro,cn=orgunits,cn=accounts,dc=ald250,dc=pro
rbtaou: ald250.pro
sn: User
uid: conflict_user
uidNumber: 1213300500
userPassword: {PBKDF2-SHA512}10000$uPEJ8l/mnTsjJkckyxqqJRIQx/X2OrOI$Wzm9wddHKCb9JOLl4UVQLUk/czorLTUqEOYE6QBT/l4t+B+pXgJ8xXrVmkdnKYyREYmXrpf2XyNPsOoEbzbz8A==
x-ald-user-mac: 0:0x0:0:0x0
xaldusermacmax: 0
xaldusermacmin: 0
 
 
dn: cn=conflict_user+nsuniqueid=adc2dc05-71ea11f0-816fe86f-aa36b0da,cn=groups,cn=accounts,dc=ald250,dc=pro
cn: conflict_user
description: User private group for conflict_user
gidNumber: 1213300500
ipaUniqueID: c1a7f6d8-71ea-11f0-a685-02000a452904
mepManagedBy: uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
nsds5replconflict: namingConflict (ADD) cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
objectClass: posixgroup
objectClass: ipaobject
objectClass: mepManagedEntry
objectClass: top
objectClass: ldapsubentry

Посмотрим конфликты для cn=conflict_user+nsuniqueid=adc2dc05-71ea11f0-816fe86f-aa36b0da,cn=groups,cn=accounts,dc=ald250,dc=pro

dsconf ldap://dc01.ald250.pro -D "cn=Directory Manager" repl-conflict compare cn=conflict_user+nsuniqueid=adc2dc05-71ea11f0-816fe86f-aa36b0da,cn=groups,cn=accounts,dc=ald250,dc=pro


Conflict Entry:
 
dn: cn=conflict_user+nsuniqueid=adc2dc05-71ea11f0-816fe86f-aa36b0da,cn=groups,cn=accounts,dc=ald250,dc=pro
cn: conflict_user
description: User private group for conflict_user
gidNumber: 1213300500
ipaUniqueID: c1a7f6d8-71ea-11f0-a685-02000a452904
mepManagedBy: uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
nsds5replconflict: namingConflict (ADD) cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
objectClass: posixgroup
objectClass: ipaobject
objectClass: mepManagedEntry
objectClass: top
objectClass: ldapsubentry
 
 
Valid Entry:
 
dn: cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
cn: conflict_user
description: User private group for conflict_user
gidNumber: 1213200010
ipaUniqueID: accda578-71ea-11f0-8dec-02000a452902
mepManagedBy: uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
objectClass: posixgroup
objectClass: ipaobject
objectClass: mepManagedEntry
objectClass: top

Оставим только cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro:

dsconf ldap://dc01.ald250.pro -D "cn=Directory Manager" repl-conflict delete cn=conflict_user+nsuniqueid=adc2dc05-71ea11f0-816fe86f-aa36b0da,cn=groups,cn=accounts,dc=ald250,dc=pro

По такому же принципу разрешим 2й конфликт:

root@dc01:~# dsconf ldap://dc01.ald250.pro -D "cn=Directory Manager" repl-conflict compare nsuniqueid=adc2dc01-71ea11f0-816fe86f-aa36b0da+uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
Enter password for cn=Directory Manager on ldap://dc01.ald250.pro:
Conflict Entry:
 
dn: nsuniqueid=adc2dc01-71ea11f0-816fe86f-aa36b0da+uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
cn: conflicted User
displayName: conflicted User
gecos: conflicted User
gidNumber: 1213300500
givenName: conflicted
homeDirectory: /home/conflict_user
initials: cU
ipaNTSecurityIdentifier: S-152119632958532268353583389735258101500
ipaUniqueID: c173c7be-71ea-11f0-a685-02000a452904
krbCanonicalName: conflict_user@ALD250.PRO
krbExtraData:: AAI445Focm9vdC9hZG1pbkBBTEQyNTAuUFJPAA==
krbLastPwdChange: 20250805105552Z
krbPasswordExpiration: 20250805105552Z
krbPrincipalKey:: MIHeoAMCAQGhAwIBAaIDAgEBowMCAQGkgccwgcQwaKAbMBmgAwIBBKESBBBjQjo4PD1ZLVBIfEI0KitroUkwR6ADAgESoUAEPiAAXxsWn7SM64uMNXVBzUsCpN1JZOObIc/h+tt+/vlGqWrfFMcF2en4vgPJJo/qtKx0+886arhXPkdPAv4bMFigGzAZoAMCAQShEgQQNTBRWS07MXNTUFZpcCZVJKE5MDegAwIBEaEwBC4QAFnNxLdgMlcm6rpsMIqgh6CN2IWb/cTk6Jj/sKQYGZkU8KlkJHuelUVz0bSk
krbPrincipalName: conflict_user@ALD250.PRO
loginShell: /bin/bash
mail: conflict_user@ald250.pro
mepManagedEntry: cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
nsds5replconflict: namingConflict (ADD) uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: x-ald-user
objectClass: x-ald-user-parsec14
objectClass: x-ald-audit-policy
objectClass: rbta-unit
objectClass: rbta-address
objectClass: rbtaCustomUserAttrs
objectClass: rbta-inetorgperson-ext
objectClass: ruPostMailAccount
objectClass: rbtaUserMeta
objectClass: ipaSshGroupOfPubKeys
objectClass: ldapsubentry
objectClass: mepOriginEntry
objectClass: ipantuserattrs
proxyAddresses: SMTP:CONFLICT_USER@ALD250.PRO
rbtadp: ou=ald250.pro,cn=orgunits,cn=accounts,dc=ald250,dc=pro
rbtaou: ald250.pro
sn: User
uid: conflict_user
uidNumber: 1213300500
userPassword: {PBKDF2-SHA512}10000$uPEJ8l/mnTsjJkckyxqqJRIQx/X2OrOI$Wzm9wddHKCb9JOLl4UVQLUk/czorLTUqEOYE6QBT/l4t+B+pXgJ8xXrVmkdnKYyREYmXrpf2XyNPsOoEbzbz8A==
x-ald-user-mac: 0:0x0:0:0x0
xaldusermacmax: 0
xaldusermacmin: 0
 
 
Valid Entry:
 
dn: uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
cn: conflict User
displayName: conflict User
gecos: conflict User
gidNumber: 1213200010
givenName: conflict
homeDirectory: /home/conflict_user
initials: cU
ipaNTSecurityIdentifier: S-1521196329585322683535833897352581010
ipaUniqueID: acbf75f2-71ea-11f0-8dec-02000a452902
krbCanonicalName: conflict_user@ALD250.PRO
krbExtraData:: AAIV45Focm9vdC9hZG1pbkBBTEQyNTAuUFJPAA==
krbLastPwdChange: 20250805105517Z
krbPasswordExpiration: 20250805105517Z
krbPrincipalKey:: MIHeoAMCAQGhAwIBAaIDAgEBowMCAQGkgccwgcQwaKAbMBmgAwIBBKESBBBlWVFiX0VGQy0pWD5lSEQ3oUkwR6ADAgESoUAEPiAAzbHqRTVBdHb5wmDrl77TO8VUARRi0rHmJ/98XoVsTBAvYLNRjJVPh9G0b3ghLu0PONdXZiIpu2ErHi8xMFigGzAZoAMCAQShEgQQTUZ7PTopVktRfGZFaW8+LaE5MDegAwIBEaEwBC4QAM3dD4hlnDrfq/XuK10ieoM4yAPEMA+MM+R9CW4OdIsThk9Sx36VOtIOIhSh
krbPrincipalName: conflict_user@ALD250.PRO
loginShell: /bin/bash
mail: conflict_user@ald250.pro
memberOf: cn=ipausers,cn=groups,cn=accounts,dc=ald250,dc=pro
memberOf: cn=ALDPRO - Organization units,cn=roles,cn=accounts,dc=ald250,dc=pro
memberOf: cn=Organization units,cn=privileges,cn=pbac,dc=ald250,dc=pro
memberOf: cn=Organization units - Read - Relations,cn=permissions,cn=pbac,dc=ald250,dc=pro
memberOf: cn=Organization units - Read - OU,cn=permissions,cn=pbac,dc=ald250,dc=pro
memberOf: cn=conflict_user_3m98nnfmo7u7d2rsx,cn=users_history,cn=accounts,dc=ald250,dc=pro
memberOf: cn=conflict_user_fow3ooa2q7q3vkvui,cn=users_history,cn=accounts,dc=ald250,dc=pro
memberOf: cn=test_role,cn=roles,cn=accounts,dc=ald250,dc=pro
memberOf: cn=ALDPRO ROCO Attributes Mapping - Read,cn=privileges,cn=pbac,dc=ald250,dc=pro
memberOf: cn=ALDPRO ROCO Attributes Mapping - Read,cn=permissions,cn=pbac,dc=ald250,dc=pro
memberOf: cn=ALDPRO ROCO Attributes Mapping - Manage,cn=privileges,cn=pbac,dc=ald250,dc=pro
memberOf: cn=ALDPRO ROCO Attributes Mapping - Manage,cn=permissions,cn=pbac,dc=ald250,dc=pro
mepManagedEntry: cn=conflict_user,cn=groups,cn=accounts,dc=ald250,dc=pro
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: x-ald-user
objectClass: x-ald-user-parsec14
objectClass: x-ald-audit-policy
objectClass: rbta-unit
objectClass: rbta-address
objectClass: rbtaCustomUserAttrs
objectClass: rbta-inetorgperson-ext
objectClass: ruPostMailAccount
objectClass: rbtaUserMeta
objectClass: ipaSshGroupOfPubKeys
objectClass: mepOriginEntry
objectClass: ipantuserattrs
proxyAddresses: SMTP:CONFLICT_USER@ALD250.PRO
rbtadp: ou=ald250.pro,cn=orgunits,cn=accounts,dc=ald250,dc=pro
rbtaou: ald250.pro
sn: User
uid: conflict_user
uidNumber: 1213200010
userPassword: {PBKDF2-SHA512}10000$+mn7IoPU4om7kLc9I3PS1opkiHJteGzy$uEHe5EuvMJ4c4KOukivH8+46Ohqvx8PuvSamj18k3uQnzgZ1KBl7brBq4yEGzxJc5Y6Ssl0hkxDZ2D0cMPCOLA==
x-ald-user-mac: 0:0x0:0:0x0
xaldusermacmax: 0
xaldusermacmin: 0
 
 
root@dc01:~# dsconf ldap://dc01.ald250.pro -D "cn=Directory Manager" repl-conflict delete nsuniqueid=adc2dc01-71ea11f0-816fe86f-aa36b0da+uid=conflict_user,cn=users,cn=accounts,dc=ald250,dc=pro
Enter password for cn=Directory Manager on ldap://dc01.ald250.pro:
root@dc01:~# dsconf ldap://dc01.ald250.pro -D "cn=Directory Manager" repl-conflict list dc=ald250,dc=pro
Enter password for cn=Directory Manager on ldap://dc01.ald250.pro:
There were no conflict entries found under the suffix

Перезагружаем dirsrv и проверяем вывод ds-replcheck:

root@dc01:~# systemctl restart dirsrv@*
root@dc01:~# ds-replcheck online -D "cn=Directory Manager" -W -m ldap://dc01:389 -r ldap://dc02:389 -b "dc=ald250,dc=pro" -i memberof,idnssoaserial,entryusn,krblastsuccessfulauth,krblastfailedauth,krbloginfailedcount
Enter password:
================================================================================
Replication Synchronization Report (Thu Aug 7 10:15:54 2025)
================================================================================
 
 
Database RUV's
=====================================================
 
Supplier RUV:
{replica 3 ldap://dc02.ald250.pro:389} 687a55d0000100030000 6894526b000500030000
{replica 4 ldap://dc01.ald250.pro:389} 687a55c1000100040000 6894527e000300040000
{replicageneration} 687a55c1000000040000
 
Replica RUV:
{replica 3 ldap://dc02.ald250.pro:389} 687a55d0000100030000 6894526b000500030000
{replica 4 ldap://dc01.ald250.pro:389} 687a55c1000100040000 6894527e000300040000
{replicageneration} 687a55c1000000040000
 
Replication State: Supplier and Replica are in perfect synchronization
 
 
Entry Counts
=====================================================
 
Supplier: 3704
Replica: 3824
 
 
Tombstones
=====================================================
 
Supplier: 21
Replica: 21
 
Missing Entries
=====================================================
 
Entries missing on Supplier:

  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:53 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:52 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:51 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • ou=sudoers,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:50 2025)
  • cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:49 2025)
  • cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:49 2025)
  • uid=conflict_user,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:14:42 2025)
  • uid=testuser,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • uid=admin,cn=users,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ng,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:49 2025)
  • cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:49 2025)
  • cn=testuser,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Tue Aug 5 10:06:38 2025)
  • cn=print_admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=Default\20SMB\20Group,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=ald\20trust\20admin,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=editors,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=admins,cn=groups,cn=compat,dc=ald250,dc=pro (Created on Replica at: Fri Jul 18 14:19:28 2025)
  • cn=computers,cn=compat,dc=ald250,dc=pro (Created on Replica at: Thu Aug 7 07:15:49 2025)
  • ou=sudoers,dc=ald250,dc=pro  (Created on Replica at: Fri Jul 18 14:19:28 2025)
     
    Result
    =====================================================
     
    There are replication differences between Supplier and Replica

Видим сообщение Replication State: Supplier and Replica are in perfect synchronization, означающее что синхронизация прошла успешно.
Остальные конфликтующие записи разрешились самостоятельно,  вывод команды говорит о расхождении записей каталога compat - на реплике записи присутствуют, а на 1КД - нет.  Данные записи не влияют на работу ALD Pro, они относятся к плагину Schema Compatibility и этот плагин можно отключить. Данная структура не переносится при реинициализации реплики. 
Отключим плагин на 2м КД и перезагрузим dirsrv:

root@dc02:~# ipa-compat-manage disable
Directory Manager password:
 
Disabling plugin
This setting will not take effect until you restart Directory Server.
root@dc02:~# systemctl restart dirsrv@*

И при выполнении команды ds-replcheck получаем идеальный результат:

root@dc01:~# ds-replcheck online -D "cn=Directory Manager" -W -m ldap://dc01:389 -r ldap://dc02:389 -b "dc=ald250,dc=pro" -i memberof,idnssoaserial,entryusn,krblastsuccessfulauth,krblastfailedauth,krbloginfailedcount
Enter password:
================================================================================
Replication Synchronization Report (Thu Aug 7 12:11:57 2025)
================================================================================
 
 
Database RUV's
=====================================================
 
Supplier RUV:
{replica 3 ldap://dc02.ald250.pro:389} 687a55d0000100030000 68946d16000200030000
{replica 4 ldap://dc01.ald250.pro:389} 687a55c1000100040000 68946cc6000100040000
{replicageneration} 687a55c1000000040000
 
Replica RUV:
{replica 3 ldap://dc02.ald250.pro:389} 687a55d0000100030000 68946d16000200030000
{replica 4 ldap://dc01.ald250.pro:389} 687a55c1000100040000 68946cc6000100040000
{replicageneration} 687a55c1000000040000
 
Replication State: Supplier and Replica are in perfect synchronization
 
 
Entry Counts
=====================================================
 
Supplier: 3724
Replica: 3724
 
 
Tombstones
=====================================================
 
Supplier: 41
Replica: 41
 
Result
=====================================================
 
No replication differences between Supplier and Replica

Реинициализация реплики

В сложных случаях может потребоваться полная реинициализация реплики:

  1. Производительность: Реинициализация требует полной пересылки всех данных (часы простоя для больших каталогов).
  2. Риски: Может привести к потере локальных изменений, если выполнена некорректно.
  3. Маскировка проблем: Не устраняет корневые причины конфликтов (например, неправильную топологию репликации).

Когда точно нужна реинициализация:

Что проверять при сравнении данных после реинициализации?

В выводе ds-replcheck должно быть:

Replication State: Supplier and Replica are in perfect synchronization No replication differences between Supplier and Replica

Критичные параметры:

Полезные команды

Проверка расхождений записей пользователей, компьютеров и подразделений:

base_dn=$(ldapsearch -Q -LLL -s base

awk '/^dn:/{print $2}')
password="<PASSWORD>"

  1. Для пользователей
    ipa-replica-manage list 2>/dev/null

grep -E

'^\[a-zA-Z0-9.-\]+:'

awk -F: '{print $1}'

xargs -I{} bash -c 'echo "=== Проверка пользователей на реплике: {} ==="; ldapsearch -x -h {} -b "cn=users,cn=accounts,'"$base_dn"'" -s onelevel -D "cn=Directory Manager" -w "'"$password"'" "(uid=*)" dn 2>/dev/null

grep -c "^dn:"

echo "Ошибка подключения к {}"'

  1. Для компьютеров
    ipa-replica-manage list 2>/dev/null

grep -E

'^\[a-zA-Z0-9.-\]+:'

awk -F: '{print $1}'

xargs -I{} bash -c 'echo "=== Проверка компьютеров на реплике: {} ==="; ldapsearch -x -h {} -b "cn=computers,cn=accounts,'"$base_dn"'" -s onelevel -D "cn=Directory Manager" -w "'"$password"'" "(fqdn=*)" dn 2>/dev/null

grep -c "^dn:"

echo "Ошибка подключения к {}"'

  1. Для подразделений
    ipa-replica-manage list 2>/dev/null

grep -E

'^\[a-zA-Z0-9.-\]+:'

awk -F: '{print $1}'

xargs -I{} bash -c 'echo "=== Проверка подразделений на реплике: {} ==="; ldapsearch -x -h {} -b "cn=orgunits,cn=accounts,'"$base_dn"'" -s onelevel -D "cn=Directory Manager" -w "'"$password"'" "(ou=*)" dn 2>/dev/null

grep -c "^dn:"

echo "Ошибка подключения к {}"'

Где <PASSWORD> - пароль УЗ Directory Manager Вывести служебную информацию Replica Update Vectors (RUV), о состоянии репликации между серверами FreeIPA :

ipa-replica-manage list-ruv


Проверка статуса репликации между всеми серверами:

dsconf $(ldapsearch -Q -LLL -s base

awk '/nisDomain:/{gsub(/\./,"-",$2); print toupper($2)}') replication monitor

На вопрос Enter a bind DN for <server>:389 ответьте cn="Directory Manager"
Вывести информацию о группе узлов ipaservers:

ipa hostgroup-show ipaservers


Удаление всех конфликтов:

Данная команда удалит все конфликты, данные могут быть повреждены! Используйте ее с осторожностью.


<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="38506f4c-1a2a-45ba-a15c-050ce4f22a2f"><ac:plain-text-body><![CDATA[

domain=$(ldapsearch -Q -LLL -s base

awk '/nisDomain:/{gsub(/\./,"-",$2); print toupper($2)}'); dsconf $domain repl-conflict list $(ldapsearch -Q -LLL -s base

awk '/^dn:/{print $2}')

awk '/^dn: /{print substr($0,5)}'

xargs -I [] dsconf $domain repl-conflict delete []

]]></ac:plain-text-body></ac:structured-macro>


Заключение

Регулярный мониторинг и соблюдение рекомендаций по разрешению конфликтов помогут избежать проблем с согласованностью данных.

Моделирование ошибок репликации


Подготовка тестовой среды

  1. Создадим тестовую OU и пользователя (выполняем команду на 1КД):

    kinit admin
    suffix=$(ldapsearch -Q -LLL -s base

    grep 'dn: '

    cut -d ' ' -f2)
    dc=$(hostname -f)
    domain=$(hostname -d)
     
    ldapadd -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix
    objectClass: rbta-org-unit
    ou: test_repl
    displayName: test_repl
    EOF
     
    ipa user-add testuser \
    --first="Test" \
    --last="User" \
    --random
     
    ldapmodify -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: rbtadp
    rbtadp: ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix

  1. Проверим репликацию (выполняем команду на 2КД):

    kinit admin
    suffix=$(ldapsearch -Q -LLL -s base

    grep 'dn: '

    cut -d ' ' -f2)
    dc=$(hostname -f)
    domain=$(hostname -d)
    ldapsearch -h $dc -D "cn=Directory Manager" -W -b "ou=test_repl,ou=$domain,cn=orgunits,cn=accounts,$suffix"


    Этап 1: Создаем namingConflict (ADD)

  1. На КД1 изменяем телефон
    ldapmodify -h $dc -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: telephoneNumber
    telephoneNumber: +111111111
    EOF
     
  2. На КД2 изменяем email
    ldapmodify -h $5DC2.$domain -D "cn=Directory Manager" -W <<EOF
    dn: uid=testuser,cn=users,cn=accounts,$suffix
    changetype: modify
    replace: mail
    mail: test@example.com
    EOF|