apache ignite
IMDG或内存数据网格不是内存中关系数据库,NOSQL数据库或关系数据库。 它是另一种软件数据存储库。 数据模型分布在单个位置或多个位置的许多服务器上。 这种分布称为数据结构。 这种分布式模型被称为“无共享”架构。 IMDG具有以下特征:
- 所有服务器可以在每个站点中处于活动状态。
- 所有数据都存储在服务器的RAM中。
- 可以不中断地添加或删除服务器,以增加可用的RAM量。
- 数据模型是非关系的,是基于对象的。
- 用平台独立语言编写的分布式应用程序。
- 数据结构具有弹性,可以无中断地自动检测和恢复一台或多台服务器。
大多数情况下,我们将IMDG用于应用程序服务器的Web会话管理,并用作分布式缓存或L2缓存。 Hazelcast社区的添加是我们一直以来最喜欢的IMDG工具,但是从hazelcast社区版的最新情况来看,它的性能让我们感到非常不满意。 作为HazelCast的快速替代方案,我们决定尝试使用
Apache点燃 。 这篇文章专门针对apache点燃,可用于快速启动指南。 对于安装,我将使用具有以下配置的2个Redhat操作系统虚拟机:
- CPU:2
- 内存:4
- 硬盘:25 GB
- 操作系统:Redhat Santiago
从Apache ignite6的许多功能中,我们将仅研究以下功能:
- 准备操作系统
- 使用Spring使用DataGrid
- MyBatis缓存配置
- Spring缓存
安装apache点燃
前提条件:
- Java 1.7及更高版本
- 打开端口:47500..47509、8080(用于Rest接口),47400、47100:47101、48100:48101、31100:31101在操作系统中安装JDK之后,我们必须打开上述端口。 通过执行以下命令,我们可以操纵iptables。
vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 47500:47509 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 47400 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 47100 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 47101 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 48100 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 48101 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 31100 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 31101 -j ACCEPT/etc/init.d/iptables restart
在几台机器上安装Apache ignite
- 让我们从以下链接下载ignite 1.5.0final版本。
- 将档案解压缩到os中的任何位置,例如/ opt / apache-ignite
- 将环境路径IGNITE_HOME添加到apache ignite的主目录中。
- 将文件夹$ IGNITE_HOME / libs / optional / ignite-rest-http复制到/home/user/apache-ignite-fabric-1.5.0/libs,它将通过REST接口启用apign点火。
- 运行命令ignite.sh examples / config / example-cache.xml以启动apache ignite。
如果一切正常,您应该在控制台中看到以下日志:
[12:32:01] Ignite node started OK (id=ceb614ca) [12:32:01] Topology snapshot [ver=4, servers=2, clients=0, CPUs=3, heap=2.0GB]
并且通过网址http:// host:port / ignite?cmd = version也可以通过http获得ignite
使用Spring使用DataGrid
首先,我们必须构建Maven项目以编写一堆代码来检查apache Ignite的功能。
- 将以下依赖项添加到pom.xml
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-core</artifactId><version>${ignite.version}</version></dependency><dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring</artifactId><version>${ignite.version}</version></dependency><dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-indexing</artifactId><version>${ignite.version}</version></dependency><!-- myBatis --><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ignite</artifactId><version>1.0.0-beta1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.1</version></dependency><!-- Oracle 12--><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.3</version></dependency>
请注意,Oracle JDBC客户端jar应该位于本地Maven存储库中。 就我而言,我使用Oracle 11.2.02客户端。
- 使用以下上下文在资源目录中添加spring-context.xml文件:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd "><!-- Enable annotation-driven caching. --><cache:annotation-driven/><context:property-placeholder location="classpath:jdbc.properties"/><!-- beans --><bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"><property name="gridName" value="TestGrid"/><!-- Enable client mode. --><property name="clientMode" value="true"/><property name="cacheConfiguration"><list><!-- Partitioned cache example configuration (Atomic mode). --><bean class="org.apache.ignite.configuration.CacheConfiguration"><!--<property name="atomicityMode" value="ATOMIC"/>--><!-- Set cache mode. --><property name="cacheMode" value="PARTITIONED"/><property name="backups" value="1"/><property name="statisticsEnabled" value="true" /></bean></list></property><!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --><property name="discoverySpi"><bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"><property name="ipFinder"><!-- Uncomment static IP finder to enable static-based discovery of initial nodes. --><!--<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">--><bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder"><property name="addresses"><list><!-- In distributed environment, replace with actual host IP address. --><value>Add your node ip address</value><value>add your node ip address</value></list></property></bean></property></bean></property></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:com/blu/ignite/dao/*Mapper.xml"/></bean><bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"><property name="URL" value="${jdbc.url}" /><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="connectionCachingEnabled" value="true"/></bean> </beans>
让我们检查一些配置属性:
- 属性名称=“ clientMode”值=“ true” –此属性将强制当前应用程序作为客户端运行。
- 属性名称=“ cacheMode”值=“已分配” –缓存模式将被分区,缓存模式也可被复制。
- 属性名称=“备份”值=“ 1” –总是在另一个节点中有一个冗余的缓存元素。
- 属性名称=“ statisticsEnabled”值=“ true” –此属性将激活缓存统计信息。
- 现在让我们写一些:
public class SpringIgniteRun {public static void main(String[] args) throws Exception{System.out.println("Run Spring example!!");ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-core.xml");IgniteConfiguration igniteConfiguration = (IgniteConfiguration) ctx.getBean("ignite.cfg");Ignite ignite = Ignition.start(igniteConfiguration);// get or create cacheIgniteCache cache = ignite.getOrCreateCache("myCacheName");for(int i = 1; i < 1000; i++){cache.put(i, Integer.toString(i));}for(int i =1; i<1000;i++){System.out.println("Cache get:"+ cache.get(i));}Thread.sleep(20000); // sleep for 20 seconds// statisticsSystem.out.println("Cache Hits:"+ cache.metrics(ignite.cluster()).getCacheHits());ignite.close();} }
上面的代码是自解释的,我们只创建一个名为“ myCacheName”的缓存,并添加1000 String整数值。 将值插入缓存后,我们还从缓存中读取元素并检查统计信息。 通过ignitevisorcmd,您还可以监视数据网格,随后您可以找到网格统计信息的屏幕截图
MyBatis缓存配置
现在让我们添加MyBatis ORM l2缓存并检查其工作方式。
<bean id="servicesBean" class="com.blu.ignite.WebServices"><property name="dao" ref="userServicesBean"/></bean><bean id="userServicesBean" class="com.blu.ignite.dao.UserServices"><property name="userMapper" ref="userMapper"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="mapperLocations" value="classpath*:com/blu/ignite/dao/*Mapper.xml"/></bean><bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"><property name="URL" value="${jdbc.url}" /><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="connectionCachingEnabled" value="true"/></bean><bean id="userMapper" autowire="byName" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.blu.ignite.mapper.UserMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.blu.ignite.mapper" /></bean>
我们添加了SQLsessionFactory,MyBatis映射器和Service Bean。 现在让我们添加* .Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.blu.ignite.mapper.UserMapper"><cache type="org.mybatis.caches.ignite.IgniteCacheAdapter" /><select id="getUser" parameterType="String" resultType="com.blu.ignite.dto.User" useCache="true">SELECT * FROM users WHERE id = #{id}</select><select id="getUniqueJob" parameterType="String" resultType="String" useCache="false">select unique job from emp order by job desc</select></mapper>
emp和dept表的完整sql(DDL / DML)脚本可在目录com / blu / ignite / scripts中找到。我创建了一个简单的Web服务,以获取用户和员工的独特工作。 这是Web服务的代码,如下所示:
@WebService(name = "BusinessRulesServices",serviceName="BusinessRulesServices",targetNamespace = "http://com.blu.rules/services")
public class WebServices {private UserServices userServices;@WebMethod(operationName = "getUserName")public String getUserName(String userId){User user = userServices.getUser(userId);return user.getuName();}@WebMethod(operationName = "getUniqueJobs")public List getUniqueJobs(){return userServices.getUniqueJobs();}@WebMethod(exclude = true)public void setDao(UserServices userServices){this.userServices = userServices;}}
调用Web方法getUserName将查询数据库并将查询结果缓存在ignite缓存中。
Spring缓存
使用spring缓存,您可以实现任何spring bean方法的返回值的缓存。 Apache ignite将通过您将通过注释@Cacheable(“ returnHello”)提供的缓存名称来创建缓存,例如,如果我具有如下方法:
@Cacheable("returnHello")public String sayhello(String str){System.out.println("Client says:"+ str);return "hello"+str;}
第一次调用该方法时,将在ignite中创建一个带有参数名称的复制缓存,下次调用上述方法时,将从缓存中返回该值。
- 现在就足够了。 很快我将以apache ignite的一些新功能返回。 该项目的完整源代码将在github中找到。
翻译自: https://www.javacodegeeks.com/2016/02/quick-start-memory-data-grid-apache-ignite.html
apache ignite