我的监控世界观(2)-- 抽象的世界很精彩

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 抽象是我们认识世界的一种手段,它能把复杂的世界简单化 以主机监控为例,如果我们抛开网卡的数量不同,磁盘的数量不同,文件分区数量的不同,我们可以发现 剩余的部分几乎是相同的 cpu 使用率 磁盘使用率 内存使用率 … … 对于某种应用而言,比如某个网站在某台机器上的运行情况,我们可以发现大体可以得到以下状态数据 每分钟的PV数 每分钟的真实IP数 文件下载量 文章新增数等等 如果我们进一步抽象,就会发现主机监控除了状态信息不一样,几乎可以把它和其它的应用同等对待 当然抽象的结果就会失去精度,就好比,高度抽象的人这个概念,已经无法知道是男人还是女人,是 年轻人还是老人了。 后记: 这篇文章是我2014年写的文章。这里补充一点 其实简而言之,就是指标–时间–值 对于指标信息的描述是元数据,现在一般的实现是存储在关系型数据库里(比如MySQL) 时间-值都存储在时序型数据库里,比如 RRDTool (Nagios、Open-falcon) InfluxDB Hbase (OpenTSDB) ES

January 6, 2018 · 1 min

从hadoop 中删除匹配指定字符串的任务

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 我们都知道如果使用 hadoop job -list 获取当前正在运行的hadoop 任务,返回的结果如下: 返回的任务中不包括任务的名称, 但是通过hadoop 管理页面是可以查看到job 的名称的。 但是现实情况是我们可能需要根据任务的名称来删除任务。 我的实现方案是这样的 通过获取 http://192.168.1.100:50030/jobtracker.jsp 网页 解析网页获取任务名称 + job_id 的任务列表 过滤出指定名称的job 最后调用hadoop job -kill <job_id> 来杀死任务 from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) # self.current_tag = None self.flag = False self.name_flag = False def handle_starttag(self, tag, attrs): if tag == &#039;td&#039;: for name,value in attrs: if name == &#039;id&#039; and value.startswith(&quot;job_&quot;): self.flag = True self.name_flag = False break elif name == &#039;id&#039; and value.startswith(&quot;name_&quot;): self.flag = True self.name_flag = True break def handle_endtag(self, tag): self.flag = False def handle_data(self, data): if self.flag: print data, if self.name_flag: print &#039; &#039; if __name__ == &#039;__main__&#039;: fp = open(&quot;./jobtracker.jsp&quot;) data = fp.read() my = MyHTMLParser() my.feed(data) 主程序 kill_job.sh ...

January 2, 2018 · 1 min

vim 命令总结(持续更新)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 工作三年,一直处在半命令行,半IDE的状态,慢慢的总结一部分,便于以后使用。 ###【基本】 1. tab 在新标签中打开文件 :tabedit filename vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. :tabnew 打开新的tab(Ctrl+N新建标签页,Ctrl+T在新标签页中打开选定的文件) :tabclose 关闭当前的tab(Ctrl+W) :tabonly 关闭所有其他的tab(Ctrl+Shift+W ) vim不区分ctrl+shift+字母和ctrl+字母 :tabprev 前一个(Ctrl+Shift+Tab) :tabnext 后一个(Ctrl+Tab) 标准模式下: gt 、gT 可以直接在tab之间切换。 2. 删除某个词 dw 3. 光标移动 10j 向下移动10行 10k 向上移动10行 w 跳到下一个词的第一个字符 b 跳到上一个词的第一个字符 4. 分屏 4.1 创建分屏 :vs 文件路径/文件名 在新的垂直分屏中打开文件 :sv 文件路径/文件名 在新的水平分屏中打开文件 :new,新建文件并分屏, 快捷键,Ctrl+W,然后马上按n键 :spilt 水平分屏,将当前屏分为两个,水平的。 Ctrl + w, s :vsplit 垂直分屏,将当前屏分为两个,垂直的。 Ctrl + w, v :only 取消分屏,取消当前的屏,当前屏指的是光标所在屏 4.2 移动光标 Ctrl + w, w 后一个 Ctrl + w, p 前一个 Ctrl + w, h 四个方向 Ctrl + w, i Ctrl + w, k Ctrl + w, l 4.3 关闭分屏 Ctrl+w,c 关闭当前屏 Ctrl + w, o 关闭其他窗口 5. 编辑多行 Shift + v 选中多行 6. 缩进 &gt;&gt; 增加缩进 5&gt;&gt; 增加缩进(包括当前行共5行) &lt;&lt; 减少缩进 5&lt;&lt; 减少缩进(包括当前行共5行) 也可以使用Shift +v 先选中多行再使用此命令

January 2, 2018 · 1 min

gitlab安装

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 安装gitlab社区版 参考资料: 非常重要 https://about.gitlab.com/downloads/#ubuntu1404 我是直接在ubuntu14.04上安装的 PS:官方文档是最有价值的,我来当下搬运工 1. 安装必要的包 sudo apt-get install curl openssh-server ca-certificates postfix 其中 postfix 是邮件发送程序 ca-certificates使用来对公钥进行验证的 2. 安装gitlab社区版 curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt-get install gitlab-ce 3. 安装启动gitlab sudo gitlab-ctl reconfigure 4. 访问gitlab主页 经过观察我发现gitlab默认会在机器上安装 1)Ruby 2)Redis 安装路径 /var/opt/gitlab/redis 默认监听在unix域套接字上(还好没暴露在公网上) /var/opt/gitlab/redis/redis.socket 3)PostgreSQL 4)Nginx 安装路径 /opt/gitlab/embedded/sbin/nginx 配置文件路径 /var/opt/gitlab/nginx/conf nginx作为反向代理,后面挂有用unicorn启动的ruby进程,提供web服务 默认nginx需要占用80端口,所以这有可能会与你原先配置的web服务造成冲突 upstream gitlab-workhorse { server unix:/var/opt/gitlab/gitlab-workhorse/socket; } server { listen *:8000; # 默认为listen *:80 server_name code.xxx.club; # ***必须修改*** 默认为主机名 } 这里必须修改server_name,代码库中的git project地址都依赖此值 ...

January 1, 2018 · 1 min

docker 常用命令(持续更新)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 删除image docker rmi myapp/base 2. 给image 打tag docker tag 4424b58cae58 myapp/base 3. 容器的存储层保存下来成为镜像 docker commit [选项] &lt;容器ID或容器名&gt; [&lt;仓库名&gt;[:&lt;标签&gt;]] docker commit webserver nginx:v2

January 1, 2018 · 1 min

Percona监控工具初探

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 一直找不到合适的MySQL监控工具,正好听同事无意中说起,Percona在2016年4月发布了一个监控套件,可以同时对多个MySQL、MongoDB实例进行监控 参考资料: https://www.percona.com/blog/2016/04/18/percona-monitoring-and-management/ https://www.percona.com/doc/percona-monitoring-and-management/index.html https://www.percona.com/doc/percona-monitoring-and-management/install.html 安装过程描述的非常详尽,参考此文档足以 环境 操作系统版本CentOS 6.7 MySQL版本为 MySQL 5.7 1. 安装 1.1 PMM Server 负责将收集到的数据存储、聚合和展现 假定安装在192.168.100.1上 1) docker percona/pmm-server:1.0.6 2) docker create \ -v /opt/prometheus/data \ -v /opt/consul-data \ -v /var/lib/mysql \ -v /var/lib/grafana \ --name pmm-data \ percona/pmm-server:1.0.6 /bin/true 3) $ docker run -d \ -p 80:80 \ --volumes-from pmm-data \ --name pmm-server \ --restart always \ percona/pmm-server:1.0.6 到此,docker已经启动,可以访问 ...

January 1, 2018 · 3 min

rtorrent初探--利用好你的云主机

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 有了云主机以后,我常常想能够用它来做什么,当然可以用来挂网站,然后还能做什么,我想到可以把一些下载任务(BT)直接放到云主机来做,经过调研我选择了rtorrent。 1. 简介 rTorrent为一款纯文本环境BT客户端,具有占用内存小、频宽利用率高、支持 utf-8 编码等功能,除了在终端机界面操作,也可以在第三方支持下透过浏览器界面操作本软件。开发者杰瑞·森德尔(Jari Sundell)的目标是“一个侧重于高性能的良好代码。”属于自由软件。 2. 安装 centos yum install rtorrent ubuntu apt-get install rtorrent 安装完成以后,需要手动创建一个配置文件,配置文件需放在 ~/.rtorrent.rc 样例 以下列出比较重要的一些 # Directory to manage temporary downloads to # 下载好的文件的保存路径 directory = ~/Downloads/torrents/rtorrent_temp/ # 其它可调参, 单位是KB upload_rate = 30 download_rate = 200 peer_exchange = yes # 监听目录,只要有后缀为.torrent的文件就自动开始下载 schedule = watch_directory,0,10,load_start=~/Downloads/torrents/rtorrent_watch/*.torrent 启动(可以任何目录下直接启动) rtorrent 重要的命令: ↑↓ 用于选择任务 ctrl + s 开始下载任务 ctrl + d 停止下载任务,再按一次,删除停止的下载任务 ctrl + q 退出rtorrent **重要: ** 最后 rtorrent 只能在当前窗口运行,关闭窗口会导致程序退出 要想让它一直运行,需要和screen 或者tmux 结合使用 ...

January 1, 2018 · 1 min

kafka查看队列的消费情况

kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --broker-info --group $group --topic $topic --zookeeper $zk_host:2181 0.9.0以后官方建议使用 kafka-consumer-groups.sh --new-consumer --bootstrap-server $broker:9092 --describe --group $topic

January 1, 2018 · 1 min

rinetd 在生产环境要谨慎使用

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 购买了阿里云的redis节点,但是默认阿里云不提供公网IP,所以我在一台阿里云的机器启动了rinetd,做端口的转发服务,开始一切正常,一段时间以后,随着并发力度加大。我们发现redis连不上了,提示Connection reset by peer 排查 1. 排查Redis 为什么会这样,首先我怀疑,是否redis有问题 首先我查看了redis的负载情况,使用INFO 命令 # Clients connected_clients:192 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:16 # Stats total_connections_received:1131 total_commands_processed:7225865 instantaneous_ops_per_sec:30 total_net_input_bytes:216949807 total_net_output_bytes:87315792 显然redis的负载并不高 instantaneous_ops_per_sec 要超过2w, 负载才算高 connected_clients还不到200, 默认的设置允许最大连接数是1w 2. 排查阿里云主机 首先这台的机器的连接数并不高 [root@xxx-xx-77 ~]# ss -s Total: 733 (kernel 751) TCP: 644 (estab 598, closed 1, orphaned 0, synrecv 0, timewait 1/0), ports 234 Transport Total IP IPv6 * 751 - - RAW 0 0 0 UDP 1 1 0 TCP 643 636 7 INET 644 637 7 FRAG 0 0 0 但是观察机器的CPU使用率 ...

January 1, 2018 · 3 min

优雅的终止docker容器

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 本文受到参考资料1的启发 我们线上的服务有不少都是部署在docker中,部署涉及的机器多大几十台, 服务发布时,要求前一个版本的容器必须优雅的退出。 docker容器中的进程是一个任务消费者。不断得从任务队列中取任务,然后进行执行(执行时间较长) 假定docker容器的name为test_v1 docker容器中的进程名为atm 也就是说不能简单的 docker rm -vf test_v1 docker run -d --name test_v1 test:v1 解决方案 1)方案1 首先,我想到的办法是在docker容器外部使用 ps -ef| grep atm |grep -v grep |awk &#039;{print $2}&#039;|xargs kill -15 容器中的进程捕获 SIGTERM 信号,优雅的退出,发现所有容器中的进程都退出后再执行发布逻辑 缺点: 这个方案肯定是没有问题的,但是如果进程同名,很有可能会导致误杀,而且从docker容器外部,传信号给容器内部的进程,感觉有点奇怪 2)方案2 幸运的看到了参考资料1 root@xxxx:~/test/docker/test_dk$ docker stop --help Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] Stop a running container by sending SIGTERM and then SIGKILL after a grace period --help=false Print usage -t, --time=10 Seconds to wait for stop before killing it 在docker stop命令执行的时候,会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认的10秒,会继续发送SIGKILL的系统信号强行kill掉进程。在容器中的应用程序,可以选择忽略和不处理SIGTERM信号,不过一旦达到超时时间,程序就会被系统强行kill掉,因为SIGKILL信号是直接发往系统内核的,应用程序没有机会去处理它。在使用docker stop命令的时候,我们唯一能控制的是超时时间,比如设置为20秒超时: ...

January 1, 2018 · 1 min