Clickhouse扩容方案概览
文章目录
- 二、扩容
- 2.1 扩容副本
- 1、扩容副本的大致步骤
- 2、案例测试
- 2.2 扩容分片
- 1、扩容分片的大致步骤
- 2、案例测试
- 3、案例测试
二、扩容
2.1 扩容副本
对于副本节点的扩容,当ck集群新增副本节点后,zk会自动将原副本中的数据同步至新增副本节点中。
1、扩容副本的大致步骤
- 在扩容副本节点中修改配置,将集群配置中添加当前副本节点
- 启动扩容副本节点节点,并创建相关复制表(此时该副本节点查询请求可正常路由选择所有的副本节点,但原副本节点配置文件未刷新,只能路由选择原有副本节点)
- 原副本节点修改配置文件,将集群配置中添加新增副本节点信息
2、案例测试
1)扩容前配置
-- 配置文件
<clickhouse_remote_servers><!-- Test only shard config for testing distributed storage --><shard1_repl1><shard><!-- Optional. Shard weight when writing data. Default: 1. --><weight>1</weight><!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). --><internal_replication>true</internal_replication><replica><host>sdw1</host><port>9000</port></replica></shard></shard1_repl1>
</clickhouse_remote_servers>-- sdw1集群信息
sdw1 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │ 1 │ 1 │ 1 │ sdw1 │ 172.16.104.12 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘1 rows in set. Elapsed: 0.005 sec.-- sdw1上复制表信息
sdw1 :) show tables;SHOW TABLES┌─name─┐
│ tt1 │
└──────┘1 rows in set. Elapsed: 0.007 sec.sdw1 :) select * from tt1 order by id;SELECT *
FROM tt1
ORDER BY id ASC┌─id─┬─name─┬─create_date─┐
│ 4 │ ww │ 2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 6 │ dsk │ 2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw │ 2021-02-18 │
└────┴──────┴─────────────┘3 rows in set. Elapsed: 0.012 sec.
2)修改配置文件
<clickhouse_remote_servers><!-- Test only shard config for testing distributed storage --><shard1_repl1><shard><!-- Optional. Shard weight when writing data. Default: 1. --><weight>1</weight><!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). --><internal_replication>true</internal_replication><replica><host>sdw1</host><port>9000</port></replica>
<!-- 将新增的副本节点添加至集群配置中 --><replica><host>sdw2</host><port>9000</port></replica></shard></shard1_repl1>
</clickhouse_remote_servers><!-- 新增副本节点按照规律填写macros信息 -->
<macros><layer>01</layer><shard>01</shard><replica>cluster01-01-2</replica>
</macros>
3)修改sdw2节点配置信息后,启动新增副本节点ck服务,并手动创建相关表结构。此时对于sdw2节点来讲,集群的副本信息是完整的,可正常路由到任意节点,当时对于sdw1节点来讲,由于配置文件还未刷新,集群副本仍然还是只有sdw1一个。
-- 启动sdw2节点
# systemctl restart clickhouse-server-- 在sdw2节点上手动创建表结构
sdw2 :) create table db1.tt1 (`id` Int32,`name` String,`create_date` Date) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/tt1', '{replica}') PARTITION BY toYYYYMM(create_date) ORDER BY id SETTINGS index_granularity = 8192;
sdw2 :) create table db1.tt2 on cluster shard1_repl1 (`id` Int32,`name` String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/tt2', '{replica}') ORDER BY id SETTINGS index_granularity = 8192;-- sdw1上ck集群仍然还是1节点
sdw1 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │ 1 │ 1 │ 1 │ sdw1 │ 172.16.104.12 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘1 rows in set. Elapsed: 0.006 sec.-- sdw2上ck集群信息已经刷新为扩容之后的状态
sdw2 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │ 1 │ 1 │ 1 │ sdw1 │ 172.16.104.12 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ shard1_repl1 │ 1 │ 1 │ 2 │ sdw2 │ 172.16.104.13 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘2 rows in set. Elapsed: 0.011 sec.
4)检查sdw2节点数据是否可正常复制
sdw2 :) select * from tt1 order by id;SELECT *
FROM tt1
ORDER BY id ASC┌─id─┬─name─┬─create_date─┐
│ 4 │ ww │ 2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 6 │ dsk │ 2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw │ 2021-02-18 │
└────┴──────┴─────────────┘3 rows in set. Elapsed: 0.011 sec.
5)修改sdw1节点配置文件检查配置生效情况
-- 检查sdw1的ck服务集群信息,集群信息已经刷新为扩容后信息
sdw1 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard1_repl1 │ 1 │ 1 │ 1 │ sdw1 │ 172.16.104.12 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ shard1_repl1 │ 1 │ 1 │ 2 │ sdw2 │ 172.16.104.13 │ 9000 │ 0 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘2 rows in set. Elapsed: 0.010 sec.
5)检查sdw1集群服务信息
-- sdw2正常写入数据
sdw1 :) select * from tt1 order by id;SELECT *
FROM tt1
ORDER BY id ASC┌─id─┬─name─┬─create_date─┐
│ 1 │ aa │ 2020-01-04 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 4 │ ww │ 2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 6 │ dsk │ 2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw │ 2021-02-18 │
└────┴──────┴─────────────┘4 rows in set. Elapsed: 0.015 sec.-- sdw1检查数据
sdw1 :) select * from tt1 order by id;SELECT *
FROM tt1
ORDER BY id ASC┌─id─┬─name─┬─create_date─┐
│ 1 │ aa │ 2020-01-04 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 4 │ ww │ 2020-01-02 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 6 │ dsk │ 2020-07-20 │
└────┴──────┴─────────────┘
┌─id─┬─name─┬─create_date─┐
│ 19 │ bw │ 2021-02-18 │
└────┴──────┴─────────────┘4 rows in set. Elapsed: 0.015 sec.
2.2 扩容分片
1、扩容分片的大致步骤
方案一(历史数据重分布):
- 在原分片节点、新增分片节点中新增一个集群,新集群为我们扩容后所有节点的信息
- 在原分片节点上,创建与历史表结构一致的新表table_bak,需要留意engine、以及cluster的选择
- 通过快照表的方式,将原集群的分布式表数据备份迁移至新集群对应的分布式表中,该步骤会自动对表数据进行分片的路由选择
- 通过rename将新集群的本地表table_bak替换为table,并新建分布式表,完成数据的重分布
方法二(不迁移历史数据):
- 无论是新增分片节点还是原分片节点,直接在原集群中加入新增分片的信息
- 在新增分片节点中手动创建本地表、分布式表,在原分片节点重建分布式表语句
- 历史数据仍然保留再原分片节点中,扩容后新的数据写入正常路由至集群各个分片
不迁移历史数据的情况,表尽量是有设置TTL,这样可以避免某一节点数据量倾斜巨大,导致单个节点负载过大。
2、案例测试
1)扩容前环境检查
-- 配置文件
<clickhouse_remote_servers><!-- Test only shard config for testing distributed storage --><shard2_repl0><shard><replica><host>mdw</host><port>9000</port></replica></shard></shard2_repl0>
</clickhouse_remote_servers>-- 集群信息
mdw :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘
2)新增集群配置
<clickhouse_remote_servers><!-- 新增分片节点不需要再配置该集群信息 --><shard2_repl0><shard><replica><host>mdw</host><port>9000</port></replica></shard></shard2_repl0><!-- 新增集群配置 --> <shard2_repl0_new><shard><replica><host>mdw</host><port>9000</port></replica></shard><shard><replica><host>sdw3</host><port>9000</port></replica></shard></shard2_repl0_new>
</clickhouse_remote_servers>
3)修改mdw、sdw3节点配置文件后,检查配置文件生效情况
-- mdw集群信息
mdw :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ shard2_repl0_new │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ shard2_repl0_new │ 2 │ 1 │ 1 │ sdw3 │ 172.16.104.14 │ 9000 │ 0 │ default │ │ 0 │ 0 │
└──────────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘3 rows in set. Elapsed: 0.011 sec.sdw3 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0_new │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ shard2_repl0_new │ 2 │ 1 │ 1 │ sdw3 │ 172.16.104.14 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘2 rows in set. Elapsed: 0.006 sec.
4)通过快照表的方式在新的集群下创建表,并进行数据备份迁移
mdw :) create table db1.t2_new_local on cluster shard2_repl0_new as db1.t2_local ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/t2_new_local', '{replica}') ORDER BY id;
mdw :) create table db1.t8_new_local on cluster shard2_repl0_new as db1.t8_local ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/t8_new_local', '{replica}') ORDER BY id;;mdw :) create table db1.t2_new on cluster shard2_repl0_new as db1.t2 ENGINE = Distributed('shard2_repl0_new', 'db1', 't2_new_local', rand())
mdw :) create table db1.t8_new on cluster shard2_repl0_new as db1.t8 ENGINE = Distributed('shard2_repl0_new', 'db1', 't8_new_local', rand())mdw :) insert into t2_new select * from t2;
mdw :) insert into t8_new select * from t8;-- 检查数据分布
mdw :) select * from t2_newSELECT *
FROM t2_new┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
└────┴──────┘
┌─id─┬─name─┐
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘5 rows in set. Elapsed: 0.013 sec.mdw :) select * from t2_new_local;SELECT *
FROM t2_new_local┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
└────┴──────┘sdw3 :) select * from t2_new_local;SELECT *
FROM t2_new_local┌─id─┬─name─┐
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘3 rows in set. Elapsed: 0.006 sec.
5)通过rename对本地表进行名字替换,新建分布式表
mdw :) rename table db1.t2_local to db1.t2_bak_local,db1.t2_new_local to db1.t2_local;
mdw :) rename table db1.t2 to db1.t2_bak;
mdw :) rename table db1.t8_local to db1.t8_bak_local,db1.t8_new_local to db1.t8_local;
mdw :) rename table db1.t8 to db1.t8_bak;sdw3 :) rename table db1.t2_local to db1.t2_bak_local,db1.t2_new_local to db1.t2_local;
sdw3 :) rename table db1.t2 to db1.t2_bak;
sdw3 :) rename table db1.t8_local to db1.t8_bak_local,db1.t8_new_local to db1.t8_local;
sdw3 :) rename table db1.t8 to db1.t8_bak;mdw :) create table db1.t2(`id` Int32,`name` String) ENGINE = Distributed('shard2_repl0_new', 'db1', 't2_local', rand())
mdw :) create table db1.t8 on cluster shard2_repl0_new (`id` Int32,`name` String) ENGINE = Distributed('shard2_repl0_new', 'db1', 't8_local', rand())mdw :) select * from t2;SELECT *
FROM t2┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
└────┴──────┘
┌─id─┬─name─┐
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘5 rows in set. Elapsed: 0.032 sec.mdw :) select * from t2_local;SELECT *
FROM t2_local┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
└────┴──────┘2 rows in set. Elapsed: 0.006 sec.sdw3 :) select * from t2_localSELECT *
FROM t2_local┌─id─┬─name─┐
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘3 rows in set. Elapsed: 0.020 sec.
6)删除无效表
mdw :) drop table t2_bak_local on cluster shard2_repl0;
mdw :) drop table t2_bak on cluster shard2_repl0;
mdw :) drop table t8_bak_local on cluster shard2_repl0;
mdw :) drop table t8_bak on cluster shard2_repl0;
3、案例测试
1)扩容前环境检查
<clickhouse_remote_servers><shard2_repl0><shard><replica><host>mdw</host><port>9000</port></replica></shard></shard2_repl0>
</clickhouse_remote_servers>mdw :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘1 rows in set. Elapsed: 0.008 sec.
2)所有分片节点修改配置信息,在原集群下添加新增分片节点信息
<clickhouse_remote_servers><shard2_repl0><shard><replica><host>mdw</host><port>9000</port></replica></shard><shard><replica><host>sdw3</host><port>9000</port></replica></shard></shard2_repl0>
</clickhouse_remote_servers> mdw :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 1 │ default │ │ 0 │ 0 │
│ shard2_repl0 │ 2 │ 1 │ 1 │ sdw3 │ 172.16.104.14 │ 9000 │ 0 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘2 rows in set. Elapsed: 0.006 sec.sdw3 :) select * from system.clusters;SELECT *
FROM system.clusters┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl0 │ 1 │ 1 │ 1 │ mdw │ 172.16.104.11 │ 9000 │ 0 │ default │ │ 0 │ 0 │
│ shard2_repl0 │ 2 │ 1 │ 1 │ sdw3 │ 172.16.104.14 │ 9000 │ 1 │ default │ │ 0 │ 0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘2 rows in set. Elapsed: 0.006 sec.
3)在新增的分片节点下手动新建本地表和分布式表
sdw3 :) create table db1.t2_aa_local on cluster shard2_repl0 (`id` Int32,`name` String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/t2_aa_local', '{replica}') ORDER BY id;
sdw3 :) create table t2_aa(`id` Int32,`name` String) ENGINE = Distributed('shard2_repl0', 'db1', 't2_aa_local', rand())mdw :) select * from t2_aaSELECT *
FROM t2_aa┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘5 rows in set. Elapsed: 0.016 sec.mdw :) select * from t2_aa_localSELECT *
FROM t2_aa_local┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘5 rows in set. Elapsed: 0.005 sec.sdw3 :) select * from t2_aaSELECT *
FROM t2_aa┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘5 rows in set. Elapsed: 0.016 sec.sdw3 :) select * from t2_aa_localSELECT *
FROM t2_aa_localOk.0 rows in set. Elapsed: 0.004 sec.
4)新增数据写入
sdw3 :) insert into t2_aa values(6,'ff'),(7,'gg');INSERT INTO t2_aa VALUESOk.2 rows in set. Elapsed: 0.050 sec.sdw3 :) select * from t2_aa_localSELECT *
FROM t2_aa_local┌─id─┬─name─┐
│ 6 │ ff │
└────┴──────┘mdw :) select * from t2_aa_localSELECT *
FROM t2_aa_local┌─id─┬─name─┐
│ 1 │ aa │
│ 2 │ bb │
│ 3 │ cc │
│ 4 │ dd │
│ 5 │ ee │
└────┴──────┘
┌─id─┬─name─┐
│ 7 │ gg │
└────┴──────┘6 rows in set. Elapsed: 0.008 sec.
Clickhouse扩容方案概览相关推荐
- MySQL 分库分表及其平滑扩容方案
作者:王克锋 出处:https://kefeng.wang/2018/07/22/mysql-sharding/ 众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分 ...
- 区块链第二层扩容方案Plasma和Rollups
本文首发在本人知乎专栏 https://zhuanlan.zhihu.com/p/361016799 目前的permissionless区块链系统比如以太坊和比特币存在扩展性问题,表现为每秒所能处理的 ...
- Qtum量子链研究院:Plasma扩容方案详解(上)
近段时间著名的比特币投资者Olivier Janssens发布的推特投票中,Vitalik Buterin表达了其对ERC20 CBDC(央行数字货币)的支持.当被问到有关延展能力的问题时,Buter ...
- 亿级流量场景下的平滑扩容:TDSQL的水平扩容方案实践
为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库.云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙<你想了解的国产数据库秘密,都在这!&g ...
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
为什么80%的码农都做不了架构师?>>> 版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...
- 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案
架构组件:基于Shard-Jdbc分库分表,数据库扩容方案 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 ( ...
- oracle数据库扩容方案_ORACLE数据库扩容
本文档实施目标 AIX 表空间:ITDB 方式:裸设备方式扩容方案 作者:johncoco 日期:2016/1/29 1.查询oracle数据库表空间ITDB使用到的裸设备文件,注意裸设 ...
- Layer-2方案StarkWare估值80亿 以太坊扩容方案重要角色
如果说上一个牛市最后的叙事是公链,那么在本轮牛市最后的谢幕表演中,Layer2 尤其是 zk Rollups 是当之无愧的主角. 公众号:领航员kol 微博:牛熊领航员kol zk rollups ...
- 以太坊链上的二层(layer2)扩容方案Matic(Polygon)
文章目录 以太坊链上的二层扩容方案Matic(Polygon) 什么是 Matic(Polygon) Polygon的发展史 Matic 改名 Polygon Polygon生态 Matic(Poly ...
最新文章
- c语言赋值x为字母,C语言算术、赋值、关系、逻辑运算详细剖析---
- 竞赛|数据竞赛Top解决方案开源整理
- 目前常用的服务器端网络操作系统有,目前常用的服务器端网络操作系统是()。...
- Java 应用性能调优,可视化工具
- Netty之实现一个简单的群聊系统
- 一个简单的反向连接服务程序
- Majority Element(169) Majority Element II(229)
- 选好财务软件做好企业管理
- 全自动洗衣机单片机c语言程序,全自动洗衣机单片机程序
- 数值计算方法的简单介绍
- Atheros QCA8337交换芯片驱动开发
- oracle asm 日志,oracle 11g RAC 下ASM实例的alert日志告诉我们什么
- 前端UI配色辅助RGB颜色调色板配色表HTML源码
- 析取范式、合取范式、主析取和主合取
- Esp32-C3使用gpio唤醒深度睡眠,rtc gpio0~5始终置低,导致低电平唤醒一直复位,高电平唤醒无效?
- iOS 图形处理 Core Graphics Quartz2D 教程
- 微信联合登录全攻略,早期测试用户的详尽经验总结!
- ECCV 2022 | 用于对抗攻击的频域模型增强方法
- qpython3手机版turtle_Python的画图模块turtle使用详解
- 一个简单的C语言程序(详解)