科技小数据|NoSQL数据库,Couchbase完美的分布式( 三 )


科技小数据|NoSQL数据库,Couchbase完美的分布式
文章图片
这里有低水位和高水位的概念 , 也就是说当移除数据过多以至于内存中有效数据占用内存低于低水位的时候 , couchbase会随机挑一些文件到内存中以达到低水位 。 当有效数据内存占用超过高水位时 , couchbase就会移除数据 。 高低水位都是可以设置的 。
随着内存数据越来越多 , 会逐渐到达低水位 , 这时候 , 系统不会做任何处理 。 当数据量持续增加 , 到达高水位时 , 系统会启动一个job任务移除数据 , 当到达低水位时任务停止 。 如何进入数据的速度大于移除数据的速度 , 系统会返回空间不足的错误提示 , 直到有足够的内存为止 。
如果只使用memcachedbuckets , 服务器只提供数据缓存 , 不会持久化到硬盘 。 如果服务器内存空间不足 , 系统会使用LRU算法从内存中Eviction数据 , Eviction表示服务器会移除一个数据项的key , metadata和所有其他信息 。 Eviction后 , 数据将无法恢复 。
数据持久化
考虑到性能 , couchbase服务主要使用缓存为客户端保存和返回信息 , 同时会逐渐将数据保存到硬盘以维持高可靠性 。 如果有节点fail了可以直接从硬盘恢复数据 , 数据是逐渐持久化到硬盘的 , 同时保存到缓存层和硬盘writequeue,不会阻塞客户线程 。 当客户端访问一个不在内存的数据时 , 持有loadqueue的进程会将数据读到内存 , 在数据返回之前客户端需要等待 。
多线程读写:之前的couchbase版本 , 读写硬盘的线程只有一个 。 为了提高读写硬盘的速度和提高缓存命中率 , 现在couchbase提供了多线程读写 。
科技小数据|NoSQL数据库,Couchbase完美的分布式
文章图片
多线程读写需要考虑线程之间的同步问题以避免冲突 。 为了维持性能和避免冲突 , couchbase对每个线程访问的资源进行了静态分配 , 同时使用了资源锁 。 当创建多个读写线程时 , 服务器为每个线程单独分配了不同的vbuckets 。 通过这种静态协调方式 , 可以保证同一个vbuckets只有一个读线程和一个写线程可以访问 。 上图表示6个线程和两个数据vbucket 。 每个线程有预先分配的可读写范围 。
负载均衡
Couchbase服务器上数据的分配方式是通过vbucket结构实现的 , 如果想增加或减少集群中的机器 , vbuckets中存储的数据都需要重新分配 , vBucketmap(映射表)也需要更新以适应新的集群结构 。
Rebalancing是集群结构发生变化时的数据调整 , 需要手动操作 , 这个过程改变vbuckets到服务器的分配 , 需要在服务器节点之间迁移数据以适应新的结构 。
Rebalancing过程可以发生在集群运行和提供服务时 , 客户端使用现有架构读写数据 , 同时后端在节点之间迁移数据 。 一旦这个过程完成 , 更新vBucketmap表 , 并通知smartclients和代理服务(MOxi).
Rebalancing后数据在集群中重新分配 , 因此数据被均匀分配到整个数据库 , 这个过程需要考虑数据和数据的副本 。
总结
数据存储:nosql , 易水平扩展 。
缓存层:低水位和高水位设置 , 文档metadata 。
vBucket:使系统易于动态管理 , 自动分片 , reblancing 。
【科技小数据|NoSQL数据库,Couchbase完美的分布式】多线程持久化:预分配每个线程的访问范围 , 保证性能和可靠性 。