数据库访问
通过API访问数据库:直接访问,ODBC,JDBC
ODBC
访问DBMS的标准API,是为了把数据库与系统分离开,所有主要关系型数据库都有ODBC的实现。
ODBC基于设备驱动模型,把标准命令集转换为DBMS特定的调用。
JDBC
可以看做用java写的ODBC(ODBC用C写的)
JDBC使用说明
数据库网络协议
所有主要的DBMS都是在TCP/IP协议上实现的
客户端-服务器工作流程:
- 客户端连上DBMS,开始身份验证(可能通过SSL握手实现)
- 客户端发送查询
- DBMS执行查询,然后序列化结果发给客户端
当前新的系统都用的是开源DBMS连接协议。
协议设计需要考虑的问题
行/列分布
ODBC/JDBC天生支持行分布
服务器一个一个的把元组打包,客户端再一个一个反序列化得到元组
然而现代的数据分析工具都是在列或矩阵上工作的。
一种解决方式是以向量的方式发送数据
压缩
用原始的通用压缩方法进行压缩
可以用Columnar-Specific Encoding有更高的压缩率对于网络较慢的情况是非常有效的。
数据的序列化
实现
1.二进制编码:客户端进行字节存储次序的转换;序列化格式与DBMS二进制格式越接近,序列化开销越低;可以用自己的格式也可以用已存在的库ProtoBuffers, Thrift, FlatBuffers
- 文本编码:把所有的二进制值都转换成字符串,不用考虑字节存储次序了endian
文本编码的处理:
- 空标志用'\0'表示字符串的结束以便客户端找到字符串末尾
- 长度:在开始加一个字符串的长度
- 定长:都按属性的maxsize给字符串分配长度
复制协议
实现上
- Master-Replica:所有更新都写到指定主体中;主体传播更新到副本不用院子提交协议;只读事务可以访问副本;如果主体down了,选举一个新的主体
- Multi-Master:事务可以更新在任意副本中,副本必须用原子协议进行同步
当一个事务提交到一个复制数据库上时,DBMS会决定是不是要等这个事务的修改传播到其他节点之后再对应用做出应答。
传播等级:
- 同步(强一致性):
主体会把更新发送给副本,然后等待他们应答已经收到更新(比如Logged) - 异步(最终一致性)
主体给客户端发送ack而不需要等待副本收到更新。
网友评论