Geode简介

王威威

1. 简介

QuoteApache Geode是一个数据管理平台,它提供对分布式云体系结构中广泛分布的数据密集型应用的实时与一致的访问功能。 Geode集中内存,CPU,网络资源,以及可选的本地磁盘到多个进程来管理应用程序对象和行为。它使用动态复制和数据分区技术来实现高可用性,提升性能,扩展性,容错。它除了是一个分布式数据容器,还是一个内存数据管理系统,提供了可靠的异步事件通知并且保障消息传递。适用小数据块、快速更新、低延时、高吞吐。Apache Geode提供实时且高一致性的分布式数据管理平台,典型案例是中国铁路12306售票系统使用Geode管理10个集群节点,在内存中管理2T的热点数据和10个高可用弹性规模的后备节点。 Apache Geode设计的核心理念是跨集群节点分布数据,完全复制数据到所选节点,或者跨所选节点的分区数据。当数据条目在内存中更新时,这个更新同步到一个或者多个内存池中的节点。Apache Geode允许数据被查询,参与到事务中,共享引用进程空间,同步到外部数据源(同步或者异步方式)。经验告诉我们, Apache Geode把关注点从磁盘I/O的优化转向到分布式内存的优化。这种通过优化内部数据结构的存储方式,把内存作为一种资源,达到了可高并发访问数据的目的。

2. 与redis比较

                            Geode        redis

分区                       支持         支持

复制                       支持         需要配置

Region                   支持        不支持

负载均衡                 支持        不支持

持久化                     支持        支持

对象查询语言OQL    支持       不支持

3.安装&基本操作

http://geode.apache.org/下载最新1.2.0

1) 单节点
windows:

linux:

下载压缩包,解压后,添加geode到环境变量

GEODE_HOME=/home/ops/apache-geode-1.2.0

export GEODE_HOME

PATH=$PATH:$M2_HOME/bin:$GEODE_HOME/bin

source /etc/profile

启动gfsh:

启动locator:start locator --name=locator1

启动server:start server --name=server1 --server-port=40411

创建一个region:create region --name=region1 --type=REPLICATE_PERSISTENT

.put数据:put --region=region1 --key="hello" --value="world"

查询:query --query="select * from /region1"

关闭server(数据会写入磁盘,再次使用仍将被写入缓存中):stop server --name=sever1

关闭集群:shutdown --include-locators=true java client api:

2) Geode多节点

主机(192.168.11.35): locator1 + server1 主机(192.168.11.30): locator2 + server2 主机(192.168.11.33): server3 分别按照上一步中在各主机Geode工作环境。

新建多locator集群

主机(192.168.11.35) gfsh> start locator --name=locator1 --port=10334 --locators=192.168.11.35[10334],192.168.11.30[10334]

主机(192.168.11.30) gfsh> start locator --name=locator2 --port=10334 --locators=192.168.11.35[10334],192.168.11.30[10334]

主机(192.168.11.35) gfsh> start server --name=server1 --server-port=40401 --locators=192.168.11.35[10334],192.168.11.30[10334]

主机(192.168.11.30) gfsh> start server --name=server2 --server-port=40401 --locators=192.168.11.35[10334],192.168.11.30[10334]

主机(192.168.11.35) gfsh>list members

  Name   | Id

-------- | -------------------------------------------------- locator2 | 192.168.11.30(locator2:1780:locator):1024
locator1 | 192.168.11.35(locator1:28126:locator):1024
server2 | 192.168.11.30(server2:3174):1025
server1 | 192.168.11.35(server1:1013):1025

主机(192.168.11.30) gfsh>list members

Name   | Id

-------- | -------------------------------------------------- locator2 | 192.168.11.30(locator2:1780:locator):1024
locator1 | 192.168.11.35(locator1:28126:locator):1024
server2 | 192.168.11.30(server2:3174):1025
server1 | 192.168.11.35(server1:1013):1025

添加新server节点 主机(192.168.11.33) gfsh>start server --name=server3 --server-port=40401 --locators=192.168.11.35[10334],192.168.11.30[10334]

主机(192.168.11.30) & 主机(192.168.11.35) gfsh>list members

Name   | Id

-------- | -------------------------------------------------- locator2 | 192.168.11.30(locator2:1780:locator):1024
server3 | 192.168.11.33(server3:25962):1024
locator1 | 192.168.11.35(locator1:28126:locator):1024
server2 | 192.168.11.30(server2:3174):1025
server1 | 192.168.11.35(server1:1013):1025

主机(192.168.11.35) gfsh>create region --name=region1 --type=REPLICATE_PERSISTENT

Member | Status ------- | -------------------------------------- server2 | Region "/region1" created on "server2"
server3 | Region "/region1" created on "server3"
server1 | Region "/region1" created on "server1"

4.架构简介

1) locator:

通过UDP多播或者TCP位置服务动态发现其他geode成员,运行TCP位置服务的被称为Locator,提供简单负载均衡,只是基于当前服务器是否有客户端连接。

2) server:

提供了connection poor,queue以及subscription机制,以并行处理以CEP事件通知机制。同样,Gemfire客户端也提供了connection pool

3) Regions:

存储数据的地方,分布式系统之上的抽象概念。支持OQL查询和事务。 复制: 在区域中所有的数据被复制到每一个缓存服务器节点。复制区域使用了‘multiple masters’复制组织结构。当数据区域被复制(没有分区),对于每一个数据条目没有指定的管理者,来自任意成员的初始更新并发地传播到每一个节点。一旦成功处理了这个事件,ACK作为一个回应发送回初始成员。初始成员接到返回的ACK之后,做出相应地数据更新调用处理。每一个缓存服务器节点都维护了一份数据的拷贝。所以复制区域模式适合于系统中有大量读操作,少量写操作的情况下。 分区: 在区域中的数据跨服务器节点分布。一些服务器的节点管理分区的数据副本用来做备份。分区区域使用’single master’复制模式。 所以当读很重,数据集很小的时候,不适合分区区域模式。 如果你的数据量单机能够承受,那么你不需要在两个节点间分割数据。在这样的情况下,复制区域能够更好的做到这一点,特别是你的应用运行大量读操作。

4)实际操作:

在192.168.11.35新建一个region,并插入数据: put --region=region1 --key="china" --value="zhongguo"

分别在192.168.11.30上执行查询:query --query="select * from /region1"

在192.168.11.33上执行查询:query --query="select * from /region1"

因为没有连上任何一个locator 新加入集群,要先连接上某个locator:connect --locator=192.168.11.35[10334]

再执行查询:

Replicated:保存所有分区的数据副本
Partitioned:保存一部分分区的数据
Client Caching:本地数据缓存,可以通过注册服务器来更新本地数据缓存

5.java api

ClientCache cache = new ClientCacheFactory()  
        .addPoolLocator("192.168.11.30", 10334)
        .addPoolLocator("192.168.11.35", 10334)
        .create();
Region<String, String> region = cache  
        .<String, String>createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY)
        .create("region1");

Object objList = region.query("select * from /region1");  
ResultsBag resultsBag = (ResultsBag) objList;

String queryString = "select * from /region1";  
QueryService queryService = cache.getQueryService();  
Query query = queryService.newQuery(queryString);  
SelectResults<String> selectResults = (SelectResults) query.execute();  
cache.close();  

输出结果:

与在192.168.11.30,192.168.11.33上查询结果一致

6.与spark集成

待续