一文读懂Apache Geode缓存中间件( 二 )


Client可以配置连接到哪个Server服务器,但更合理的配置方式是连接到某个Locator上,由这个Locator为Client分配一个负载较低的Server,Client启动后只会和Locator沟通一次,在获知被分配到的Server的IP和端口之后,每次读写都会直接连接到Server上 。
2.1.3 数据存储形式和区域市面上大部分的内存数据存储,都将数据按键值对的格式进行存放,Geode也是如此 。但与Redis等简单的KV不同,Geode将KV数据们按数据区域(Region)进行组织 。对于不同的区域可以单独配置(如是否分区或需要副本) 。
数据区域可以类比于关系型数据库中的表的概念 , 是一系列结构相同的数据结构的集合 。实际上,在实现上数据区域就是一个ConcurrentMap<K, V>,其键就是一条数据的唯一性标识(类型任意 , 只要重写了equals和hashcode以便于Region确认键的唯一),其值是一个表达完整数据概念的对象,这样其实也让一条数据中按类的成员又划分出了列的概念 。基于这种类似关系型数据库的存储模式,Geode提供了一种类似于SQL的查询语言,称为OQL,并支持多区域查询(类似于连表查询) 。下面是一个OQL查询的小例子:
class DictPlatform implements DataSerializable {    short platformId;    String name;    String status;}class TestServiceImpl {    public void query() {        String queryString = "SELECT dp.platformId, dp.name FROM /dict_platform dp WHERE dp.status >= 0;"        QueryService queryService = cache.getQueryService();        Query query = queryService.newQuery(queryString);        SelectResults results = (SelectResults)query.execute();        DictPlatform p = (DictPlatform)results.iterator().next();    }}

  • 2.1.3.1 区域的分布式存储和复制
    数据区域可配置的类型主要为 Partitioned , Replicated , Distributed non-replicated,Non-distributed 这四种 。下面重点介绍前两种类型 。
    • Partitioned 分区区域如果某个区域数据量很大,一个成员放不下,可以将这个区域划分为多个bucket,分别存储在不同的server上 , 为了保证高可用 , 可以让不同的bucket的副本分布在多个server上,以某个server上的bucket作为master,很类似于Apache Kafka的设计 。当存储不够,可以增加新的server,增加新server后的需要发起重平衡 , 重平衡不需要停机,但可能会导致正在执行的事务失败 。可以从任何一个副本中读取到数据 , 如果和Client联系的那个Server没有想访问的分区的副本,需要经过server间的一跳,将请求转给目标server 。因此,分区的读性能稍差 。
    • Replicated 复制区域如果某个区域数据量不大 , 为了提高读性能 , 复制区域可以将区域中所有数据完整地复制给其它副本,这样所有server中保存着完全相同的数据 。
2.1.4 数据量的控制和热点数据Geode有两种模式控制内存中的数据规模,持久化和失效 。但无论如何 , 热点数据都通过最近最少使用(LRU)算法来判断 。