远程及安全措施
远程 SQL(RSQL)应用程序可以在不同处理器甚至不同架构的系统上运行。例如,验证测试已使用由以下系统上的服务器提供的数据库分片进行运行:
- Itanium 处理器(big-endian) x64
- x86 处理器(little-endian) x64
- x86 处理器(little-endian) x32
客户端应用程序可以在 x86、x32 或 x64 系统上运行。因此,架构和字节序都不会影响 SmartESQL RSQL 接口。
安全措施
SmartESQL 远程 SQL 应用程序能够实现两种类型的安全性:密码验证或安全套接层,如以下各节所述。
密码身份验证
RSQL 应用程序可以通过在 SqlServer 类中设置 authenticationRequired 参数来对远程 SQL 连接进行密码保护。如果将该参数设置为 true,则客户端应用程序必须通过 authenticate() API 向 RemoteSqlEngine 或 DistributedSqlEngine 传递身份验证凭据,才能连接到服务器。
RemoteSqlEngine::authenticate(char const* login, char const* password);
DistributedSqlEngine::authenticate(char const* login, char const* password);
该身份验证需要一个名为“Users”的表,其中包含两个必需的字符串字段“login”和“password”,用于保存用户名和密码:
create table Users (login string primary key, password string);
insert into Users values ('user1', 'mypass');
insert into Users values ('user2', 'hYfjdKK2');
远程客户端应用程序必须提供与“用户”表中所列相匹配的凭证才能连接到数据库。请注意此密码保护功能的以下重要特性:
“用户”表除了包含登录名和密码字段外,还可以包含其他字段。
数据库运行时不会对凭证进行加密。如果需要,应用程序有责任对“Users”表的内容进行加密或以某种方式加以保护。
通过远程引擎协议传输的凭证也没有加密。不过,可以将远程服务器身份验证与 SSL 加密结合使用。
如果在使用 xSQL 时启用了 SSL 加密(但未启用身份验证),则密码传输将受到保护。
远程 SQL SSL 客户端应用程序
要以 SSL 安全方式启动 RemoteSQL 客户端和服务器应用程序,必须设置用于建立网络连接的 SSL 参数。有关实现 OpenSSL 安全性的详细信息,请参阅网络通信页面。
设置远程 SQL 超时时间
对于使用版本低于 7.0 版本的 SmartESQL 构建的 RSQL 应用程序,RSQL 客户端在等待建立服务器连接或等待查询结果时可能会出现挂起现象。这是因为 RemoteSqlEngine 实现使用了 TCP 的 connect() 和 read() 函数,它们依靠 TCP 超时来通知客户端网络错误。(请注意,连接超时错误几乎无法告知您哪里出了问题或错误为何发生;它只是表明错误已发生。超时错误可能由多种原因造成。服务器、请求设备、网络硬件或互联网连接都可能是问题所在。)
问题在于默认的 TCP 超时值相当大。而且更改这些值需要管理员权限,并会影响整个操作系统环境。在 Linux 系统中,TCP 超时值是内核参数,而在 Windows 系统中,超时值是通过注册表进行配置的。
为避免修改系统范围参数的麻烦,RemoteSQL 引擎的实现已得到扩展,可通过 RemoteSqlEngineopen() 方法的两个附加参数 connect_timeout 和 read_timeout 来设置连接超时和读取超时。内部的超时值会传递给套接字 API。然而,应用程序不应使用 RSQL(即使通过 xSQL)执行大小不可预测的查询。应提前了解查询的大致长度,并根据需要调整超时设置或修改查询,因为服务器在执行查询期间会一直处于忙碌状态。
旧版 API 仍可使用。若未明确指定,超时参数的默认值为:connect() 操作为 2000(即 2000 毫秒或 2 秒),read() 操作为 1200000(20 分钟)。
以下代码片段演示了客户端应用程序对上述服务器发起的对新 open() API 的调用:
RemoteSqlEngine engine;
engine.open(SERVER_HOST, SERVER_PORT, connect_attempts, local_domain,
0, connect_timeout, read_timeout);
或
DistributedSqlEngine engine;
engine.open(nodes, n_nodes, n_replicas, replication_type, connect_attempts,
&bad_node, local_domain, 0, connect_timeout, read_timeout);
从 Java 应用程序来看,新的 open() API 调用将如下所示:
SqlConnection con = new SqlRemoteConnection(host, port, maxAttempts,
bufSize, connectTimeout, readTimeout);
或
SqlConnection con = new SqlRemoteConnection(nodes, nReplicas,
SqlRemoteConnection.ReplicationType.SQLReplication,
maxAttempts, bufSize, connectTimeout, readTimeout);
在 Python 应用程序中,新的 open() API 调用将如下所示:
Remote engine: conn = exdb.connect('localhost', 5001,
connectTimeout=3000L, readTimeout=1500L)
或
Distributed engine: conn = exdb.connect(nodes=('localhost:5001', 'localhost:5002'),
connectTimeout=3000L, readTimeout=1500L)
使用 xSQL 连接到远程数据库时,超时值是在配置文件中设置的:
sql_connect_timeout : 2000,
sql_read_timeout : 120000,
此外,SmartESQL JDBC 驱动程序允许应用程序通过在连接字符串中指定超时值(以秒为单位)来调整默认的 90 秒超时值。例如,下面的代码片段使用 TCP 地址 localhost、端口 5001 以及读取操作的超时时间为 10 秒创建了与 SmartEDB JDBC 驱动程序的连接:
String url = "jdbc:smartedb:localhost:5001:10";
String user = null;
String password = null;
Connection con = DriverManager.getConnection(url, user, password);
传输缓冲区的重新分配
如果传递到 SqlServer 实例中的缓冲区大小(默认大小为 64 * 1024 字节)不足以容纳正在传输的记录(数据),运行时将重新分配(增加)缓冲区的大小,以处理数据传输而不引发内存不足异常。
关闭远程 SQL 服务器
在 xSQL 中,可以执行 shutdown 命令来关闭(停止)远程服务器。该命令通过 SQL 用户定义函数 xsql_shutdown() 实现。当分布式 SQL 客户端(xSQL 作为客户端,连接到不同网络节点上的多个服务器)发出关闭指令时,客户端连接到的所有服务器(分片)都将关闭。
请注意以下限制:
- UDF 不适用于运行在 Windows 平台上的服务器(不过客户端可以在 Windows 上运行,并关闭运行在 *nix 系统上的服务器)。
- 只有当 xSQL 服务器以非交互模式运行时,才能通过 shutdown 命令将其停止。
对于 xSQL 而言,在服务器上有一个“别名”:两个命令 exit 和 shutdown 是等效的。任何连接到 RemoteSqlEngine 或 DistributedSqlEngine 的 SmartESQL 客户端应用程序都可以通过执行 UDF 来关闭远程服务器。例如:
engine.executeStatement("select xsql_shutdown();");
但请注意,如果此语句由分布式 SQL 引擎执行且 nReplicas 大于 1,则每个分片仅有一个(随机)副本会收到该语句并关闭。
远程SQL的OpenSSL支持
为了实现安全通信、授权和认证,传输层安全通过安全套接层(TLS/SSL)得以实现。OpenSSL 被选为最广泛使用且广受认可的 TLS 协议实现之一。
启用 OpenSSL 支持
OpenSSL 二进制库由运行时(通过 mconet 库)动态加载。若要构建支持 OpenSSL 的 mconet 库,请参阅 C 语言网络通信管理页面。
用法
为了启用 OpenSSL 通信,应用程序必须将 SSL 设置传递给子系统。然后,用于管理安全网络通信的方法将取决于您嵌入式 SQL 应用程序所选择的编程语言。请参阅网络通信页面,以获取针对您的开发环境的详细说明和示例。