文章目录

  • 二、扩容
    • 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扩容方案概览相关推荐

  1. MySQL 分库分表及其平滑扩容方案

    作者:王克锋 出处:https://kefeng.wang/2018/07/22/mysql-sharding/ 众所周知,数据库很容易成为应用系统的瓶颈.单机数据库的资源和处理能力有限,在高并发的分 ...

  2. 区块链第二层扩容方案Plasma和Rollups

    本文首发在本人知乎专栏 https://zhuanlan.zhihu.com/p/361016799 目前的permissionless区块链系统比如以太坊和比特币存在扩展性问题,表现为每秒所能处理的 ...

  3. Qtum量子链研究院:Plasma扩容方案详解(上)

    近段时间著名的比特币投资者Olivier Janssens发布的推特投票中,Vitalik Buterin表达了其对ERC20 CBDC(央行数字货币)的支持.当被问到有关延展能力的问题时,Buter ...

  4. 亿级流量场景下的平滑扩容:TDSQL的水平扩容方案实践

    为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库.云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙<你想了解的国产数据库秘密,都在这!&g ...

  5. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...

    为什么80%的码农都做不了架构师?>>>    版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...

  6. 架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

    架构组件:基于Shard-Jdbc分库分表,数据库扩容方案 一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 ( ...

  7. oracle数据库扩容方案_ORACLE数据库扩容

    本文档实施目标 AIX  表空间:ITDB  方式:裸设备方式扩容方案      作者:johncoco 日期:2016/1/29 1.查询oracle数据库表空间ITDB使用到的裸设备文件,注意裸设 ...

  8. Layer-2方案StarkWare估值80亿 以太坊扩容方案重要角色

    ​​如果说上一个牛市最后的叙事是公链,那么在本轮牛市最后的谢幕表演中,Layer2 尤其是 zk Rollups 是当之无愧的主角. 公众号:领航员kol 微博:牛熊领航员kol zk rollups ...

  9. 以太坊链上的二层(layer2)扩容方案Matic(Polygon)

    文章目录 以太坊链上的二层扩容方案Matic(Polygon) 什么是 Matic(Polygon) Polygon的发展史 Matic 改名 Polygon Polygon生态 Matic(Poly ...

最新文章

  1. c语言赋值x为字母,C语言算术、赋值、关系、逻辑运算详细剖析---
  2. 竞赛|数据竞赛Top解决方案开源整理
  3. 目前常用的服务器端网络操作系统有,目前常用的服务器端网络操作系统是()。...
  4. Java 应用性能调优,可视化工具
  5. Netty之实现一个简单的群聊系统
  6. 一个简单的反向连接服务程序
  7. Majority Element(169) Majority Element II(229)
  8. 选好财务软件做好企业管理
  9. 全自动洗衣机单片机c语言程序,全自动洗衣机单片机程序
  10. 数值计算方法的简单介绍
  11. Atheros QCA8337交换芯片驱动开发
  12. oracle asm 日志,oracle 11g RAC 下ASM实例的alert日志告诉我们什么
  13. 前端UI配色辅助RGB颜色调色板配色表HTML源码
  14. 析取范式、合取范式、主析取和主合取
  15. Esp32-C3使用gpio唤醒深度睡眠,rtc gpio0~5始终置低,导致低电平唤醒一直复位,高电平唤醒无效?
  16. iOS 图形处理 Core Graphics Quartz2D 教程
  17. 微信联合登录全攻略,早期测试用户的详尽经验总结!
  18. ECCV 2022 | 用于对抗攻击的频域模型增强方法
  19. qpython3手机版turtle_Python的画图模块turtle使用详解
  20. 一个简单的C语言程序(详解)

热门文章

  1. 18. 树 - 子树
  2. 【收集】关于GRU的博客
  3. 为什么有时我们需要配置hosts来本地测试?
  4. jsdelivr cdn报错无法访问的解决方法
  5. python串口类_Python中serial的使用
  6. 关于FFMPEG中的filter滤镜的简单介绍
  7. 2021-5-5 buu刷题记录
  8. collate utf8_bin是什么意思
  9. c语言extend作用,extend
  10. Java简易系统监视器system-monitoring