KVM下宿主机的目录直通到虚机

这个需求也很有点意思,DBA 要求做 MySQL 的卸载从库,数据量会很大,硬盘空间后期需要扩容,但是 cpu 反倒占的不多。 单独 MySQL 是无法限制其 CPU 核使用的,这样的话,最好就是做个虚机来控制 MySQL 总 CPU 核数的使用,然后硬盘扩容的话,比如要拉伸虚机的附加第二块硬盘,如果是 QEMU 格式,会花费很长时间,所以干脆把宿主机的目录直接透传进虚机,之后如果要扩容加硬盘,直接把新的大硬盘 mount 出来再透进去即可,新旧硬盘拷贝数据也比拉伸虚机硬盘快。 CentOS7 下的做法如下: 两个大前提: 一、宿主机的 KVM qemu 系统需要使用新的 rpm 包,需要编译 二、虚机的内核需要升级,mount 命令需要支持 -t p9 的新格式 我们做好准备,就可以开始了 一、编译宿主机的qemu新包 现在已经是2022年了,所以编译的方式也发生变化了,最佳编译方式是干脆启动一个 Docker 虚拟机,来编译出来 rpm 包,也不污染环境。 首先克隆下来项目: git clone https://github.com/AlekseyChudov/qemu-kvm-virtfs.git cd qemu-kvm-virtfs 看一下最后的 build 脚本,有一个地方需要修改: 现在的 CentOS 最新版是 7.9.2009 ,这个版本树里是没有 qemu 的 Source Code 的,需要修改 baseurl,降低到 7.8.2003 才有 Source 的 repo baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/\$releasever/virt/Source/kvm-common/ 改成: baseurl=https://mirrors.tripadvisor.com/centos-vault/centos/7.8.2003/virt/Source/kvm-common/ 改好后 build 脚本如下 ...

2022年2月23日

如何用CPU挖Polygon网络的MATIC币

这是个严肃话题,正经挖以太币的话,很多的矿厂都是如果直接挖到以太币地址,那么必须挖到完整一个才允许提现,手续费还特高。 但是如果挖到以太链Polygon的地址的话,就可以 0.005 ETH提币了,如下图所示 但是千万记住,Polygon提出的所谓 0.005 ETH,看下图,只是个ERC-20的Token,实际是wETH Token,必须经过转换才能提到 ETH 去。 从 ERC-20 转换到其它代币呢,需要 MATIC 代币来付账,这玩意也必须得有啊!废话不多说,直接放上挖MATIC教程,我的机器是 CentoOS 首先需要有个完全自主的的 ETH 钱包地址,这个我就不教大家了 一、下载xmrig挖矿软件 下载地址:https://github.com/xmrig/xmrig/releases 我们选择最近的下载就好 二、做好加密通道 我们需要做好一条加密tcp通道 用 ghostunnel, localhost:9012 —> vps:9012 —> rx.unmineable.com:3333 三、用screen后台开挖 screen #./xmrig -o localhost:9999 -a rx -k -u DOGE:MATIC地址.矿工名 ./xmrig -o localhost:9012 -u MATIC:0x64358C7ddC96001697aBbA7ed431BADB6ABAaec5.cpu01 -p x --cpu-no-yield ctrl+a+d 四、查看挖了多少 查看地址:https://unmineable.com/coins/MATIC/address/ 五、兑换 挖到了足够的 MATIC,就可以愉快的兑换了。

2022年2月22日

Grafana画出prometheus的图

公司要做阿里的小程序接入,需要通过测试,测试呢需要提供硬盘的监控报告,比如 iops 。 同事从网上找了一下,iops 监控原文如下:监控磁盘的 iops ,利用 linux 的 /proc/diskstats 的第四个字段和第八字段可监控读和写的 iops,第四个记录是记录所有读的次数,第八个字段是记录所有写的次数。通过 zabbix 上的差速率即可监控磁盘的 iops。 文章链接:https://cloud.tencent.com/developer/article/1519113?ivk_sa=1024320u 仔细研究了一下上面的文章,看了它提供了两张监控图,分析一下: 第一张图: 有两个指标,绿色的是硬盘每秒的 io 读次数,红色的是硬盘每秒的 io 写次数。 第二张图: 同样两个指标,绿色的是硬盘每秒的 io 读 Bytes,红色的是硬盘每秒的 io 写 Bytes。 知道了指标具体的含义,这样就好办了。 我们用的是 prometheus 和 node_exporter 首先去看看 node_exporter 暴露的指标,搜一搜 node_disk,会看到如下4个指标: # HELP node_disk_reads_completed_total The total number of reads completed successfully. # TYPE node_disk_reads_completed_total counter node_disk_reads_completed_total{device="sda"} 4.9530358e+07 # HELP node_disk_writes_completed_total The total number of writes completed successfully. # TYPE node_disk_writes_completed_total counter node_disk_writes_completed_total{device="sda"} 1.4449267304e+10 # HELP node_disk_read_bytes_total The total number of bytes read successfully. # TYPE node_disk_read_bytes_total counter node_disk_read_bytes_total{device="sda"} 6.4101677568e+11 # HELP node_disk_written_bytes_total The total number of bytes written successfully. # TYPE node_disk_written_bytes_total counter node_disk_written_bytes_total{device="sda"} 1.15483858333184e+14 可以看出是上面 4 个指标,这四个指标都是 counter 计数器类型的,都是只增不减的。 ...

2022年1月18日

Javascript的项目与babel和eslint

最近开始弄hubot,顺带也开始学习 javascript ,首先从单独一个 nodejs 项目开始: nvm 和 node 的安装使用在前面已经说过了: Nodejs多版本的安装与管理 新建一个项目目录,build01 然后在其下建立如下目录结构: mkdir build01 cd build01 mkdir es6 dist mkdir public cd public mkdir es6 dist 解释一下,es6 下放的是服务器端的源代码,dist 下放的是服务器端处理过的源代码。 public/es6 放的是浏览器端的源代码,public/dist 放的是浏览器端处理过的源代码。 一、安装gulp和babel babel 是用来做 js 格式转换的,注意,原有的 babel-preset-es2015 已经不适用了。 npm install --save-dev gulp gulp-babel babel-preset-env@next 生成一个.babelrc 文件,内容就一行 { "presets": ["env"] } 在 es6 目录下,建立一个测试的 test.js 文件,内容如下: 'use strict'; const sentences = [ { subject: 'JavaScript', verb: 'is', object: 'great' }, { subject: 'Elephants', verb: 'are', object: 'large' }, ]; function say({ subject, verb, object }) { console.log(`${subject} ${verb} ${object}`); } for ( let s of sentences) { say(s); } 仔细看,上面这个文件用到了 es6 的语法,对象的解构,of语法。 ...

2022年1月4日

hubot集成企业微信+jenkins+ansible

Hubot是一个通用的聊天机器人,能和很多聊天软件集成,比如slack、rockchat、telegram、企业微信、IRC等。 公司用的是企业微信,之前用群机器人和 prometheus 集成,发送各种告警信息,但是群机器人无法接收消息;同时我们想集成进去很多自定义命令,比如发送指令就开始 jenkins build,发送 ansible 指令执行,发送流量图就自动把机房的流量图发过来,这个群机器人就用不成了。所以必须再直接一些,构建一个企业微信的应用。 一、企业微信安装前准备 安装前需要在企业微信中拿到4个信息: WECHATWORK_CORP_ID WECHATWORK_APP_AGENT_ID WECHATWORK_APP_SECRET WECHATWORK_AES_KEY 首先联系企业微信管理员新增一个应用: 在“管理后台-我的企业”中可以获得地一个信息,企业 ID 信息,CORP_ID : 拿拿 在“管理后台-应用管理-点击某具体应用-详情”页中可以获得二、三个信息, APP_AGENT_ID 和 APP_SECRET 第四个 AES_KEY 就比较麻烦了,我们进入这个应用,点击配置的图标: 然后进入,点击启用 API 接收 然后设置一下 url 填写 https://hubot.rendoumi.com/wechatwork/webhook Token 点随机获取 EncodingAESKey 点随机获取,这就是具体的 AESKey 了 然后点击保存,这里必然会失败!没有关系,因为我们还没有装hubot呢。我们把这三个地方先记录下来,随后再来点击保存。 二、Hubot 安装前准备 1、注意上面地址:URL 地址是 https ,然后 hubot 的缺省地址是 http://xxx:8080 ,这样如果前面没有证书卸载的设备,就得搭建一个Nginx(haproxy、traefik)来代理 https 443端口到8080。 2、Hubot 是支持 Coffeescript 和 nodejs 的,从它的 Adapters 网页看 https://hubot.github.com/docs/adapters/development/ 里面都是 coffee 味的单箭头函数,导致不太熟悉的八戒以为在 wechatwork module导出的时候也应该用单箭头函数,结果就悲剧了。 ...

2021年12月22日

nodejs多版本的安装与管理

最近在搞 JavaScripts,nodejs的版本满天飞,之前用的 nvm 管理的方法突然不能用了。 这里记录一下,比较新的 nvm 的安装使用方法: 下载安装: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 以上的脚本安装到底做了什么呢? 一、它 clone 了 nvm 到 $HOME/.nvm目录 二、它在 .bashrc 中添加了三行 事实上它是根据当前的 bash 选择在 .bash_profile、.zshrc、.profile、.bashrc中的某一个进行添加 然后我们退出终端,并重新进入,看看 nvm list nvm ls-remote 然后选择最新的版本安装: nvm install v16.13.1 如果想使用不同版本 nvm use 14.0.0 设置缺省版本或者取消 nvm alias defaut <your_nodejs_default_version> nvm alias default 14.0.0 node -v # prints 14.0.0 参考地址:https://github.com/nvm-sh/nvm

2021年12月17日

Backblaze类S3免费免备案对象存储

S3 的桶存储可以用 minio 来模拟。 网上有个 Backblaze 的网站,提供 10GB 的免费空间,且如果是公网访问,1GB流量是免费的,如果前面套了 Cloudflare 的CDN,那基本是全免了。 说下使用方式: 首先去 https://www.backblaze.com/ 注册个帐号: 然后直接建个桶(Create a Bucket) 桶文件类型选择 public,否则无法公网访问: 然后 gen 出 master app key 来并记录好: 随后最大的问题就来了,如果你用它页面自带的上传下载工具,彻底完蛋,拖进去的文件夹会变成扁平的,完全丧失目录结构。 必须要找一个好用的上传工具了,推荐 b2 。 b2 工具下载: https://github.com/Backblaze/B2_Command_Line_Tool 下载后直接改名为 b2 ,然后放到 /usr/local/bin 中 wget -O /usr/local/bin/b2 https://github.com/Backblaze/B2_Command_Line_Tool/releases/download/v3.1.0/b2-linux chmod 755 /usr/lcoal/b2 运行一下,有很多命令参数: 详细的使用文档: https://b2-command-line-tool.readthedocs.io/en/master/ 先去配置帐号,输入applicationKeyId和applicationKey b2 authorize-account 然后就可以往桶里传东西了,把当前目录下的东西传到 rendoumi 这个桶里,并且不要传 .git 目录 b2 sync --excludeDirRegex .git . b2://rendoumi/ 套 Cloudflare 就随意了。full ssl,建个 CNAME 且用 Page rule 做 url 转发就可以了。 ...

2021年12月8日

kubernetes下定制服务器503以及其他的403消息

kubernetes下定制 http 50x 以及 40x 服务器返回信息的话,如果用 Nginx 做 ingress,大家会很自然想到直接用 nginx 来定制: error_page 500 502 503 504 /50x.html; location = /50x.html { root /export/html; } 这样做是不行的,因为 Nginx 作为 ingress 来使用,就不能落地,只能做转发;如果你落地了,访问了本地文件,就违背了初衷。而且在 ingress 的 pod 上放页面,会导致 ingress 的配置错乱。 那么正确 50x 重定位的方法如下:首先建立一个 deploy 和对应的 svc,就是建立一个 web 服务器,能提供服务返回 50x 和 40x 的定制页面;然后在 ingress 内指定 custom-http-errors 和 default-backend 指向它就可以了。 一、建立miniserve的deploy和svc 我们选用 rust 的 miniserve 作为 web 服务器,准备好定制好的 index.html,写个 Dockerfile 网址:https://github.com/svenstaro/miniserve FROM alpine:3.12 RUN apk add --update bash && rm -rf /var/cache/apk/* COPY . /data/ RUN rm -rf /data/Dockerfile WORKDIR /data EXPOSE 8080 CMD ["/data/miniserve","--index","index.html"] #CMD /bin/sh -c "while true; do echo hi; sleep 10; done" 作出镜像后推送到阿里镜像:registry.cn-shanghai.aliyuncs.com/rendoumi/miniserve:lastest ...

2021年11月29日

kubernetes下nginx ingress的限制

在 kubernetes 中,ingress 负责转发、融断和限流。 我们以 Nginx ingress 为例,讨论一下这方面的问题。 一、Nginx ingress黑白名单 这个很简单了,丢进黑名单或者白名单,在入口前拦一刀。 我们只要在 annotations 声明即可: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: www-com-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/block-cidrs: a.b.c.d/32 #nginx.ingress.kubernetes.io/whitelist-source-range: a.b.c.d/32 spec: tls: - hosts: - www.huabbao.com secretName: www-huabbao-com-cert rules: - host: www.huabbao.com http: paths: - path: / backend: serviceName: nginx-svc 注意,多个ip的话,之间用逗号隔开(该值是逗号分隔的CIDR列表) : ...

2021年11月29日

kubernetes搭建minio作为阿里OSS的Gateway

阿里的云的 OSS 并不是完全版本的 AWS S3 兼容。 我们如果需要用 S3 协议访问 OSS,就比较麻烦了。 所以搭建一个 minio 来做网关,代理OSS,minio 是基本兼容S3的,所以这样曲线救国,通过 S3 协议访问 minio 来访问最后端的 OSS 这里还有一段故事: Minio 中间有一版是支持 oss 的,但是后来 oss 改了协议,所以现在的最新版本 minio 反而是不支持代理 oss 的,我们必须手动作出镜像,放到镜像库里,然后阿里 ACK 再使用 首先去下载那一版直接支持oss的 wget http://dl.minio.org.cn/server/minio/release/linux-amd64/archive/minio.RELEASE.2020-04-15T19-42-18Z chmod 755 minio.RELEASE.2020-04-15T19-42-18Z 这个文件比较宝贵,给个本地备份链接下载: minio.RELEASE.2020-04-15T19-42-18Z 然后在当前目录编辑 Dockerfile ,因为 K8S 和 OSS 同一地域,所以用 OSS 私网域名: FROM alpine:3.12 RUN apk add --update bash && rm -rf /var/cache/apk/* COPY minio.RELEASE.2020-04-15T19-42-18Z /data/minio.RELEASE.2020-04-15T19-42-18Z ENV MINIO_ACCESS_KEY=LTAI5tFFTbsxxxxxuLb ENV MINIO_SECRET_KEY=t78PyGnHZilxxxxxdxBCjvNgtVC5Y WORKDIR /data EXPOSE 9000 CMD ["/data/minio.RELEASE.2020-04-15T19-42-18Z","gateway","oss","http://oss-cn-shanghai-internal.aliyuncs.com"] # CMD /bin/sh -c "while true; do echo hi; sleep 10; done" 注意上面,MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY 对应的是阿里云 OSS的 AccessKey ID 和 AccessKey Secret ...

2021年11月26日