天天看点

Apache Geode/GemFire入门(1)-基本概念和模块

在这个入门中我们将走一遍gemfire应用程序代码,学习gemfire enterprise基本的特性。这个应用详解了gemfire怎么在vms宕机情况下并不中断服务。当应用运行时动态地添加更多的存储,并且提供更小的延迟来访问你的数据。

入门概览

主要的概念

本入门涵盖了以下概念:

gemfire distributed

system

运行在gemfire上的vms组成了分布式系统。每一个mv都作为一个gemfire对等体存在。启动gemfire对等体,在每个vm对等体上你创建了一个缓存。每一个缓存管理到其他vm对等体的连接。通过udp多播或者tcp位置服务,互相发现。

regions

region是一个分布式系统之上的抽象概念。一个region允许你在系统的多个vm中存储数据,不用考虑数据存在那个对等体上。region给你一个map接口能透明地从合适的vm上获取数据。这个region类扩展了java.util.map接口,

但是他也支持查询和事务。

replicated regions

一个replicated region保存着所有分区的数据拷贝

partitioned regions

partitioned regions只保存一部分分区的数据拷贝

client caching

gemfire分布式系统是一个网格结构,所有的peer直接互相连接。gemfire也支持客户端,客户端有他们自己的本地数据缓存,他们能够更新他们的本地缓存,通过注册服务器来更新改变的数据。

shared-nothing persistence

gemfire支持’非共享’持久化,每一个peer持久化数据到本地磁盘,gemfire持久化也允许你在磁盘上维护一份配置的数据拷贝。

分布式系统和region

1.     开始一个locator

通过udp多播或者tcp位置服务gemfire能够动态发现成员,其中运行tcp位置服务的被称为locator,locator作为单独的进程运行,每一个新的vm连接到已有的peer上。在这个例子中我们将要使用locator。

Apache Geode/GemFire入门(1)-基本概念和模块

2.     创建一份缓存

你将要在gemfire对等体上存储一些数据。第一步启动gemfire对等体创建一份缓存。缓存是gemfire的中心模块。他管理着到其他gemfire对等体的连接。

— ”locators” 属性告诉缓存哪一个locator用来发现其他的gemfire vm。

—“mcast-port” 属性告诉gemfire是否用多播发现来找到对等体。

—“log-level” 属性控制gemfire内部日志级别。设定error是为了限制消息的数量,这个将在”console”中显示。在调用创建结束后,对等体已经发现了其他的对等体同时连接他们。

3.     启动对等体

运行ide中运行两次peer.java ,对等体启动,互相连接。

4.     创建people region(a replicated region)

gemfire region是一个键值集合。他扩展了java.util.concurrent.concurrentmap接口。region最简单的类型就是replicated region。每一个拥有replicated region的peer都存储一份整个region的拷贝。对replicated region所做的任何改变都同步发送到所有的peer中。

Apache Geode/GemFire入门(1)-基本概念和模块

a.     查看一下gemfiredao中initpeer方法,用regionfactory创建region,在这个例子中,people region用regionshortcut.replicate构造,告诉工厂使用replicated region的配置,这个方法添加了缓存监听器到region。当region中的数据改变,你能够利用缓存监听器接受改变通告。这个应用包含了loggingcachelistener类,他能把改变打印到控制台,能够让你看到条目怎么被分布的。

b.     看一下addperson方法。通过调用region.put()方法添加条目到region。

    public void addperson(string name, profile profile) {

     people.put(name, profile);

    }

通过分布people对象到所有的对等体当中。在完成调用之后,每一份对等体都有一份person拷贝。

c.      添加people。在控制台中键入

>person isabella

>person ethan

你将在窗口中看到

in region people created key isabella value profile [friends=[]]

in region people created key ethan value profile [friends=[]]

5.创建posts region(partitioned region)

你创建了大量的posts。如果你不想在每一台服务器上都拥有一份拷贝。

你能存储一份在partitioned region当中。一个partitioned region让你在你的分布式系统当中控制拷贝数量。数据在所有的对等体中分区。gemfire自动维护了每个分区的拷贝数量。    

Apache Geode/GemFire入门(1)-基本概念和模块

看一下gemfiredao的initpeer方法,你能使用partition_xxx快捷键创建分区。创建posts区,这个方法使用partitioned_redundant快捷键告诉gemfire创建一个分区来维护主备

拷贝。

5.     启动对等体应用

再启动一个对等体

6.     添加一个帖子

你将要看到只有一个vm上的监听器被调用。这是因为分区选择其中一份拷贝到主拷贝中。缺省情况下,gemfire只调用了维护主拷贝的对等体的监听器。

7.     用posts命令列出可用的posts命令

gemfire会从每一个各自的对等体中获取他们,

如果你杀了一个vms,你仍然能够列出所有的条目。这就是vm的备份能力。

8.     kill掉peers

client/server 缓存

你有一个全工作系统,但是现在ui代码正运行在相同的vm上,这些用例工作地很好,

但是对于其他人不需要,比如,如果你在ui层有一个web server,你可能想到增加或者减少web server的数量而不改变data server。或者你只需要100g的服务器,但是可能有数万个客户端会访问它。对于这个例子,有一个专门的gemfire服务器来服务gemfire客户端会更有意义。

Apache Geode/GemFire入门(1)-基本概念和模块

gemfire服务器是gemfire对等体,但是他们也能监听客户端连接的端口,而gemfire客户端连接一个限制数量的服务器。

对于传统的peers,gemfire服务器仍然需要定义region。你可能已经有了peer代码,又创建了一个cacheserver,但是这个例子使用了cacheserver脚本。cacheserver脚本从cache xml文件中读取了cache配置。cache.xml 以声明的方式在缓存中定义region。

1.     用xml配置gemfire

所有在java代码能做的也都能在xml中定义,

1.     启动缓存服务器

cacheserver 脚本启动了jaguar对等体(监听客户端连接),又启动了两个缓存服务器,

3.     启动一个客户端

启动一个客户端和启动gemfire peer是一样的。在jaguar客户端上,你创造一个clientcache

连接到locator来发现服务器,看一下gemfire dao.initclient方法。这个方法所做的就是创建clientcache。

一旦你创建一个clientcache,他便维护了一个类似于jdbc的连接池。然而你不需要用gemfire从池中来做查询连接和返回他们,这个是自动发生的。池定位属性告诉你客户端怎么发现服务器。客户端使用相同的locator发现缓存服务器。

设定订阅功能开启,订阅冗余属性运行客户端订阅更新服务端条目。如果你订阅通告(任何人添加的),这个更新被异步发送到客户端。因为更新被异步发送,他们需要在服务端队列化。提交冗余设定控制多少队列拷贝在服务端维护。

设定冗余级别为1意味着你能宕掉1个服务器而没有任何的消息丢失。

4.     创建一个proxy region,在客户端发post消息

在客户端创建一个region类似于在peer中创建region。有两个类型的client region,proxy region和caching region。proxy region并不在客户端存数据。caching_proxy region允许客户端存储键值。这个例子使用了大量的posts,这样你不用在客户端缓存任何的posts。你能创建一个带有proxy 的proxy region。看一看gemfiredao.initpeer方法。这个方法创建了posts region

5.在客户端创建一个cache proxy region,people

你并没有很多people,所以在这个例子当中客户端缓存所有的people。第一你创建了一个有本地存储的region,clientregionshortcut.caching_proxy。在initclient方法中,people region被创建。

6.调用registerinterest方法订阅从服务器上来的通告。

通过创建一个caching_proxy,你能告诉gemfire缓存任何的people你从客户端创建出来的。然而,你也能选择任何的更新到people region的从其他的peer 或者别的客户端通过调用registerinterest方法。在这个案例中,你在所有people中想要register interest,这样你缓存整个people region在客户端。正则表达式匹配了所有的键值在people region中的。看一下initclient方法调用registerinterestregex,

当registerinterestregex方法被调用时,客户端下载已经存在的people。当一个new person 被添加到server上时,他被推到客户端。

7.从client中迭代键值

8.在ide中运行客户端应用程序

添加和停止cache servers

你能够动态的添加peers到服务器中当系统正在运行时。new peers动态地被其他peer和客户端发现。new peer自动接受一份拷贝由replicated region创建的。然而, partitioned region并不自动地分布数据到new peer如果你不显式地命令gemfire负载均衡partitioned region。

在cacheserver脚本中, 你能通过一个命令行来指定一个new peer将要触发一个所有partitioned region的负载均衡。

停止cache servers

1.     停止其中之一的cacheservers

数据仍然可用, 客户端自动忽略死掉的服务器。

2.在移动到下一步之前, 停止其他的缓存服务器。你能保持客户端处于运行状态。