Skip to content

Commit 96c76ca

Browse files
authored
feat(risedev): support starting cluster with sqlite meta backend (#15693) (#16128)
1 parent dc0ea2d commit 96c76ca

File tree

6 files changed

+89
-19
lines changed

6 files changed

+89
-19
lines changed

risedev.yml

+11-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ profile:
7070
- use: frontend
7171
- use: compactor
7272

73-
# `dev-compute-node` have the same settings as default except the the compute node will be started by user.
73+
# `dev-compute-node` have the same settings as default except the compute node will be started by user.
7474
dev-compute-node:
7575
steps:
7676
- use: meta-node
@@ -1043,6 +1043,13 @@ template:
10431043
# Other etcd nodes
10441044
provide-etcd: "etcd*"
10451045

1046+
sqlite:
1047+
# Id of this instance
1048+
id: sqlite
1049+
1050+
# File name of the sqlite database
1051+
file: metadata.db
1052+
10461053
compute-node:
10471054
# Compute-node advertise address
10481055
address: "127.0.0.1"
@@ -1117,6 +1124,9 @@ template:
11171124
# Etcd backend config
11181125
provide-etcd-backend: "etcd*"
11191126

1127+
# Sqlite backend config
1128+
provide-sqlite-backend: "sqlite*"
1129+
11201130
# Prometheus nodes used by dashboard service
11211131
provide-prometheus: "prometheus*"
11221132

src/risedevtool/src/bin/risedev-compose.rs

+1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ fn main() -> Result<()> {
123123
volumes.insert(c.id.clone(), ComposeVolume::default());
124124
(c.address.clone(), c.compose(&compose_config)?)
125125
}
126+
ServiceConfig::Sqlite(_) => continue,
126127
ServiceConfig::Prometheus(c) => {
127128
volumes.insert(c.id.clone(), ComposeVolume::default());
128129
(c.address.clone(), c.compose(&compose_config)?)

src/risedevtool/src/bin/risedev-dev.rs

+31-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
use std::env;
1616
use std::fmt::Write;
17-
use std::path::Path;
17+
use std::path::{Path, PathBuf};
1818
use std::sync::Arc;
1919
use std::time::{Duration, Instant};
2020

@@ -27,7 +27,7 @@ use risedev::{
2727
generate_risedev_env, preflight_check, AwsS3Config, CompactorService, ComputeNodeService,
2828
ConfigExpander, ConfigureTmuxTask, EnsureStopService, ExecuteContext, FrontendService,
2929
GrafanaService, KafkaService, MetaNodeService, MinioService, OpendalConfig, PrometheusService,
30-
PubsubService, RedisService, ServiceConfig, Task, TempoService, ZooKeeperService,
30+
PubsubService, RedisService, ServiceConfig, SqliteConfig, Task, TempoService, ZooKeeperService,
3131
RISEDEV_SESSION_NAME,
3232
};
3333
use tempfile::tempdir;
@@ -101,6 +101,7 @@ fn task_main(
101101
let listen_info = match service {
102102
ServiceConfig::Minio(c) => Some((c.port, c.id.clone())),
103103
ServiceConfig::Etcd(c) => Some((c.port, c.id.clone())),
104+
ServiceConfig::Sqlite(_) => None,
104105
ServiceConfig::Prometheus(c) => Some((c.port, c.id.clone())),
105106
ServiceConfig::ComputeNode(c) => Some((c.port, c.id.clone())),
106107
ServiceConfig::MetaNode(c) => Some((c.port, c.id.clone())),
@@ -158,6 +159,34 @@ fn task_main(
158159
risedev::ConfigureGrpcNodeTask::new(c.address.clone(), c.port, false)?;
159160
task.execute(&mut ctx)?;
160161
}
162+
ServiceConfig::Sqlite(c) => {
163+
let mut ctx =
164+
ExecuteContext::new(&mut logger, manager.new_progress(), status_dir.clone());
165+
166+
struct SqliteService(SqliteConfig);
167+
impl Task for SqliteService {
168+
fn execute(
169+
&mut self,
170+
_ctx: &mut ExecuteContext<impl std::io::Write>,
171+
) -> anyhow::Result<()> {
172+
Ok(())
173+
}
174+
175+
fn id(&self) -> String {
176+
self.0.id.clone()
177+
}
178+
}
179+
180+
let prefix_data = env::var("PREFIX_DATA")?;
181+
let file_dir = PathBuf::from(&prefix_data).join(&c.id);
182+
std::fs::create_dir_all(&file_dir)?;
183+
let file_path = file_dir.join(&c.file);
184+
185+
ctx.service(&SqliteService(c.clone()));
186+
ctx.complete_spin();
187+
ctx.pb
188+
.set_message(format!("using local sqlite: {:?}", file_path));
189+
}
161190
ServiceConfig::Prometheus(c) => {
162191
let mut ctx =
163192
ExecuteContext::new(&mut logger, manager.new_progress(), status_dir.clone());

src/risedevtool/src/config.rs

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ impl ConfigExpander {
159159
let result = match use_type.as_str() {
160160
"minio" => ServiceConfig::Minio(serde_yaml::from_str(&out_str)?),
161161
"etcd" => ServiceConfig::Etcd(serde_yaml::from_str(&out_str)?),
162+
"sqlite" => ServiceConfig::Sqlite(serde_yaml::from_str(&out_str)?),
162163
"frontend" => ServiceConfig::Frontend(serde_yaml::from_str(&out_str)?),
163164
"compactor" => ServiceConfig::Compactor(serde_yaml::from_str(&out_str)?),
164165
"compute-node" => ServiceConfig::ComputeNode(serde_yaml::from_str(&out_str)?),

src/risedevtool/src/service_config.rs

+14
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub struct MetaNodeConfig {
6161
pub user_managed: bool,
6262

6363
pub provide_etcd_backend: Option<Vec<EtcdConfig>>,
64+
pub provide_sqlite_backend: Option<Vec<SqliteConfig>>,
6465
pub provide_prometheus: Option<Vec<PrometheusConfig>>,
6566

6667
pub provide_compute_node: Option<Vec<ComputeNodeConfig>>,
@@ -168,6 +169,17 @@ pub struct EtcdConfig {
168169
pub provide_etcd: Option<Vec<EtcdConfig>>,
169170
}
170171

172+
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
173+
#[serde(rename_all = "kebab-case")]
174+
#[serde(deny_unknown_fields)]
175+
pub struct SqliteConfig {
176+
#[serde(rename = "use")]
177+
phantom_use: Option<String>,
178+
pub id: String,
179+
180+
pub file: String,
181+
}
182+
171183
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
172184
#[serde(rename_all = "kebab-case")]
173185
#[serde(deny_unknown_fields)]
@@ -331,6 +343,7 @@ pub enum ServiceConfig {
331343
Compactor(CompactorConfig),
332344
Minio(MinioConfig),
333345
Etcd(EtcdConfig),
346+
Sqlite(SqliteConfig),
334347
Prometheus(PrometheusConfig),
335348
Grafana(GrafanaConfig),
336349
Tempo(TempoConfig),
@@ -352,6 +365,7 @@ impl ServiceConfig {
352365
Self::Compactor(c) => &c.id,
353366
Self::Minio(c) => &c.id,
354367
Self::Etcd(c) => &c.id,
368+
Self::Sqlite(c) => &c.id,
355369
Self::Prometheus(c) => &c.id,
356370
Self::Grafana(c) => &c.id,
357371
Self::Tempo(c) => &c.id,

src/risedevtool/src/task/meta_node_service.rs

+31-16
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// limitations under the License.
1414

1515
use std::env;
16-
use std::path::Path;
16+
use std::path::{Path, PathBuf};
1717
use std::process::Command;
1818

1919
use anyhow::{anyhow, Result};
@@ -76,21 +76,36 @@ impl MetaNodeService {
7676
}
7777

7878
let mut is_persistent_meta_store = false;
79-
match config.provide_etcd_backend.as_ref().unwrap().as_slice() {
80-
[] => {
81-
cmd.arg("--backend").arg("mem");
82-
}
83-
etcds => {
84-
is_persistent_meta_store = true;
85-
cmd.arg("--backend")
86-
.arg("etcd")
87-
.arg("--etcd-endpoints")
88-
.arg(
89-
etcds
90-
.iter()
91-
.map(|etcd| format!("{}:{}", etcd.address, etcd.port))
92-
.join(","),
93-
);
79+
80+
if let Some(sqlite_config) = &config.provide_sqlite_backend
81+
&& !sqlite_config.is_empty()
82+
{
83+
is_persistent_meta_store = true;
84+
let prefix_data = env::var("PREFIX_DATA")?;
85+
let file_path = PathBuf::from(&prefix_data)
86+
.join(&sqlite_config[0].id)
87+
.join(&sqlite_config[0].file);
88+
cmd.arg("--backend")
89+
.arg("sql")
90+
.arg("--sql-endpoint")
91+
.arg(format!("sqlite://{}?mode=rwc", file_path.display()));
92+
} else {
93+
match config.provide_etcd_backend.as_ref().unwrap().as_slice() {
94+
[] => {
95+
cmd.arg("--backend").arg("mem");
96+
}
97+
etcds => {
98+
is_persistent_meta_store = true;
99+
cmd.arg("--backend")
100+
.arg("etcd")
101+
.arg("--etcd-endpoints")
102+
.arg(
103+
etcds
104+
.iter()
105+
.map(|etcd| format!("{}:{}", etcd.address, etcd.port))
106+
.join(","),
107+
);
108+
}
94109
}
95110
}
96111

0 commit comments

Comments
 (0)