lianbingjie 8 月之前
当前提交
b6272692eb

+ 70 - 0
🔧运维团队/服务器成本优化.md

@@ -0,0 +1,70 @@
+# 服务器成本优化方案
+
+
+## 一、现有成本分析
+> 参看 提交的服务器年度费用表 excel文档
+
+**高费用项分析:**
+> 倒序排列,前5
+
+|序号|事项|年费用(万)|应用场景(业务)|产品|客户群体|其他说明|
+|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
+|1|ES集群1|:--:|:--:|:--:|:--:|核心主集群|
+|2|ES集群2|:--:|:--:|:--:|:--:|企业服务主集群|
+
+TODO 其他待补充
+
+## 二、应用/服务整合优化
+### 2.1 服务器搓堆
+结合现有部署情况,列哪些服务/应用,可以搓堆部署。
+可以节省X台服务器,预计可以节省费用 XX万元/年
+
+**存在风险:**
+对将来访问高峰预估不准,会导致整个平台性能急剧下滑,甚至部分业务受影响。
+
+
+
+### 2.2 附件解析(竞价服务器)优化
+附件解析,目前占用机器多(持续保持10台竞价,工作时段高峰500台左右);在控制数据教工周期(时间)后,对附件解析服务性能要求更高。
+
+- 附件解析后的价值,有待评估
+- 附件解析,优化现有信息加工流程,可以避免近20%-30%的附件处理。(附件已经按照MD5去重。不同网站的重复标讯,附带的附件也可以不解析处理。需要附件解析环节后置,但对无正文类信息单独处理)
+
+优化后预计平时保持7台,高峰在300台左右; 预计可以节约成本 XX万/年
+
+### 2.3 中间件优化
+- TiFlash 砍掉
+> 依赖我们产品改造
+> 
+- ClickHouse 阿里云数仓BI环境优化
+> 数据分析团队在使用,目前项目因人手问题,搁置;
+> 
+> 建议,合并到华为云
+
+### 2.4 ES集群优化
+目前的业务特性,多产品、多场景、包括我们的现金牛服务,都重度依赖全文检索服务;
+
+2套ES集群没有资源闲置情况,而且企业服务的ES集群近期持续告警资源不足。
+
+ES集群在不改变我们业务/产品 数据筛选模式的前提下,暂时不建议缩减服务器。
+
+## 三、云服务商侧优化
+### 3.1 服务商折扣
+**目前折扣**
+
+阿里云九州服务商折扣情况:
+xxxxx
+
+华为云折扣情况
+
+**新谈的折扣情况**
+阿里云新建账号折扣情况:
+XXXX
+前提条件:新建账号,存在公司支付方式问题
+
+华为云新的折扣及优惠情况:
+
+
+
+
+

二进制
🔧运维团队/服务器故障复盘/image-1.png


二进制
🔧运维团队/服务器故障复盘/image.png


+ 104 - 0
🔧运维团队/服务器故障复盘/服务器故障复盘.md

@@ -0,0 +1,104 @@
+# 2024年11月初服务故障复盘
+
+2024年10月31日起至11月4日,平台服务持续遭受恶意访问攻击,导致平台运行不稳定,多次出现504页面。经过多日追踪分析,该故障与大量非法爬虫在剑鱼网站爬取数据、SEO优化搜索引擎调度策略有关。
+
+目前在平台入口配置非法访问过滤、高并发桶策略限流、调整搜索引擎采集等级,故障得到解决。
+
+## 一、事件回顾
+
+### 1. 过程
+1) 10月31日早上8点50告警,整个应用访问异常。经处理,9点30恢复
+> 监控数据+现象分析(CPU耗尽,etcd崩溃),初步怀疑是服务器整合,导致资源紧张造成
+
+2) 11月3日凌晨1点告警,经处理,2点恢复
+> 连续观测多日日志结合现象,发现总是凌晨出故障,怀疑遭受恶意访问/攻击
+
+### 2. 原因分析
+1) 大量ip访问标签页、ip访问详情页,redis缓存穿透,占用大量tcp连接和cpu,所有中台使用的etcd在同一台服务器,造成服务中断
+
+2) 访问量较平时【2000次seo相关页面/分钟】约增加10~20倍:
+
+![访问量](image.png)
+
+3) ip量较平时【1000个全站独立ip/分钟】约增加5~6倍:
+
+![IP量](image-1.png)
+
+### 3.结论
+
+平台遭受瞬时高并发请求访问,资源耗尽,导致平台拒绝服务。
+
+## 二、响应(处理)过程
+
+> 故障发生后,我们采集的应急措施
+
+### 1. IP封禁
+
+脚本,动态判断恶意爬虫,封禁爬虫ip,截止目前封禁ip量3万条
+### 2. seo请求限流
+- Nginx桶限流策略分拆2套,增加夜晚和白天区分限流。
+- 在nginx前置代理上进一步限制同一时间段单ip访问量及seo页面总的并发量,无差别限速后,bing和360蜘蛛采集受到影响,后调整为放宽带蜘蛛头的ip,当触发限流后跳转到首页。
+### 3. 搜索引擎蜘蛛采集
+协调运营降低必应的采集频率,把采集速度放缓时间拉长。避免瞬时高并发请求。
+
+### 4. 服务器优化
+把高耗资源的seo程序与etcd服务器进行单独和使用docker进行部署,降低资源依赖
+
+### 5. 应用优化
+- 限制程序使用的cpu资源和并发数
+- 开启debug性能监控(发现于Reids服务性能有关)
+- 使用nslookup和前置浏览器检测放行真蜘蛛,增加采集难度(正在验证)
+
+## 三、总结
+### 3.1 事件特点分析
+1. 分散化:使用大量分散IP进行访问
+2. 规律性:访问行为呈现明显的机器特征
+3. 针对性:集中攻击SEO相关页面和详情页(高耗资源页面,后续画像类服务同样存在风险)
+4. 持续性:在短期内发起多次恶意访问
+
+### 3.2 造成的影响
+1. 系统资源消耗:Redis缓存穿透,TCP连接耗尽
+2. 服务中断:核心服务etcd受影响导致整体服务不可用
+3. SEO效果影响:正常搜索引擎爬虫采集受限
+4. 用户体验:部分正常用户访问受到影响
+
+### 3.3 经验教训
+**架构问题**
+1. 核心中间件(etcd 服务注册发现)与业务中台混合部署带来不稳定性风险。(整合服务器,需要慎重)
+2. 缺乏完善的服务隔离机制(要求有风险服务,必须在docker内部署)
+3. 缓存策略设计需要优化
+4. 限流策略粒度过粗,限流指标需要依据实际平台性能得来。
+
+### 3.4 改进方案
+**1) 运维**
+
+1. 建立IP访问模型(普通用户、搜索类用户等),IP信誉,IP黑名单,ip特征地理位置等
+2. 设置多维度告警阈值,实现安全态势感知,针对流量攻击、访问攻击预警
+3. 完善资源使用率监控,并有效使用监控
+4. 完善应用日志、nginx日志,错误、响应时间、状态码、请求字节等方面的监控
+实现多级限流、自适应防护策略,服务降级,熔断及故障自愈逐步完善
+
+**2) 访问行为检测**
+
+投入精力对完善反爬系统;包括爬虫、恶意访问的识别和处置
+
+**3)架构优化**
+
+1. etcd服务改进,对高耗资源的页面、实行多级缓存
+
+2. 识别并完善真蜘蛛爬虫库
+
+3. 增加对匿名访问的浏览器检测
+
+4. 增加反爬能力,对正文的加密、字体混淆
+
+5. 根据负载情况增加匿名用户的验证码弹出策略,不限于三级页、列表、tags、list等页面。平台资源紧张时,可以通过弹验证码人机识别,限制人+机对高耗资源页面的访问频次。
+
+
+## 四、后续工作安排计划
+|序号|任务|责任人|截止日期|
+|:--:|:--|:--:|:--:|
+|1|剥离seo相关页面请求<br/>URL地址分开<br>走不同限流策略|任政|11月底|
+|2|反爬平台升级<br/>包括:字体混淆、浏览器识别、<br/>验证频率等|王凯越|-|
+|3|详情页打码优化<br>需要于产品部协商|任政|-|
+|4|服务器优化<br>ETCD单独部署|连冰杰|11月底|

二进制
🔧运维团队/监控管理/剑鱼用户请求过程.png


二进制
🔧运维团队/监控管理/用户请求过程.png


+ 234 - 0
🔧运维团队/监控管理/监控管理.drawio

@@ -0,0 +1,234 @@
+<mxfile host="65bd71144e">
+    <diagram id="yrvvuqrXyjU8VaIZNAdO" name="剑鱼用户请求过程">
+        <mxGraphModel dx="746" dy="1588" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+            <root>
+                <mxCell id="0"/>
+                <mxCell id="1" parent="0"/>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-20" value="剑鱼服务区" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=14;fontStyle=1" vertex="1" parent="1">
+                    <mxGeometry x="527" y="60" width="623" height="300" as="geometry"/>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-1" style="edgeStyle=none;html=1;exitX=0.87;exitY=0.65;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="3EzkkTgupiQvGg1rKkdm-2" target="3EzkkTgupiQvGg1rKkdm-10">
+                    <mxGeometry relative="1" as="geometry"/>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-2" value="用户" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.user;" vertex="1" parent="1">
+                    <mxGeometry x="90" y="160" width="47.5" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-3" style="html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="3EzkkTgupiQvGg1rKkdm-10" target="3EzkkTgupiQvGg1rKkdm-11">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="460" y="100"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-4" value="DNS解析" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="3EzkkTgupiQvGg1rKkdm-3">
+                    <mxGeometry x="-0.2132" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-5" style="html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="3EzkkTgupiQvGg1rKkdm-10" target="3EzkkTgupiQvGg1rKkdm-11">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="480" y="140"/>
+                        </Array>
+                        <mxPoint x="510" y="90" as="targetPoint"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-6" style="html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;exitPerimeter=0;startArrow=none;startFill=0;endArrow=classic;endFill=1;elbow=vertical;" edge="1" parent="1" source="3EzkkTgupiQvGg1rKkdm-10" target="3EzkkTgupiQvGg1rKkdm-13">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="540" y="185"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-7" value="请求" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="3EzkkTgupiQvGg1rKkdm-6">
+                    <mxGeometry x="-0.0956" y="4" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-8" style="html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;exitPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;elbow=vertical;" edge="1" parent="1" source="3EzkkTgupiQvGg1rKkdm-10" target="3EzkkTgupiQvGg1rKkdm-13">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="490" y="240"/>
+                            <mxPoint x="560" y="220"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-9" value="回应" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="3EzkkTgupiQvGg1rKkdm-8">
+                    <mxGeometry x="-0.0913" y="6" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <object placeholders="1" c4Type="Container name" c4Container="Container" c4Technology="e.g. JavaScript, Angular etc." c4Description="Description of web browser container role/responsibility." label="&lt;font style=&quot;font-size: 16px&quot;&gt;&lt;b&gt;%c4Type%&lt;/b&gt;&lt;/font&gt;&lt;div&gt;[%c4Container%:&amp;nbsp;%c4Technology%]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;&lt;font color=&quot;#E6E6E6&quot;&gt;%c4Description%&lt;/font&gt;&lt;/div&gt;" id="3EzkkTgupiQvGg1rKkdm-10">
+                    <mxCell style="shape=mxgraph.c4.webBrowserContainer2;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;strokeColor=#118ACD;fillColor=#23A2D9;strokeColor=#118ACD;strokeColor2=#0E7DAD;fontSize=12;fontColor=#ffffff;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
+                        <mxGeometry x="180" y="105" width="240" height="160" as="geometry"/>
+                    </mxCell>
+                </object>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-11" value="DNS服务器" style="verticalLabelPosition=bottom;sketch=0;aspect=fixed;html=1;verticalAlign=top;strokeColor=none;align=center;outlineConnect=0;shape=mxgraph.citrix.dns_server;" vertex="1" parent="1">
+                    <mxGeometry x="470" y="-60" width="76.5" height="92.5" as="geometry"/>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-12" value="WEB服务器" style="verticalLabelPosition=bottom;sketch=0;aspect=fixed;html=1;verticalAlign=top;strokeColor=none;align=center;outlineConnect=0;shape=mxgraph.citrix.web_server;" vertex="1" parent="1">
+                    <mxGeometry x="730" y="140" width="76.5" height="90" as="geometry"/>
+                </mxCell>
+                <mxCell id="3EzkkTgupiQvGg1rKkdm-13" value="Nginx 反向代理" style="verticalLabelPosition=bottom;sketch=0;aspect=fixed;html=1;verticalAlign=top;strokeColor=none;align=center;outlineConnect=0;shape=mxgraph.citrix.proxy_server;" vertex="1" parent="1">
+                    <mxGeometry x="570" y="175" width="76.5" height="90" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-1" value="" style="endArrow=classic;html=1;sketch=0;elbow=vertical;" edge="1" parent="1" target="3EzkkTgupiQvGg1rKkdm-12">
+                    <mxGeometry width="50" height="50" relative="1" as="geometry">
+                        <mxPoint x="630" y="220" as="sourcePoint"/>
+                        <mxPoint x="680" y="170" as="targetPoint"/>
+                        <Array as="points">
+                            <mxPoint x="670" y="180"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-2" value="代理请求" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+                    <mxGeometry x="640" y="160" width="60" height="30" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-4" value="回应代理" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+                    <mxGeometry x="660" y="218" width="60" height="30" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-6" value="" style="endArrow=classic;html=1;sketch=0;elbow=vertical;" edge="1" parent="1" target="3EzkkTgupiQvGg1rKkdm-13">
+                    <mxGeometry width="50" height="50" relative="1" as="geometry">
+                        <mxPoint x="730" y="180" as="sourcePoint"/>
+                        <mxPoint x="780" y="130" as="targetPoint"/>
+                        <Array as="points">
+                            <mxPoint x="680" y="250"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-8" value="订单中心" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/mscae/API_Management.svg;" vertex="1" parent="1">
+                    <mxGeometry x="860" y="118" width="50" height="42" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-9" value="用户中心" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/mscae/API_Management.svg;" vertex="1" parent="1">
+                    <mxGeometry x="860" y="188" width="50" height="42" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-10" value="其他中心" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/mscae/API_Management.svg;" vertex="1" parent="1">
+                    <mxGeometry x="860" y="260" width="50" height="42" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-11" value="" style="endArrow=classic;html=1;sketch=0;elbow=vertical;" edge="1" parent="1" target="LJYGr0Lr-wOhKNfNGLZf-8">
+                    <mxGeometry width="50" height="50" relative="1" as="geometry">
+                        <mxPoint x="790" y="180" as="sourcePoint"/>
+                        <mxPoint x="840" y="130" as="targetPoint"/>
+                        <Array as="points">
+                            <mxPoint x="820" y="150"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-12" value="" style="endArrow=classic;html=1;sketch=0;elbow=vertical;" edge="1" parent="1" target="LJYGr0Lr-wOhKNfNGLZf-9">
+                    <mxGeometry width="50" height="50" relative="1" as="geometry">
+                        <mxPoint x="790" y="180" as="sourcePoint"/>
+                        <mxPoint x="840" y="130" as="targetPoint"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-13" value="" style="endArrow=classic;html=1;sketch=0;elbow=vertical;" edge="1" parent="1" target="LJYGr0Lr-wOhKNfNGLZf-10">
+                    <mxGeometry width="50" height="50" relative="1" as="geometry">
+                        <mxPoint x="790" y="180" as="sourcePoint"/>
+                        <mxPoint x="840" y="130" as="targetPoint"/>
+                        <Array as="points">
+                            <mxPoint x="820" y="240"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-14" value="TiDB" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="980" y="120.5" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-15" value="Redis" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="980" y="197.5" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-16" value="MongoDB" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="980" y="272.5" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-17" value="ClickHouse" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="1060" y="113" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-18" value="OSS" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="1070" y="197.5" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-19" value="Other" style="aspect=fixed;perimeter=ellipsePerimeter;html=1;align=center;shadow=0;dashed=0;spacingTop=3;image;image=img/lib/active_directory/database_server.svg;" vertex="1" parent="1">
+                    <mxGeometry x="1070" y="272.5" width="41" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-21" value="代理服务集群" style="text;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;" vertex="1" parent="1">
+                    <mxGeometry x="536.5" y="87.5" width="113.5" height="22" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-22" value="应用服务集群" style="text;html=1;strokeColor=#6c8ebf;fillColor=#dae8fc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;" vertex="1" parent="1">
+                    <mxGeometry x="700" y="87.5" width="117" height="22" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-23" value="中台服务" style="text;html=1;strokeColor=#6c8ebf;fillColor=#dae8fc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;" vertex="1" parent="1">
+                    <mxGeometry x="840" y="87.5" width="90" height="22" as="geometry"/>
+                </mxCell>
+                <mxCell id="LJYGr0Lr-wOhKNfNGLZf-24" value="数据存储" style="text;html=1;strokeColor=#b85450;fillColor=#f8cecc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;" vertex="1" parent="1">
+                    <mxGeometry x="950" y="87.5" width="170" height="22" as="geometry"/>
+                </mxCell>
+            </root>
+        </mxGraphModel>
+    </diagram>
+    <diagram id="aE6NxmvyANrgpVP5XkID" name="web请求流程">
+        <mxGraphModel dx="746" dy="419" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+            <root>
+                <mxCell id="0"/>
+                <mxCell id="1" parent="0"/>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-17" style="edgeStyle=none;html=1;exitX=0.87;exitY=0.65;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="aDEZ4C59y7elcwYQe-yg-18" target="aDEZ4C59y7elcwYQe-yg-26">
+                    <mxGeometry relative="1" as="geometry"/>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-18" value="用户" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=none;fillColor=#00BEF2;shape=mxgraph.azure.user;" vertex="1" parent="1">
+                    <mxGeometry x="90" y="160" width="47.5" height="50" as="geometry"/>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-19" style="html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="aDEZ4C59y7elcwYQe-yg-26" target="aDEZ4C59y7elcwYQe-yg-27">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="460" y="100"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-20" value="DNS解析" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="aDEZ4C59y7elcwYQe-yg-19">
+                    <mxGeometry x="-0.2132" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-21" style="html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="aDEZ4C59y7elcwYQe-yg-26">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="480" y="140"/>
+                        </Array>
+                        <mxPoint x="510" y="90" as="targetPoint"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-22" style="html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;exitPerimeter=0;startArrow=none;startFill=0;endArrow=classic;endFill=1;elbow=vertical;" edge="1" parent="1" source="aDEZ4C59y7elcwYQe-yg-26" target="aDEZ4C59y7elcwYQe-yg-28">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="540" y="185"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-23" value="请求" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="aDEZ4C59y7elcwYQe-yg-22">
+                    <mxGeometry x="-0.0956" y="4" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-24" style="html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;exitPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;elbow=vertical;" edge="1" parent="1" source="aDEZ4C59y7elcwYQe-yg-26" target="aDEZ4C59y7elcwYQe-yg-28">
+                    <mxGeometry relative="1" as="geometry">
+                        <Array as="points">
+                            <mxPoint x="560" y="220"/>
+                        </Array>
+                    </mxGeometry>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-25" value="回应" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="aDEZ4C59y7elcwYQe-yg-24">
+                    <mxGeometry x="-0.0913" y="6" relative="1" as="geometry">
+                        <mxPoint as="offset"/>
+                    </mxGeometry>
+                </mxCell>
+                <object placeholders="1" c4Type="Container name" c4Container="Container" c4Technology="e.g. JavaScript, Angular etc." c4Description="Description of web browser container role/responsibility." label="&lt;font style=&quot;font-size: 16px&quot;&gt;&lt;b&gt;%c4Type%&lt;/b&gt;&lt;/font&gt;&lt;div&gt;[%c4Container%:&amp;nbsp;%c4Technology%]&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;font style=&quot;font-size: 11px&quot;&gt;&lt;font color=&quot;#E6E6E6&quot;&gt;%c4Description%&lt;/font&gt;&lt;/div&gt;" id="aDEZ4C59y7elcwYQe-yg-26">
+                    <mxCell style="shape=mxgraph.c4.webBrowserContainer2;whiteSpace=wrap;html=1;boundedLbl=1;rounded=0;labelBackgroundColor=none;strokeColor=#118ACD;fillColor=#23A2D9;strokeColor=#118ACD;strokeColor2=#0E7DAD;fontSize=12;fontColor=#ffffff;align=center;metaEdit=1;points=[[0.5,0,0],[1,0.25,0],[1,0.5,0],[1,0.75,0],[0.5,1,0],[0,0.75,0],[0,0.5,0],[0,0.25,0]];resizable=0;" vertex="1" parent="1">
+                        <mxGeometry x="180" y="105" width="240" height="160" as="geometry"/>
+                    </mxCell>
+                </object>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-27" value="DNS服务器" style="verticalLabelPosition=bottom;sketch=0;aspect=fixed;html=1;verticalAlign=top;strokeColor=none;align=center;outlineConnect=0;shape=mxgraph.citrix.dns_server;" vertex="1" parent="1">
+                    <mxGeometry x="510" y="30" width="76.5" height="92.5" as="geometry"/>
+                </mxCell>
+                <mxCell id="aDEZ4C59y7elcwYQe-yg-28" value="WEB服务器" style="verticalLabelPosition=bottom;sketch=0;aspect=fixed;html=1;verticalAlign=top;strokeColor=none;align=center;outlineConnect=0;shape=mxgraph.citrix.web_server;" vertex="1" parent="1">
+                    <mxGeometry x="670" y="130" width="76.5" height="90" as="geometry"/>
+                </mxCell>
+            </root>
+        </mxGraphModel>
+    </diagram>
+</mxfile>

+ 92 - 0
🔧运维团队/监控管理/监控管理.md

@@ -0,0 +1,92 @@
+# 剑鱼服务器&应用监控管理
+## 一、监控产品信息收集
+### 1.1 用户请求过程
+#### 1.1.1 用户请求web服务流程
+![./用户请求过程.png](./用户请求过程.png)
+
+#### 1.1.2 剑鱼用户请求web服务器流程
+![./剑鱼用户请求过程.png](./剑鱼用户请求过程.png)
+
+
+### 1.2 用户体验监控平台
+按照数据采集途径大致分为2类:
+- 从底层网络嗅探、拦截,监控收集数据 (如RUEI、PackageBeat)
+- 从应用层收集数据,进行监控,如各种埋点、日志分析
+
+2种方案各有利弊,网络层收集产品通用性要好,定制化工作要多一些;应用层收集,日志解析难度小,对于产品/应用类型不多,更适合一些。
+
+**以下是几款知名监控产品:**
+
+1. RUEI Real User Experience Insight
+
+> 主要是架构在网络交换机层面,通过抓Client ip,Server IP,URL,Cookie/Session ID ,以及响应时间,数据大小,用户访问的错误,以及网络失败,或者网络超时等等这些数据,然后进行分析
+> 
+> Oracle 10年前的产品,付费
+> 
+> 基于网络,对应用侵入少,
+
+2. InfluxDB + Telegraf + Grafana 
+> 剑鱼一直在使用的监控告警平台,开源,免费
+> 需要埋点、手写一些监控指标收集(官方提供了一些服务器、中间件的agent可以使用)
+> 偏后端服务器、中间件监控
+
+3. Nginx请求响应监控
+> 剑鱼一直在使用的用户体验监控方案,剑鱼的部署模式采用所有请求都走nginx反向代理,通过分析Nginx访问、出错日志,可以拿到RUEI监控需要的指标数据:Client ip,Server IP,URL,Cookie/Session ID ,以及响应时间,数据大小,用户访问的错误,以及网络失败,或者网络超时等
+> 
+> 配合日志分析+企业微信告警提示,已经在生产环境中投入使用
+
+4. Sentry 错误跟踪平台
+> Sentry 是一个开源的错误跟踪系统,剑鱼一直在使用该产品监控用户侧前端错误。
+> 
+> 主要用来收集**用户侧前台多端**(PC、微信、APP)前端错误,进行错误分析、告警监控
+> 
+> 剑鱼依赖很多第三方设施/服务,如CDN、用户侧缓存错误等等。
+
+5. ELK 
+> 是一个流行的开源日志分析平台,由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成。这个组合经常用于监控、搜索、分析和可视化大量日志数据。
+> 
+> **拓普采用的该方案,进行扩展构建了《运维监控平台》,是一套通用型方案,可以灵活加入多个待监控项目。是挺大一个项目,功能很全面,有中间件、应用监控等。**
+> 
+> 借助一个Go开源项目PackageBeat作网络抓包(TCP/UDP/ICMP/HTTP/MySQL等底层网络协议),思路与RUEI类似,实现对应用无入侵,但需要配置数据包解析协议,以及数据包解析后与自身应用的对应关系。如:GET /user/login 的请求,对应哪个服务,在哪台机器上。
+
+拓普环境:
+```plantext
+地址:http://192.168.3.192:9528/ops/#/login
+用户名:admin
+密码:dsj@12345
+```
+## 二、剑鱼服务器&应用监控
+剑鱼对用户请求链路进行分析、切割,制定了不同的监控管理办法。(情况比较特殊)
+
+从前往后依次梳理监控方案;
+
+### 1. 纯用户侧前端监控
+Sentry ,应对CDN、用户网络、页面出错(JS出错)等;
+
+当收集到的日志,出现大面积异常,开始告警
+
+### 2. 服务端流量入口监控
+Nginx 监控管理,所有请求都走Nginx反向代理,(CDN除外)
+在Nginx上,可以监控用户IP、服务端IP、请求地址、用户请求头、Cookie、响应时长、传输流量、响应结果状态等等(RUEI从网络上拿到的监控指标数据),结合日志分析+告警机制,目前与企业微信群联动(联动这块是11月初刚上)。
+
+> 剑鱼主要监控TCP/ HTTP协议,网络监控的其他协议UDP/ICMP对剑鱼目前看意义不大
+
+### 3. 服务器&中间件&应用监控
+InfluxDB(时序库)+Telegra(代理,数据收集)+Grafana(看板、监控告警)
+目前剑鱼大部分服务器、中间件、应用,都加入该监控平台,运维组的主要工作。
+
+CPU、内存、磁盘、网络、应用(不可用) 会在该平台告警
+
+
+## 三、剑鱼对突发事件(高并发请求)应急响应SOP
+1. 从请求总入口阻断、限流请求,服务降级,保障大部分人正常服务(降低损失)
+> nginx切换配置,使用不同桶策略限流
+
+2. 应急扩容,并适当放开桶策略
+> 拿钱,去硬抗一部分冲击 (要评估是否要花这一部分钱)
+
+3. 分析日志、查找原因
+4. 更新&部署
+5. 放开总入口限制,切换Nginx配置策略 
+
+