Apache Ignite 社区宣布发布 Apache Ignite 的 2.18.0 版本。在该版本中,Ignite 社区移除了大量组件上的@IgniteExperimental注解,引入了一系列新功能和系统视图,做了大量的改进,下面将介绍可以期待的主要亮点。
支持为每个数据区配置独立的持久化文件夹
最初,Apache Ignite 只允许通过以下方式配置单个根文件夹来存储持久化数据:
DataStorageConfiguration#setStoragePath
如果某服务器有多个存储设备,就无法全部使用,除非配置符号链接和移动文件等复杂操作。现在可以为每个数据区配置独立的存储路径。
new DataStorageConfiguration()
.setExtraStoragePaths("/path1", "/path2");
统计每个缓存插入和删除字节的数量
Apache Ignite 提供多种指标:
现在新增了若干指标,用于统计自上次集群重启以来插入和删除缓存组的总条目大小(字节)。这些指标有助于估算内存缓存的近似内存使用情况:
insertedBytes:显示插入的数量(字节);
removedBytes:显示从存储中删除的数量(字节)。
SessionContext API
该新API通过引入一种机制,在Apache Ignite中提供会话上下文和应用属性,其适用以下情景:
- 应用从一个连接池获取 Ignite 连接,需要指定业务逻辑依赖的属性;
- 不同的应用会重复使用同一连接,但需要各自的属性值。
通过SessionContext访问属性
- 新的
SessionContext 接口为跨所有层级的属性和会话数据提供了一个单一入口;
- 开发者将
SessionContextProviderResource注入函数(例如QuerySqlFunction、CacheInterceptor)以访问当前上下文;
- 可以从Ignite线程中提取
SessionContext,而无需每次调用新实例。
通过 JDBC 设置:
// JDBC connection to Ignite server.
try (Connection conn = DriverManager.getConnection(URL)) {
conn.setClientInfo("SESSION_ID", "111-333");
...
}
通过用户自定义函数获得:
@SessionContextProviderResource
public SessionContextProvider sesCtxProv;
@QuerySqlFunction
public @Nullable String sessionId() {
return sesCtxProv.getSessionContext().getAttribute("SESSION_ID");
}
Calcite SQL 引擎支持用户定义表函数
定义函数如下:
@QuerySqlTableFunction(columnTypes = {int.class, int.class, int.class}, columnNames = {"COL_1", "COL_2", "COL_3"})
public static Iterable<Collection<?>> collectionRow(int x) {
return Arrays.asList(
Arrays.asList(x + 1, x + 2, x + 3),
Arrays.asList(x + 4, x + 5, x + 6),
Arrays.asList(x + 7, x + 8, x + 9)
);
}
然后用法如下:
sql("SELECT * from collectionRow(10)")
Ignite 集群跨多数据中心优化
现代需求要求能够将集群扩展到多个数据中心,同时必须满足以下要求:
- 额外配置最小化;
- 连接应当无缝运行,就像标准集群一样;
- 集群必须经受得住某个数据中心完全故障;
- 尽量减少数据中心间通信。
Ignite为此进行了多种优化:
- 客户端连接到自己数据中心内的服务器,在瘦客户端中支持;
- KV操作从本地数据中心读取数据,在瘦客户端中支持;
- 发现机制最大限度地减少了节点间的跨数据中心连接;
- 数据再平衡应优先从同一数据中心内拉取分区(本地化每个数据中心内的流量再平衡);
- 在快照恢复过程中尽量减少跨数据中心通信;
- SQL(Calcite)应该从本地数据中心获取数据。
还新增了一个dataCenterId属性,可以通过服务端节点的NODES视图和胖客户端的指标来查看。
所有的改进和更新细节,请参见发布说明。