無標題文檔

分享下自己的家庭网络拓扑和结构

上次对于树莓派搭建的家庭网络可能说了个大概,其实根据每个家庭的需求不同,网络的拓扑其实也会有些调整。下面从应用的切面角度分享下目前家庭的网络拓扑情况,这个是个大概的图:

Network

旁路由

家里的路由器性能其实不差,但考虑其实很多的工作(网关、代理、端口转发、等等)如果在路由器上处理,往往路由器的性能会打个折扣,同时也会影响稳定性。

同时,其实路由器上配置多了以后,对于以后更换路由器重新配置也是件比较麻烦的事情。所以,我使用了树莓派分担了部分路由器的任务,主要是些网络寻址以及服务发现等相关的服务,例如 DNS、DHCP 以及防火墙等。

DNS 这块主要使用 DNSMasq,做了很多使用这个应用应该做的事情,例如「境外网络加速」、对接 Consul 作为内部的无痛服务发现、网络内容过滤(去广告)等功能,同时为了加块解析速度本地加大了缓存。

后面考虑由于 斐讯 N1 综合性价比比树莓派高出很多,因此会考虑这部份的服务将往 N1 的硬件上迁移。同时,树莓派打算用来做 4G 的网关,搭配 UPS 这样子家庭网络就不会断网了。

监控

监控使用了 Prometheus 以及 Grafana 同时独立管理,具体的可以参看这里

应用层

应用层主要使用了虚拟机,系统方面主要是 CentOS 以及 Manjaro 以及 Debian 还有几台 FreeBSD。主要应用场景分别是用来做 CI、以及数据抓取(爬虫)以及其他些比较费时的操作。

虚拟机的寻址主要使用 Consul 搭配 DNSMasq 完成,写个 go 小程序用来注册以及健康检查。其中台虚拟机还对接了统一的通知服务,例如收发邮件以及短信。

数据层

数据层相对比较简单,使用了两台物理机:分别是台联想的 i7 四代小主机、16g 的内存(性能不差因此拿来开虚拟机用);以及还有台相对比较弱的奔腾机接了 Raid1 阵列柜,专门用来做数据存储和同步。后面会考虑使用黑群晖,将这部份硬件的可靠性强化下。

物理机

以上

使用斐讯 N1 作为 Prometheus 监控服务器

新出了树莓派4,性能方面可以说对于老的 3B+ 的版本可以说是有全面的提升。但价格方面 4G 内存配置的就已经需要 50$,已经逼近台 x86 的准系统。同时因为树莓派是裸板,如果想要在生产环境使用,后面还需要自己增加存储、外壳等,全套上去其实性价比已经不高。

个人在家里部署了几台树莓派用来做小的应用服务器以及网关,详细看这里。在社区讨论新的树莓派4的时候,网友无意间说道「为什么不考虑下斐讯的N1?」

N1

由于原先的 Prometheus 和 Grfana 是在台虚拟机里,从安全的角度叫上说监控还是使用单独的硬件更加合适些,所就立马入了台 N1 用来当作单独的监控系统。

硬件

购买的渠道先不说了,总之你总能办法到手的,普遍价格依据成色从几十到一百出头不等。由于是矿难的遗留物,所以建议还是买带包装以及三码合一的产品,差价其实并不是很大。

下面硬件方面,我们对比斐讯的 N1 和树莓派3B+做个对比:

/斐讯 N1树莓派 3B+
CPU 和平台Amlogic ARM64BCM2835 ARMv7
内存2G1G
存储自带 8g EMMC另外安装 SD 卡
外观自带外壳裸板,需要外壳自行购买
价格100+裸板200+,外壳和存储另算

总体来说,对于性能(平台)以及性价比方面,斐讯 N1 都是要比树莓派3B+要强不少的,尤其是 EMMC 是非常加分的项目。具体性能方面,可以参考这篇文档这里不放具体的指标和数字了。

系统

目前二手市场上很多卖家都提供了刷机服务,我这边为了节省时间直接让卖家给刷了 Armbian 系统。

到手以后 SSH 上去发现存储空间有些不对,还需要些调整。原先还有部分 Android 的文件在其他的分区,可以直接执行 blkid 查看可以的块设备。

大概有那么几个块设备可以使用:

/dev/cache
/dev/tee
/dev/system
/dev/data

可用的几个:/dev/data 是目前的根分区,我们不用动它,而 /dev/tee 这个分区太小没有使用的价值,所以个人将 /dev/system 格式化为 ext4 mount 到了 /home 以及将 /dev/cache 作为 swap 分区备用(512MB 有点鸡肋)。

Filesystem      Size  Used Avail Use% Mounted on
udev            789M     0  789M   0% /dev
tmpfs           180M   17M  164M  10% /run
/dev/data       4.4G  2.4G  2.0G  56% /
tmpfs           900M     0  900M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           900M     0  900M   0% /sys/fs/cgroup
tmpfs           900M     0  900M   0% /tmp
/dev/system     1.2G  294M  855M  26% /home
log2ram          50M   13M   38M  25% /var/log
tmpfs           180M     0  180M   0% /run/user/1000

以及 free(已经运行了部分服务的情况):

              total        used        free      shared  buff/cache   available
Mem:           1.8G        205M        837M         28M        756M        1.5G
Swap:          511M          0B        511M

所以,总体分区调整配置完了以后,大概是这样子总计占用的空间大概 7G 不到一点,但其实足够日常使用了(其实是不想在系统瘦身这块花更多的时间)。

调整完分区,然后关闭不必要的服务和启动项。关闭和删除红外线服务:

systemctl disable lircd.service lircd-setup.service lircd.socket lircd-uinput.service lircmd.service
apt remove -y lirc

关闭 NFS 服务,在集群里已经有 NFS 服务器了,所以不需要:

systemctl disable nfs-server

禁止图形界面启动的 Hook,这个其实没必要操作,但为了避免自启动有些图形应用:

systemctl disable graphical.target

后面添加清华的镜像源,安装 Docker CE 等操作就不复述了。这样子,重启以后系统层面的配置就完成了。

配置

下面主要说下这个机子安装 Prometheus 和 Grafana 遇到的些坑。首先,就是平台的问题,由于是 ARM64 的设备,所以直接用 Docker 镜像(默认 x86/amd64)是行不通的,需要使用针对平台的 Docker 镜像。

下面是我简单的 docker-compose 配置,注意镜像的名称:

services:
  prometheus:
    image: prom/prometheus-linux-arm64:v2.10.0
    container_name: prometheus
    hostname: prometheus
    user: "root"
    restart: unless-stopped
    volumes:
      - /etc/hosts:/etc/hosts:ro
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./targets.json:/prometheus-targets.json:ro
      - prometheus-storage:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=6month'
      - '--storage.tsdb.retention.size=2GB'
      - '--web.enable-lifecycle'
    ports:
      - 9090:9090

  grafana:
    image: grafana/grafana:6.2.5
    container_name: grafana
    hostname: grafana
    user: "root"
    restart: unless-stopped
    links:
      - prometheus
    volumes:
      - /etc/hosts:/etc/hosts:ro
      - grafana-storage:/var/lib/grafana
      - grafana-provisioning:/etc/grafana/provisioning
    ports:
      - 3000:3000
    depends_on:
      - prometheus

因为机子的存储容量较少,针对 Prometheus 最好追加个容量方面的限定参数,例如我这边配置了:

- '--storage.tsdb.retention.time=6month'
- '--storage.tsdb.retention.size=2GB'

6个月或者总容量到达 2GB 的时候自动清除老的数据,默认 Prometheus 清除时间为 15d,很多刚开始接触 Prometheus 的同学表示为什么会「丢数据」也是因为这个原因。

注意到 Alert ManagerNode Exporter 以及 Push GateWay 都没有加入 Docker 的部署。原因一来是官方没有针对 ARM64 平台的镜像,二来这些服务相对比较简单、同时数据也不用纳入 Docker Volume 管理,因此就直接下载安装包运行。

后续

安装配置好了以后,上面跑了十几个 Job 用来 Pull 各个节点的状态负载其实并不高:

Status

总体来说,用来监控十几个节点的小集群常规数据是足够了的,还能带起 Grafana 服务。说起来,这些只要一百出头三顿麦当劳的价格,性价比超高。

由于还是担心存储的问题(一般来说是足够了),我还是给它增加了块 64G 的 U 盘(存储比机子贵),挂在 /var/lib/docker 专门用来跑 Docker 服务以及保存 Docker Volume 使用,这样子安心多了。

由于价格便宜,我后面又追加了几台 N1 机器当作备用机以及单独的集群。估计以后 Docker Build 出来的镜像都是 ARM 平台的了(例如我单独给树莓派维护的 Syncthing 镜像),谁叫它性价比高呢。

- eof -

整理汇总下最近用 Golang 写的些小玩意

由于工作的关系,所以又点了 Golang 这个技能树。几个月下来,对于这个语言以及对应技术栈的理解不算透彻,但多多少少会有些心得。

在这里整理下最近用 Golang 写的些小工具以及类库,希望能对大家有所帮助。

Genpasswd 简单的密码生成工具

源码地址:https://github.com/mingcheng/genpasswd.go ,根据名字就知道这是个生成随机密码的小工具。这个项目是本人的第一个 Goalng 项目,主要是熟练使用了些对应的脚本和配套的 CI 等工具(Travis 非常好用)。

QQWry 基于纯真 IP 库的微服务应用

源码地址:https://github.com/mingcheng/qqwry.go ,根据 IP 地址反查对应的地理位置等信息。

纯真 IP 库其实不是新东西了,早在以前 QQ 时代显示对方的 IP 信息就基本上会拿这个库来处理。其实,这个项目也只是根据线上现成的项目改进了下,使其支持在线获取以及更新最新的数据库(后续考虑增加 GRPC 的支持)。

NCMDump 云音乐 NCM 格式分析

源码地址: https://github.com/mingcheng/ncmdump.go ,云音乐出于版权方面的考虑有些歌曲在下载到本地的时候,格式是所谓的 NCM 格式。这在导入到其他设备的时候会有些麻烦。

网络上有对应的 C++ 以及 Python 的实现。其实也有对应 Golang 的实现,但会有些 Bug 例如解析某些 flac 封装的歌曲的时候会报异常,所以改进了下。通过这个项目,对于 AES 加密以及文件操作有了很直观的认知。

PIDFile 生成 PID 文件的库

源码地址:https://github.com/mingcheng/pidfile ,由于些 Golang 通常用于 Daemon 的编写,所以会考虑使用 PID 文件避免程序重复启动,因此就有了这个库。

Obsync 华为对象存储同步工具

源码地址:https://github.com/mingcheng/obsync.go ,尝试使用了下华为云的对象存储服务(OBS),发现支持的节点不错而且对比阿里云相对便宜些。诡异的是它还有非洲的节点,速度也不慢电信直连。

这样子,我的线上备份以及同步就有了另外个去处,数据方面也会安心一点。在中美这个节点上,支持下华为吧。

最后,顺便说下 Chaosblade 这个项目,它是阿里的混沌实验实施工具。其源代码相对来说不会很复杂,可以阅读下以后多给它做些改进。

One more thing. 还有个小玩意是 NSFW 的,我改造了下使其支持代理下载,具体的看链接吧:https://github.com/mingcheng/pornhub-dl.go

- eof -

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章