多重主伺服器複寫使用約略一致的複寫模式。這表示相同的項目可能會在不同的伺服器上同時修改。當更新在兩部伺服器之間互傳時,必須解決所有衝突的變更。大多數的衝突會自動解決。例如,與各伺服器上的變更相關之時間戳記會經由使用最近的變更而獲得解決。但是,某些變更衝突需要手動介入才能解決。
本節包含下列主題:
解決複寫衝突最簡單的方式是使用 DSCC。如需相關資訊,請參閱 DSCC 線上說明。
您可以使用指令行解決複寫衝突。無法經由複寫程序自動解決之變更衝突的項目,會包含操作屬性 nsds5ReplConflict 做為衝突記號。
若要尋找出現衝突的項目,請定期搜尋包含此屬性的項目。例如,您可以使用下列 ldapsearch 指令尋找衝突的項目:
$ ldapsearch -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config \ -w - -b "dc=example,dc=com" "(nsds5ReplConflict=*)" |
請注意,預設會編製 nsds5ReplConflict 屬性的索引。
具有相同 DN 的項目如果是在伺服器彼此複寫變更之前所建立的,則可能是建立在不同的主伺服器上。經過複寫之後,衝突解決機制會自動重新命名第二個建立的項目。
具有 DN 命名衝突的項目會在其 DN 中包含操作屬性 nsuniqueid 提供的唯一識別碼,進行重新命名。
例如,如果項目 uid=bjensen,ou=People,dc=example,dc=com 在兩部主伺服器上同時建立,則這兩部主伺服器在複寫之後會有以下兩個項目:
uid=bjensen,ou=People,dc=example,dc=com
nsuniqueid=66446001-1dd211b2-66225011-2ee211db+uid=bjensen,dc=example,dc=com
必須為第二個項目提供有用的 DN。您可以刪除衝突的項目,並再次以非衝突的名稱增加。但是,重新命名項目可確保其內容不會變更。重新命名程序會視命名屬性是單值或多值而有所不同。請參閱下列程序。
您可以使用 DSCC 執行此作業。如需有關資訊,請參閱目錄服務控制中心介面與 DSCC 線上說明。
重新命名項目,同時保留舊 RDN 值,例如:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: nsuniqueid=66446001-1dd211b2-66225011-2ee211db+uid=bjensen,dc=example,dc=com changetype: modrdn newrdn: uid=bj66446001 deleteoldrdn: 0 ^D |
您無法刪除此步驟中的舊 RDN 值,因為該值還同時包含無法刪除的 nsuniqueid 操作屬性。
移除命名屬性的舊 RDN 值與衝突記號屬性,例如:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: uid=bj66446001,dc=example,dc=com changetype: modify delete: uid uid: bjensen - delete: nsds5ReplConflict ^D |
複寫項目中的命名屬性為單值時,例如 dc (網域元件),您無法僅重新命名項目為相同屬性的其他值。相反的,您必須提供項目暫存名稱。
您可以使用 DSCC 執行此作業。如需有關資訊,請參閱目錄服務控制中心介面與 DSCC 線上說明。
使用不同的命名屬性重新命名項目,並保留舊 RDN,例如:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: nsuniqueid=66446001-1dd211b2-66225011-2ee211db+dc=HR,dc=example,dc=com changetype: modrdn newrdn: o=TempHREntry deleteoldrdn: 0 ^D |
您無法刪除此步驟中的舊 RDN 值,因為該值還同時包含無法刪除的 nsuniqueid 操作屬性。
將想要的命名屬性變更為唯一值,並移除衝突記號屬性,例如:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: o=TempHREntry,dc=example,dc=com changetype: modify replace: dc dc: NewHR delete: nsds5ReplConflict ^D |
將項目重新命名回預定命名屬性,例如:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: dc=NewHR,dc=example,dc=com changetype: modrdn newrdn: dc=HR deleteoldrdn: 1 ^D |
您可以將 deleteoldrdn 屬性值設為 1,刪除成對的暫存屬性值組 o=TempHREntry。若要保留此屬性,請將 deleteoldrdn 屬性值設為 0。
複寫刪除作業時,若是用戶伺服器發現要刪除的項目有子項目,衝突解決程序會建立接點項目,以避免目錄中出現孤立項目。
同理,複寫增加作業時,若是用戶伺服器找不到父項目,衝突解決程序就會建立表示父系的接點項目,使得新項目不會成為孤立項目。
接點項目是包含物件類別 glue 與 extensibleObject 的暫存項目。接點項目會以下列各種方式建立:
如果衝突解決程序發現有刪除的項目符合唯一識別碼,接點項目會是該項目的復原內容。接點項目也包含 glue 物件類別與 nsds5ReplConflict 屬性。
此情況下,您可以修改接點項目以移除 glue 物件類別與 nsds5ReplConflict 屬性,使該項目維持為一般項目,或刪除接點項目與其子項目。
伺服器會以 glue 與 extensibleObject 物件類別建立基本項目。
此情況下,您必須修改項目使其變成有意義的項目,或刪除項目與所有子項目。
如需依賴屬性唯一性的應用程式互通操作,例如郵件伺服器,您可能必須限制包含 nsds5ReplConflict 屬性的項目之存取權。如果沒有限制這些項目的存取權,僅需要一個屬性的應用程式會同時選擇原始項目與包含 nsds5ReplConflict 的衝突解決項目,而作業將因此失敗。
若要限制存取,您必須使用下列指令修改授予匿名讀取權的預設 ACI:
$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w - Enter bind password: dn: dc=example,dc=com changetype: modify delete: aci aci: (target ="ldap:///dc=example,dc=com") (targetattr !="userPassword" (version 3.0;acl "Anonymous read-search access"; allow (read, search, compare)(userdn = "ldap:///anyone");) - add: aci aci: (target="ldap:///dc=example,dc=com") (targetattr!="userPassword") (targetfilter="(!(nsds5ReplConflict=*))")(version 3.0;acl "Anonymous read-search access";allow (read, search, compare) (userdn="ldap:///anyone");) ^D |
新的 ACI 會避免搜尋結果中傳回包含 nsds5ReplConflict 屬性的項目。