作者归档:Young

家庭网络的若干升级

近期升级了NAS和家庭的无线网,原本的目的是解决NAS噪音问题,最后的走向却有些偏差。
需求的不断变更往往是项目失败的根源,还好在家庭网络升级过程中及时打住。

起因

整个事情的起因竟然是为了解决噪音问题。

目前仍在使用古老的QNAP TS-551 NAS,与几年前不同的是,3 HDD 和 2 SSD 都已经插满了。在HDD的选择上,使用了便宜又大碗的 WD HC550 16T,性价比自然是不错,存储容量焦虑大大缓解。SSD 得益于国产固态近半年的降价,可以直接把 SSD 作为存储池的的一部分,但是想要全闪 NAS 的话,目前看起来成本还是太高。

HC550 有一个让人头疼的噪音问题。起停阶段自然不必说,大量读写的时候噪音和震动之大多少有些夸张,然而日常状态会定期出现的“咯噔”声音才是最让人烦躁的存在。这一噪音据说是磁头归位保护硬盘这个特性引起的,但是个人对这个噪音多少有些敏感,虽然实际上不大,深夜情况下,还是有明显的感觉。

考虑了各种办法,最终决定让 NAS 远离自己解决噪音问题。

套壳静音

首先是套壳阶段。这一阶段主要是尝试使用加装了隔音材料的 MATX 机箱套住 NAS 尝试解决问题。至于说为什么不选择隔音机柜,那是因为成品实在是太贵,大约4位数,这是难以接受的。

为了解决散热问题,用了一把利民的 12 cm PWM 调温风扇配合温控电路板解决,整体成本30元左右。效果上聊胜于无,隐约还是可以听到,主要是不完全封闭,而且 UPS 还在机箱外,整个感觉就是有些不伦不类,这一阶段成果很快就要被否决了。

增加距离

既然隔音不能完全解决,那么是不是可以考虑让NAS远离?在一个不常有人的空间内部署,应该是最优解了。

不过最大问题是,NAS 的网络如何解决?在一个已经居住的环境里,网线走明线似乎是一个好选择,而且也有扁平网线,看起来哪怕是过门缝这种情况也能应对。如果选择这个方案,30元解决问题。

作为家居环境,还要考虑美观,网线难以做到无感知,地线影响打扫,天花板固定有些突兀,走门缝不一定方便,但是如果结合圆形细线和扁线,用连接器连接,扁线过门缝,圆细线走线,做好部分拐角保护,似乎是一个好的方案。最美观的方案可能就是上3频路由器无线 mesh 了。不过问题是成本,速度,稳定性这三者都需要考虑。如果再给我一次家里新增布线的机会,大概会选择细网线走墙+扁网线过门的方案,过墙部分直接用热熔胶粘平,只要门缝不是太极限(3mm以下)完全没有问题。细网线3mm不到,走墙和直角看起来也不是特别违和,甚至能直接沿着踢脚线布线,二者通过一个法兰连接,看起来问题也不大,这样布线两居室就算全拉上线也才100出头,RJ45的接口也方便接设备。家里有猫狗或者孩子也不用担心,毕竟网线还是很结实,唯一的缺点可能还是能目视到,不过相比起低成本来说,这算得了什么呢?假设家里装修风格是纯白或者边缘是黑色的,可能都不会太意识到。

但是这时候想要折腾的心态突然上来了,觉得这个方案还是不够优雅,而且门缝不一定有超过3mm的高度(扁线还是有厚度的,可能会阻碍关门),目光投向了光纤。

常见的皮线带钢丝,硬度还是有些大,不好塑形,而且还是比较明显。这时候隐形光纤就成为了最佳选择。实际上隐形光纤是接近透明的光纤,去掉了跳线的外壳,大致在1mm左右的线缆,成本上不贵,成品 SC 接口 15 米大约也就是30元,考虑到自己冷接的手艺,买成品即可。隐形光纤最大的问题是不能折90度,在这些地方需要稍微做一些弧度即可。固定可以用热熔胶点胶,等待3s左右防止烫坏光纤,过门缝等地方可以用布基胶布一类的做点简单保护。有条件可以打个光看看有没有漏光的情况,大致判断一下是否有衰减,或者更好的做法是上仪器。

光信号的电信号转换,可以采用光纤收发器解决。TP-LINK 有一对 SC 接口的 FC311A-3 和 FC314B-3 的组合,千兆速度,接收端有4个 RJ45 网口,可以当半个交换机使用,大约 180 左右,是一个不错的选择。

至此,网络问题基本解决了。

机柜组织设备

NAS 移动到其他空间之后,此时 NAS 的供电和网络等附属设备比较多,看起来比较杂乱,也不利于保护设备,可以考虑上一个机柜。

最终考虑尺寸,选择了 6U 机柜,大概可以放下一台 NAS,一台 UPS,光纤收发器,还剩余大约一个迷你主机的空间。

机柜的供电,散热和走线需要考虑,常规的机柜都是顶部开口,敲掉钢板,然后引入线路。但是考虑到实际上只需要一根电线和光纤,完全不需要这么大的开口,可以考虑机柜的其他较小的空洞引线。散热可以复用阶段1中机箱的PWM风扇,机柜顶部还是有12CM风扇固定位的。供电上可以用自己接线的 PDU 插排,8口总开的,保证有足够的电源入口,不过 PDU 插排会占据1U的高度,这点需要考虑。不过无论使用普通插排还是 PDU 插排自己接线大概率是肯定要的,毕竟三相插头不敲掉顶部钢板很难从机柜中引出,而电线则容易很多。走线的话这个没有特别的说法,不过束线带或者电工胶布还是需要,毕竟混乱的机柜自己用起来也很麻烦。

6U 机柜一般不带轮,用可调节尺寸的台式机支架DIY了一个机柜底座,带可锁定的万向轮。考虑到我是把机柜放在了厨房,垫高机柜还能起到基本的防水目的。

配合米家,增加温度计和智能开关,漏水和高温时自动断电,虽然不能自动灭火,但是还算是稍有改善,也能监测用电量。

扩展应用

事情到了这个阶段,似乎问题得到了完美解决,但是不要低估个人对需求的创造能力。

既然整个屋子的南北都有了网线,还可以做一些其他什么应用呢?作为一个大进深的屋子,在远离路由器的一端网速堪忧,那么是不是趁机解决一下网络问题?

使用的华硕 AC68U 已经多年,其实至今稳定而且基本够用,更改模式以后,对信号较差的情况有了部分改善。不过唯二的问题是不是很好选择 mesh 方案了,而且无支持 Wi-Fi 6。

还有一个问题是,米家默认情况都是云端执行模式,一旦偶发断网,整个控制都有可能瘫痪。比如 zigbee 开关控制的灯具,这种情况需要一个中枢网关。

综上,首先考虑需要扩展的自然是路由器 mesh 以及米家本地化执行的需求。

刚好近期小米路由器推出了新品6500Pro就是一次性解决这些需求的设备。但是尺寸上属实让人震惊,堪比PS4的尺寸。

外观算是好看的,没有天线的设计还不错。4个2.5G网口共享5G,目前家用环境影响不大,毕竟内网也就千兆。

能NFC一碰连接,不过仅限于Android。作为路由器的基本的上网功能基本不用担心,Mac Mini千兆无线内网轻松跑满。带了中枢网关和蓝牙网关,搭配多模网关zigbee设备也能用,AP mesh情况下不影响网关使用(上游还有一个主路由器的情况),基本上解决了核心的问题,不过如果带了红外模块就更完美了,目前客厅的其他设备还需要带红外模块音箱进行控制。

正好买到了很便宜的小米 AX3000T,本次方案就是小米路由器主打了。

稳定性上使用了半个月,基本上没有问题,访问 NAS 基本能跑满千兆了。

整个事情到这里已经偏离了最开始的计划。

再提速

路由器上的2.5G网口只能有千兆速度想起来让人总觉得有些难以接受,最终又想要再次提升速度了。

速度限制的瓶颈其实主要分为三部分,收发两端以及线路。线路上是光纤,自然万兆毫无压力,实际上用6类线在家用距离上也没有问题。但是 USB 5G 网卡的价格确实有些昂贵,更不用说万兆电口网卡了,这类设备也很少。本身Mac上也没有选配万兆网口,倒是也不用这么极限。

采用Realtek 8156芯片的 USB 2.5G 网卡物美价廉,百元左右,很多设备都能驱动,哪怕在老旧的 QNAP 设备上都能免驱。

收发段就它了吧。不过问题是光纤收发器是千兆的,这就无法发挥2.5G网卡的能力了。只能升级光纤的收发设备。然而,2.5G的光纤收发器价格也比较贵,不如考虑带光口(SFP)的交换机+光模块的模式了。

兮克的这款 SKS3200M-4GPY2XF 价格尚可,其他大品牌的同类产品稍微有些贵。4电(2.5G)+ 2光(10G)轻管理交换机能支持VLAN,对于家庭组建2.5G内网来说是非常方便的,一条隐形光纤,通过LC SFP模块能完成单线复用等功能。速度应该是不用担心,不过手里没有能跑到10G的设备,2.5G倒是能跑满,配合6500Pro路由器和QNAP NAS上的USB 3.0 2.5G网卡,总算是有了一个准2.5G内网。买上两只组合一下。

光模块买了一对便宜的单模单纤的万兆,使用LC接口,不过前期的隐形光纤是SC接口,这里需要做一些转接,用法兰连接成品转接线即可。SC接口也看到了有一家有卖单模单纤,但是没有试过。如果当时是两根光纤,购买这类产品的成本会大幅度降低,单模单纤的还是太贵,哪怕是二手设备。

划分了两个 VLAN,其中一个是包含 NAS 的家庭内网。划分VLAN单线复用有个人用一个简单的方式:

  • 公用的端口设定为tagged
  • VLAN本身的端口设定为untagged
  • VID只设定VLAN本身的端口

不过这一交换机有个离谱的交互,交换机居然修改后要到最底部的二级菜单点击保存才可以,这个交互设计过于阴间了,导致第一天配置完成之后mesh子路由器上的IP居然是另一个路由器DHCP分配的,整个家里设备的连接情况一片混乱。接上网线一看VLAN设定全部没了

看着测速结果,在想原本是要做什么来着?还是立刻打住继续发散的想法吧。

IDEA插件开发尝试

TL;DR

JetBrains IDEA 基本上是目前最好的 Java 开发 IDE ,根据自己的一些个性化需求定制插件也是可行的。本篇会通过修改一个开源插件的的方式,描述一些简单修改插件的方法以及可能遇到的问题。

此处感谢 ArthasHotSwap 插件,这一个插件为开发工作提供了便利。

场景

此处以一个场景作为案例。

ArthasHotSwap 插件是一个使用 Aliyun OSS 作为加密后 class 文件作为中转,近似“一键”完成热更新操作的 IDEA 插件。

插件功能很简单,仅在右侧菜单提供一个 Swap this class 选项:

Swap this class

查看插件源代码:

可以看到实际上是生成了一个 OSS 上的公共读对象,通过复杂的文件名来提供一定的安全性,并且满足可以在服务器上访问的的链接。

那么下面修改的目标就是提供一个选项,决定是否生成带有过期时间的链接

开发

开发环境搭建

需求明确后先要搭建开发环境。

ArthasHotSwap 插件使用 gradle 进行工程的组织。

使用 gradle 可能会遇到依赖下载速度缓慢的问题,考虑将 build.gradle 文件中调整一下源:

开发插件还会用到 gradle-intellij-plugin 。在配置文件中声明的版本可能也需要下载,这个速度也可能很慢,考虑直接替换成本地的 IDEA:

其中 localPath 替换成自己的目录即可,version 也是必须配置的。

这两步完成后可能可以加快投入开发的时间。

插件结构

开发首先看文档:https://plugins.jetbrains.com/docs/intellij/plugin-structure.html

关注 src/main/resources/META-INF/plugin.xml

一些常规的字段之外,本次修改最关键的部分,就是配置窗口的声明:

从这里可以看到入口是 com.xxxtai.arthas.dialog.SettingDialog 这个类。

同时因为目标是提供修改配置的功能,参考文档:https://plugins.jetbrains.com/docs/intellij/settings-guide.html

结合文档以及配置,ArthasHotSwap 插件提供的是项目级别的配置功能,并且目录中位于 Tools 目录下:

ArthasHotSwap

修改方法

增加一个配置,整体方法就明确了:

  • 选择合适的显示组件
  • 增加配置字段
  • 功能层面读取字段完成功能分支

选择合适的显示组件

可以考虑 CheckBox 形式,勾选上表示 true。

注意 com.xxxtai.arthas.dialog.SettingDialog 是配置文件中的入口,而此类会调用 com.xxxtai.arthas.dialog.AppSettingsComponent 对象构建面板。

修改 com.xxxtai.arthas.dialog.AppSettingsComponent ,增加对象以及获取以及赋值方法:

增加配置字段

com.xxxtai.arthas.dialog.AppSettingsComponent 会在 com.xxxtai.arthas.dialog.SettingDialog 中通过配置文件中的 com.xxxtai.arthas.domain.AppSettingsState 读取和存储配置文件。

增加变量之余,上面的 @State 注解也声明了存储位置。

功能层面读取字段完成功能分支

此处不多描述,即 com.xxxtai.arthas.facade.impl.OssFacadeImpl#uploadString 会给脚本返回 OSS 对象链接,需要加密也是需要在此处理。即读取配置后,决定是否返回加密链接。

测试

逻辑开发完成之后,项目 gradle 任务中有一个 runIde 任务,运行此任务之后,会启动一个测试 IDEA 实例,可以在此 IDE 中进行功能的测试。

此处可见刚才的私有访问配置已经添加成功:

Added checkbox

配置也存储到@State 注解配置对应文件中:

config saved

至此,一个插件的修改过程结束。安装上可以通过 gradle 打包 fatJar 再进入 IDEA 进行安装即可。

至于如何增加全局配置等其他功能的开发,之后有时间再记录。

参考链接

发号器设计简述

TL;DR

发号器用于为系统中各个模块提供ID生成服务。

设计一个发号器至少需要考虑ID唯一性,有序性,性能,可用性,使用成本,以及一定的数据安全问题。

作为一个极其成熟的业务功能,发号器有大量的实现,有海量的文章描述各类要点,按序选择即可,无需重复造轮子。

继续阅读