---
slideOptions:
transition: slide
theme: night
tags: LDAP-Series, Configure, Tutorial
type:
title: 2. Config OpenLdap Master-Master
---
<style>
.reveal section img {
background: transparent!important;
border: none!important;
box-shadow: none!important;
}
</style>
# Cấu hình triển khai OpenLdap theo mô hình Master-Master
## Tổng quan
Tài liệu này hướng dẫn cấu hình openLdap theo mô hình Master-Master. Mô hình Master-Master áp dụng trong trường hợp tải cao khi yêu cầu ghi vào openLdap nhiều trong khi mô hình Master-Slave thì chỉ có thể ghi vào một node duy nhất là node Master. Với mô hình Master-Master, dữ liệu có thể ghi vào bất cứ node nào. Đây là mô hình nhằm cải thiện hiệu năng WRITE vào openLdap tăng tính sẵn sàng cho dịch vụ

----
## Chuẩn bị
- Cài trên 2 server tương đương với 2 node với cấu hình như sau:
- <b>Node 1:</b>
> HostName: ldap-01(Master)
> CPU: 2 cores
> Ram: 2Gb
> Disk: 30Gb
> Network: eth0: Network access (192.168.1.18)
- <b>Node 2:</b>
> HostName: ldap-02(Master)
> CPU: 2 cores
> Ram: 2Gb
> Disk: 30Gb
> Network: eth0: Network access (192.168.1.19)
----
## Cài đặt
### Cài đặt OpenLdap
- Cài đặt OpenLdap theo hướng dẫn tại đây: [Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-ubuntu-16-04) | [Windows](https://www.maxcrc.de/userbooster/)
----
### Cấu hình bổ sung tại tất cả các node
- Bước 1: Kích hoạt <b><i>module syncprov</i></b>
```ssh
cat > mod_syncprov.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"
```
- Bước 2: Cho phép <b><i>module syncprov</i></b> hoạt động trên DB LDAP
```ssh
cat > syncprov.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
```
----
### Cấu hình node Master01
<b><u>Lưu ý:</u></b>
- Trong mô hình mình có 2 node, Master-01 (Ip: 192.168.1.18) và Master-02 (Ip: 192.168.1.19)
- Tại Node Master-01 sẽ khai báo cấu hình cho phép nhân bản dữ liệu lên node Master-02(master02.ldif)
- Tại Node Master-02 sẽ khai báo cấu hình cho phép nhân bản dữ liệu lên node Master-01(master01.ldif)
<b><u>Lưu ý file cấu hình:</u></b>
- <b>`olcServerID`</b>: Phải là duy nhất định danh cho node openLdap. Với <b>Master-01</b>, ta sẽ định nghĩa là <b><i>`oclServerID: 1`</i></b>, với <b>Master-02</b>, ta sẽ định nghĩa là <b><i>`oclServerID: 2`</i></b>
<b><u>Cấu hình:</u></b>
```ssh
cat > master02.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://192.168.1.18:389/
bindmethod=simple
binddn="cn=Manager,dc=nhanhoa,dc=local"
credentials=*****
searchbase="dc=nhanhoa,dc=local"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f master96.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
```
----
### Cấu hình node Master02
<b><u>Lưu ý:</u></b>
- Trong mô hình mình có 2 node, Master-01 (Ip: 192.168.1.18) và Master-02 (Ip: 192.168.1.19)
- Tại Node Master-01 sẽ khai báo cấu hình cho phép nhân bản dữ liệu lên node Master-02(master02.ldif)
- Tại Node Master-02 sẽ khai báo cấu hình cho phép nhân bản dữ liệu lên node Master-01(master01.ldif)
<b><u>Lưu ý file cấu hình:</u></b>
- <b>`olcServerID`</b>: Phải là duy nhất định danh cho node openLdap. Với <b>Master-01</b>, ta sẽ định nghĩa là <b><i>`oclServerID: 1`</i></b>, với <b>Master-02</b>, ta sẽ định nghĩa là <b><i>`oclServerID: 2`</i></b>
<b><u>Cấu hình:</u></b>
```ssh
cat > master01.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://192.168.1.19:389/
bindmethod=simple
binddn="cn=Manager,dc=nhanhoa,dc=local"
credentials=*****
searchbase="dc=nhanhoa,dc=local"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f master96.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
```
----
## Kết quả
### Trên node Master-01
Thêm dữ liệu vào node Master-01
```ssh
echo '
dn: ou=Tests,dc=nhanhoa,dc=local
ou: Tests
objectclass: organizationalUnit' > test_structure.ldif
ldapadd -x -D cn=Manager,dc=nhanhoa,dc=local -W -f test_structure.ldif
```
Kết quả:
```ssh
adding new entry "ou=Tests,dc=nhanhoa,dc=local"
```
Kiểm tra dữ liệu trên node Master-02
```ssh
ldapsearch -x -h 192.168.1.19 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=person)"
```
Kết quả:
```ssh
[root@ldap_02 ~]# ldapsearch -x -h 192.168.1.19 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=organizationalUnit)"
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (objectclass=organizationalUnit)
# requesting: ALL
#
# People, nhanhoa.local
dn: ou=People,dc=nhanhoa,dc=local
objectClass: organizationalUnit
ou: People
# Group, nhanhoa.local
dn: ou=Group,dc=nhanhoa,dc=local
objectClass: organizationalUnit
ou: Group
# Tests, nhanhoa.local
dn: ou=Tests,dc=nhanhoa,dc=local
ou: Tests
objectClass: organizationalUnit
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
```
----
### Trên node Master-02
Thêm dữ liệu vào node Master-02
```ssh
echo '
dn: cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba@test.com
userPassword:: b3BlbnN0YWNr
cn: thanhbaba
sn: thanhbaba' > user_test_thanhbaba.ldif
ldapadd -x -D cn=Manager,dc=nhanhoa,dc=local -W -f user_test_thanhbaba.ldif
```
Kết quả:
```ssh
adding new entry "cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local"
```
Kiểm tra dữ liệu trên node Master-01
```ssh
[root@ldap_01 ~]# ldapsearch -x -h 192.168.1.18 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=person)"
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (objectclass=person)
# requesting: ALL
#
# thanhbaba, Tests, nhanhoa.local
dn: cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba@test.com
cn: thanhbaba
sn: thanhbaba
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
```
Kết quả:
```ssh
[root@ldap_01 ~]# ldapsearch -x -h 192.168.1.18 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=organizationalUnit)"
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (objectclass=organizationalUnit)
# requesting: ALL
#
# People, nhanhoa.local
dn: ou=People,dc=nhanhoa,dc=local
objectClass: organizationalUnit
ou: People
# Group, nhanhoa.local
dn: ou=Group,dc=nhanhoa,dc=local
objectClass: organizationalUnit
ou: Group
# Tests, nhanhoa.local
dn: ou=Tests,dc=nhanhoa,dc=local
ou: Tests
objectClass: organizationalUnit
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
```
----
### Tắt node Master-01, ghi dữ liệu vào Master-02
Tại node Master-01
```ssh
[root@ldap_01 ~]# init 0
```
Tại node Master-02
```ssh
echo '
dn: cn=thanhbaba2,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba2@test.com
userPassword:: b3BlbnN0YWNr
cn: thanhbaba2
sn: thanhbaba2' > user_test_thanhbaba2.ldif
ldapadd -x -D cn=Manager,dc=nhanhoa,dc=local -W -f user_test_thanhbaba2.ldif
```
Kết quả:
```ssh
adding new entry "cn=thanhbaba2,ou=Tests,dc=nhanhoa,dc=local"
```
Kiểm tra:
```ssh
[root@ldap_01 ~]# ldapsearch -x -h 10.10.10.96 -b "dc=nhanhoa,dc=local" -s sub "(cn=thanhbaba2)"
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (cn=thanhbaba2)
# requesting: ALL
#
# thanhbaba2, Tests, nhanhoa.local
dn: cn=thanhbaba2,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba2@test.com
cn: thanhbaba2
sn: thanhbaba2
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
```
----
### Bật node Master-01, kiểm tra dữ liệu đồng bộ
```ssh
[root@ldap_01 ~]# ldapsearch -x -h 192.168.1.18 -b "dc=nhanhoa,dc=local" -s sub "(cn=thanhbaba2)"
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (cn=thanhbaba2)
# requesting: ALL
#
# thanhbaba2, Tests, nhanhoa.local
dn: cn=thanhbaba2,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba2@test.com
cn: thanhbaba2
sn: thanhbaba2
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
```
----
## Tổng kết
Như vậy trong bài viết này mình đã triển khai mô hình LDAP Master-Master. Tuy nhiên còn một mô hình triển khai LDAP phổ biến khác đó là mô hình LDAP Master-Slave. Vậy sự khác nhau giữa hai mô hình này là thế nào? Cách triển khai ra sao? Lợi ích của mô hình Masterr-Slave đem lại là gì? Mời các bạn theo dõi bài viết tiếp theo của mình.