DB发展
RDBMS:MySQL-->解决分布式的问题
NoSQL:MongoDB
NewSQL:TiDB
MySQL的高可用
MySQL的主从库之间是通过binlog来做。主库挂了,选择哪个从库变成主库?同步关系需要改变。
接下来,我们看一个落地的MySQL高可用方案,这个方案是从从MHA演进来的,做了一些精简。
我们先看倒数第三层:检查与故障切换。MySQL主备库的健康可以通过一个测试库中的测试表实现,即定期向test table中插入一些内容,来确认主从库是不是好的。这是由healthcheck server组件完成的。
那么当Master挂了以后,是slave1还是slave2被提升为主库?
看哪个从库上同步的数据多,就变成主库。这是由failover server完成的。
接下来,我们还需要考虑一下DB切换所带来的IP变化问题。我们希望DB的主从切换对业务是透明的。DAS需要连接VIP。这个VIP是飘的。哪个库是主库,这个VIP就飘到那个库上。这是TGW VIP负责的。
日志会记录DB相关发生的日志。当健康检查模块发现DB有问题的时候,会触发报警接口,这样DBA就可以收到报警进行处理了。
管理组信息:里面有那些DB集群需要做监控和主从切换。DB的IP、Port、用户名、密码。
顶层web是一个dashboard,它可以调用API层(POST、GET请求)来管理整个DB架构。
上述架构整体的调用逻辑可以参照下图,具体内容不展开说明。
NoSQL介绍
接下来我们看NoSQL。
NoSQL的全称是:Not Only Sql。它的优势是:
海量扩展能力
读写高性能
与Relational Database相辅相成
NoSQL有以下几类产品:
键值存(KV)储型:
Memcached、Redis
列存储:
Cassadra、HBase
图形数据库(Graph)
Neo4J、InfoGrid、Infinite Graph
文档型:
MongoDB、CouchDB
MongoDB是面向文档的NoSQL数据库,它是通过C++书写的,具有高扩展性、高性能。
MongoDB天然支持嵌套。如下图所示,第一个People表中关于住址就是一个ID,嵌套到第二个表。
MongoDB数据库中的数据存储和网络传输格式是BSON。除了支持嵌套外,MySQL支持的索引,MongoDB都支持。
MongoDB天然支持Sharding、复制和HA。
MogoDB最多一行是16MB。也就是一条记录最多16MB。如果超过16MB,提供一个文件存储系统GridFS。把超过16MB的文件存起来。
MongoDB高可用架构
此前坊间流传MongoDB容易丢数据。主要是为了保证性能,把mongodb的redolog和强同步给关掉了。2.4之前,默认这两个配置是关的。
目前这些问题已经被解决了。
为了保证数据落库,必须要保证写日志落到本地磁盘,joutnal。这样即使内存中的数据丢了,我们也可以从日志上进行恢复。
MongoDB有个写关注的概念。
MongoDB定义了如下四种写关注级别,依次从弱到强。我们用后两种:
Unacknowledged {w:0}
Acknowledged{w:1}
Journaled{j:1}
Replica Acknowledged {w:"majority"}
下图中,。因为是w:2。所以写操作会强一致写两份。
MongoDB的高可用是通过副本集replica set实现。一个副本集通常是一主双从。一个副本集通常是跨交换机的,采取raft分布式协议选举。
数据不丢失是CP模型,牺牲的是A。但我们希望HA提供A的功能实现。一主两从就是一个副本集。
MongDB的系统架构如下:mongodb天然支持sharding,从DAS访问MongoDB的时候,经过mongos这个router。而config server存放的是元数据。
数据可能会在mongos上做汇聚。momgos是无状态的。
Sharding的两种方式如下:
hash哈希方式:取模
按照range方式分表。
需要注意的是,hash不支持范围查询。
下图是按照range方式分表:
下图是按照哈希方式分表。哈希精准查询的速度很快,如下图所示
MogoDB线上分片结构如下。我们看到每个sharding是一主两从。