pb级kv存储
A. 什么是kv数据库
kv数据库是指Key-value数据库,是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。
key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。
如果辅以实时搜索引擎进行复杂条件检索、全文检索,就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数 量的目的。以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。
(1)pb级kv存储扩展阅读:
数据库的安全直接关系到整个数据库系统的安全,其防护手段主要有以下八点:
1、使用正版数据库管理系统并及时安装相关补丁。
2、做好用户账户管理,禁用默认超级管理员账户或者为超级管理员账户设置复杂密码;为应用程序分别分配专用账户进行访问;设置用户登录时间及登录失败次数限制, 防止暴力破解用户密码。
3、分配用户访问权限时,坚持最小权限分配原则,并限制用户只能访问特定数据库,不能同时访问其他数据库。
4、修改数据库默认访问端口,使用防火墙屏蔽掉对 外开放的其他端口,禁止一切外部的端口探测行为。
5、对数据库内存储的重要数据、敏感数据进行加密存储,防止数据库备份或数据文件被盗而造成数据泄露。
6、设置好数据库的备份策略,保证数据库被破坏后能迅速恢复。
7、对数据库内的系统存储过程进行合理管理,禁用掉不必要的存储过程,防止利用存储过程进行数据库探测与攻击。
8、启用数据库审核功能,对数据库进行全面的事件跟踪和日志记录。
参考资料来源:
网络-Key-Value
网络-数据库
B. 什么是kv数据库
一个解决方案是使用键值(Key-Value)存储数据库,这是一种NoSQL(非
关系型数据库
)模型,其数据按照键值对的形式进行组织、索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比
SQL数据库
存储拥有更好的读写性能。
C. kv褰㈠纺鏄浠涔堟剰镐濓纻
KV褰㈠纺鏄鎸囬氲繃阌鍊煎规柟寮忔潵鎻忚堪鏁版嵁鎴栦俊鎭镄勬牸寮忋傞氩父浣跨敤涓缁勯敭鍊煎规潵鎻忚堪涓涓瀹炰綋鎴栧硅薄锛岄敭琛ㄧず瀹炰綋鎴栧硅薄镄勬煇涓灞炴ф垨鐗瑰緛锛屽艰〃绀鸿ュ睘镐ф垨鐗瑰緛镄勫叿浣揿笺傝繖绉嶆柟寮忓湪缂栫▼璇瑷涓涔熺粡甯歌浣跨敤锛屼緥濡侸avaScript涓镄勫硅薄灏辨槸浠ラ敭鍊煎圭殑褰㈠纺𨱒ュ畾涔夌殑銆
KV褰㈠纺鍦ㄤ俊鎭瀛桦偍鍜屼紶阃掍腑闱炲父鏂逛究銆傚湪鏁版嵁搴扑腑锛屽彲浠ラ氲繃KV褰㈠纺𨱒ュ瓨鍌ㄥ拰镆ヨ㈡暟鎹锛屼竴浜汵oSQL鏁版嵁搴扑篃閲囩敤KV瀛桦偍鏂瑰纺銆傚湪鐢靛晢骞冲彴涓锛屽晢鍝佷俊鎭涔熼氩父浠KV镄勫舰寮忚繘琛屽瓨鍌ㄥ拰灞旷ず锛岀敤鎴峰彲浠ラ氲繃鎼灭储鎴栫瓫阃変笉钖岀殑阌鍊煎规潵镆ユ垒鍟嗗搧銆
KV褰㈠纺鍙浠ヨ骞挎硾搴旂敤鍦ㄥ悇绉嶉嗗烟涓銆傚湪缃戠粶浼犺緭涓锛孒TTP璇锋眰鍜屽搷搴旂殑澶撮儴淇℃伅灏变互KV褰㈠纺杩涜屾恶甯﹀拰浼犻掋傚湪鐗╄仈缃戜腑锛岃惧囦俊鎭涔熷父浠KV镙煎纺杩涜屼紶杈揿拰瀛桦偍銆傛ゅ栵纴鍦ㄤ竴浜涙暟鎹绉戝﹂嗗烟涓锛屽傛満鍣ㄥ︿範鍜屾暟鎹鎸栨帢涓锛孠V褰㈠纺镄勬暟鎹涔熻骞挎硾搴旂敤浜庢ā鍨嬭缁冨拰棰勬祴銆
D. 什么是kv数据库
kv数据库是指Key-value数据库,是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。
Key-value数据库代表的有redis,Redis是一个Key-Value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。
另外redis是一种内存型的数据库,所以可以对外提供很好地读写操作,但是同样也暴露出内存占用高,数据持久化不易等问题。
(4)pb级kv存储扩展阅读
key-value数据库的优点(以redis为例):
1、Redis将数据库完全保存在内存中,仅使用磁盘进行持久化。
2、相比于其他键值数据库,Redis有相对丰富的数据结构。
3、Redis可以将数据复制到任意数量的从机中。
5、快。每秒可以执行大约110000次设置(set)操作,每秒大约可执行81000次读取(get)操作.
6、支持丰富的数据类型。Redis有5种数据类型。
7、操作具有原子性。所有Redis操作都是原子操作,这确保了两个客户端并发访问,Redis服务器能接收更新的值。
8、多实用工具。Redis可用于多种用例,如:缓存,消息队列(支持发布和订阅),应用程序中的任何短期数据,如:session等。
E. 海量分布式存储系统Doris原理概述
Doris( https://github.com/itisaid/Doris )是一个海量分布式 KV 存储系统,其设计目 标是支持中等规模高可用可伸缩的 KV 存储集群。
Doris可以实现海量存储,线性伸缩、平滑扩容,自动容错、故障转移,高并发,且运维成本低。部署规模,建议部署4-100+台服务器。
Doris采用两层架构,Client 和 DataServer+Store。
有四个核心组件,Client、DataServer、Store、Administration。
应用程序通过Client SDK进行Doris的访问,
每台服务器上部署一个Data Sever做服务器的管理,每台服务器上有自己的存储Store,整个集群的数据存储,每台机器独立部署。数据通过路由选择写入到不同的机器中。
Administration为管理中心,提供配置、管理和监控。
config指,应用程序启动一个Data Server,在启动时要配置管理中心的ip地址,通关管理中心。管理中心会修改配置项感知到集群中加了新机器,对新机器管理,扩容等。待机器处于可用状态,将该机器的配置项通知给KV Client。从而KV Client进行新的路由选择。
扩容、下线机器等的控制台界面通过Management管理。
Monitor监控机器是否正常。
client写数据,绑定产品的namespace(逻辑隔离),构成新key,路由到具体机器上读写。
路由解析算法是设计的一个关键点,决定集群的管理方式,也决定了集群扩容的复杂性和难度。
Doris的算法类似redis,有桶的概念,key映射到1w个虚拟节点,虚拟节点在映射到物理节点。
由于Doris设计时,用于4-100+规模的集群。因此,Doris分了1w个虚拟节点,当服务器超过100会导致负载不均衡,1000会更差,相当于每一个集群上有10个虚拟节点,虚拟节点会有10%的影响。
扩容时,需要调节虚拟节点指向新的位置。具体过程为,暴利轮询新节点添加后,一个服务器上应该承载的虚拟节点个数,将超出的虚拟节点迁移到新机器即可。如上图左图有2个物理节点,扩容后,有3个物理节点,变为右图。
为了保证高可用。doris所有服务分成2个组,两组服务器对等。两个group是可以有不同数量的服务器。
写操作时,client的路由算法在两个group分别选2个服务器,分别(同时)写入,两个服务器全部返回后,再继续向下进行。读操作时,从两个服务器随机选一个读。这样,提高可用性,数据持久性,不会丢失。
集群管理的重要角色Config Server,有一个功能是负责发现故障服务器。
发现故障的方式有2种:
节点失效分为:瞬间失效、临时失效、永久失效
应用服务器向服务器写,如果写失败,为 瞬间失效 。接着应用服务器进行3次重试。3次都失败,通知管理服务器,进行服务的失效判断。
管理服务器再写一次,如果写成功,认为是客户端自己通信通信问题。如果写入失败,判断为 临时失效 ,通知所有client,服务器失效,不要写,也不读。
如果2小时恢复,则节点为临时失效。如果2小时没有恢复,认为是 永久失效 。
如图,如果节点2失效,进入临时失效阶段。
如图,节点2临时失效2个小时还未恢复,判定为永久失效。进入永久失效的恢复。
设计中,有临时日志节点(备份节点),有空白节点。实际使用中没有节点3空白节点。原因:1 自动迁移有风险,还是需要手动迁移。2 几年宕机1台,一直有一个空白节点standby浪费。一般晚上报警失效也没有事情,第二天,找机器扩容即可。认为24小时之内,同样编号的2台机器连续down掉,概率很低。
物理节点分成2个group,写的时候,向2个group同时写。当其中一个group扩容机器时,该group上的所有节点进入临时失效状态。停止读写,将数据迁移到新的服务器上。
由于是虚拟节点的映射在调整,所以迁移是按照虚拟节点调整。为了迁移方便,虚拟节点物理化,一个虚拟节点对应一个文件。迁移时其实就是拷贝文件。这时,如果group1有节点失效也会出现不一致,但是,通常扩容的过程很快,因为,是scp拷贝文件,瓶颈为网络带宽,通常几十T数据,几分钟迁移完成,十来分钟进行数据恢复。
F. etcd工作原理和部署指南
etcd是由CoreOS团队发的一个分布式一致性的KV存储系统,可用于服务注册发现和共享配置,随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用斗老塌到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本文将从etcd的应用场景开含档始,深入解读etcd的实现方式,以供开发者们更为充分地享用etcd所带来的便利。
etcd推荐使用奇数作为集群节点个数。因为奇数个节点和其配对的偶数个节点相比,容错能力相同,却可以少一个节点。综合考虑性能和容错能力,etcd官方文档推荐的etcd集群大小是3,5,7。由于etcd使用是Raft算法,每次写入数据需要有2N+1个节点同意可以写入数据,所以部分节点由于网络或者其他不可靠因素延迟收到数据更新,但是最终数据会保持一致,高度可靠。随着节点数目的增加,每次的写入延迟会相应的线性递增,除了节点数量会影响写入数据的延迟,如果节点跟接节点之间的网络延迟,也会导致数据的延迟写入。
结论:
1.节点数并非越多越好,过多的节点将会导致数据延迟写入。
2.节点跟节点之间的跨机房,专线之间网络延迟,也将会导致数据延迟写入。
3.受网络IO和磁盘IO的延迟
4.为了提高吞吐量,etcd通常将多个请求一次批量处理并提交Raft,
5.增加节点,读性能会提升,写性能会下降,减少节点,写性能会提升。
参数说明:
这种方式就是 利用一个已有的 etcd 集群来提供 discovery 服务,从而搭建一个新的 etcd 集群。
假设已有的 etcd 集群的一个访问地址是: myetcd.local ,那么我们首先需要在已有 etcd 中创建一个特殊的 key,方法如下:
其中 value=3 表示本集群的大小,即: 有多少集群节点。而 就是用来做 discovery 的 token。
接下来你在 3 个节点上分别启动 etcd 程序,并加上刚刚的 token。
加 token 的方式同样也有 命令行参数 和 环境变量 两种。
命令行参数:
环境变量
以 命令行参数 启动方式为例:
可以使用etcd附带的 基准 CLI工具完成基准测试etcd性能。
对于一些基准性能数字,我们考虑具有以下硬件配置的三个成员的etcd集群:
有了这个配置,etcd可以大致写出:
示例命令是:
可线性读取请求通过集群成员的法定人数达成一致以获取最新数据。可序列化的读取请求比线性读取要便宜,因为它们由任何单个etcd成员提供,而不是成员法定人数,以换取可能的陈旧数据。etcd可以阅读:
示例命令是:
我们鼓励在新环境中首次安装etcd集群时运行基准测试,以确保集群达到足够的性能; 群集延迟和吞吐量可能会对较小的环境差异敏感。
以上测试部分翻译空圆自官方文档( https://coreos.com/etcd/docs/latest/op-guide/performance.html )