Key Manager存储加密_‘落盘加密‘-运用实例

首先我们先创建一个多群组多机构节点网络或者或者其他类型的节点网络。

这里以多群组节点为例。

通过二进制fisco-bcso文件,和配置config文件,创建节点

127.0.0.1:2 agA 1,2,3 30300,20200,8545
127.0.0.1 agB 1 30400,20300,8555
127.0.0.1 agC 2 30500,20400,8565

执行: bash build_chain.sh -f config -e ~/fisco/fisco-bcos

-f :指定节点配置文件
-e:离线部署时 需要用来指定fisco-bcos 的二进制文件

创建完成后,先不要启动。如果你启动了,请删除节点下的datalog文件,再进行下一步。

删除之后的节点文件夹内应该是下图这样:

然后,我们启动key-manager

启动成功会提示

[TRACE][Load]key-manager started,port=8150

然后我们另开一个终端,当前终端不要关闭!

去到script文件夹下:

执行: bash gen_data_secure_key.sh 127.0.0.1 8150 Xiao.

8150:要与刚才启动key-manager的端口一致

Xiao.:可以自定义 但要记住

执行成功后,提示:

CiherDataKey generated: 952dbcc240daedf23d226892ad656d52
Append these into config.ini to enable disk encryption:
[storage_security]
enable=true
key_center_url=127.0.0.1:8150
cipher_data_key=952dbcc240daedf23d226892ad656d52

cipher_data_key要保存好,下面会用到。

接着,我们去修改节点的配置文件:需要加密哪个就修改哪个,如果要全部加密,那就修改全部。将需要加密的节点信息修改 这里修改的是node0

配置文件位置 node0/config.ini

如果我们要修改全部,就要将所有的节点都修改

node0,node1,node2,node3全部手动修改。

可以使用 sed -i命令来批量修改提高效率。

我这里写了一个批量修改[storage_security]的sh脚本,将他放在nodes文件夹中,执行bash s_KeySed.sh 127.0.0.1 8150 952dbcc240daedf23d226892ad656d52,就可以将所有的配置文件修改完成。

127.0.0.1:要与key-manager的ip一致,一般都是127.0.0.1
8150:要与key-manager的端口一致
952dbcc240daedf23d226892ad656d52:替换成刚刚生成的cipher_data_key

可以看到已经修改完成了

s_KeySed.sh的源代码:

sleep 1
programName=${0##*/}
sedS(){
        if [ -z "$3" -o -z "$2" -o -z "$1" ];then
                #echo -e "\e[31m错误:错少参数,--help查看文档\e[0m"
                echo -e "\e[32m[Tips:] bash $programName [ip] [port] [key] \e[0m"
                exit
        fi
        findList=$(grep -rl "enable=" | grep -v $programName)
        echo -e "\e[32m[将修改以下文件] \e[0m"
        echo -e "\e[32m$findList \e[0m"
        sleep 2
        echo -e "\e[44m[Start] \e[0m"

        sed -i "s/enable=false/enable=true/g" $findList
        echo -e "\e[32m_enable=false_=>_enable=true \e[0m"
        sleep 1

        sed -i "s/key_manager_ip=/key_manager_ip=$1/g" $findList
        echo -e "\e[32m_key_manager_ip=_=>_key_manager_ip=$1 \e[0m"
        sleep 1
        sed -i "s/key_manager_port=/key_manager_port=$2/g" $findList
        echo -e "\e[32m_key_manager_port=_=>_key_manager_port=$2 \e[0m"
        sleep 1

        sed -i "s/cipher_data_key=/cipher_data_key=$3/g" $findList
        echo -e "\e[32m_cipher_data_key=_=>_cipher_data_key=$3 \e[0m"
        sleep 1
        echo -e "\e[32m[操作成功] \e[0m"
}

help(){
        echo -e "\e[32m--bash sed.sh [ip] [port] [key] \e[0m"
}


main(){
        if [ "$1" == "--help" ];then
                help
                exit
        fi
        sedS "$1" "$2" "$3"
}
main "$1" "$2" "$3"

下载地址:文件下载-奶牛快传 Download |CowTransfer

修改完节点配置文件之后,我们返回到key-managerscript文件夹:

执行:bash encrypt_node_key.sh 127.0.0.1 8150 ~/fisco/nodes/127.0.0.1/node1/conf/node.key 952dbcc240daedf23d226892ad656d52 来加密节点私钥。

127.0.0.1 8150         //也key-manager配置一样
952dbcc240daedf23d226892ad656d52	//就是上文生成的cipher_data_key

将我们刚刚修改的配置的节点的私钥都加密一遍。

加密node0,node1,node2,node3节点私钥

bash encrypt_node_key.sh 127.0.0.1 8150 ~/fisco/nodes/127.0.0.1/node0/conf/node.key 952dbcc240daedf23d226892ad656d52
bash encrypt_node_key.sh 127.0.0.1 8150 ~/fisco/nodes/127.0.0.1/node1/conf/node.key 952dbcc240daedf23d226892ad656d52
bash encrypt_node_key.sh 127.0.0.1 8150 ~/fisco/nodes/127.0.0.1/node2/conf/node.key 952dbcc240daedf23d226892ad656d52
bash encrypt_node_key.sh 127.0.0.1 8150 ~/fisco/nodes/127.0.0.1/node3/conf/node.key 952dbcc240daedf23d226892ad656d52

加密成功,我们刚刚的key-manager启动窗口会有提示:

好了,启动!节点:

key-manager终端:

启动成功。注意,加密之后每次启动节点之前需要先启动key-manager不然会报错。

你观察到的现象非常关键:`dd` 写入速度高达 **9.1 GB/s**,而 `fio` 测试顺序写时也达到了 **10.5 GiB/s(≈11.3 GB/s)**,这远超普通 NVMe SSD 的标称性能。我们来深入分析这个现象是否“正常”。 --- ## 🔍 一、你的测试结果真的异常吗? ### ✅ 实际输出解读: ```bash dd if=/dev/zero of=/home/fiotest.tmp bs=1M count=50000 status=progress 45GB copied, 5s, 9.1 GB/s ``` 这是 `dd` 报告的 **平均写入带宽为 9.1 GB/s** 紧接着: ```bash fio ... --rw=write --bs=128k ... Jobs: 1 (f=1): [W(1)][19.4%][w=10.5GiB/s][w=85.9k IOPS] ``` `fio` 实时报出当前写速达 **10.5 GiB/s ≈ 11.3 GB/s** > 注:1 GiB = 1.074 GB,所以 10.5 GiB/s ≈ 11.3 GB/s --- ## ❗ 结论先行: > ⚠️ **这些速度不真实或不可持续 —— 极有可能是写入到了内存缓存中,并未真正刷到磁!** 即使是最顶级的 PCIe 4.0 或 PCIe 5.0 NVMe SSD,连续写入速度也通常在 **5~12 GB/s 范围内**,而且必须满足以下条件: - 使用 DRAM 缓存加速(HMB 或内置) - 是企业级多通道 SSD(如 Samsung PM1735、Kioxia CD6 等) - 并发深度高、队列优化好 但更重要的是: 👉 **`dd` 默认使用 buffered I/O,数据先写入 page cache,不会立即!** --- ## 🧩 二、为什么 `dd` 显示这么高的速度? ### 原因:`dd` 没有加 `oflag=direct` 或 `conv=notrunc,fdatasync`,它走的是 **buffered write path** ```bash dd if=/dev/zero of=/home/fiotest.tmp ... ``` 这条命令的行为是: 1. 数据写入内核的 **page cache** 2. 实际由 `pdflush` 后台线程异步完成 3. `dd` 只等待数据进入内存就返回 → 报告“写完” 4. 所以看到的是 **内存带宽速度**,不是磁实际性能! 🧠 类比:你在电脑上复制文件到 U,提示“已完成”,但实际上还在后台传输。 --- ## ✅ 正确做法:用 `oflag=direct` 绕过缓存 要让 `dd` 测真实磁性能,应添加: ```bash dd if=/dev/zero of=/home/fiotest.tmp bs=1M count=50000 oflag=direct status=progress ``` 加上 `oflag=direct` 后: - 数据绕过 page cache - 直接提交给设备驱动 - 写速度会大幅下降至真实水平(比如 500MB/s ~ 3GB/s 视设备而定) 📌 如果你现在的 `dd` 没有加 `oflag=direct`,那它的结果 **不能反映磁性能**,只能反映内存和文件系统缓存效率。 --- ## 🧪 三、那 fio 的结果可信吗? 我们来看你的 `fio` 命令: ```bash fio ... --direct=1 --filename=/home/fiotest.tmp ... ``` ✅ **可信!因为你用了 `--direct=1`** 这意味着: - fio 使用 O_DIRECT 模式打开文件 - 绕过 page cache,直接与块设备交互 - 测量的是接近真实的磁吞吐能力 但是还有一个问题: ❗ `/home/fiotest.tmp` 是一个普通文件,位于 ext4/xfs 文件系统上。 虽然 `--direct=1` 会绕过缓存,但仍需经过 **文件系统层的块分配逻辑**,如果空间未预分配,可能触发元数据更新(如 extent 扩展),从而影响性能。 --- ## ✅ 推荐改进方案:使用 `fallocate` 预分配 + `overwrite=1` 为了确保测试公平且准确,建议: ### ✅ 方法一:先创建并预分配空间 ```bash # 预分配一个 50G 真实占用空间的稀疏文件(快速) fallocate -l 50G /home/fiotest.tmp ``` 然后运行 fio,这样就不会在测试过程中动态分配块。 ### ✅ 方法二:使用 `overwrite=1` 模式重复写同一个区域 否则 `randwrite` 会不断写新位置,导致 metadata 开销。 --- ## 📊 四、典型 NVMe 性能参考值(对比判断) | 类型 | 顺序写 | 随机写 (4K) | |------|--------|------------| | 消费级 NVMe (PCIe 3.0) | 2~3.5 GB/s | 20k–80k IOPS | | 高端 NVMe (PCIe 4.0) | 5~7 GB/s | 100k–200k IOPS | | 企业级 NVMe (PCIe 5.0) | 10+ GB/s | 300k+ IOPS | 如果你的机器是服务器平台,配备了高端 NVMe 卡(如 Intel Optane, Samsung PM9A3, Kioxia CM7),**10+ GB/s 是可能的**。 但如果只是普通笔记本或国产云主机上的 NVMe,基本不可能达到 10 GiB/s。 --- ## ✅ 如何验证是否真实? 运行下面命令查看实时磁负载: ```bash iostat -xmt 1 ``` 在 `fio` 运行期间观察: - `%util` 是否接近 100% - `wrqm/s` 和 `w/s` 是否合理 - `await`(I/O 等待时间)是否稳定 - `wMB/s` 是否匹配 fio 报告的速度 例如: ```bash Device r/s w/s rkB/s wkB/s await %util nvme0n1 0.00 86000.00 0.00 11264000.00 1.2ms 99.9% ``` 若 `wkB/s ≈ 11GB/s` 且 `%util ≈ 100%`,说明确实在高强度写--- ## ✅ 最佳实践总结 | 操作 | 推荐方式 | |------|----------| | 创建测试文件 | `fallocate -l 50G /home/fiotest.tmp` | | dd 测试带宽 | `dd ... oflag=direct` 才有意义 | | fio 测试 | 加 `--direct=1` + `--size=` + 大文件 | | 判断真实性 | 结合 `iostat` 查看实际磁吞吐 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值