1. 目标是找到一种如下的key-value数据库集群方案:
- 具备高性能的读写,支持亿级PV
- 具备灵活的可扩展性,同时也是支持上一条的基础
- 数据自动切分,即不依赖于业务逻辑
- 具备分布式事务功能以及不同隔离级别
- 具备数据的一致性或局部一致,最终全部一致
- 可独立提供网络层服务,以支持N(数据库集群)*M(WEB集群)结构,并支持二进制的网络协议
- 方便的客户端API
2. 我最初的思路
- 使用Memcachedb,由客户端API(改造spymemcached)实现分布式事务和隔离
- 由客户端API使用Consistent Hashing进行数据切分
3. 关于自己思路的发现
- 读写性能不错
- 不具备良好的可扩展性,由于Consistent Hashing,由于负载过高需要增加一倍的节点时,数据转移量是巨大的(5星级问题)
- 数据可以自动切分
- 分布式事务和隔离的实现只交由客户端API非常困难(5星级问题)
- 一致性满足
- 有独立的网络层服务,可以实现N*M架构,但不支持二进制协议(2星级问题)
- 客户端API相对方便,如spymemcached
4. 继续发现
由于自己是初学者,在这方面没有太多的经验,无法想出一个解决方案。于是我首先做的是去找其他已有的框架,并做粗浅的了解。
根据"菜鸟"和Robbin以及Google的提示,做了下大概的了解,除了上述提到的Memcachedb外,还包括:
- Cassandra,看看它能否解决我3中出现的三个问题,通过了解发现,它的扩展性是很好的,但没有分布式事务处理。
- Voldemort,面临跟Cassandra一样的问题,所以也让人纠结。
- Redis,主张以内存为主的存储,感觉用于生产会有问题。同时也不能解决分布式事务。
- JBossCache,提供了BDB Loader,但没有独立的网络层,需要与APP SERVER(如JBoss等)配合提供服务,有锁机制,由于配置复杂,也因为下面的Scalaris,我没有做进一步的了解。
- Scalaris,让我激动的框架,因为它支持分布式事务和隔离级别,并且以TC作为底层存储,目前正在研究它的扩展性和使用。由于不懂Erlang,这个过程比较费劲,但我仿佛看到一点光亮……
由于是这方面的初学者,加上基础不足,有些见解可能是错误的或不足的,敬请各位大侠指正,谢谢!
分享到:
相关推荐
作为NoSQL数据库的一种,Redis提供了一个内存中的数据结构存储系统,可以当作数据库、缓存和消息中间件使用。 Redis与传统的键值存储系统如Memcached相比,有以下显著的优势: 1. **丰富的数据结构**:Redis支持...
集成SpringBoot与Redis集群的第一步是添加相应的依赖。在`pom.xml`或`build.gradle`文件中,你需要包含Spring Data Redis库和Spring Boot的Redis starter。对于Maven项目,可以在`pom.xml`中添加以下依赖: ```xml ...
<key-template> <string-key-generator /> </key-template> <resources> <heap unit="MB">5</heap> <disk persistent="false" path="./temp" unit="MB">10</disk> </resources> </cache> </config> ``` 3. ...
这样做的好处是可以实现session的分布式共享,对于负载均衡的Web集群,用户在集群中的任意一台服务器上的操作都可以在其他服务器上继续,无需重新登录或丢失状态。 为了在Java项目中集成Memcache,你需要添加对应的...
### Redis数据库集群部署知识点详解 #### 一、Redis简介与特性 **Redis**(Remote Dictionary Server)是一款开源的键值(key-value)存储系统,它以其卓越的性能和灵活性,在众多NoSQL数据库中脱颖而出。Redis主要...
Redis是一款高性能的Key-Value数据库,它以内存存储为主,数据持久化到硬盘,支持丰富的数据类型,如字符串、哈希、列表、集合、有序集合等。在Java开发中,我们通常使用Jedis库来与Redis进行交互。Jedis是一个简单...
- `LPOP key`:移除并返回列表的第一个元素 - `RPOP key`:移除并返回列表的最后一个元素 5. **集合(Set)操作命令** - `SADD key member [member ...]`:向集合添加元素 - `SMEMBERS key`:获取集合的所有...
- 插入文档:`db.<collection>.insert({<field1>:<value1>, <field2>:<value2>})` - 查询文档:`db.<collection>.find({<query>)` - 更新文档:`db.<collection>.update({<query>}, {<update>})` - 删除文档:`...
- 当服务器收到请求后,会将返回的数据封装在一个函数调用中,例如`fn({“key”:”value”})`的形式。 - 客户端预先定义好这个函数,如`function fn(data) { alert(data.key); }`,当数据返回时,该函数会被调用并...
- **键值(Key-Value)存储数据库**:如TokyoCabinet/Tyrant、Redis等,适合于内容缓存场景,数据模型为一系列键值对,优点在于快速查询,缺点是数据缺少结构化。 - **列存储数据库**:如Cassandra、HBase等,适用于...
- 如果需要分配不同的负载权重,可以使用`<weights>`标签,例如`<weights>3,7</weights>`表示将30%的负载分配给第一个地址,70%给第二个地址。 **集群配置** 除了基础配置,还可以为高可用性设置集群配置。例如,...
与其他Key-Value存储系统相比,Memcached在集群部署、性能等方面表现出色。例如,在集群方面,Memcached支持通过一致性哈希进行数据分布;在性能方面,Memcached通常具有更快的响应时间和更低的延迟。 #### 6. ...
- 第一次调用`func($a)`时,全局变量`$a`被传递给`func()`,并在函数内输出并修改了`$a`的值,但因为是局部作用域,所以不会影响到全局变量`$a`的值。 - 第二次调用`func($obj->a)`时,对象属性`$a`被传递给`func...
### 第二周第一天的学习笔记 #### 一、Kubernetes (K8S) 中的 Deployment (部署) **Deployment** 是 Kubernetes 中用于管理应用实例的核心概念之一,它提供了声明式的更新功能,确保应用程序始终运行指定数量的...
它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者能够快速地创建一个独立运行的、生产级别的基于 Spring 的应用。 Redis 是一个开源的、高性能的键值存储系统,常被用作...
* setrange key 起始位置 value:用 <value> 覆写 <key> 所储存的字符串值,从 <起始位置> 开始(索引从 0 开始),新值有几位,就替换掉几个字符。 List List 是列表,单键多值,Redis 的 List 是简单的字符串...
<value>true</value> </property> ``` - **配置HUE访问HDFS的权限**: ```xml <property> <name>hadoop.proxyuser.hue.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hue...
可分为键值(Key-Value)存储数据库、列存储数据库、文档型数据库和图形(Graph)数据库。 三、Memcache 的分布式实现 Memcache 的分布式实现可以通过客户端程序库来实现。标准的分布式方法对键的存储根据服务器台数的...
- 移除并返回第一个元素:`lpop(key)` - 移除并返回最后一个元素:`rpop(key)` - 删除指定值:`lrem(key, count, value)` 5. **集合(Set)操作** 集合中元素唯一,不重复。 - 添加元素:`sadd(key, member)`...
- `name`:与`<client>`中的`socketpool`属性关联。 - `failover`:是否启用故障转移。 - `initConn`:初始化连接数。 - `minConn`:最小连接数。 - `maxConn`:最大连接数。 - `maintSleep`:后台线程管理...