阿里云云原生多模数据库Lindorm对接使用全流程指南
1. 认识云原生多模数据库Lindorm
云原生多模数据库Lindorm是阿里云面向物联网、互联网、车联网等场景深度设计和优化的一款云原生多模超融合数据库。与传统数据库最大的区别在于,Lindorm打破了不同类型数据必须存储在不同数据库中的技术壁垒,在一个平台上统一支持宽表、时序、文本、对象、流、空间等多种数据模型的统一访问和融合处理。
传统数据存储方案往往需要为结构化数据使用关系型数据库,为半结构化数据使用HBase或Cassandra,为时序数据使用时序数据库,为文本检索使用搜索引擎。这种技术碎片化带来了组件繁杂、选型困难、数据同步链路冗长等一系列问题。当业务需要实现跨可用区高可用或全球同步时,各组件需要独立改造,故障率和维护成本急剧上升。Lindorm正是为了解决这一核心矛盾而设计的。
Lindorm采用存储计算分离、多模共享融合的云原生架构,以云原生分布式文件系统LindormDFS为统一存储底座,支撑宽表引擎、时序引擎、搜索引擎、计算引擎、流引擎、向量引擎、列存引擎等各个垂直专用的多模数据引擎。在多模引擎之上,Lindorm既提供统一的SQL访问实现跨模型联合查询,也提供HBase、OpenTSDB、Spark、HDFS、Solr、Kafka等开源标准接口,保障存量业务无缝迁移。Lindorm兼容SQL、HBase/Cassandra/S3、TSDB、HDFS、Solr、Kafka等多种标准接口。
2. Lindorm产品架构与核心引擎
Lindorm的多模能力主要由以下几个核心数据引擎协同提供,每个引擎针对特定的数据模型和工作负载进行了深度优化,同时又共享底层的统一存储系统,实现数据互融互通。
2.1 宽表引擎
宽表引擎是Lindorm的核心组件之一,兼容HBase API、Cassandra CQL、S3 API等多种开源标准接口,同时支持标准SQL访问。它面向海量半结构化和结构化数据设计,适用于元数据管理、订单处理、账单核算、用户画像、社交关系、Feed流、日志分析等大规模数据存储与查询场景。宽表引擎具备全局二级索引、多维检索、动态列、TTL等能力,支持千万级高并发吞吐和百PB级存储,吞吐性能是开源HBase的3到7倍,P99延迟仅为开源HBase的十分之一。
2.2 时序引擎
时序引擎是专门针对时序数据设计的分布式引擎,兼容OpenTSDB API、InfluxDB行协议,支持Prometheus作为Remote Storage将监控数据写入。时序引擎适用于物联网设备监控、应用性能监控、工业传感器数据采集、车联网轨迹跟踪等场景。它支持SQL查询,采用针对时序数据优化的高效压缩算法,将单个数据点的平均存储空间压缩到1到2个字节,整体存储使用量可降低90%。时序引擎还支持降采样、数据插值、空间聚合等专业时序计算能力。
2.3 搜索引擎
搜索引擎是采用存储和计算分离架构设计的分布式引擎,兼容Solr接口和SQL访问。它可无缝作为宽表引擎和时序引擎的索引存储,加速多维检索查询,具备全文检索、聚合计算、复杂多维查询等能力。搜索引擎适用于海量日志分析、账单检索、画像查询等需要高效全文检索和多维度组合查询的场景。
2.4 计算引擎与流引擎
计算引擎是基于云原生架构提供的分布式计算服务,兼容Spark计算模型和编程接口,深度融合Lindorm存储引擎特性。流引擎则兼容Kafka协议,支持实时数据接入与流式处理。
3. 开通Lindorm实例
3.1 账号准备与权限配置
在使用Lindorm之前,需要先完成云环境的准备工作并开通Lindorm实例。首先需要注册阿里云账号。如果使用RAM用户创建Lindorm实例,需要确认RAM用户具备相应权限。不同付费模式对RAM用户的权限要求有所不同:
- 包年包月:需具备AliyunLindormFullAccess、AliyunVPCReadOnlyAccess、AliyunBSSOrderAccess权限
- 按量付费:需具备AliyunLindormFullAccess、AliyunVPCReadOnlyAccess权限
如不具备权限,需要联系阿里云主账号为RAM用户授权。
3.2 选择商品类型
云原生多模数据库Lindorm针对不同的使用场景,提供了Lindorm V1、Lindorm、Lindorm通道服务(LTS)三种商品类型。Lindorm V1是独立集群的标准化部署方式,提供宽表、时序、搜索、文件、计算和流引擎,适用于大中型企业的生产环境。Lindorm支持宽表引擎、时序引擎、LTS等多种引擎,适用于大中型企业生产、个人开发者学习和小型企业的功能验证及开发测试。Lindorm通道服务(LTS)提供数据迁移同步、实时订阅、备份恢复等功能。
3.3 创建实例
创建Lindorm实例时,需要配置以下核心参数:
- 付费模式:包年包月(预付费,适合长期需求,价格更实惠)或按量付费(后付费,适合短期需求,用完可立即释放)
- 部署方案:单可用区(主备节点位于同一可用区)、多可用区基础版(主备节点位于不同可用区,具备跨可用区容灾)、多可用区高可用版(当前只支持宽表引擎)
- 实例名称:设置便于后续业务识别的名称
- 地域与可用区:选择与业务系统同地域的部署位置,以降低网络延迟
创建实例的具体操作可通过控制台、OpenAPI或SDK完成。控制台和OpenAPI均支持创建和释放Lindorm实例。
需要先登录阿里云控制台,点击:阿里云控制台
4. 网络配置与安全设置
4.1 网络选型
Lindorm实例创建完成后,需要根据业务场景选择合适的网络访问方式。Lindorm支持VPC(虚拟私有云)内网访问和公网访问两种方式。VPC内网访问延迟低、安全性高,推荐生产环境使用。公网访问需要单独开通外网地址。
4.2 配置IP白名单
无论使用内网还是公网访问,都需要将客户端IP地址添加至Lindorm的白名单中。具体操作步骤为:进入Lindorm控制台实例详情页面,点击左侧“访问控制”,然后点击“修改分组白名单”,将需要连接的客户端IP地址添加进去(多个IP用英文逗号隔开)。如果使用公网连接,需要获取公网IP并将其添加至Lindorm白名单。如果使用了VPN等代理,也需要将代理IP添加至白名单。
4.3 端口说明
Lindorm宽表引擎提供了多种协议的访问端口:
- 30060:SQL端口(Avatica协议)
- 33060:SQL端口(MySQL协议)
- 30020:宽表端口(HBase兼容协议、Java访问方式)
- 9042:CQL端口(Cassandra协议兼容)
连接前需要确认使用的是正确的端口号。
5. 使用Lindorm-cli连接数据库
Lindorm-cli是一个类似于MySQL shell命令行的工具,可用于通过命令行连接和操作Lindorm数据库。
5.1 下载与安装
进入Lindorm控制台实例详情页面,点击左侧“数据库连接”,然后点击“下载Lindorm Shell”。根据操作系统选择对应的版本(Windows、Linux、Mac)下载并安装。
5.2 连接命令
使用以下命令连接Lindorm:
./lindorm-cli -url <host:port> -username <用户名> -password <密码>其中,<host:port>替换为实例详情页面中的数据库连接地址,<用户名>和<密码>默认为root(或根据实例配置修改)。
5.3 宽表引擎常用操作
连接成功后,可以执行以下SQL操作:
-- 创建数据库
CREATE DATABASE test_db;
-- 使用数据库
USE test_db;
-- 创建表
CREATE TABLE user_info (
user_id VARCHAR PRIMARY KEY,
name VARCHAR,
age INT,
city VARCHAR
);
-- 插入数据
UPSERT INTO user_info (user_id, name, age, city) VALUES ('u001', '张三', 28, '北京');
-- 查询数据
SELECT * FROM user_info WHERE user_id = 'u001';
-- 批量查询
SELECT * FROM user_info LIMIT 10;6. 使用Java JDBC连接Lindorm
6.1 添加Maven依赖
在Maven项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>com.aliyun.lindorm</groupId>
<artifactId>lindorm-all-client</artifactId>
<version>最新版本</version>
</dependency>推荐通过8.0及以上版本的MySQL JDBC驱动连接Lindorm宽表引擎。
6.2 JDBC连接示例
以下是通过Java JDBC连接Lindorm宽表引擎并进行数据操作的完整示例:
import java.sql.*;
public class LindormJDBCDemo {
public static void main(String[] args) {
// JDBC连接URL格式:jdbc:mysql://host:port/database
String url = "jdbc:mysql://ld-xxxx-proxy.lindorm.rds.aliyuncs.com:33060/test_db";
String username = "root";
String password = "your_password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
// 创建表
String createTableSQL = "CREATE TABLE IF NOT EXISTS orders (" +
"order_id VARCHAR PRIMARY KEY, " +
"product_name VARCHAR, " +
"quantity INT, " +
"price DOUBLE" +
")";
try (Statement stmt = conn.createStatement()) {
stmt.execute(createTableSQL);
System.out.println("表创建成功");
}
// 插入数据 - 使用PreparedStatement
String insertSQL = "UPSERT INTO orders (order_id, product_name, quantity, price) VALUES (?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
pstmt.setString(1, "ord001");
pstmt.setString(2, "笔记本电脑");
pstmt.setInt(3, 2);
pstmt.setDouble(4, 8999.00);
pstmt.executeUpdate();
System.out.println("数据插入成功");
}
// 批量插入
String batchInsertSQL = "UPSERT INTO orders (order_id, product_name, quantity, price) VALUES (?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(batchInsertSQL)) {
for (int i = 2; i <= 100; i++) {
pstmt.setString(1, "ord" + String.format("%03d", i));
pstmt.setString(2, "商品_" + i);
pstmt.setInt(3, i % 10 + 1);
pstmt.setDouble(4, 100.0 * i);
pstmt.addBatch();
}
pstmt.executeBatch();
System.out.println("批量插入完成");
}
// 查询数据
String querySQL = "SELECT order_id, product_name, quantity, price FROM orders WHERE price > ?";
try (PreparedStatement pstmt = conn.prepareStatement(querySQL)) {
pstmt.setDouble(1, 500.0);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println("订单ID: " + rs.getString("order_id") +
", 商品: " + rs.getString("product_name") +
", 数量: " + rs.getInt("quantity") +
", 价格: " + rs.getDouble("price"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}6.3 时序引擎JDBC连接
Lindorm时序引擎同样支持通过JDBC Driver进行连接。对于已经使用JDBC标准API访问多种异构数据库的应用,可以无缝切换到Lindorm时序引擎。
7. 使用Python连接Lindorm
7.1 环境准备
使用Python连接Lindorm需要安装Python 3.7及以上版本,并将客户端IP地址添加至Lindorm白名单。
7.2 使用mysql-connector-python连接
以下是通过Python的mysql-connector-python连接Lindorm宽表引擎的示例:
import mysql.connector
# 建立连接
conn = mysql.connector.connect(
host="ld-xxxx-proxy.lindorm.rds.aliyuncs.com",
port=33060,
user="root",
password="your_password",
database="test_db"
)
cursor = conn.cursor()
# 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS sensor_data (
sensor_id VARCHAR PRIMARY KEY,
temperature DOUBLE,
humidity DOUBLE,
timestamp BIGINT
)
""")
# 插入数据
cursor.execute("""
UPSERT INTO sensor_data (sensor_id, temperature, humidity, timestamp)
VALUES ('s001', 25.6, 60.2, 1640995200000)
""")
conn.commit()
# 批量插入
data = [
('s002', 26.1, 58.7, 1640995300000),
('s003', 24.8, 62.3, 1640995400000),
('s004', 27.2, 55.9, 1640995500000)
]
cursor.executemany(
"UPSERT INTO sensor_data (sensor_id, temperature, humidity, timestamp) VALUES (%s, %s, %s, %s)",
data
)
conn.commit()
# 查询数据
cursor.execute("SELECT * FROM sensor_data WHERE temperature > 25")
for row in cursor.fetchall():
print(f"传感器: {row[0]}, 温度: {row[1]}, 湿度: {row[2]}")
# 关闭连接
cursor.close()
conn.close()7.3 使用Python DB-API开发
Lindorm支持通过Python DB-API进行应用开发。对于使用ORM框架(如SQLAlchemy)的应用,Lindorm也提供了良好的兼容性。
8. 使用HBase Shell连接宽表引擎
由于Lindorm宽表引擎兼容HBase API,因此可以使用HBase Shell来连接和操作宽表引擎。
8.1 下载与配置
进入Lindorm控制台实例详情页面,点击左侧“数据库连接”,然后点击“下载Lindorm Shell”。将下载的压缩包解压到Linux系统下,并配置hbase-site.xml文件中的连接参数:
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>ld-xxxx-proxy-lindorm-pub.lindorm.rds.aliyuncs.com:30020</value>
</property>
<property>
<name>hbase.client.username</name>
<value>root</value>
</property>
<property>
<name>hbase.client.password</name>
<value>root</value>
</property>
</configuration>8.2 连接与操作
配置完成后,运行以下命令连接:
./hbase shell成功连接后,可以使用HBase Shell提供的DDL和数据读写操作命令。
9. 冷热分离与TTL生命周期管理
9.1 冷热分离概述
Lindorm宽表引擎支持冷热分离存储功能,可以将冷热数据分别存储在不同的存储介质上,有效提升热数据查询效率,降低冷数据存储成本。冷热分离与TTL均为分区级别,仅支持枚举时间分区。Lindorm在后台定期执行Compaction操作,在Compaction过程中将符合条件的数据行移动到冷存储。
9.2 配置冷热分离
可以在建表时开启冷热分离并设置冷热分界线:
-- 建表时开启冷热分离,设置冷热分界线为7天
CREATE TABLE log_data (
log_id VARCHAR PRIMARY KEY,
log_content VARCHAR,
log_time BIGINT
) WITH (
'COLD_BOUNDARY' = '7d'
);
-- 或者使用CHS参数(Lindorm SQL语法)
CREATE TABLE log_data_v2 (
log_id VARCHAR PRIMARY KEY,
log_content VARCHAR,
log_time BIGINT
) WITH (
'CHS' = '7d'
);也可以对已有表修改冷热分离配置:
ALTER TABLE log_data SET 'COLD_BOUNDARY' = '30d';9.3 TTL数据生命周期
TTL(Time To Live)用于自动清理过期数据。可以同时配置冷热分界线和TTL,当已归档的冷数据时间戳超过TTL设定的存活时间时,系统会自动触发清理机制。
-- 设置TTL为90天
ALTER TABLE log_data SET 'TTL' = '90d';
-- 同时设置冷热分界线和TTL
ALTER TABLE log_data SET 'COLD_BOUNDARY' = '7d', 'TTL' = '90d';冷热分离和数据保留策略的设置都是基于事件时间,不支持基于入库时间设置。整个分区过期后才会删除该分区的全部数据。
10. 监控告警配置
10.1 查看告警规则
登录Lindorm管理控制台,在左上角选择实例所属的地域,在实例列表页单击目标实例ID。在左侧导航栏单击“报警配置”可以查看实例的告警规则。
10.2 创建告警规则
在实例管理页面进入Lindorm告警列表页面,单击“创建Lindorm告警规则”。Lindorm支持为关键实例指标创建告警规则,当指标触发阈值时,系统会自动向指定告警组发送告警通知。
建议针对以下关键指标配置告警:
- CPU使用率
- 内存使用率
- 存储空间使用率
- 请求延迟
- QPS/TPS
- 连接数
11. 数据迁移与同步
11.1 使用DTS进行数据同步
数据传输服务DTS支持将多种数据源的数据同步至Lindorm实例的宽表引擎。目前支持的同步源包括:
- PolarDB MySQL版
- RDS MySQL
- 云数据库MongoDB版
- PolarDB-X 2.0
11.2 使用LTS进行数据迁移
Lindorm通道服务(LTS)提供数据迁移同步、实时订阅、备份恢复等功能。在LTS操作页面中,可以创建导入任务,选择RDS数据源、DTS数据源以及目标数据源。LTS支持SLS实时数据复制等功能。
12. 最佳实践与性能优化
12.1 使用PreparedStatement提升性能
使用时序引擎时,使用prepareStatement绑参方式可以减少服务端资源占用,提高查询性能。
12.2 合理设置TTL与冷热分离
根据数据的访问频率和重要性,合理设置TTL和冷热分界线。热数据保留在性能更高的存储介质上,冷数据自动迁移到低成本存储,既保证了查询性能又控制了存储成本。
12.3 批量写入优化
对于大批量数据写入场景,建议使用批量写入接口(如JDBC的executeBatch、Python的executemany),减少网络往返次数,提升写入吞吐。
12.4 监控与告警
生产环境务必配置完善的监控告警,及时发现和处理性能瓶颈、存储不足等问题。
12.5 网络优化
尽量将业务应用部署在与Lindorm实例相同的VPC和可用区内,使用内网地址访问,降低网络延迟和流量费用。
13. 常见问题与解答
问1:使用Lindorm-cli连接宽表引擎失败,可能是什么原因?
答:请逐一排查以下方面:是否将客户端IP添加至Lindorm白名单;是否使用了VPN等代理但未将代理IP添加至白名单;服务端口是否可用。可以使用telnet命令检测Lindorm端口连通性。
问2:Lindorm宽表引擎支持哪些访问端口?
答:Lindorm宽表引擎提供以下端口:30060(SQL端口,Avatica协议)、33060(SQL端口,MySQL协议)、30020(宽表端口,HBase兼容协议)、9042(CQL端口,Cassandra协议兼容)。
问3:冷热分离和TTL可以同时配置吗?
答:可以。冷热分离和TTL可以同时配置,当已归档的冷数据时间戳超过TTL设定的存活时间时,系统会自动触发清理机制来清理这部分数据。但需要注意,冷热分离和TTL的设置都是基于事件时间,不支持基于入库时间设置。
问4:如何将其他数据库的数据迁移到Lindorm?
答:可以通过数据传输服务DTS将RDS MySQL、PolarDB MySQL版、MongoDB等数据源的数据同步至Lindorm宽表引擎。也可以使用Lindorm通道服务LTS进行数据迁移同步。
问5:Lindorm时序引擎支持哪些写入方式?
答:Lindorm时序引擎支持多种写入方式:Native SDK(推荐用于Java应用)、JDBC Driver(适用于已使用JDBC标准API的应用)、HTTP API SQL(适用于非Java语言开发的应用)。时序引擎还兼容OpenTSDB API和InfluxDB行协议。
问6:升级Lindorm宽表小版本有什么影响?
答:升级宽表小版本可能导致单个节点短暂断开连接,每个Server滚动重启,升级期间Region会下线再上线。对低负载实例影响较小;对高负载或时延敏感实例可能有一定影响,建议在业务低峰期进行。每个节点约需5到30分钟,具体时间取决于Region数量及负载。




