分布式数据库与目录系统详解
立即解锁
发布时间: 2025-08-23 01:16:52 阅读量: 2 订阅数: 17 

# 分布式数据库与目录系统详解
## 1. 云服务与分布式数据库概述
在当今时代,云服务市场发展迅猛。云服务提供商在数据存储和管理方面存在诸多差异。例如,一些云服务提供商可能会受相关法规影响,即便客户未曾预料,其数据也可能被要求提供给美国政府。同时,不同的云服务提供商为客户提供的数据分布和复制控制权程度不同,有些甚至直接提供数据库服务,而非仅提供原始存储和虚拟机。
数据库管理员在选择云服务时,需综合考虑技术、经济和法律等多方面问题,以确保数据的隐私和安全,保证数据具有 ACID 属性(或可接受的近似属性),并在数据广泛分布的情况下仍能保证足够的性能。
## 2. 目录系统基础
### 2.1 目录系统的概念与需求
目录系统是一种专门用于存储和组织信息的系统,类似于文件系统对文件的组织方式。在过去,组织会创建员工的实体目录并进行分发,如今电话公司也会创建客户的实体电话簿。而在网络时代,目录系统需要以计算机网络的形式存在,而非传统的纸质形式。
### 2.2 目录访问协议
为了实现对目录信息的标准化访问,人们开发了多种目录访问协议,其中最常用的是轻量级目录访问协议(LDAP)。虽然目录中的数据也可以存储在数据库系统中并通过 JDBC 或 ODBC 等协议访问,但目录访问协议有其独特的优势:
- **简化协议**:目录访问协议是简化的协议,专门针对有限类型的数据访问而设计,与数据库访问协议并行发展。
- **层次化命名机制**:目录系统提供了一种类似于文件系统目录名的层次化命名机制,可用于分布式目录系统中指定每个目录服务器存储的信息。例如,不同地点的贝尔实验室员工信息可以分别存储在不同的目录服务器中,并且目录访问协议可以跨网络获取这些数据,还能自动转发查询请求。
由于这些优势,许多组织使用目录系统通过目录访问协议在线提供组织信息,这些信息可用于查找人员的地址、电话号码、电子邮件地址等,还可用于用户认证。
### 2.3 LDAP 协议
#### 2.3.1 LDAP 数据模型
在 LDAP 中,目录存储条目,每个条目都有一个唯一的区分名(DN),DN 由一系列相对区分名(RDNs)组成。例如:`cn=Silberschatz, ou=Computer Science, o=Yale University, c=USA`。条目还可以有属性,LDAP 提供了二进制、字符串、时间等类型,以及专门用于电话号码的 `tel` 类型和用于地址的 `PostalAddress` 类型。与关系模型不同,LDAP 中的属性默认是多值的。
LDAP 允许定义对象类,支持继承,并且一个条目可以属于一个或多个对象类。条目按照其区分名组织成目录信息树(DIT),叶节点通常表示具体对象,内部节点表示组织单位、组织或国家等。DIT 中的节点可以有别名,用于处理一个条目有多个区分名的情况。
#### 2.3.2 LDAP 数据操作
LDAP 没有定义数据定义语言和数据操作语言,但定义了用于数据定义和操作的网络协议。用户可以使用应用程序编程接口或供应商提供的工具进行数据操作。LDAP 还定义了 LDAP 数据交换格式(LDIF)用于存储和交换信息。
LDAP 的查询机制相对简单,仅包含选择和投影操作,不支持连接操作。一个查询需要指定以下内容:
- **基础节点**:通过给出其区分名指定 DIT 中的一个节点。
- **搜索条件**:可以是对单个属性条件的布尔组合,支持相等、通配符匹配和近似相等(近似相等的具体定义因系统而异)。
- **搜索范围**:可以是基础节点本身、基础节点及其子节点或基础节点下的整个子树。
- **返回的属性**。
- **结果数量和资源消耗的限制**。
查询还可以指定是否自动解引用别名。查询 LDAP 数据源有两种方式:
- **使用 LDAP URLs**:例如 `ldap://codex.cs.yale.edu/o=Yale University,c=USA` 返回指定服务器上所有组织为耶鲁大学且国家为美国的条目的所有属性;`ldap://codex.cs.yale.edu/o=Yale University,c=USA??sub?cn=Silberschatz` 在指定子树中搜索 `cn=Silberschatz` 的条目。
- **使用应用程序编程接口**:以下是一个使用 C 语言连接 LDAP 服务器并执行查询的示例代码:
```c
#include <stdio.h>
#include <ldap.h>
main() {
LDAP *ld;
LDAPMessage *res, *entry;
char *dn, *attr, *attrList[] = {"telephoneNumber", NULL};
BerElement *ptr;
int vals, i;
ld = ldap_open("codex.cs.yale.edu", LDAP_PORT);
ldap_simple_bind(ld, "avi", "avi-passwd");
ldap_search_s(ld, "o=Yale University, c=USA", LDAP_SCOPE_SUBTREE,
"cn=Silberschatz", attrList, /*attrsonly*/ 0, &res);
printf("found %d entries", ldap_count_entries(ld, res));
for (entry = ldap_first_entry(ld, res); entry != NULL;
entry = ldap_next_entry(ld, entry))
{
dn = ldap_get_dn(ld, entry);
printf("dn: %s", dn);
ldap_memfree(dn);
for (attr = ldap_first_attribute(ld, entry, &ptr);
attr != NULL;
attr = ldap_next_attribute(ld, entry, ptr))
{
printf("%s: ", attr);
vals = ldap_get_values(ld, entry, attr);
for (i = 0; vals[i] != NULL; i++)
printf("%s, ", vals[i]);
ldap_value_free(vals);
}
}
ldap_msgfree(res);
ldap_unbind(ld);
}
```
LDAP API 还包含创建、更新和删除条目等操作,但不支持多个更新操作的原子性。
#### 2.3.3 分布式目录
0
0
复制全文
相关推荐








