<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>王盛</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://akemi.zj.cn/icon.png</icon>
  <id>https://akemi.zj.cn/</id>
  <link href="https://akemi.zj.cn/" rel="alternate"/>
  <link href="https://akemi.zj.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 王盛</rights>
  <subtitle>无论重复多少次</subtitle>
  <title>Akemi</title>
  <updated>2026-05-21T00:49:23.183Z</updated>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="纳甲六爻" scheme="https://akemi.zj.cn/tags/%E7%BA%B3%E7%94%B2%E5%85%AD%E7%88%BB/"/>
    <category term="易经" scheme="https://akemi.zj.cn/tags/%E6%98%93%E7%BB%8F/"/>
    <category term="六爻" scheme="https://akemi.zj.cn/tags/%E5%85%AD%E7%88%BB/"/>
    <content>
      <![CDATA[<p><strong>十二地支的冲合</strong></p><p>需要记忆</p><p>相隔六位，互为对角，方向相反所以”冲”。</p><p>子午冲，丑未冲，寅申冲，卯酉冲，辰戌冲，巳亥冲<br>子丑合土，寅亥合木，卯戌合火，辰酉合金，巳申合水，午未合火。</p><p>冲：主散开、变动、分离、快、猛<br>合：主吸引，聚集、绊住、慢、柔、渐进</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190640033.png"></p><p><strong>日月令的冲合</strong></p><ul><li>月冲&#x2F;月破：没有能量，但如果是受日辰生扶，或其他爻生扶那就还有能量</li><li>月合：如果是旺相，就是合旺；如果休囚也没有用</li><li>日冲&#x2F;冲起：</li><li>如果本身是旺相，就会引发暗动，即变成了动爻；</li><li>如果是旺相且旬空，就叫冲空填实；</li><li>如果休囚也没有用，有意向但能力不足；</li><li>日合：合绊&#x2F;合旺</li></ul><p>例子：</p><p>辰月丑日，看未土，得令并日辰生扶（旺相），同时丑未相冲，暗动<br>辰月丑日，看酉金，被日月相生（旺相），同时辰酉相合，合旺<br>寅月申日，看申金，月破但日辰生扶，说明这个月没能量了，但出了这个月还有用</p><p><strong>旬空&#x2F;空亡</strong></p><p>空亡不主吉凶，仅取向用</p><p>表示空心、心里没底、不在、不自信<br>例<br>测朋友在不在家，兄弟空亡代表不在家<br>子孙空亡，说明没有想法</p><p>木空则朽，火空则发，土空则崩，金空则鸣，水空则流</p><p><strong>旬空&#x2F;空亡特殊情况-不空</strong></p><p>“旺不为空，动不为空，空化空不为空，然则还是空”</p><p>“空而旺者，有名无实；空而动者，有始无终”</p><p>1.冲空填实<br>2.独动 不空<br>3.休囚独动，短期不空，长期看还是空</p><p><strong>取用神-用神两现（卦象里有两个用神）</strong></p><p>1.动爻<br>2.空亡、月破之爻<br>3.逢冲、逢合、暗动之爻<br>4.居世爻、应爻<br>5.爻位&#x2F;六神取像<br>6.兼看</p><p><strong>十二长生</strong></p><p>十二长生就是从出生到死亡的一整个过程</p><p>一般看长生(旺）、淋浴(桃花位）、帝旺(旺）、病(疾病)、死、墓(收&#x2F;埋)、绝(3个休囚)</p><p>3个以上相同的六亲，认为是能量分散，需要入墓</p><p>例：<br>男测感情，妻财与应爻相合、沐浴，断女出轨<br>绝地，但有动爻生&#x2F;日辰生扶，断绝处逢生<br>原神入墓，代表想法被埋了</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190708873.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/30/Fortune-2/</id>
    <link href="https://akemi.zj.cn/2026/04/30/Fortune-2/"/>
    <published>2026-04-30T11:13:00.000Z</published>
    <summary>
      <![CDATA[<p><strong>十二地支的冲合</strong></p>
<p>需要记忆</p>
<p>相隔六位，互为对角，方向相反所以”冲”。</p>
<p>子午冲，丑未冲，寅申冲，卯酉冲，辰戌冲，巳亥冲<br>子丑合土，寅亥合木，卯戌合火，辰酉合金，巳申合水，午未合火。</p>
<p>冲：主散开、变动、分离、快、猛<br>合：主吸引，聚集、绊住、慢、柔、渐进</p>
<p><img]]>
    </summary>
    <title>纳甲六爻-十二地支的冲合、十二长生</title>
    <updated>2026-05-21T00:49:23.183Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="纳甲六爻" scheme="https://akemi.zj.cn/tags/%E7%BA%B3%E7%94%B2%E5%85%AD%E7%88%BB/"/>
    <category term="易经" scheme="https://akemi.zj.cn/tags/%E6%98%93%E7%BB%8F/"/>
    <category term="六爻" scheme="https://akemi.zj.cn/tags/%E5%85%AD%E7%88%BB/"/>
    <content>
      <![CDATA[<h3 id="传统起卦的过程"><a href="#传统起卦的过程" class="headerlink" title="传统起卦的过程"></a>传统起卦的过程</h3><p><strong>六爻</strong><br>六爻顾名思义一共有六根爻，每次获取爻都是从低到高一共六条<br>每一根爻都是阴或阳的不同形态：<br>— — 阴<br> —— 阳</p><p>使用3枚硬币或五铢钱摇卦，根据正反面来确定一根爻</p><p>遵循简为阳，繁为阴的原则<br>即光滑、无文字为阳面、有文字花纹为阴面<br>根据阴阳的数量来判断一根爻的类型</p><p>那么每次扔硬币都有4种状态：<br>2阴1阳 → ——少阳<br>2阳1阴 → — —少阴<br>3阳 → —— x老阳<br>3阴 → — — o老阴<br>其中老阴和老阳都是动爻，即发生变化的爻，老阴会变成少阳，老阳会变成少阴</p><h3 id="后天八卦"><a href="#后天八卦" class="headerlink" title="后天八卦"></a><strong>后天八卦</strong></h3><p>需要记忆</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190354628.png"></p><p>那么一共扔了6次，就会出现上下两个卦，称为本卦<br>如果有动爻，或者日冲暗动，就会出现变卦<br>↑<br>这个过程在六爻排盘软件中可以自动进行，完成后就会给出一个像这样的卦象：</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260430162422809.png"></p><p><strong>后天八卦的方位</strong></p><p>一数坎来二数坤，三震四巽是中分，五数中宫六乾是，七兑八艮九离门。大概是下面这个方位</p><p>4 9 2<br>3 7<br>8 1 6</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260430163206566.png"></p><h3 id="十二地支"><a href="#十二地支" class="headerlink" title="十二地支"></a><strong>十二地支</strong></h3><p>需要记忆</p><p>寅卯辰 巳午未 申酉戌 亥子丑</p><p>十二地支也有自己的属性，春季寅辰属木，夏季巳午属火，秋季申酉属金，冬季亥子属水</p><p>这里的季节是按照24节气来的：<br>立春到惊蛰之间 → 寅月（木）<br>惊蛰到清明之间 → 卯月（木）<br>清明到立夏之间 → 辰月（带木气的土）</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190528730.png"></p><h3 id="五行生克"><a href="#五行生克" class="headerlink" title="五行生克"></a><strong>五行生克</strong></h3><p>需要记忆<br>木火土金水（相生顺序）<br>木土水火金（相克顺序）</p><h3 id="六亲生克"><a href="#六亲生克" class="headerlink" title="六亲生克"></a><strong>六亲生克</strong></h3><p>六亲与五行之间有着类似的生克关系：</p><p>父母生兄弟<br>兄弟生子孙<br>子孙生妻财<br>妻财生官鬼<br>官鬼生父母</p><p><strong>六亲的象法</strong><br>需要理解</p><p>父母： 父母、长辈、老师、领导；文书、合同、证书、房屋、衣服、车船、信件；操心劳累、保护庇佑、学业文化</p><p>兄弟： 兄弟姐妹、朋友、同学、同事、合伙人；竞争、争夺、破财损耗、口舌是非；义气帮助（与世爻同五行时）</p><p>子孙： 子女、晚辈、学生、徒弟、下属；医药、快乐、娱乐、出行；福神解忧、克官鬼（不利求官求名、利于治病）</p><p>妻财： 妻子、女友、情人、财务人员；钱财、工资、收入、资产、存款、食物、货物；财运进财、物质享受、克父母（不利文书学业）</p><p>官鬼： 丈夫、官员、领导、上司、警察、法官、小人；官职、工作、官司、疾病、灾祸、压力、忧愁；约束管制、克兄弟（代表灾祸疾病）</p><h3 id="旺相休囚死"><a href="#旺相休囚死" class="headerlink" title="旺相休囚死"></a><strong>旺相休囚死</strong></h3><p>需要记忆<br>旺相休囚死是从生克关系得来的一个关系，分为旺相、休囚、死三种状态，分别代表能量高、能量低但有气、没有能量三种能量状态</p><p>比如。火在巳午(火)月就是旺，在寅卯(木)月是相，在辰戌丑未(土)月是休，在申酉(金)月是囚，在亥子(水)月是死</p><p><strong>月建与日建（月令&#x2F;日令）能量</strong></p><p>不同的日建和月建对不同的爻能量不一样</p><p>例：</p><ul><li>午月午日，看午火，那就是临月建临日辰，属旺相</li><li>巳月寅日，看午火，那就是得月令扶助（得令），得日辰生扶（日辰生爻），属旺相</li><li>寅月申日，看子水，那就是被月建泄气（休），得日辰生扶，一得一生，平和状态</li></ul><p><strong>卦中的神</strong><br>用神、原神、忌神、仇神、喜神<br>表示<br>我、生我、我生、克我、生克我的爻</p><p>一般只看前三个</p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/30/Fortune-1/</id>
    <link href="https://akemi.zj.cn/2026/04/30/Fortune-1/"/>
    <published>2026-04-30T11:07:00.000Z</published>
    <summary>
      <![CDATA[<h3 id="传统起卦的过程"><a href="#传统起卦的过程" class="headerlink" title="传统起卦的过程"></a>传统起卦的过程</h3><p><strong>六爻</strong><br>六爻顾名思义一共有六根爻，每次获取爻都是从低到高一共六条<br>每一根爻都是阴或阳的不同形态：<br>— — 阴<br> ——]]>
    </summary>
    <title>纳甲六爻-从传统起卦到日月能量</title>
    <updated>2026-04-30T11:08:12.222Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="虚拟化" scheme="https://akemi.zj.cn/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    <category term="容器技术" scheme="https://akemi.zj.cn/tags/%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF/"/>
    <category term="实战" scheme="https://akemi.zj.cn/tags/%E5%AE%9E%E6%88%98/"/>
    <content>
      <![CDATA[<ul><li>宿主机配置要求至少16C64G</li><li>梯子要有流量，经过测试单master吃15G流量，3master吃50G</li></ul><p>访问并登录<a href="https://console.redhat.com/openshift">https://console.redhat.com/openshift</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">获取镜像</span><br><span class="line">1.进入界面</span><br><span class="line">选择Resource-Assisted Installer辅助安装器</span><br><span class="line">选择Create Cluster</span><br><span class="line"></span><br><span class="line">2.填写基本信息</span><br><span class="line">Cluster name 我写的是wangsheng</span><br><span class="line">Base domain 我写的是ws.com</span><br><span class="line">version选择4.21.9</span><br><span class="line">Number of control plane nodes 选择3</span><br><span class="line"></span><br><span class="line">3.直接到Host discovery，点击add hosts</span><br><span class="line">镜像选择Full image</span><br><span class="line">填入本机ssh公钥（作为openshift的ssh公钥</span><br><span class="line">勾选使用代理，填入代理地址</span><br><span class="line">完成后会给出iso下载地址</span><br><span class="line"></span><br><span class="line">4.VMware workstation配置安装</span><br><span class="line">创建5台虚拟机配置8C16G内存120G硬盘，网络使用NAT</span><br><span class="line">使用下载下来的iso安装</span><br><span class="line">在每台虚拟机的vmx中添加一行disk.EnableUUID = <span class="string">&quot;TRUE&quot;</span></span><br><span class="line">开启5台虚拟机</span><br><span class="line"></span><br><span class="line">5.继续网页安装</span><br><span class="line">等5分钟，在网页Waiting <span class="keyword">for</span> hosts中会出现这五台机器</span><br><span class="line">下到第五步，填入两个与节点同网段的VIP</span><br><span class="line">下到第七步，开始安装</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260417095153834.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">6.访问管理面板</span><br><span class="line">会提示要将解析添加到hosts文件中</span><br><span class="line">192.168.8.200 api.wangsheng.ws.com</span><br><span class="line">192.168.8.199 oauth-openshift.apps.wangsheng.ws.com</span><br><span class="line">192.168.8.199 console-openshift-console.apps.wangsheng.ws.com</span><br><span class="line">192.168.8.199 grafana-openshift-monitoring.apps.wangsheng.ws.com</span><br><span class="line">192.168.8.199 thanos-querier-openshift-monitoring.apps.wangsheng.ws.com</span><br><span class="line">192.168.8.199 prometheus-k8s-openshift-monitoring.apps.wangsheng.ws.com</span><br><span class="line">192.168.8.199 alertmanager-main-openshift-monitoring.apps.wangsheng.ws.com</span><br><span class="line"></span><br><span class="line">填入kubeadmin及其密码</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260417095848672.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260417095958087.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260417100216482.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260417100317011.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/17/Openshift/</id>
    <link href="https://akemi.zj.cn/2026/04/17/Openshift/"/>
    <published>2026-04-17T02:06:00.000Z</published>
    <summary>
      <![CDATA[<ul>
<li>宿主机配置要求至少16C64G</li>
<li>梯子要有流量，经过测试单master吃15G流量，3master吃50G</li>
</ul>
<p>访问并登录<a href="https://console.redhat.com/openshift">https://console.redhat.com/openshift</a></p>
<figure]]>
    </summary>
    <title>VMware Workstation安装Openshift多节点</title>
    <updated>2026-04-17T02:07:15.903Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="Milvus" scheme="https://akemi.zj.cn/tags/Milvus/"/>
    <category term="数据备份" scheme="https://akemi.zj.cn/tags/%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD/"/>
    <content>
      <![CDATA[<p>参考文档：<a href="https://github.com/zilliztech/milvus-backup/releases">https://github.com/zilliztech/milvus-backup/releases</a></p><p>迁移原则：只能低到高，不能高到低；是一种全量备份的工具，需要暂停服务使用</p><p>如果需要热备、跨集群容灾或低停机时间迁移，可以结合Milvus CDC使用。参考文档：<a href="https://github.com/zilliztech/milvus-cdc">https://github.com/zilliztech/milvus-cdc</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 二进制安装</span></span><br><span class="line">wget https://github.com/zilliztech/milvus-backup/releases/download/v0.5.12/milvus-backup_0.5.12_Linux_x86_64.tar.gz</span><br><span class="line">tar -xf milvus-backup_0.5.12_Linux_x86_64.tar.gz</span><br><span class="line"><span class="built_in">mv</span> milvus-backup /usr/bin/</span><br></pre></td></tr></table></figure><h3 id="使用流程"><a href="#使用流程" class="headerlink" title="使用流程"></a><strong>使用流程</strong></h3><ul><li>创建backup.yaml，旧集群生成备份</li><li>物理数据搬迁，OSS文件从Old Bucket迁移到New Bucket</li><li>创建restore.yaml，指向新集群</li><li>在新集群执行恢复</li></ul><h3 id="环境说明"><a href="#环境说明" class="headerlink" title="环境说明"></a><strong>环境说明</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">新milvus环境:</span><br><span class="line">192.168.8.147:19530</span><br><span class="line">oss-cn-beijing.aliyuncs.com</span><br><span class="line">bucketName: <span class="string">&quot;milvus-backup-test&quot;</span></span><br><span class="line"></span><br><span class="line">旧milvus环境:</span><br><span class="line">192.168.10.100:19530</span><br><span class="line">oss-cn-beijing.aliyuncs.com</span><br><span class="line">bucketName: <span class="string">&quot;milvus-wangsheng-test&quot;</span></span><br></pre></td></tr></table></figure><h3 id="数据备份"><a href="#数据备份" class="headerlink" title="数据备份"></a><strong>数据备份</strong></h3><p>具体backup.yaml字段格式可以查看<a href="https://github.com/zilliztech/milvus-backup?tab=readme-ov-file#backupyaml-configurations">https://github.com/zilliztech/milvus-backup?tab=readme-ov-file#backupyaml-configurations</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建backup.yaml</span></span><br><span class="line">milvus:</span><br><span class="line"> address: <span class="string">&quot;192.168.10.100&quot;</span></span><br><span class="line"> port: 19530</span><br><span class="line">minio:</span><br><span class="line"> storageType: <span class="string">&quot;minio&quot;</span></span><br><span class="line"> port: <span class="string">&quot;443&quot;</span></span><br><span class="line"> address: <span class="string">&quot;oss-cn-beijing.aliyuncs.com&quot;</span></span><br><span class="line"> bucketName: <span class="string">&quot;milvus-wangsheng-test&quot;</span></span><br><span class="line"> rootPath: <span class="string">&quot;test&quot;</span></span><br><span class="line"> accessKeyID: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> secretAccessKey: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> useSSL: <span class="literal">true</span></span><br><span class="line"> useIAM: <span class="literal">false</span></span><br><span class="line"> region: <span class="string">&quot;cn-beijing&quot;</span></span><br><span class="line">backup:</span><br><span class="line"> backuppath: <span class="string">&quot;backup_folder&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查是否可以连接</span></span><br><span class="line">milvus-backup --config ./backup.yaml check</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开始备份，会在oss创建名为backup_test_2026的文件夹</span></span><br><span class="line">milvus-backup --config ./backup.yaml create -n backup_test_2026</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line">[2026/04/15 14:08:38.106 +08:00] [INFO] [backup/task.go:261] [<span class="string">&quot;backup successfully&quot;</span>] [task_id=5f2b4c61-c368-423a-aa20-ea442336a9e7]</span><br><span class="line">duration:4.08 s</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260415141356589.png"></p><h3 id="oss数据迁移-两种方法"><a href="#oss数据迁移-两种方法" class="headerlink" title="oss数据迁移-两种方法"></a><strong>oss数据迁移-两种方法</strong></h3><p>这两种方法的最后，都是会在新对象存储的目录下，生成backup_test_2026的目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">1.方法1-使用ossutil搬运</span><br><span class="line">ossutil <span class="built_in">cp</span> -r oss://milvus-wangsheng-test/test/backup_test_2026 oss://milvus-backup-test/test/</span><br><span class="line"></span><br><span class="line">2.方法2-直接在backup.yaml中定义目标s3的位置</span><br><span class="line">milvus:</span><br><span class="line"> address: <span class="string">&quot;192.168.10.100&quot;</span></span><br><span class="line"> port: 19530</span><br><span class="line">minio:</span><br><span class="line"> <span class="comment"># 源Bucket配置</span></span><br><span class="line"> storageType: <span class="string">&quot;minio&quot;</span></span><br><span class="line"> port: <span class="string">&quot;443&quot;</span></span><br><span class="line"> address: <span class="string">&quot;oss-cn-beijing.aliyuncs.com&quot;</span></span><br><span class="line"> bucketName: <span class="string">&quot;milvus-wangsheng-test&quot;</span></span><br><span class="line"> rootPath: <span class="string">&quot;test&quot;</span></span><br><span class="line"> accessKeyID: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> secretAccessKey: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> useSSL: <span class="literal">true</span></span><br><span class="line"> region: <span class="string">&quot;cn-beijing&quot;</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 备份/目标Bucket配置</span></span><br><span class="line"> backupAddress: <span class="string">&quot;oss-cn-beijing.aliyuncs.com&quot;</span></span><br><span class="line"> backupPort: <span class="string">&quot;443&quot;</span></span><br><span class="line"> backupBucketName: <span class="string">&quot;milvus-backup-test&quot;</span></span><br><span class="line"> backupAccessKeyID: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> backupSecretAccessKey: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> backupRegion: <span class="string">&quot;cn-beijing&quot;</span></span><br><span class="line"> backupRootPath: <span class="string">&quot;test&quot;</span></span><br><span class="line"> backupUseSSL: <span class="literal">true</span></span><br><span class="line">backup:</span><br><span class="line"> backuppath: <span class="string">&quot;backup_folder&quot;</span></span><br><span class="line"> </span><br><span class="line">milvus-backup create -n backup_2026_direct --config backup.yaml</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260415144155196.png"></p><h3 id="恢复到新集群"><a href="#恢复到新集群" class="headerlink" title="恢复到新集群"></a><strong>恢复到新集群</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建restore.yaml</span></span><br><span class="line">milvus:</span><br><span class="line"> address: <span class="string">&quot;192.168.8.147&quot;</span></span><br><span class="line"> port: 19530</span><br><span class="line"></span><br><span class="line">minio:</span><br><span class="line"> storageType: <span class="string">&quot;minio&quot;</span></span><br><span class="line"> port: <span class="string">&quot;443&quot;</span></span><br><span class="line"> address: <span class="string">&quot;oss-cn-beijing.aliyuncs.com&quot;</span></span><br><span class="line"> bucketName: <span class="string">&quot;milvus-backup-test&quot;</span></span><br><span class="line"> rootPath: <span class="string">&quot;test&quot;</span></span><br><span class="line"> accessKeyID: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> secretAccessKey: <span class="string">&quot;xxxx&quot;</span></span><br><span class="line"> useSSL: <span class="literal">true</span></span><br><span class="line"> region: <span class="string">&quot;cn-beijing&quot;</span></span><br><span class="line"></span><br><span class="line">backup:</span><br><span class="line"> backuppath: <span class="string">&quot;backup_folder&quot;</span></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置文件格式</span></span><br><span class="line">milvus-backup list --config restore.yaml</span><br><span class="line">&gt;&gt; Backups:</span><br><span class="line">backup_2026_direct</span><br><span class="line">backup_test_2026</span><br><span class="line"></span><br><span class="line">↑说明有两个可还原的版本</span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择恢复</span></span><br><span class="line">milvus-backup restore -n backup_2026_direct --config restore.yaml</span><br><span class="line">...</span><br><span class="line">duration:42.30 s</span><br></pre></td></tr></table></figure><h3 id="测试访问"><a href="#测试访问" class="headerlink" title="测试访问"></a><strong>测试访问</strong></h3><h4 id="图形访问测试"><a href="#图形访问测试" class="headerlink" title="图形访问测试"></a><strong>图形访问测试</strong></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line"> --name attu \</span><br><span class="line"> -p 8000:3000 \</span><br><span class="line"> -e MILVUS_URL=192.168.8.147:19530 \</span><br><span class="line"> zilliz/attu:latest</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260415151823424.png"></p><h4 id="业务访问测试"><a href="#业务访问测试" class="headerlink" title="业务访问测试"></a><strong>业务访问测试</strong></h4><p>修改代码访问的milvus端点，调用embedding后的向量</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">milvus_config = &#123;</span><br><span class="line"> <span class="string">&quot;host&quot;</span>: <span class="string">&quot;192.168.8.147&quot;</span>,</span><br><span class="line"> <span class="string">&quot;port&quot;</span>: <span class="string">&quot;19530&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260415183436138.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/15/Milvus-backup/</id>
    <link href="https://akemi.zj.cn/2026/04/15/Milvus-backup/"/>
    <published>2026-04-15T10:40:00.000Z</published>
    <summary>
      <![CDATA[<p>参考文档：<a]]>
    </summary>
    <title>使用OSS的Milvus-backup数据备份迁移</title>
    <updated>2026-04-16T05:53:20.596Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="OpenClaw" scheme="https://akemi.zj.cn/tags/OpenClaw/"/>
    <content>
      <![CDATA[<h2 id="测试环境搭建与问题诊断"><a href="#测试环境搭建与问题诊断" class="headerlink" title="测试环境搭建与问题诊断"></a><strong>测试环境搭建与问题诊断</strong></h2><p>在<a href="/2026/04/10/VibeCoding-meilisearch-1/">上一篇文章</a>中，我们完成了 MeiliSearch 的基础部署和索引创建，但搜索框的下拉显示功能存在问题。为了系统化地解决这个问题，我决定采用 OpenClaw 的三 Agent 协同工作流。</p><p>首先创建了测试环境：</p><ul><li><strong>目录</strong>：<code>/blog-staging</code>（与生产环境隔离）</li><li><strong>容器</strong>：Docker 运行 nodejs 环境</li><li><strong>端口</strong>：4000（可通过 localhost:4000 测试）</li><li><strong>目标</strong>：所有修改先在测试环境验证，再合并到生产环境</li></ul><h2 id="OpenClaw-三-Agent-协同工作流设计"><a href="#OpenClaw-三-Agent-协同工作流设计" class="headerlink" title="OpenClaw 三 Agent 协同工作流设计"></a><strong>OpenClaw 三 Agent 协同工作流设计</strong></h2><p>我创建了一个专门的 <code>blog-feature-update</code> skill，设计了三 Agent 协同工作流：</p><h3 id="工作流架构"><a href="#工作流架构" class="headerlink" title="工作流架构"></a><strong>工作流架构</strong></h3><ol><li><strong>代码 Agent</strong>：负责修改代码和配置</li><li><strong>部署 Agent</strong>：负责重新生成博客并重启服务  </li><li><strong>验证 Agent</strong>：负责自动化测试验证功能</li></ol><p>每个 Agent 通过文件标志（<code>.flag</code> 文件）进行通信，形成完整的迭代开发循环：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">用户需求 → 代码Agent → 部署Agent → 验证Agent → 结果反馈</span><br></pre></td></tr></table></figure><h3 id="验证-Agent-的自动化测试"><a href="#验证-Agent-的自动化测试" class="headerlink" title="验证 Agent 的自动化测试"></a><strong>验证 Agent 的自动化测试</strong></h3><p>为了确保每次修改都能可靠验证，我配置了验证 Agent 使用 Playwright 进行 UI 自动化测试：</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/playwright-test-screenshot.png"></p><p><strong>中文字体问题</strong>：在容器环境中，Playwright 默认不包含中文字体，导致测试截图中的中文显示为方框。通过手动添加 simkai.ttf 字体文件解决：</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/playwright-font-fixed.png"></p><h2 id="六轮优化迭代过程"><a href="#六轮优化迭代过程" class="headerlink" title="六轮优化迭代过程"></a><strong>六轮优化迭代过程</strong></h2><h3 id="第一轮：修复下拉框显示"><a href="#第一轮：修复下拉框显示" class="headerlink" title="第一轮：修复下拉框显示"></a><strong>第一轮：修复下拉框显示</strong></h3><p><strong>问题</strong>：API 请求成功（F12 可见），但下拉框不显示结果。</p><p><strong>根本原因</strong>：JavaScript 数据处理逻辑 bug。<code>searchMeilisearch</code> 函数返回完整 API 响应，而 <code>displayResults</code> 函数期望处理后的数组。</p><p><strong>代码 Agent 修复</strong>：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 修复前：返回完整API响应</span></span><br><span class="line"><span class="keyword">return</span> data;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 修复后：返回处理后的hits数组</span></span><br><span class="line"><span class="keyword">return</span> data.<span class="property">hits</span>.<span class="title function_">map</span>(<span class="function"><span class="params">hit</span> =&gt;</span> (&#123;</span><br><span class="line">    <span class="attr">id</span>: hit.<span class="property">id</span>,</span><br><span class="line">    <span class="attr">title</span>: hit.<span class="property">title</span> || hit.<span class="property">_formatted</span>?.<span class="property">title</span> || <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">    <span class="attr">date</span>: hit.<span class="property">date</span>,</span><br><span class="line">    <span class="attr">tags</span>: hit.<span class="property">tags</span> || [],</span><br><span class="line">    <span class="attr">url</span>: hit.<span class="property">url</span></span><br><span class="line">&#125;));</span><br></pre></td></tr></table></figure><p><strong>验证结果</strong>：✅ 下拉框正常显示搜索结果</p><h3 id="第二轮：优化显示格式"><a href="#第二轮：优化显示格式" class="headerlink" title="第二轮：优化显示格式"></a><strong>第二轮：优化显示格式</strong></h3><p><strong>用户反馈</strong>：下拉框显示格式有问题，包含重复标题行。</p><p><strong>原始显示</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">k8s证书延长有效期（标题，带超链接）</span><br><span class="line">k8s证书延长有效期（标题） ← 重复行</span><br><span class="line">http://192.168.10.100:4000/posts/K8s-crt/（链接）</span><br><span class="line">2025-02-05 21:42:55（时间）</span><br></pre></td></tr></table></figure><p><strong>新需求</strong>：</p><ol><li>最多显示5个待选项</li><li>删除第二行的重复标题</li><li>时间+相关性混合排序</li></ol><p><strong>代码 Agent 修改</strong>：</p><ol><li><strong>数量限制</strong>：<code>limit: 10</code> → <code>limit: 5</code></li><li><strong>删除重复</strong>：移除 <code>excerpt</code> 相关代码</li><li><strong>排序优化</strong>：添加 <code>sort: [&#39;date:desc&#39;]</code></li></ol><p><strong>技术问题</strong>：添加 <code>sort: [&#39;_score:desc&#39;, &#39;date:desc&#39;]</code> 导致 API 返回 0 个结果。</p><p><strong>发现</strong>：MeiliSearch v0.24.0 不支持 <code>_score:desc</code> 排序参数。</p><p><strong>解决方案</strong>：只使用 <code>sort: [&#39;date:desc&#39;]</code>，依赖默认相关性排序。</p><p><strong>优化后显示</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">k8s剩余资源计算脚本（标题，带超链接）</span><br><span class="line">http://192.168.10.100:4000/posts/K8s-resource/（链接）</span><br><span class="line">2025-04-08 19:14:34（时间）</span><br></pre></td></tr></table></figure><h3 id="第三轮：添加标签显示"><a href="#第三轮：添加标签显示" class="headerlink" title="第三轮：添加标签显示"></a><strong>第三轮：添加标签显示</strong></h3><p><strong>用户需求</strong>：删除 URL 行和时间行，添加其他字段。</p><p><strong>选择</strong>：添加标签（tags）字段，因为：</p><ul><li>信息价值高</li><li>API 已有该字段</li><li>格式简洁</li><li>用户友好</li></ul><p><strong>代码 Agent 修改</strong>：</p><ol><li>删除 URL 显示代码</li><li>删除日期显示代码</li><li>添加标签显示逻辑：<ul><li>最多显示3个标签</li><li>超过3个时显示”等X个标签”</li><li>无标签时显示”标签: 无”</li><li>添加 🏷️ 图标前缀</li></ul></li></ol><p><strong>CSS Agent 添加样式</strong>：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.meilisearch-suggestion-tags</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#666</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">0.75rem</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">1.4</span>;</span><br><span class="line">    <span class="attribute">margin-top</span>: <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.meilisearch-suggestion-tags</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">&#x27;🏷️ &#x27;</span>;</span><br><span class="line">    <span class="attribute">margin-right</span>: <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">opacity</span>: <span class="number">0.7</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>优化后显示</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">k8s剩余资源计算脚本（标题，带超链接）</span><br><span class="line">标签: k8s</span><br></pre></td></tr></table></figure><h3 id="第四轮：宽度调整"><a href="#第四轮：宽度调整" class="headerlink" title="第四轮：宽度调整"></a><strong>第四轮：宽度调整</strong></h3><p><strong>用户需求</strong>：将搜索框和下拉框长度扩展到1.5倍，保持居中。</p><p><strong>初始状态</strong>：搜索框宽度 202px，容器最大宽度 500px。</p><p><strong>第一轮扩展</strong>：</p><ul><li>容器最大宽度：750px (500px × 1.5)</li><li>搜索框最小宽度：600px</li><li><strong>结果</strong>：644px (3.2倍扩展，超出预期)</li></ul><p><strong>用户反馈</strong>：太宽了，缩减到400px。</p><p><strong>最终调整</strong>：</p><ul><li>容器最大宽度：400px</li><li>搜索框最小宽度：350px</li><li><strong>结果</strong>：394px (接近400px目标)</li></ul><h3 id="第五轮：超链接修复"><a href="#第五轮：超链接修复" class="headerlink" title="第五轮：超链接修复"></a><strong>第五轮：超链接修复</strong></h3><p><strong>问题</strong>：下拉框中的文章链接点击跳转到无效链接。</p><p><strong>根本原因</strong>：MeiliSearch 索引中的 URL 字段是旧格式 <code>/posts/K8s-crt/</code>，而实际 Hexo 生成的 URL 格式是 <code>/年/月/日/文章文件名/</code>。</p><p><strong>解决方案</strong>：在 JavaScript 中动态生成正确的 URL。</p><p><strong>代码 Agent 修复</strong>：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 从原始URL提取slug（Hexo使用文件名作为slug）</span></span><br><span class="line"><span class="keyword">if</span> (result.<span class="property">url</span>) &#123;</span><br><span class="line">    <span class="comment">// 从 /posts/K8s-crt/ 提取 K8s-crt</span></span><br><span class="line">    <span class="keyword">const</span> match = result.<span class="property">url</span>.<span class="title function_">match</span>(<span class="regexp">/\/([^\/]+)\/?$/</span>);</span><br><span class="line">    <span class="keyword">if</span> (match) &#123;</span><br><span class="line">        slug = match[<span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 构建Hexo格式URL</span></span><br><span class="line"><span class="keyword">if</span> (slug) &#123;</span><br><span class="line">    fullUrl = <span class="string">`/<span class="subst">$&#123;year&#125;</span>/<span class="subst">$&#123;month&#125;</span>/<span class="subst">$&#123;day&#125;</span>/<span class="subst">$&#123;slug&#125;</span>/`</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>验证结果</strong>：✅ 链接可正常跳转到文章页面</p><h3 id="第六轮：视觉标识（最终撤销）"><a href="#第六轮：视觉标识（最终撤销）" class="headerlink" title="第六轮：视觉标识（最终撤销）"></a><strong>第六轮：视觉标识（最终撤销）</strong></h3><p><strong>用户需求</strong>：在搜索框最左边添加小的黑色放大镜图标。</p><p><strong>发现</strong>：图标原本就存在，但被 CSS 隐藏：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* style.css 中的隐藏规则 */</span></span><br><span class="line"><span class="selector-class">.meilisearch-icon</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>解决方案</strong>：移除隐藏规则，设置黑色：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.meilisearch-icon</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#000000</span>;  <span class="comment">/* 黑色放大镜 */</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>后续</strong>：用户觉得不需要，最终撤销此修改，恢复隐藏状态。</p><h2 id="生产环境合并策略"><a href="#生产环境合并策略" class="headerlink" title="生产环境合并策略"></a><strong>生产环境合并策略</strong></h2><p>所有功能在测试环境验证通过后，需要合并到生产环境，但要注意关键差异：</p><h3 id="API-访问路径差异"><a href="#API-访问路径差异" class="headerlink" title="API 访问路径差异"></a><strong>API 访问路径差异</strong></h3><ol><li><strong>测试环境</strong>：直接访问 <code>http://114.55.64.10:7700</code></li><li><strong>生产环境</strong>：使用 <code>/search</code> 代理路径</li></ol><h3 id="API-密钥处理差异"><a href="#API-密钥处理差异" class="headerlink" title="API 密钥处理差异"></a><strong>API 密钥处理差异</strong></h3><ol><li><strong>测试环境</strong>：前端传递 <code>X-MEILI-API-KEY</code> 头</li><li><strong>生产环境</strong>：由 Nginx 反向代理自动添加，前端无需传递</li></ol><h3 id="合并实施"><a href="#合并实施" class="headerlink" title="合并实施"></a><strong>合并实施</strong></h3><ol><li><strong>JavaScript 文件</strong>：应用所有功能优化，但保持生产环境的 API 调用方式</li><li><strong>CSS 文件</strong>：直接复制所有样式优化</li><li><strong>主题配置</strong>：保持 <code>host: &#39;/search&#39;</code> 设置</li><li><strong>测试文章</strong>：仅合并《OpenClaw多Agent协同测试》一篇</li></ol><h2 id="技术总结与经验"><a href="#技术总结与经验" class="headerlink" title="技术总结与经验"></a><strong>技术总结与经验</strong></h2><h3 id="MeiliSearch-版本兼容性教训"><a href="#MeiliSearch-版本兼容性教训" class="headerlink" title="MeiliSearch 版本兼容性教训"></a><strong>MeiliSearch 版本兼容性教训</strong></h3><ul><li><strong>问题</strong>：v0.24.0 不支持 <code>_score:desc</code> 排序参数</li><li><strong>现象</strong>：添加该参数导致 API 返回 0 个结果</li><li><strong>解决</strong>：只使用 <code>date:desc</code>，依赖默认相关性排序</li><li><strong>教训</strong>：使用开源工具时要关注版本特性差异</li></ul><h3 id="三-Agent-协同工作流优势"><a href="#三-Agent-协同工作流优势" class="headerlink" title="三 Agent 协同工作流优势"></a><strong>三 Agent 协同工作流优势</strong></h3><ol><li><strong>职责分离</strong>：代码、部署、验证各司其职</li><li><strong>迭代可靠</strong>：验证失败可自动回退重试</li><li><strong>通信简单</strong>：文件标志通信机制简单可靠</li><li><strong>适合复杂任务</strong>：多步骤、需要验证的工作流</li></ol><h3 id="CSS-布局技巧"><a href="#CSS-布局技巧" class="headerlink" title="CSS 布局技巧"></a><strong>CSS 布局技巧</strong></h3><ul><li><strong>组合控制</strong>：<code>max-width</code> + <code>min-width</code> 实现弹性宽度</li><li><strong>填充容器</strong>：<code>width: 100%</code> 确保填满父容器</li><li><strong>下拉框同步</strong>：<code>left: 0; right: 0;</code> 实现与父容器同宽</li></ul><h3 id="Playwright-UI-自动化测试价值"><a href="#Playwright-UI-自动化测试价值" class="headerlink" title="Playwright UI 自动化测试价值"></a><strong>Playwright UI 自动化测试价值</strong></h3><ol><li><strong>真实模拟</strong>：完全模拟用户操作流程</li><li><strong>问题捕获</strong>：及时发现 JavaScript 错误和网络问题</li><li><strong>可视化验证</strong>：截图提供直观的验证结果</li><li><strong>回归测试</strong>：确保修改不会破坏现有功能</li></ol><h2 id="最终成果与反思"><a href="#最终成果与反思" class="headerlink" title="最终成果与反思"></a><strong>最终成果与反思</strong></h2><h3 id="实现的功能"><a href="#实现的功能" class="headerlink" title="实现的功能"></a><strong>实现的功能</strong></h3><ol><li><strong>优雅显示</strong>：简洁的标题+标签，无冗余信息</li><li><strong>智能排序</strong>：按相关性+时间混合排序</li><li><strong>数量控制</strong>：最多显示5个最相关结果</li><li><strong>正确链接</strong>：动态生成正确的 Hexo 文章 URL</li><li><strong>适中宽度</strong>：400px 宽度，居中布局</li><li><strong>安全访问</strong>：通过 Nginx 代理隐藏 API 密钥</li></ol><h3 id="vibe-coding-工作模式反思"><a href="#vibe-coding-工作模式反思" class="headerlink" title="vibe coding 工作模式反思"></a><strong>vibe coding 工作模式反思</strong></h3><p>这次实践展示了 <strong>vibe coding</strong>（与 AI 协同编程）的有效工作模式：</p><ol><li><strong>人类角色</strong>：提供方向、决策、质量把控</li><li><strong>AI 角色</strong>：执行具体任务、快速迭代、处理细节</li><li><strong>协同关键</strong>：清晰的指令、及时的反馈、系统化的工作流</li></ol><h3 id="OpenClaw-多-Agent-架构的价值"><a href="#OpenClaw-多-Agent-架构的价值" class="headerlink" title="OpenClaw 多 Agent 架构的价值"></a><strong>OpenClaw 多 Agent 架构的价值</strong></h3><p>通过创建 <code>blog-feature-update</code> skill 和三 Agent 工作流，我们实现了：</p><ol><li><strong>可复用的流程</strong>：类似任务可直接套用此模式</li><li><strong>质量保证</strong>：自动化验证确保每次修改可靠</li><li><strong>效率提升</strong>：并行处理代码、部署、验证步骤</li><li><strong>文档完整</strong>：整个过程有完整记录可供复盘</li></ol><h2 id="部署与后续"><a href="#部署与后续" class="headerlink" title="部署与后续"></a><strong>部署与后续</strong></h2><p>所有修改已通过 <code>./hexo.sh</code> 脚本部署到生产环境，包含：</p><ul><li>两篇技术文章（本篇及前篇）</li><li>完全优化的搜索功能</li><li>测试文章验证</li></ul><p>搜索功能现在提供优雅、高效的用户体验，同时后台通过系统化的 AI 协作流程保证质量和可靠性。</p><hr><p><em>本文完整记录了 2026年4月9日 使用 OpenClaw 三 Agent 协同工作流优化博客 MeiliSearch 搜索功能的详细过程。从工作流设计到六轮优化迭代，展示了如何通过系统化的 AI 协作解决复杂技术问题。</em></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/10/VibeCoding-meilisearch-2/</id>
    <link href="https://akemi.zj.cn/2026/04/10/VibeCoding-meilisearch-2/"/>
    <published>2026-04-09T16:15:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="测试环境搭建与问题诊断"><a href="#测试环境搭建与问题诊断" class="headerlink" title="测试环境搭建与问题诊断"></a><strong>测试环境搭建与问题诊断</strong></h2><p>在<a href="/2026/04/10/VibeCoding-meilisearch-1/">上一篇文章</a>中，我们完成了]]>
    </summary>
    <title>VibeCoding改造博客使用Meilisearch搜索框—Openclaw创建多Agent迭代调试</title>
    <updated>2026-04-16T05:53:08.168Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="Meilisearch" scheme="https://akemi.zj.cn/tags/Meilisearch/"/>
    <category term="博客优化" scheme="https://akemi.zj.cn/tags/%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96/"/>
    <category term="iflow" scheme="https://akemi.zj.cn/tags/iflow/"/>
    <content>
      <![CDATA[<h2 id="k8s部署meilisearch"><a href="#k8s部署meilisearch" class="headerlink" title="k8s部署meilisearch"></a>k8s部署meilisearch</h2><p>给公司的公有云部署了一个，挺有意思的，我准备后续给我的博客也用上<br>官方文档：<a href="https://github.com/meilisearch/meilisearch-kubernetes">https://github.com/meilisearch/meilisearch-kubernetes</a><br>支持资源清单或helm部署</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/meilisearch/meilisearch-kubernetes/refs/heads/main/manifests/meilisearch.yaml</span><br></pre></td></tr></table></figure><p>几个注意点：</p><ul><li>建议加上环境变量 <code>MEILI_MASTER_KEY</code></li><li>调整 <code>NodeSelector</code>、<code>taint</code></li><li>默认使用 <code>emptyDir</code> 作为 <code>tmp</code> 和 <code>data</code> 卷，生产肯定需要改成 <code>pvc</code></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kubectl apply -f meilisearch.yaml</span><br></pre></td></tr></table></figure><h2 id="docker部署meilisearch"><a href="#docker部署meilisearch" class="headerlink" title="docker部署meilisearch"></a>docker部署meilisearch</h2><p>官方文档: <a href="https://www.meilisearch.com/docs/resources/self_hosting/getting_started/docker">https://www.meilisearch.com/docs/resources/self_hosting/getting_started/docker</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> /meili_data</span><br><span class="line"></span><br><span class="line">docker run -itd --name meilisearch \</span><br><span class="line"> -p 7700:7700 \</span><br><span class="line"> -v /meili_data:/meili_data \</span><br><span class="line"> -e MEILI_MASTER_KEY=<span class="string">&#x27;MASTER_KEY&#x27;</span>\</span><br><span class="line"> getmeili/meilisearch:latest</span><br></pre></td></tr></table></figure><h2 id="token暴露问题"><a href="#token暴露问题" class="headerlink" title="token暴露问题"></a><strong>token暴露问题</strong></h2><p>部署完成后，我要求 iflow：</p><ol><li>在我的博客顶端中间增加一个颜色素、线条细的搜索框</li><li>搜索框与 Meilisearch 进行关联，并通过 hexo 主题的配置文件 <code>_config.yaml</code> 配置</li></ol><p>但完成后发现一个新问题，就是这样我发起搜索的请求中，会直接带有 master key，这肯定不行</p><p>有两种方法可以解决：</p><ol><li>使用 master key 向 meilisearch 重新申请一个只有读权限的 key，然后展示这个 key</li><li>在 nginx 后端添加新的路由，并且附带 token 转发到本机的 7700 端口</li></ol><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260409235747441.png"></p><p><strong>配置nginx</strong></p><p>meilisearch 不使用 bearer auth，而是使用特殊请求头 <code>X-MEILI-API-KEY</code>（全大写）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加nginx配置</span></span><br><span class="line">location /search/ &#123;</span><br><span class="line">    <span class="comment"># 将请求转发到本地 7700 端口</span></span><br><span class="line">    proxy_pass http://127.0.0.1:7700/;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 在后端隐式添加 Meilisearch API Key</span></span><br><span class="line">    proxy_set_header X-MEILI-API-KEY <span class="string">&quot;xxxxxx&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 传递其他必要的头信息</span></span><br><span class="line">    proxy_set_header Host <span class="variable">$host</span>;</span><br><span class="line">    proxy_set_header X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    proxy_set_header X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 限制客户端只能使用 POST 方法</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$request_method</span> != POST) &#123;</span><br><span class="line">        <span class="built_in">return</span> 405;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 隐藏真实的后端响应头，防止信息泄露</span></span><br><span class="line">    proxy_hide_header X-Meilisearch-Stats;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">nginx -s reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用curl在云主机内部进行临时测试</span></span><br><span class="line">curl -X POST <span class="string">&#x27;http://127.0.0.1:7700/indexes/posts/search&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-Meili-API-Key: xxxx&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">    -d <span class="string">&#x27;&#123;&quot;q&quot;:&quot;k8s&quot;,&quot;limit&quot;:5&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 看到已经可以正常访问meilisearch了，因为此时我还没有往里面传数据</span></span><br><span class="line">&#123;<span class="string">&quot;message&quot;</span>:<span class="string">&quot;Index `posts` not found.&quot;</span>,<span class="string">&quot;code&quot;</span>:<span class="string">&quot;index_not_found&quot;</span>,<span class="string">&quot;type&quot;</span>:<span class="string">&quot;invalid_request&quot;</span>,<span class="string">&quot;link&quot;</span>:<span class="string">&quot;https://docs.meilisearch.com/errors#index_not_found&quot;</span>&#125;</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260325151257563.png"></p><h2 id="创建索引与导入数据"><a href="#创建索引与导入数据" class="headerlink" title="创建索引与导入数据"></a>创建索引与导入数据</h2><p>这一步我让 openclaw 给我做了，主要内容如下：</p><p>中途我和它还对自动化、索引格式进行了讨论，所以说用 AI 还得懂技术才能用，不然他直接乱创建索引，查询效率就很低了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line">第一步：验证当前 Meilisearch 状态</span><br><span class="line"><span class="comment"># 1. 检查索引列表</span></span><br><span class="line">curl -X GET <span class="string">&#x27;http://114.55.64.10:7700/indexes&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-MEILI-API-KEY: xxxxx&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 查看 posts 索引详情</span></span><br><span class="line">curl -X GET <span class="string">&#x27;http://114.55.64.10:7700/indexes/posts&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-MEILI-API-KEY: xxxxx&#x27;</span></span><br><span class="line"></span><br><span class="line">第二步：设计数据模型</span><br><span class="line">基于 Hexo 文章结构：</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;id&quot;</span>: <span class="string">&quot;唯一标识（如文件名哈希）&quot;</span>,</span><br><span class="line">    <span class="string">&quot;title&quot;</span>: <span class="string">&quot;文章标题&quot;</span>,</span><br><span class="line">    <span class="string">&quot;content&quot;</span>: <span class="string">&quot;文章纯文本内容&quot;</span>,</span><br><span class="line">    <span class="string">&quot;excerpt&quot;</span>: <span class="string">&quot;摘要&quot;</span>,</span><br><span class="line">    <span class="string">&quot;date&quot;</span>: <span class="string">&quot;发布日期&quot;</span>,</span><br><span class="line">    <span class="string">&quot;tags&quot;</span>: [<span class="string">&quot;标签数组&quot;</span>],</span><br><span class="line">    <span class="string">&quot;categories&quot;</span>: [<span class="string">&quot;分类数组&quot;</span>],</span><br><span class="line">    <span class="string">&quot;url&quot;</span>: <span class="string">&quot;文章URL&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">第三步：创建/配置索引（如果需要）</span><br><span class="line"><span class="comment"># 如果 posts 索引不存在，创建它</span></span><br><span class="line">curl -X POST <span class="string">&#x27;http://114.55.64.10:7700/indexes&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-MEILI-API-KEY: xxxxx&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">    -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">        &quot;uid&quot;: &quot;posts&quot;,</span></span><br><span class="line"><span class="string">        &quot;primaryKey&quot;: &quot;id&quot;</span></span><br><span class="line"><span class="string">    &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">第四步：提取 Hexo 博客文章</span><br><span class="line">扫描 /blog/source/_posts/ 目录的所有 .md 文件</span><br><span class="line">解析每篇文章：</span><br><span class="line">- 提取 frontmatter（标题、日期、标签、分类）</span><br><span class="line">- 提取内容并转换为纯文本</span><br><span class="line">- 生成唯一ID</span><br><span class="line"></span><br><span class="line">第五步：批量导入到 Meilisearch</span><br><span class="line"><span class="comment"># 分批导入文章数据</span></span><br><span class="line">curl -X POST <span class="string">&#x27;http://114.55.64.10:7700/indexes/posts/documents&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-MEILI-API-KEY: xxxxx&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">    -d <span class="string">&#x27;[&#123;文章1数据&#125;, &#123;文章2数据&#125;, ...]&#x27;</span></span><br><span class="line"></span><br><span class="line">第七步：测试和验证</span><br><span class="line"><span class="comment"># 测试搜索功能</span></span><br><span class="line">curl -X POST <span class="string">&#x27;http://114.55.64.10:7700/indexes/posts/search&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;X-MEILI-API-KEY: xxxxx&#x27;</span> \</span><br><span class="line">    -H <span class="string">&#x27;Content-Type: application/json&#x27;</span> \</span><br><span class="line">    -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">        &quot;q&quot;: &quot;k8s&quot;,</span></span><br><span class="line"><span class="string">        &quot;limit&quot;: 5,</span></span><br><span class="line"><span class="string">        &quot;attributesToRetrieve&quot;: [&quot;title&quot;, &quot;date&quot;, &quot;tags&quot;],</span></span><br><span class="line"><span class="string">        &quot;attributesToHighlight&quot;: [&quot;title&quot;]</span></span><br><span class="line"><span class="string">    &#125;&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="搜索框与下拉框问题"><a href="#搜索框与下拉框问题" class="headerlink" title="搜索框与下拉框问题"></a>搜索框与下拉框问题</h2><p>现在搜索框点了没反应，但在 F12 中可以看到接口已经返回了搜索到的文章。</p><p>这一步失败了很多次，所以重新创建了一个测试环境 <code>/blog-staging</code>，用 docker 运行 nodejs 环境，挂载我的 staging 环境，并暴露 4000 端口。让小龙虾直接改测试环境，我也可以通过 localhost:4000 做测试。</p><hr><p><em>本文记录了使用 iflow 创建 MeiliSearch 搜索框的初步过程，包括部署、安全配置和索引创建。下一篇文章将详细介绍如何使用 OpenClaw 的三 Agent 协同工作流解决搜索功能的具体问题。</em></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/10/VibeCoding-meilisearch-1/</id>
    <link href="https://akemi.zj.cn/2026/04/10/VibeCoding-meilisearch-1/"/>
    <published>2026-04-09T16:10:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="k8s部署meilisearch"><a href="#k8s部署meilisearch" class="headerlink" title="k8s部署meilisearch"></a>k8s部署meilisearch</h2><p>给公司的公有云部署了一个，挺有意思的，我准备后续给我的博客也用上<br>官方文档：<a]]>
    </summary>
    <title>VibeCoding改造博客使用Meilisearch搜索框—iflow创建搜索框</title>
    <updated>2026-04-15T10:37:23.163Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="自动化" scheme="https://akemi.zj.cn/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="OpenClaw" scheme="https://akemi.zj.cn/tags/OpenClaw/"/>
    <category term="测试" scheme="https://akemi.zj.cn/tags/%E6%B5%8B%E8%AF%95/"/>
    <content>
      <![CDATA[<p>这是通过OpenClaw多Agent协同系统自动创建的一篇测试文章。</p><p>本文档用于验证多Agent协同工作流程，确保Hexo博客系统能够正确处理通过自动化工具创建的文章。</p><h2 id="测试目的"><a href="#测试目的" class="headerlink" title="测试目的"></a>测试目的</h2><ol><li>验证OpenClaw多Agent协同系统的文章创建功能</li><li>测试Hexo博客系统的Front Matter格式兼容性</li><li>确保自动化流程不会破坏现有博客内容</li></ol><h2 id="技术细节"><a href="#技术细节" class="headerlink" title="技术细节"></a>技术细节</h2><ul><li>创建时间：2026年4月9日 11:16 GMT+8</li><li>创建方式：OpenClaw多Agent协同系统</li><li>文件位置：&#x2F;blog-staging&#x2F;source&#x2F;_posts&#x2F;openclaw-agent-test.md</li><li>验证方式：hexo clean &amp;&amp; hexo g</li></ul><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><p>这仅是一篇测试文章，用于验证自动化流程。在实际部署前，请确保所有自动化工具都经过充分测试。</p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/09/openclaw-agent-test/</id>
    <link href="https://akemi.zj.cn/2026/04/09/openclaw-agent-test/"/>
    <published>2026-04-09T03:16:00.000Z</published>
    <summary>
      <![CDATA[<p>这是通过OpenClaw多Agent协同系统自动创建的一篇测试文章。</p>
<p>本文档用于验证多Agent协同工作流程，确保Hexo博客系统能够正确处理通过自动化工具创建的文章。</p>
<h2 id="测试目的"><a href="#测试目的" class="headerlink"]]>
    </summary>
    <title>OpenClaw多Agent协同测试</title>
    <updated>2026-04-09T15:44:04.166Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="Prometheus" scheme="https://akemi.zj.cn/tags/Prometheus/"/>
    <category term="监控" scheme="https://akemi.zj.cn/tags/%E7%9B%91%E6%8E%A7/"/>
    <content>
      <![CDATA[<p>是一种工作在进程层面的exporter</p><p>比如k8s集群中，如果节点总是发生不明原因的OOM，在节点监控node-exporter的基础上，就很适合用这种exporter来进行针对性监控</p><h3 id="二进制部署"><a href="#二进制部署" class="headerlink" title="二进制部署"></a><strong>二进制部署</strong></h3><p>因为我当前的k8s集群是kind，不太适用，如果在k8s内，就可以用daemonset</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/ncabatoff/process-exporter/releases/download/v0.8.1/process-exporter-0.8.1.linux-amd64.tar.gz</span><br><span class="line"></span><br><span class="line">tar -xzf process-exporter-0.8.1.linux-amd64.tar.gz</span><br><span class="line"><span class="built_in">cd</span> process-exporter-0.8.1.linux-amd64/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建配置文件</span></span><br><span class="line">vim process-conf.yaml</span><br><span class="line">process_names:</span><br><span class="line"> <span class="comment"># 监控所有进程</span></span><br><span class="line"> - name: <span class="string">&quot;&#123;&#123;.Comm&#125;&#125;&quot;</span></span><br><span class="line"> cmdline:</span><br><span class="line"> - <span class="string">&#x27;.+&#x27;</span></span><br><span class="line"> </span><br><span class="line"><span class="comment"># 直接运行测试</span></span><br><span class="line">./process-exporter -config.path process-conf.yaml</span><br><span class="line"></span><br><span class="line"><span class="comment"># </span></span><br><span class="line"><span class="built_in">cp</span> /root/process-exporter-0.8.1.linux-amd64/process-exporter /usr/local/bin/</span><br><span class="line"><span class="built_in">cp</span> /root/process-exporter-0.8.1.linux-amd64/process-conf.yaml /etc/process-exporter.yaml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 没问题，写成systemd接管</span></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/systemd/system/process-exporter.service &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">[Unit]</span></span><br><span class="line"><span class="string">Description=Process Exporter</span></span><br><span class="line"><span class="string">After=network.target</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">[Service]</span></span><br><span class="line"><span class="string">Type=simple</span></span><br><span class="line"><span class="string">User=root</span></span><br><span class="line"><span class="string">Group=root</span></span><br><span class="line"><span class="string">WorkingDirectory=/root/process-exporter-0.8.1.linux-amd64</span></span><br><span class="line"><span class="string">ExecStart=/usr/local/bin/process-exporter -config.path /etc/process-exporter.yaml</span></span><br><span class="line"><span class="string">Restart=always</span></span><br><span class="line"><span class="string">RestartSec=10</span></span><br><span class="line"><span class="string">StandardOutput=journal</span></span><br><span class="line"><span class="string">StandardError=journal</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">[Install]</span></span><br><span class="line"><span class="string">WantedBy=multi-user.target</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line">systemctl daemon-reload</span><br><span class="line">systemctl <span class="built_in">enable</span> process-exporter.service --now</span><br><span class="line">systemctl is-active process-exporter.service</span><br><span class="line">active</span><br><span class="line"></span><br><span class="line">ss -tunlp | grep 9256</span><br><span class="line">tcp LISTEN 0 4096 *:9256 *:* <span class="built_in">users</span>:((&quot;process-exporte&quot;,pid=<span class="number">2440161</span>,fd=<span class="number">3</span>))</span><br></pre></td></tr></table></figure><h3 id="添加Prometheus静态抓取配置"><a href="#添加Prometheus静态抓取配置" class="headerlink" title="添加Prometheus静态抓取配置"></a>添加Prometheus静态抓取配置</h3><p>我使用的是helm部署的kube-prometheus-stack</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 修改values，添加静态配置</span></span><br><span class="line"> additionalScrapeConfigs:</span><br><span class="line"> - job_name: <span class="string">&#x27;user-login-monitor&#x27;</span></span><br><span class="line"> static_configs:</span><br><span class="line"> - targets:</span><br><span class="line"> - <span class="string">&#x27;192.168.10.100:9092&#x27;</span></span><br><span class="line"> scrape_interval: 30s</span><br><span class="line"> scrape_timeout: 10s</span><br><span class="line"> metrics_path: /</span><br><span class="line"> scheme: http</span><br><span class="line"> - job_name: <span class="string">&#x27;process-exporter&#x27;</span></span><br><span class="line"> static_configs:</span><br><span class="line"> - targets:</span><br><span class="line"> - <span class="string">&#x27;192.168.10.100:9256&#x27;</span></span><br><span class="line"><span class="comment"># helm更新</span></span><br><span class="line">helm upgrade --install prometheus ./ -f values.yaml -n prometheus</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260408171130865.png"></p><h3 id="grafana展示"><a href="#grafana展示" class="headerlink" title="grafana展示"></a>grafana展示</h3><p>选择Import dashboard，导入13882</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260408172756993.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/08/Prometheus-process-exporter/</id>
    <link href="https://akemi.zj.cn/2026/04/08/Prometheus-process-exporter/"/>
    <published>2026-04-08T09:41:00.000Z</published>
    <summary>
      <![CDATA[<p>是一种工作在进程层面的exporter</p>
<p>比如k8s集群中，如果节点总是发生不明原因的OOM，在节点监控node-exporter的基础上，就很适合用这种exporter来进行针对性监控</p>
<h3 id="二进制部署"><a href="#二进制部署" class="headerlink"]]>
    </summary>
    <title>Prometheus使用process-exporter</title>
    <updated>2026-04-16T05:52:54.802Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="EFK" scheme="https://akemi.zj.cn/tags/EFK/"/>
    <category term="数据清洗" scheme="https://akemi.zj.cn/tags/%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97/"/>
    <category term="Fluentd" scheme="https://akemi.zj.cn/tags/Fluentd/"/>
    <content>
      <![CDATA[<h2 id="Fluentd数据处理模型理论深入"><a href="#Fluentd数据处理模型理论深入" class="headerlink" title="Fluentd数据处理模型理论深入"></a><strong>Fluentd数据处理模型理论深入</strong></h2><h3 id="tag与多级tag"><a href="#tag与多级tag" class="headerlink" title="tag与多级tag"></a>tag与多级tag</h3><p>tag是<strong>Fluentd和fluent bit都有的机制</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">K8s节点 → Fluent Bit → Fluentd → ES</span><br><span class="line"> ↓ ↓ ↓</span><br><span class="line"> 生成Tag 基于Tag路由 基于内容存储</span><br><span class="line"> ↓ ↓ ↓</span><br><span class="line"> kube.** 匹配规则 索引选择</span><br><span class="line"> </span><br><span class="line">第一层：Fluent Bit的Tag路由</span><br><span class="line"><span class="comment"># Fluent Bit配置示例</span></span><br><span class="line">[INPUT]</span><br><span class="line"> Name <span class="built_in">tail</span></span><br><span class="line"> Tag kube.nginx <span class="comment"># 生成Tag</span></span><br><span class="line"></span><br><span class="line">[OUTPUT]</span><br><span class="line"> Name forward</span><br><span class="line"> Match kube.nginx <span class="comment"># 匹配Tag，发送到Fluentd</span></span><br><span class="line"></span><br><span class="line">第二层：Fluentd的Tag路由</span><br><span class="line"><span class="comment"># Fluentd配置示例</span></span><br><span class="line">&lt;<span class="built_in">source</span>&gt;</span><br><span class="line"> @<span class="built_in">type</span> forward</span><br><span class="line"> <span class="comment"># 接收Fluent Bit发来的数据，保持Tag不变</span></span><br><span class="line">&lt;/source&gt;</span><br><span class="line"></span><br><span class="line">&lt;match kube.nginx&gt; <span class="comment"># 基于同样的Tag继续路由</span></span><br><span class="line"> <span class="comment"># 深度清洗、字段丰富</span></span><br><span class="line">&lt;/match&gt;</span><br><span class="line"></span><br><span class="line">&lt;match kube.**&gt; <span class="comment"># 更通用的匹配规则</span></span><br><span class="line"> <span class="comment"># 通用处理逻辑</span></span><br><span class="line">&lt;/match&gt;</span><br></pre></td></tr></table></figure><p><strong>tag分层</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">1.常见分层模式</span><br><span class="line">kube.nginx.access # K8s中Nginx访问日志</span><br><span class="line">kube.nginx.error # K8s中Nginx错误日志 </span><br><span class="line">kube.system.kubelet # K8s系统组件日志</span><br><span class="line">host.system.ssh # 主机SSH日志</span><br><span class="line">app.payment.api # 应用支付接口日志</span><br><span class="line"></span><br><span class="line">2.match匹配规则与方式</span><br><span class="line">Fluentd按配置文件顺序匹配，第一个匹配的规则生效：</span><br><span class="line">所以具体的规则在前，通用规则在后</span><br><span class="line">&lt;match kube.nginx&gt; # 只匹配 &quot;kube.nginx&quot;</span><br><span class="line">&lt;match kube.nginx.access&gt; # 只匹配 &quot;kube.nginx.access&quot;</span><br><span class="line">&lt;match kube.**&gt; # 匹配所有以 kube. 开头的Tag</span><br><span class="line">&lt;match **.error&gt; # 匹配所有以 .error 结尾的Tag </span><br><span class="line">&lt;match app.*.api&gt; # 匹配 app.xxx.api 模式</span><br><span class="line">&lt;match kube.&#123;nginx,apache&#125;&gt; # 匹配 kube.nginx 或 kube.apache</span><br><span class="line">&lt;match &#123;app,web&#125;.api&gt; # 匹配 app.api 或 web.api</span><br><span class="line"></span><br><span class="line">3.分层的意义</span><br><span class="line">(1)处理逻辑分离（给不同filter</span><br><span class="line">kube.nginx.access → 解析访问日志，提取URL、状态码</span><br><span class="line">kube.nginx.error → 解析错误日志，提取错误级别、堆栈</span><br><span class="line">kube.system.kubelet → 解析系统日志，关注资源指标</span><br><span class="line"></span><br><span class="line">(2)输出目标分流（给不同output</span><br><span class="line">app.payment.** → 发送到高安全级别的ES集群</span><br><span class="line">app.analytics.** → 发送到分析专用ES集群</span><br><span class="line">** → 发送到通用ES集群（兜底）</span><br><span class="line"></span><br><span class="line">(3)性能优化</span><br><span class="line">kube.nginx.access（高频）→ 简单解析，快速转发</span><br><span class="line">kube.system.kubelet（低频）→ 复杂解析，深度处理</span><br><span class="line">**（其他）→ 基础处理，保证不丢数据</span><br><span class="line"></span><br><span class="line">4.推荐的分层结构</span><br><span class="line">第一级：环境标识 → &#123;cluster&#125;</span><br><span class="line">第二级：命名空间 → &#123;cluster&#125;.&#123;namespace&#125;</span><br><span class="line">第三级：工作负载 → &#123;cluster&#125;.&#123;namespace&#125;.&#123;workload&#125;</span><br><span class="line">第四级：容器 → &#123;cluster&#125;.&#123;namespace&#125;.&#123;workload&#125;.&#123;container&#125;</span><br><span class="line">第五级：日志类型 → &#123;cluster&#125;.&#123;namespace&#125;.&#123;workload&#125;.&#123;container&#125;.&#123;log_type&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Fluentd插件链架构解析"><a href="#Fluentd插件链架构解析" class="headerlink" title="Fluentd插件链架构解析"></a><strong>Fluentd插件链架构解析</strong></h3><p><strong>Fluent Bit能做的</strong>：</p><ul><li>多行日志合并</li><li>简单正则解析（如提取IP、时间戳）</li><li>K8s元数据自动添加</li><li>字段重命名&#x2F;删除</li></ul><p><strong>Fluentd能做的</strong>：</p><ul><li>复杂grok&#x2F;regex解析</li><li>日期时间标准化</li><li>用户代理、地理位置等数据丰富</li><li>基于业务逻辑的字段计算和转换</li><li>多级插件链协同处理</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line">输入插件 → Filter A → Filter B → Filter C → 输出插件</span><br><span class="line"> ↓ ↓ ↓ ↓ ↓</span><br><span class="line"> 接收数据 → 清洗数据 → 增强数据 → 转换数据 → 发送数据</span><br><span class="line"></span><br><span class="line">顺序性：插件按配置顺序依次执行</span><br><span class="line">数据传递：每个插件接收上一步的输出作为输入</span><br><span class="line">增量处理：数据在链中逐步丰富和转换</span><br><span class="line">条件执行：某些插件可以基于数据内容决定是否执行</span><br><span class="line"></span><br><span class="line"># 举例说明</span><br><span class="line">原始日志</span><br><span class="line">192.168.1.100 - - [02/Apr/2026:11:45:32 +0800] &quot;GET /api/v1/users HTTP/1.1&quot; 200 1234 &quot;Mozilla/5.0&quot; &quot;http://example.com&quot;</span><br><span class="line"></span><br><span class="line">1.解析器parser</span><br><span class="line">将文本日志拆解为结构化字段</span><br><span class="line">client_ip: &quot;192.168.1.100&quot;</span><br><span class="line">timestamp: &quot;02/Apr/2026:11:45:32 +0800&quot;</span><br><span class="line">method: &quot;GET&quot;</span><br><span class="line">url: &quot;/api/v1/users&quot;</span><br><span class="line">status_code: &quot;200&quot;</span><br><span class="line">response_size: &quot;1234&quot;</span><br><span class="line">user_agent: &quot;Mozilla/5.0&quot;</span><br><span class="line">referrer: &quot;http://example.com&quot;</span><br><span class="line"></span><br><span class="line">2.日期处理插件Date</span><br><span class="line">将文本时间戳转换为标准化时间格式</span><br><span class="line">@timestamp: &quot;2026-04-02T03:45:32.000Z&quot;（UTC时间）</span><br><span class="line">移除原始的timestamp字段</span><br><span class="line"></span><br><span class="line">3.用户代理解析插件User Agent</span><br><span class="line">解析User-Agent字符串，提取设备信息</span><br><span class="line">browser: &#123;name: &quot;Chrome&quot;, version: &quot;120.0.0.0&quot;&#125;</span><br><span class="line">os: &#123;name: &quot;Windows&quot;, version: &quot;10&quot;&#125;</span><br><span class="line">device: &#123;type: &quot;desktop&quot;&#125;</span><br><span class="line"></span><br><span class="line">4.字段增强插件Record Transformer</span><br><span class="line">添加业务逻辑相关的派生字段</span><br><span class="line">api_version: &quot;v1&quot; # 从URL提取</span><br><span class="line">endpoint_category: &quot;users&quot; #从URL提取</span><br><span class="line">is_success: true # 基于status_code&gt;199且&lt;300</span><br><span class="line"></span><br><span class="line">5.地理位置插件（GeoIP）</span><br><span class="line">geo: &#123;country: &quot;中国&quot;, city: &quot;北京&quot;, coordinates: &#123;lat: 39.9042, lon: 116.4074&#125;&#125;</span><br><span class="line"></span><br><span class="line"># 其他高级特性</span><br><span class="line"># 条件执行</span><br><span class="line">插件链：解析器 → [条件]用户代理解析 → 地理位置 → 输出</span><br><span class="line">条件逻辑：</span><br><span class="line">- 如果`user_agent`字段存在 → 执行用户代理解析插件</span><br><span class="line">- 如果`client_ip`是公网IP → 执行地理位置插件 </span><br><span class="line">- 否则 → 跳过该插件</span><br><span class="line"></span><br><span class="line"># 分支处理</span><br><span class="line">状态码为5xx的错误日志 → 进入&quot;错误处理链&quot;（添加告警标记，发送到专门索引）</span><br><span class="line">状态码为2xx的成功日志 → 进入&quot;分析处理链&quot;（添加业务标签，发送到分析索引）</span><br><span class="line"></span><br><span class="line"># 并行处理</span><br><span class="line">分支A：解析URL结构</span><br><span class="line">分支B：分析User-Agent</span><br><span class="line">分支C：验证请求合法性</span><br><span class="line">聚合：合并所有结果</span><br><span class="line"></span><br><span class="line"># 插件链设计原则</span><br><span class="line">1. 失败率低的插件在前（避免后续插件白执行）</span><br><span class="line">2. 计算量小的插件在前（快速过滤无效数据）</span><br><span class="line">3. 必需的插件在前（确保基础字段存在）</span><br><span class="line">4. 可选插件在后（基于已有字段决定是否执行）</span><br></pre></td></tr></table></figure><h3 id="与logstash架构的对比"><a href="#与logstash架构的对比" class="headerlink" title="与logstash架构的对比"></a>与logstash架构的对比</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">Logstash：经典的“管道-过滤器”模型</span><br><span class="line">Input → Filter → Output</span><br><span class="line">核心思想：数据流过固定的三段式管道</span><br><span class="line">类比：工厂流水线，每个工位完成特定任务</span><br><span class="line">配置范式：集中式、声明式配置</span><br><span class="line"></span><br><span class="line">Fluentd：基于“标签路由”的插件链模型</span><br><span class="line">输入 → 路由决策 → 插件链A → 输出A</span><br><span class="line"> → 插件链B → 输出B</span><br><span class="line"> → 插件链C → 输出C</span><br><span class="line">核心思想：数据根据标签被路由到不同的处理链</span><br><span class="line">类比：快递分拣中心，按地址分发到不同处理线</span><br><span class="line">配置范式：分布式、路由式配置</span><br><span class="line"></span><br><span class="line">1.配置差异</span><br><span class="line">Logstash：在代码中表达路由逻辑（<span class="keyword">if</span> [<span class="built_in">type</span>] == <span class="string">&quot;nginx&quot;</span> &#123; ... &#125;）</span><br><span class="line">Fluentd：在结构中表达路由逻辑（&lt;match nginx.**&gt;）</span><br><span class="line"></span><br><span class="line">2.数据处理差异</span><br><span class="line">隔离性：Fluentd不同链间完全隔离，Logstash共享同一处理上下文</span><br><span class="line">并发性：Fluentd天然支持并行处理不同数据流</span><br><span class="line">故障域：Fluentd链间故障隔离更好</span><br><span class="line"></span><br><span class="line">3. 性能与资源特性</span><br><span class="line">Logstash：单点处理能力强，适合集中式日志处理</span><br><span class="line">Fluentd：资源效率高，适合云原生分布式环境</span><br><span class="line"></span><br><span class="line">4.错误处理</span><br><span class="line">Logstash：一个插件崩溃可能影响所有数据处理</span><br><span class="line">Fluentd：一个链故障通常不影响其他链</span><br><span class="line"></span><br><span class="line">5. 扩展与生态</span><br><span class="line">两者都强：Elasticsearch输出、文件输入、正则解析</span><br><span class="line">Logstash特强：复杂Grok模式、数据丰富化、协议解析</span><br><span class="line">Fluentd特强：K8s集成、容器日志、指标收集</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Fluentd数据清洗实践"><a href="#Fluentd数据清洗实践" class="headerlink" title="Fluentd数据清洗实践"></a><strong>Fluentd数据清洗实践</strong></h2><p>当前我的k8s环境日志来源包括：<br><strong>k8s组件日志</strong><br><strong>milvus 向量数据库组件日志<br>Prometheus及组件日志</strong></p><h3 id="fluent-bit分流日志"><a href="#fluent-bit分流日志" class="headerlink" title="fluent bit分流日志"></a><strong>fluent bit</strong>分流日志</h3><ul><li><strong>识别特征</strong>：容器名包含kindnet</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260402163520841.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"> filters: |</span><br><span class="line"> [FILTER]</span><br><span class="line"> Name kubernetes</span><br><span class="line"> Match kube.var.log.containers.*</span><br><span class="line"> Merge_Log On</span><br><span class="line"> Keep_Log Off</span><br><span class="line"></span><br><span class="line"> [FILTER]</span><br><span class="line"> Name rewrite_tag</span><br><span class="line"> Match kube.var.log.containers.*</span><br><span class="line"> Rule <span class="variable">$kubernetes</span>[<span class="string">&#x27;container_name&#x27;</span>] ^(kindnet-cni)$ kube.net.kindnet <span class="literal">false</span></span><br><span class="line"> <span class="comment"># container_name 匹配成功，则改标签为 kube.system.go.apiserver</span></span><br><span class="line"> <span class="comment"># false表示匹配到后，旧标签的数据就不再往下流了</span></span><br><span class="line"> <span class="comment"># 如果要区分Nginx</span></span><br><span class="line"> <span class="comment"># Rule $kubernetes[&#x27;container_name&#x27;] ^.*nginx.*$ kube.app.nginx false </span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">helm upgrade --install fluent-bit . -f ./values.yaml -n fluent</span><br></pre></td></tr></table></figure><h3 id="fluentd清洗kindnet日志"><a href="#fluentd清洗kindnet日志" class="headerlink" title="fluentd清洗kindnet日志"></a><strong>fluentd清洗</strong>kindnet<strong>日志</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加fluentd配置，使其直接打印出kindnet的日志</span></span><br><span class="line"> 02_output.conf: |-</span><br><span class="line"> &lt;match kube.net.kindnet&gt;</span><br><span class="line"> @<span class="built_in">type</span> stdout</span><br><span class="line"> &lt;/match&gt;</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">helm upgrade --install fluentd . -f ./values.yaml -n fluent</span><br><span class="line"></span><br><span class="line">可以看到日志的格式为：</span><br><span class="line">I0402 08:41:30.590752 1 main.go:297] Handling node with IPs: map[172.19.0.3:&#123;&#125;]</span><br><span class="line">↓</span><br><span class="line">level: I</span><br><span class="line">k8s_timestamp: 0402 08:41:30.590752</span><br><span class="line">pid: 1</span><br><span class="line">source_file: main.go</span><br><span class="line">line: 297</span><br><span class="line">message: Handling node with IPs: map[172.19.0.3:&#123;&#125;]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加fluentd配置（Ruby DSL 语法）</span></span><br><span class="line">01_filter.conf: |-</span><br><span class="line"> <span class="comment"># 数据清洗，expression使用正则将整句文本进行拆解，grok插件最终也会转化成正则</span></span><br><span class="line"> &lt;filter kube.net.kindnet&gt;</span><br><span class="line"> @<span class="built_in">type</span> parser</span><br><span class="line"> key_name <span class="built_in">log</span> <span class="comment"># 指定要对哪个字段进行正则拆解</span></span><br><span class="line"> reserve_data <span class="literal">true</span> <span class="comment"># 保留原有的kubernetes元数据字段</span></span><br><span class="line"> remove_key_name_field <span class="literal">true</span> <span class="comment"># 解析成功后，删除原始的log字符串</span></span><br><span class="line"> &lt;parse&gt;</span><br><span class="line"> @<span class="built_in">type</span> regexp</span><br><span class="line"> expression /^(?&lt;level&gt;[IWEF])(?&lt;<span class="built_in">date</span>&gt;\d&#123;4&#125;)\s+(?&lt;time&gt;\d&#123;2&#125;:\d&#123;2&#125;:\d&#123;2&#125;\.\d&#123;6&#125;)\s+(?&lt;pid&gt;\d+)\s+(?&lt;file&gt;[^:]+):(?&lt;line&gt;\d+)\]\s+(?&lt;message&gt;.*)$/</span><br><span class="line"> &lt;/parse&gt;</span><br><span class="line"> &lt;/filter&gt;</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 数据(写时)增强，将告警等级变具体</span></span><br><span class="line"> &lt;filter kube.net.kindnet&gt;</span><br><span class="line"> @<span class="built_in">type</span> record_transformer</span><br><span class="line"> enable_ruby <span class="literal">true</span></span><br><span class="line"> &lt;record&gt;</span><br><span class="line"> level_name <span class="variable">$&#123; &#123;&quot;I&quot;=&gt;&quot;INFO&quot;, &quot;W&quot;=&gt;&quot;WARN&quot;, &quot;E&quot;=&gt;&quot;ERROR&quot;, &quot;F&quot;=&gt;&quot;FATAL&quot;&#125;</span>[record[<span class="string">&quot;level&quot;</span>]] &#125;</span><br><span class="line"> clean_status <span class="string">&quot;success&quot;</span> <span class="comment"># 标记该记录已成功通过清洗逻辑</span></span><br><span class="line"> processed_at <span class="variable">$&#123;Time.now.to_s&#125;</span> <span class="comment"># 记录 Fluentd 正确处理这条日志的具体时间</span></span><br><span class="line"> processed_by <span class="string">&quot;fluentd-aio-cleaner&quot;</span> <span class="comment"># 记录处理这条日志的具体组件名称</span></span><br><span class="line"> &lt;/record&gt;</span><br><span class="line"> &lt;/filter&gt;</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 更新helm</span></span><br><span class="line">helm upgrade --install fluentd . -f ./values.yaml -n fluent</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新查看fluentd输出的日志</span></span><br><span class="line">2026-04-02 09:03:31.181201000 +0000 kube.net.kindnet: &#123;<span class="string">&quot;time&quot;</span>:<span class="string">&quot;2026-04-02T09:03:31.181227255Z&quot;</span>,<span class="string">&quot;stream&quot;</span>:<span class="string">&quot;stderr&quot;</span>,<span class="string">&quot;_p&quot;</span>:<span class="string">&quot;F&quot;</span>,<span class="string">&quot;kubernetes&quot;</span>:&#123;<span class="string">&quot;pod_name&quot;</span>:<span class="string">&quot;kindnet-dztmq&quot;</span>,<span class="string">&quot;namespace_name&quot;</span>:<span class="string">&quot;kube-system&quot;</span>,<span class="string">&quot;pod_id&quot;</span>:<span class="string">&quot;e3df4eab-ac3b-41eb-9c50-86269927556f&quot;</span>,<span class="string">&quot;labels&quot;</span>:&#123;<span class="string">&quot;app&quot;</span>:<span class="string">&quot;kindnet&quot;</span>,<span class="string">&quot;controller-revision-hash&quot;</span>:<span class="string">&quot;5b49848c94&quot;</span>,<span class="string">&quot;k8s-app&quot;</span>:<span class="string">&quot;kindnet&quot;</span>,<span class="string">&quot;pod-template-generation&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;tier&quot;</span>:<span class="string">&quot;node&quot;</span>&#125;,<span class="string">&quot;host&quot;</span>:<span class="string">&quot;ws-k8s-worker2&quot;</span>,<span class="string">&quot;pod_ip&quot;</span>:<span class="string">&quot;172.19.0.3&quot;</span>,<span class="string">&quot;container_name&quot;</span>:<span class="string">&quot;kindnet-cni&quot;</span>,<span class="string">&quot;docker_id&quot;</span>:<span class="string">&quot;914c97f17227aaf4940bb038b409c46fe5a58b6429d362ca7408b55687a34ca0&quot;</span>,<span class="string">&quot;container_hash&quot;</span>:<span class="string">&quot;sha256:50415e5d05f05adbdfd902507532ebb86f924dc2e05511a3b47920156ee4236e&quot;</span>,<span class="string">&quot;container_image&quot;</span>:<span class="string">&quot;docker.io/kindest/kindnetd:v20241108-5c6d2daf&quot;</span>&#125;,<span class="string">&quot;level&quot;</span>:<span class="string">&quot;I&quot;</span>,<span class="string">&quot;date&quot;</span>:<span class="string">&quot;0402&quot;</span>,<span class="string">&quot;pid&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;file&quot;</span>:<span class="string">&quot;main.go&quot;</span>,<span class="string">&quot;line&quot;</span>:<span class="string">&quot;324&quot;</span>,<span class="string">&quot;message&quot;</span>:<span class="string">&quot;Node ws-k8s-worker has CIDR [10.244.1.0/24] &quot;</span>,<span class="string">&quot;level_name&quot;</span>:<span class="string">&quot;INFO&quot;</span>,<span class="string">&quot;clean_status&quot;</span>:<span class="string">&quot;success&quot;</span>,<span class="string">&quot;processed_at&quot;</span>:<span class="string">&quot;2026-04-02 09:03:31 +0000&quot;</span>,<span class="string">&quot;processed_by&quot;</span>:<span class="string">&quot;fluentd-aio-cleaner&quot;</span>&#125;</span><br></pre></td></tr></table></figure><table><thead><tr><th><strong>正则片段</strong></th><th><strong>匹配内容</strong></th><th><strong>示例结果 (JSON Key: Value)</strong></th></tr></thead><tbody><tr><td><code>^(?&lt;level&gt;[IWEF])</code></td><td>日志级别（首字母）</td><td><code>&quot;level&quot;: &quot;I&quot;</code></td></tr><tr><td><code>(?&lt;date&gt;\d&#123;4&#125;)</code></td><td>4位数字日期 (MMDD)</td><td><code>&quot;date&quot;: &quot;0402&quot;</code></td></tr><tr><td><code>\s+(?&lt;time&gt;...)</code></td><td>空格 + 详细时间戳</td><td><code>&quot;time&quot;: &quot;08:41:30.590752&quot;</code></td></tr><tr><td><code>\s+(?&lt;pid&gt;\d+)</code></td><td>空格 + 进程 ID</td><td><code>&quot;pid&quot;: &quot;1&quot;</code></td></tr><tr><td><code>\s+(?&lt;file&gt;[^:]+)</code></td><td>空格 + 文件名（直到冒号）</td><td><code>&quot;file&quot;: &quot;main.go&quot;</code></td></tr><tr><td><code>:(?&lt;line&gt;\d+)\]</code></td><td>冒号 + 行号 + 右中括号</td><td><code>&quot;line&quot;: &quot;297&quot;</code></td></tr><tr><td><code>\s+(?&lt;message&gt;.*)$</code></td><td>空格 + 剩下的所有消息内容</td><td><code>&quot;message&quot;: &quot;Handling node...&quot;</code></td></tr></tbody></table><h3 id="fluent-bit多行日志合并（未完成）"><a href="#fluent-bit多行日志合并（未完成）" class="headerlink" title="fluent bit多行日志合并（未完成）"></a>fluent bit多行日志合并（未完成）</h3><p>如果 kindnet 抛出一个 Go 的多行报错，现在的正则会失效（只能匹配到第一行）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">多行日志合并的重点是定义<span class="string">&quot;开始行&quot;</span></span><br><span class="line">开始行 (start_state)：匹配到这个模式，说明这是一个新的日志块</span><br><span class="line">后续行 (cont)：如果不匹配<span class="string">&quot;开始行&quot;</span>，就一直把内容追加到上一条日志里</span><br><span class="line"></span><br><span class="line">I0402 08:41:30.590752 1 main.go:297] Handling node with IPs: map[172.19.0.3:&#123;&#125;]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在 custom_parsers.conf 中定义解析器，让input中应用它</span></span><br><span class="line">custom_parsers.conf: |</span><br><span class="line"> [MULTILINE_PARSER]</span><br><span class="line"> name klog-multiline</span><br><span class="line"> <span class="built_in">type</span> regex</span><br><span class="line"> flush_timeout 1000</span><br><span class="line"> rule <span class="string">&quot;start_state&quot;</span> <span class="string">&quot;/^([IWEF])\d&#123;4&#125;/&quot;</span> <span class="string">&quot;cont&quot;</span></span><br><span class="line"> rule <span class="string">&quot;cont&quot;</span> <span class="string">&quot;/^(?![IWEF]\d&#123;4&#125;)/&quot;</span> <span class="string">&quot;cont&quot;</span></span><br><span class="line"><span class="comment"># 规则：匹配 I/W/E/F + 4位数字（如 I0402）。只要符合这个，就是新的一行</span></span><br><span class="line"><span class="comment"># 规则：如果不符合上面的开头，就属于持续行，继续合并</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># input使用新解析器</span></span><br><span class="line"> inputs: |</span><br><span class="line"> [INPUT]</span><br><span class="line"> Name <span class="built_in">tail</span></span><br><span class="line"> Path /var/log/containers/*.<span class="built_in">log</span></span><br><span class="line"> <span class="comment"># Kind 环境建议加上 DB 记录读取位点</span></span><br><span class="line"> DB /fluent-bit/tail_db.db</span><br><span class="line"> multiline.parser klog-multiline</span><br><span class="line"> Tag kube.*</span><br><span class="line"> Mem_Buf_Limit 50MB</span><br><span class="line"> Skip_Long_Lines On</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">kubectl <span class="built_in">exec</span> -it -n kube-system kindnet-dztmq -- sh</span><br><span class="line"><span class="comment"># 先写一行标准的开头（符合 start_state）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;I0403 09:40:00.123456 1 main.go:100] Standard log line&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 紧接着写几行不符合开头的（应该被合并进上一行）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot; This is a fake stacktrace line 1&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot; This is a fake stacktrace line 2&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 再写一行标准开头（触发上一条合并结束，开启新的一条）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;I0403 09:40:05.654321 1 main.go:101] New standard line&quot;</span></span><br><span class="line"></span><br><span class="line">但是没反应。。而且会导致fluentd解析错误，算了，这个需求再说吧</span><br></pre></td></tr></table></figure><h2 id="分析与清洗milvus数据库日志"><a href="#分析与清洗milvus数据库日志" class="headerlink" title="分析与清洗milvus数据库日志"></a>分析与清洗milvus数据库日志</h2><ul><li>配置fluent bit重定向tag，筛选出milvus相关的日志</li><li>配置fluentd将日志输出在控制台来调试，并查看日志格式</li><li>配置fluentd里针对该tag的日志格式，进行数据清洗和增强</li><li>根据清洗完成后的数据，定义es索引模板</li><li>如果milvus的多个服务日志格式不同，需要fluentd中进行路由处理</li></ul><h3 id="分析日志格式"><a href="#分析日志格式" class="headerlink" title="分析日志格式"></a><strong>分析日志格式</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">milvus组件我开启了下面这些，并观察日志格式</span><br><span class="line">milvus-datanode</span><br><span class="line">milvus-etcd</span><br><span class="line">milvus-mixcoord</span><br><span class="line">milvus-proxy</span><br><span class="line">milvus-querynode</span><br><span class="line"></span><br><span class="line">A类(etcd)：</span><br><span class="line">标准的JSON结构，包含 level, ts, <span class="built_in">caller</span>, msg</span><br><span class="line">&#123;<span class="string">&quot;level&quot;</span>:<span class="string">&quot;warn&quot;</span>,<span class="string">&quot;ts&quot;</span>:<span class="string">&quot;2026-04-03T06:13:12.304285Z&quot;</span>,<span class="string">&quot;caller&quot;</span>:<span class="string">&quot;v3rpc/interceptor.go:197&quot;</span>,<span class="string">&quot;msg&quot;</span>:<span class="string">&quot;request stats&quot;</span>,<span class="string">&quot;start time&quot;</span>:<span class="string">&quot;2026-04-03T06:13:11.902903Z&quot;</span>,<span class="string">&quot;time spent&quot;</span>:<span class="string">&quot;401.376037ms&quot;</span>,<span class="string">&quot;remote&quot;</span>:<span class="string">&quot;10.244.1.5:57238&quot;</span>,<span class="string">&quot;response type&quot;</span>:<span class="string">&quot;/etcdserverpb.Lease/LeaseRevoke&quot;</span>,<span class="string">&quot;request count&quot;</span>:-1,<span class="string">&quot;request size&quot;</span>:-1,<span class="string">&quot;response count&quot;</span>:-1,<span class="string">&quot;response size&quot;</span>:-1,<span class="string">&quot;request content&quot;</span>:<span class="string">&quot;&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line">B类：</span><br><span class="line">[时间戳] [级别] [文件名:行号] [<span class="string">&quot;消息内容&quot;</span>] [Key=Value 键值对]</span><br><span class="line">[2026/04/03 06:21:16.762 +00:00] [WARN] [balancer/balancer_impl.go:542] [<span class="string">&quot;fail to assign channel&quot;</span>] [module=streamingcoord] [component=balancer] [policy=vchannelFair] [assignment=by-dev-rootcoord-dml_5:rw@6445&gt;16@10.244.1.5:22222] [error=<span class="string">&quot;/milvus.proto.streaming.StreamingNodeManagerService/Assign; rpc error: code = DeadlineExceeded, desc = context deadline exceeded&quot;</span>]</span><br><span class="line"></span><br><span class="line">[2026/04/03 06:20:09.199 +00:00] [INFO] [resolver/resolver_with_discoverer.go:199] [<span class="string">&quot;update resolver done&quot;</span>] [component=grpc-resolver] [scheme=channel-assignment]</span><br></pre></td></tr></table></figure><h3 id="添加fluent-bit-tag分流"><a href="#添加fluent-bit-tag分流" class="headerlink" title="添加fluent bit tag分流"></a>添加fluent bit tag分流</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"> filters: |</span><br><span class="line"> [FILTER]</span><br><span class="line"> Name kubernetes</span><br><span class="line"> Match kube.var.log.containers.*</span><br><span class="line"> Merge_Log On</span><br><span class="line"> Keep_Log Off</span><br><span class="line"></span><br><span class="line"> [FILTER]</span><br><span class="line"> Name rewrite_tag</span><br><span class="line"> Match kube.var.log.containers.*</span><br><span class="line"> Rule <span class="variable">$kubernetes</span>[<span class="string">&#x27;container_name&#x27;</span>] ^(kindnet-cni)$ kube.net.kindnet <span class="literal">false</span></span><br><span class="line"> Rule <span class="variable">$kubernetes</span>[<span class="string">&#x27;container_name&#x27;</span>] ^(milvus-.*)$ milvus.<span class="variable">$1</span> <span class="literal">false</span></span><br><span class="line"> </span><br><span class="line"><span class="comment"># 添加fluent-bit调试</span></span><br><span class="line"> [OUTPUT]</span><br><span class="line"> Name stdout</span><br><span class="line"> Match *</span><br><span class="line"> Format json_lines</span><br><span class="line"></span><br><span class="line"><span class="comment"># 可以观察到Mlivus的日志格式与kindnet不一样</span></span><br><span class="line">&#123;<span class="string">&quot;date&quot;</span>:1775530768.779644,<span class="string">&quot;time&quot;</span>:<span class="string">&quot;2026-04-07T02:59:28.779643812Z&quot;</span>,<span class="string">&quot;stream&quot;</span>:<span class="string">&quot;stderr&quot;</span>,<span class="string">&quot;_p&quot;</span>:<span class="string">&quot;F&quot;</span>,<span class="string">&quot;log&quot;</span>:<span class="string">&quot;I0407 02:59:28.779423 1 main.go:301] handling current node&quot;</span>,<span class="string">&quot;kubernetes&quot;</span>:&#123;<span class="string">&quot;pod_name&quot;</span>:<span class="string">&quot;kindnet-nncxf&quot;</span>,<span class="string">&quot;namespace_name&quot;</span>:<span class="string">&quot;kube-system&quot;</span>,<span class="string">&quot;pod_id&quot;</span>:<span class="string">&quot;c725a431-7ed2-446d-b658-117b2db76821&quot;</span>,<span class="string">&quot;labels&quot;</span>:&#123;<span class="string">&quot;app&quot;</span>:<span class="string">&quot;kindnet&quot;</span>,<span class="string">&quot;controller-revision-hash&quot;</span>:<span class="string">&quot;5b49848c94&quot;</span>,<span class="string">&quot;k8s-app&quot;</span>:<span class="string">&quot;kindnet&quot;</span>,<span class="string">&quot;pod-template-generation&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;tier&quot;</span>:<span class="string">&quot;node&quot;</span>&#125;,<span class="string">&quot;host&quot;</span>:<span class="string">&quot;ws-k8s-worker&quot;</span>,<span class="string">&quot;pod_ip&quot;</span>:<span class="string">&quot;172.19.0.2&quot;</span>,<span class="string">&quot;container_name&quot;</span>:<span class="string">&quot;kindnet-cni&quot;</span>,<span class="string">&quot;docker_id&quot;</span>:<span class="string">&quot;21c44bc97879fdb3a7dfc68b081bbb502a5a38ac8dcc3d26dc719cd12fae144b&quot;</span>,<span class="string">&quot;container_hash&quot;</span>:<span class="string">&quot;sha256:50415e5d05f05adbdfd902507532ebb86f924dc2e05511a3b47920156ee4236e&quot;</span>,<span class="string">&quot;container_image&quot;</span>:<span class="string">&quot;docker.io/kindest/kindnetd:v20241108-5c6d2daf&quot;</span>&#125;&#125;</span><br><span class="line">↑这是kindnet的，<span class="string">&quot;container_name&quot;</span>:<span class="string">&quot;kindnet-cni&quot;</span></span><br><span class="line">↓这是Mlivus的，<span class="string">&quot;container_name&quot;</span>:<span class="string">&quot;mixcoord&quot;</span></span><br><span class="line">&#123;<span class="string">&quot;date&quot;</span>:1775530214.9856,<span class="string">&quot;time&quot;</span>:<span class="string">&quot;2026-04-07T02:50:14.985599656Z&quot;</span>,<span class="string">&quot;stream&quot;</span>:<span class="string">&quot;stdout&quot;</span>,<span class="string">&quot;_p&quot;</span>:<span class="string">&quot;F&quot;</span>,<span class="string">&quot;log&quot;</span>:<span class="string">&quot;[2026/04/07 02:50:14.784 +00:00] [INFO] [observers/collection_observer.go:319] [\&quot;observe all collections done\&quot;] [num=3] [dur=124.242\\u00b5s]&quot;</span>,<span class="string">&quot;kubernetes&quot;</span>:&#123;<span class="string">&quot;pod_name&quot;</span>:<span class="string">&quot;milvus-mixcoord-644ff7f6c-jjnxm&quot;</span>,<span class="string">&quot;namespace_name&quot;</span>:<span class="string">&quot;milvus&quot;</span>,<span class="string">&quot;pod_id&quot;</span>:<span class="string">&quot;e3216590-342e-497c-8e16-d3e54790f13c&quot;</span>,<span class="string">&quot;labels&quot;</span>:&#123;<span class="string">&quot;app.kubernetes.io/instance&quot;</span>:<span class="string">&quot;milvus&quot;</span>,<span class="string">&quot;app.kubernetes.io/name&quot;</span>:<span class="string">&quot;milvus&quot;</span>,<span class="string">&quot;component&quot;</span>:<span class="string">&quot;mixcoord&quot;</span>,<span class="string">&quot;pod-template-hash&quot;</span>:<span class="string">&quot;644ff7f6c&quot;</span>&#125;,<span class="string">&quot;annotations&quot;</span>:&#123;<span class="string">&quot;checksum/config&quot;</span>:<span class="string">&quot;3da19a518253dd9df639b082fc3b2c43da4e4c5bbf7c99ef3c8a7c60ecd35a39&quot;</span>&#125;,<span class="string">&quot;host&quot;</span>:<span class="string">&quot;ws-k8s-worker&quot;</span>,<span class="string">&quot;pod_ip&quot;</span>:<span class="string">&quot;10.244.1.9&quot;</span>,<span class="string">&quot;container_name&quot;</span>:<span class="string">&quot;mixcoord&quot;</span>,<span class="string">&quot;docker_id&quot;</span>:<span class="string">&quot;b85f3c15ca148ab5dcfa56b923349b9ce1d8a1909edf9899572d548d84e06e82&quot;</span>,<span class="string">&quot;container_hash&quot;</span>:<span class="string">&quot;docker.io/milvusdb/milvus@sha256:1db6370509d9eb8de6d5d0dfe3c1555810b422301a0830c7fe352a595fa377ed&quot;</span>,<span class="string">&quot;container_image&quot;</span>:<span class="string">&quot;docker.io/milvusdb/milvus:v2.6.11&quot;</span>&#125;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 所以B类的rule应该写成这样</span></span><br><span class="line">Rule <span class="variable">$kubernetes</span>[<span class="string">&#x27;container_name&#x27;</span>] ^(mixcoord|datanode|etcd|proxy|querynode|streamingnode|indexnode)$ milvus.<span class="variable">$1</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><h3 id="fluentd分流日志与数据清洗"><a href="#fluentd分流日志与数据清洗" class="headerlink" title="fluentd分流日志与数据清洗"></a>fluentd分流日志与数据清洗</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"># 将tag的日志显示在fluentd日志中</span><br><span class="line"><span class="number">02</span>_output.conf<span class="punctuation">:</span> |-</span><br><span class="line"> &lt;match milvus.**&gt;</span><br><span class="line"> @type stdout</span><br><span class="line"> &lt;/match&gt;</span><br><span class="line"></span><br><span class="line"># 可以看到已经tag标记出来了</span><br><span class="line"><span class="number">2026</span><span class="number">-04</span><span class="number">-07</span> <span class="number">03</span><span class="punctuation">:</span><span class="number">10</span><span class="punctuation">:</span><span class="number">51.585214297</span> +<span class="number">0000</span> milvus.mixcoord<span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="attr">&quot;time&quot;</span><span class="punctuation">:</span><span class="string">&quot;2026-04-07T03:10:51.585214297Z&quot;</span><span class="punctuation">,</span><span class="attr">&quot;stream&quot;</span><span class="punctuation">:</span><span class="string">&quot;stdout&quot;</span><span class="punctuation">,</span><span class="attr">&quot;_p&quot;</span><span class="punctuation">:</span><span class="string">&quot;F&quot;</span><span class="punctuation">,</span><span class="attr">&quot;log&quot;</span><span class="punctuation">:</span><span class="string">&quot;[2026/04/07 03:10:51.184 +00:00] [INFO] [observers/collection_observer.go:314] [\&quot;observe collection done\&quot;] [collectionID=465149880322646675] [dur=4.385µs]&quot;</span><span class="punctuation">,</span><span class="attr">&quot;kubernetes&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;pod_name&quot;</span><span class="punctuation">:</span><span class="string">&quot;milvus-mixcoord-644ff7f6c-jjnxm&quot;</span><span class="punctuation">,</span><span class="attr">&quot;namespace_name&quot;</span><span class="punctuation">:</span><span class="string">&quot;milvus&quot;</span><span class="punctuation">,</span><span class="attr">&quot;pod_id&quot;</span><span class="punctuation">:</span><span class="string">&quot;e3216590-342e-497c-8e16-d3e54790f13c&quot;</span><span class="punctuation">,</span><span class="attr">&quot;labels&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;app.kubernetes.io/instance&quot;</span><span class="punctuation">:</span><span class="string">&quot;milvus&quot;</span><span class="punctuation">,</span><span class="attr">&quot;app.kubernetes.io/name&quot;</span><span class="punctuation">:</span><span class="string">&quot;milvus&quot;</span><span class="punctuation">,</span><span class="attr">&quot;component&quot;</span><span class="punctuation">:</span><span class="string">&quot;mixcoord&quot;</span><span class="punctuation">,</span><span class="attr">&quot;pod-template-hash&quot;</span><span class="punctuation">:</span><span class="string">&quot;644ff7f6c&quot;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span><span class="attr">&quot;annotations&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;checksum/config&quot;</span><span class="punctuation">:</span><span class="string">&quot;3da19a518253dd9df639b082fc3b2c43da4e4c5bbf7c99ef3c8a7c60ecd35a39&quot;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span><span class="attr">&quot;host&quot;</span><span class="punctuation">:</span><span class="string">&quot;ws-k8s-worker&quot;</span><span class="punctuation">,</span><span class="attr">&quot;pod_ip&quot;</span><span class="punctuation">:</span><span class="string">&quot;10.244.1.9&quot;</span><span class="punctuation">,</span><span class="attr">&quot;container_name&quot;</span><span class="punctuation">:</span><span class="string">&quot;mixcoord&quot;</span><span class="punctuation">,</span><span class="attr">&quot;docker_id&quot;</span><span class="punctuation">:</span><span class="string">&quot;b85f3c15ca148ab5dcfa56b923349b9ce1d8a1909edf9899572d548d84e06e82&quot;</span><span class="punctuation">,</span><span class="attr">&quot;container_hash&quot;</span><span class="punctuation">:</span><span class="string">&quot;docker.io/milvusdb/milvus@sha256:1db6370509d9eb8de6d5d0dfe3c1555810b422301a0830c7fe352a595fa377ed&quot;</span><span class="punctuation">,</span><span class="attr">&quot;container_image&quot;</span><span class="punctuation">:</span><span class="string">&quot;docker.io/milvusdb/milvus:v2.6.11&quot;</span><span class="punctuation">&#125;</span><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"># 清洗这些日志</span><br><span class="line">&lt;filter milvus.<span class="punctuation">&#123;</span>streamingnode<span class="punctuation">,</span>mixcoord<span class="punctuation">,</span>datanode<span class="punctuation">,</span>querynode<span class="punctuation">,</span>indexnode<span class="punctuation">,</span>proxy<span class="punctuation">,</span>rootcoord<span class="punctuation">&#125;</span>&gt;</span><br><span class="line"> @type parser</span><br><span class="line"> key_name log</span><br><span class="line"> reserve_data <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"> remove_key_name_field <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"> &lt;parse&gt;</span><br><span class="line"> @type regexp</span><br><span class="line"> expression /^\<span class="punctuation">[</span>(?&lt;timestamp&gt;\d<span class="punctuation">&#123;</span><span class="number">4</span><span class="punctuation">&#125;</span>\/\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span>\/\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span> \d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span><span class="punctuation">:</span>\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span><span class="punctuation">:</span>\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span>\.\d<span class="punctuation">&#123;</span><span class="number">3</span><span class="punctuation">&#125;</span> \+\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span><span class="punctuation">:</span>\d<span class="punctuation">&#123;</span><span class="number">2</span><span class="punctuation">&#125;</span>)\<span class="punctuation">]</span> \<span class="punctuation">[</span>(?&lt;level&gt;<span class="punctuation">[</span>A-Z<span class="punctuation">]</span>+)\<span class="punctuation">]</span> \<span class="punctuation">[</span>(?&lt;file&gt;<span class="punctuation">[</span>^\<span class="punctuation">]</span><span class="punctuation">]</span>+)\<span class="punctuation">]</span> \<span class="punctuation">[</span>(?&lt;message&gt;<span class="string">&quot;[^&quot;</span><span class="punctuation">]</span>*<span class="string">&quot;)\](?&lt;kv_block&gt;(?: \[[^\]]+\])*)$/</span></span><br><span class="line"><span class="string"> &lt;/parse&gt;</span></span><br><span class="line"><span class="string">&lt;/filter&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># 查看日志</span></span><br><span class="line"><span class="string">2026-04-07 04:07:21.048175513 +0000 milvus.mixcoord: &#123;&quot;</span>time<span class="string">&quot;:&quot;</span><span class="number">2026</span><span class="number">-04</span><span class="number">-07</span>T04<span class="punctuation">:</span><span class="number">07</span><span class="punctuation">:</span><span class="number">20.387864605</span>Z<span class="string">&quot;,&quot;</span>stream<span class="string">&quot;:&quot;</span>stdout<span class="string">&quot;,&quot;</span>_p<span class="string">&quot;:&quot;</span>F<span class="string">&quot;,&quot;</span>kubernetes<span class="string">&quot;:&#123;&quot;</span>pod_name<span class="string">&quot;:&quot;</span>milvus-mixcoord<span class="number">-644</span>ff7f6c-jjnxm<span class="string">&quot;,&quot;</span>namespace_name<span class="string">&quot;:&quot;</span>milvus<span class="string">&quot;,&quot;</span>pod_id<span class="string">&quot;:&quot;</span>e3216590<span class="number">-342e-497</span>c<span class="number">-8e16</span>-d3e54790f13c<span class="string">&quot;,&quot;</span>labels<span class="string">&quot;:&#123;&quot;</span>app.kubernetes.io/instance<span class="string">&quot;:&quot;</span>milvus<span class="string">&quot;,&quot;</span>app.kubernetes.io/name<span class="string">&quot;:&quot;</span>milvus<span class="string">&quot;,&quot;</span>component<span class="string">&quot;:&quot;</span>mixcoord<span class="string">&quot;,&quot;</span>pod-template-hash<span class="string">&quot;:&quot;</span><span class="number">644</span>ff7f6c<span class="string">&quot;&#125;,&quot;</span>annotations<span class="string">&quot;:&#123;&quot;</span>checksum/config<span class="string">&quot;:&quot;</span><span class="number">3</span>da19a518253dd9df639b082fc3b2c43da4e4c5bbf7c99ef3c8a7c60ecd35a39<span class="string">&quot;&#125;,&quot;</span>host<span class="string">&quot;:&quot;</span>ws-k8s-worker<span class="string">&quot;,&quot;</span>pod_ip<span class="string">&quot;:&quot;</span><span class="number">10.244</span><span class="number">.1</span><span class="number">.9</span><span class="string">&quot;,&quot;</span>container_name<span class="string">&quot;:&quot;</span>mixcoord<span class="string">&quot;,&quot;</span>docker_id<span class="string">&quot;:&quot;</span>b85f3c15ca148ab5dcfa56b923349b9ce1d8a1909edf9899572d548d84e06e82<span class="string">&quot;,&quot;</span>container_hash<span class="string">&quot;:&quot;</span>docker.io/milvusdb/milvus@sha256<span class="punctuation">:</span><span class="number">1</span>db6370509d9eb8de6d5d0dfe3c1555810b422301a0830c7fe352a595fa377ed<span class="string">&quot;,&quot;</span>container_image<span class="string">&quot;:&quot;</span>docker.io/milvusdb/milvus<span class="punctuation">:</span>v2<span class="number">.6</span><span class="number">.11</span><span class="string">&quot;&#125;,&quot;</span>timestamp<span class="string">&quot;:&quot;</span><span class="number">2026</span>/<span class="number">04</span>/<span class="number">07</span> <span class="number">04</span><span class="punctuation">:</span><span class="number">07</span><span class="punctuation">:</span><span class="number">19.985</span> +<span class="number">00</span><span class="punctuation">:</span><span class="number">00</span><span class="string">&quot;,&quot;</span>level<span class="string">&quot;:&quot;</span>INFO<span class="string">&quot;,&quot;</span>file<span class="string">&quot;:&quot;</span>observers/collection_observer.go<span class="punctuation">:</span><span class="number">314</span><span class="string">&quot;,&quot;</span>message<span class="string">&quot;:&quot;</span>\<span class="string">&quot;observe collection done\&quot;&quot;</span><span class="punctuation">,</span><span class="attr">&quot;kv_block&quot;</span><span class="punctuation">:</span><span class="string">&quot; [collectionID=465149880321444020] [dur=9.228µs]&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>本来还想做数据强转和数据增强的，算了有点搞不明白ruby</p><h3 id="转发es与创建索引"><a href="#转发es与创建索引" class="headerlink" title="转发es与创建索引"></a>转发es与创建索引</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"> &lt;match milvus.**&gt;</span><br><span class="line"> @type elasticsearch</span><br><span class="line"> host <span class="string">&quot;192.168.10.100&quot;</span></span><br><span class="line"> port <span class="number">9200</span></span><br><span class="line"> scheme https</span><br><span class="line"> ssl_verify <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> user elastic</span><br><span class="line"> password <span class="string">&quot;123456&quot;</span></span><br><span class="line"> logstash_format <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"> logstash_prefix <span class="string">&quot;milvus&quot;</span></span><br><span class="line"> &lt;/match&gt;</span><br><span class="line"></span><br><span class="line">PUT _index_template/milvus_logs_template</span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;index_patterns&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;milvus-*&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;priority&quot;</span><span class="punctuation">:</span> <span class="number">100</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;template&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;index.number_of_shards&quot;</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;index.number_of_replicas&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;index.refresh_interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;10s&quot;</span></span><br><span class="line"> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;properties&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;@timestamp&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;date&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;timestamp&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;log_level&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;analyzer&quot;</span><span class="punctuation">:</span> <span class="string">&quot;standard&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;file&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;kv_block&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;processed&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;kubernetes&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;properties&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;pod_name&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;namespace_name&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;container_name&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">查看索引是否已经正确写入</span><br><span class="line">GET _cat/indices/milvus-*</span><br><span class="line">green open milvus<span class="number">-2026.04</span><span class="number">.07</span> TadupvsOTjWBdaU5cLg2oQ <span class="number">1</span> <span class="number">0</span> <span class="number">20256</span> <span class="number">0</span> <span class="number">4.6</span>mb <span class="number">4.6</span>mb <span class="number">4.6</span>mb</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/03/Elastic-8/</id>
    <link href="https://akemi.zj.cn/2026/04/03/Elastic-8/"/>
    <published>2026-04-03T08:46:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="Fluentd数据处理模型理论深入"><a href="#Fluentd数据处理模型理论深入" class="headerlink" title="Fluentd数据处理模型理论深入"></a><strong>Fluentd数据处理模型理论深入</strong></h2><h3 id="tag与多级tag"><a href="#tag与多级tag"]]>
    </summary>
    <title>两周复习EFK第八天之Fluentd+Fluent Bit数据清洗</title>
    <updated>2026-04-07T07:03:44.534Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="EFK" scheme="https://akemi.zj.cn/tags/EFK/"/>
    <category term="Fluentd" scheme="https://akemi.zj.cn/tags/Fluentd/"/>
    <category term="Fluent Bit" scheme="https://akemi.zj.cn/tags/Fluent-Bit/"/>
    <content>
      <![CDATA[<table><thead><tr><th><strong>特性</strong></th><th><strong>Logstash (ELK)</strong></th><th><strong>Fluent Bit (EFK)</strong></th></tr></thead><tbody><tr><td><strong>开发语言</strong></td><td>JRuby (依赖 JVM，内存大户)</td><td>C (极度轻量，几 MB 内存)</td></tr><tr><td><strong>配置风格</strong></td><td>三段式 (Input&#x2F;Filter&#x2F;Output)</td><td>插件化配置，更模块化</td></tr><tr><td><strong>生态地位</strong></td><td>传统的企业级日志中心</td><td>云原生、K8s、嵌入式设备的首选</td></tr><tr><td><strong>处理能力</strong></td><td>插件极其丰富，处理逻辑极强</td><td>偏重转发，逻辑相对简单</td></tr></tbody></table><p><strong>Fluent Bit + Fluentd的配合</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">1.Fluent Bit</span><br><span class="line">在 K8s 每一个节点（Node）上以 DaemonSet 方式运行</span><br><span class="line">把容器产生的各种标准输出、系统日志快速抓取出来</span><br><span class="line">不进行复杂的清洗，直接把原始数据转发出去</span><br><span class="line"></span><br><span class="line">2.Fluentd</span><br><span class="line">作为集群中独立的Deployment运行</span><br><span class="line">接收来自几十个节点上 Fluent Bit 发来的数据。在这里进行深度加工：利用丰富的插件进行 Grok 解析、字段重命名、甚至去调个外部 API 补全信息。处理完后，再写入 Elasticsearch。</span><br><span class="line"></span><br><span class="line">Fluentd/Fluent Bit 最大的特色是 <span class="strong">**Tag（标签）路由**</span>。</span><br><span class="line"><span class="bullet">-</span> 给 SSH 日志打上 <span class="code">`auth.ssh`</span> 标签。</span><br><span class="line"><span class="bullet">-</span> 给 Nginx 日志打上 <span class="code">`web.nginx`</span> 标签。</span><br><span class="line"><span class="bullet">-</span> 在 <span class="code">`[OUTPUT]`</span> 块中通过 <span class="code">`Match auth.*`</span> 或是 <span class="code">`Match web.*`</span> 实现精准转发。这比 Logstash 的 <span class="code">`if [type] == &quot;xxx&quot;`</span> 逻辑更高效</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Helm部署Fluentd"><a href="#Helm部署Fluentd" class="headerlink" title="Helm部署Fluentd"></a>Helm部署Fluentd</h2><p>参考文档：<a href="https://artifacthub.io/packages/helm/fluent/fluentd">https://artifacthub.io/packages/helm/fluent/fluentd</a></p><p><a href="https://github.com/fluent/helm-charts">https://github.com/fluent/helm-charts</a></p><p>因为我们是helm糕手，所以不直接部署，我们直接拉下来看values变量文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加仓库</span></span><br><span class="line">helm repo add fluent https://fluent.github.io/helm-charts/</span><br><span class="line"><span class="built_in">unset</span> http_proxy</span><br><span class="line"><span class="built_in">unset</span> https_proxy</span><br><span class="line">helm repo update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 看下用哪个版本</span></span><br><span class="line">helm search repo fluent/fluentd --versions</span><br><span class="line">NAME CHART VERSION APP VERSION DESCRIPTION</span><br><span class="line">fluent/fluentd 0.5.3 v1.17.1 A Helm chart <span class="keyword">for</span> Kubernetes</span><br><span class="line">fluent/fluentd 0.5.2 v1.16.2 A Helm chart <span class="keyword">for</span> Kubernetes</span><br><span class="line">fluent/fluentd 0.5.1 v1.16.2 A Helm chart <span class="keyword">for</span> Kubernetes</span><br><span class="line">fluent/fluentd 0.5.0 v1.16.2 A Helm chart <span class="keyword">for</span> Kubernetes</span><br><span class="line"></span><br><span class="line"><span class="comment"># 最新的0.5.3版本已经是2025年出的了，所以用这个</span></span><br><span class="line">helm pull fluent/fluentd --version 0.5.3 --untar</span><br><span class="line"><span class="built_in">cd</span> fluentd/</span><br></pre></td></tr></table></figure><h3 id="变量文件参数说明"><a href="#变量文件参数说明" class="headerlink" title="变量文件参数说明"></a><strong>变量文件参数说明</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 变化</span></span><br><span class="line">variant: elasticsearch8</span><br><span class="line"><span class="comment"># 默认DaemonSet 模式，可选聚合模式（Deployment/StatefulSet），接收Fluent Bit的日志</span></span><br><span class="line">kind: <span class="string">&quot;DaemonSet&quot;</span></span><br><span class="line"></span><br><span class="line">metrics: <span class="comment"># prometheus的相关配置，默认关闭</span></span><br><span class="line"> serviceMonitor:...</span><br><span class="line"> prometheusRule:...</span><br><span class="line"></span><br><span class="line"><span class="comment"># fluent引入外置插件的字段</span></span><br><span class="line">plugins: []</span><br><span class="line"><span class="comment"># - fluent-plugin-out-http</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 引用集群中已经存在的、非Helm维护的ConfigMap</span></span><br><span class="line">configMapConfigs: []</span><br><span class="line"><span class="comment"># - fluentd-prometheus-conf</span></span><br><span class="line"><span class="comment"># - fluentd-systemd-conf</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Fluentd配置文件内部定义</span></span><br><span class="line">fileConfigs:</span><br><span class="line"> 01_sources.conf: |-</span><br><span class="line"> <span class="comment">## logs from podman</span></span><br><span class="line"> &lt;<span class="built_in">source</span>&gt;</span><br><span class="line"> @<span class="built_in">type</span> <span class="built_in">tail</span></span><br><span class="line"> ...</span><br></pre></td></tr></table></figure><h3 id="调整配置与部署Fluentd"><a href="#调整配置与部署Fluentd" class="headerlink" title="调整配置与部署Fluentd"></a>调整配置与部署Fluentd</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">修改</span></span><br><span class="line"><span class="attr">variant:</span> <span class="string">elasticsearch8</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">&quot;Deployment&quot;</span></span><br><span class="line"><span class="string">...</span></span><br><span class="line"><span class="comment"># 新增转发的service，默认只有一个metrics的</span></span><br><span class="line"><span class="attr">service:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">&quot;ClusterIP&quot;</span></span><br><span class="line"> <span class="attr">annotations:</span> &#123;&#125;</span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">&quot;forwarder&quot;</span></span><br><span class="line"> <span class="attr">protocol:</span> <span class="string">TCP</span></span><br><span class="line"> <span class="attr">containerPort:</span> <span class="number">24224</span></span><br><span class="line"></span><br><span class="line"><span class="attr">fileConfigs:</span></span><br><span class="line"> <span class="attr">00_monitoring.conf:</span> <span class="string">|-</span></span><br><span class="line"><span class="string"> # 监控插件的主入口</span></span><br><span class="line"><span class="string"> &lt;source&gt;</span></span><br><span class="line"><span class="string"> @type prometheus</span></span><br><span class="line"><span class="string"> bind 0.0.0.0</span></span><br><span class="line"><span class="string"> port 24231</span></span><br><span class="line"><span class="string"> metrics_path /metrics</span></span><br><span class="line"><span class="string"> &lt;/source&gt;</span></span><br><span class="line"><span class="string"></span> </span><br><span class="line"> <span class="comment"># 监控 Fluentd 自身的 input/output 指标</span></span><br><span class="line"> <span class="string">&lt;source&gt;</span></span><br><span class="line"> <span class="string">@type</span> <span class="string">prometheus_monitor</span></span><br><span class="line"> <span class="string">interval</span> <span class="string">10s</span></span><br><span class="line"> <span class="string">&lt;/source&gt;</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 监控输出端（ES）的写入情况</span></span><br><span class="line"> <span class="string">&lt;source&gt;</span></span><br><span class="line"> <span class="string">@type</span> <span class="string">prometheus_output_monitor</span></span><br><span class="line"> <span class="string">interval</span> <span class="string">10s</span></span><br><span class="line"> <span class="string">&lt;/source&gt;</span></span><br><span class="line"> <span class="attr">01_input.conf:</span> <span class="string">|-</span></span><br><span class="line"><span class="string"> &lt;source&gt;</span></span><br><span class="line"><span class="string"> @type forward</span></span><br><span class="line"><span class="string"> port 24224</span></span><br><span class="line"><span class="string"> bind 0.0.0.0</span></span><br><span class="line"><span class="string"> &lt;/source&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="attr">02_output.conf:</span> <span class="string">|-</span></span><br><span class="line"><span class="string"> &lt;match **&gt;</span></span><br><span class="line"><span class="string"> @type elasticsearch</span></span><br><span class="line"><span class="string"> host &quot;192.168.10.100&quot;</span></span><br><span class="line"><span class="string"> port 9200</span></span><br><span class="line"><span class="string"> scheme https</span></span><br><span class="line"><span class="string"> ssl_verify false</span></span><br><span class="line"><span class="string"> user elastic</span></span><br><span class="line"><span class="string"> password &quot;123456&quot;</span></span><br><span class="line"><span class="string"> logstash_format true</span></span><br><span class="line"><span class="string"> logstash_prefix &quot;kind-logs&quot;</span></span><br><span class="line"><span class="string"> &lt;/match&gt;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="comment"># 部署helm</span></span><br><span class="line"><span class="string">kubectl</span> <span class="string">create</span> <span class="string">ns</span> <span class="string">fluent</span></span><br><span class="line"><span class="string">helm</span> <span class="string">upgrade</span> <span class="string">--install</span> <span class="string">fluentd</span> <span class="string">.</span> <span class="string">-f</span> <span class="string">./values.yaml</span> <span class="string">-n</span> <span class="string">fluent</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Helm部署Fluent-Bit"><a href="#Helm部署Fluent-Bit" class="headerlink" title="Helm部署Fluent Bit"></a>Helm部署Fluent Bit</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">helm search repo fluent/fluent-bit --versions</span><br><span class="line">NAME CHART VERSION APP VERSION DESCRIPTION </span><br><span class="line">fluent/fluent-bit 0.57.0 5.0.0 Fast and lightweight <span class="built_in">log</span> processor and forwarde...</span><br><span class="line">fluent/fluent-bit 0.56.0 4.2.3 Fast and lightweight <span class="built_in">log</span> processor and forwarde...</span><br><span class="line">fluent/fluent-bit 0.55.1 4.2.3 Fast and lightweight <span class="built_in">log</span> processor and forwarde...</span><br><span class="line">fluent/fluent-bit 0.55.0 4.2.2 Fast and lightweight <span class="built_in">log</span> processor and forwarde...</span><br><span class="line"></span><br><span class="line">helm pull fluent/fluent-bit --version 0.57.0 --untar</span><br><span class="line"><span class="built_in">cd</span> fluent-bit/</span><br></pre></td></tr></table></figure><h3 id="变量文件参数说明-1"><a href="#变量文件参数说明-1" class="headerlink" title="变量文件参数说明"></a><strong>变量文件参数说明</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 核心配置</span></span><br><span class="line">config:</span><br><span class="line"> service:</span><br><span class="line"> inputs:</span><br><span class="line"> filters:</span><br><span class="line"> outputs:</span><br><span class="line"> customParsers:</span><br><span class="line"> </span><br><span class="line">[SERVICE]：全局配置</span><br><span class="line">Flush 数据冲刷周期，1秒</span><br><span class="line">Parsers_File 子配置文件位置</span><br><span class="line">HTTP_Server/Health_Check：开启监控</span><br><span class="line"></span><br><span class="line">[INPUT]：数据源</span><br><span class="line">Name 插件名称（<span class="built_in">tail</span>插件、systemd插件）</span><br><span class="line">Path 数据源位置</span><br><span class="line">Tag 给数据打tag</span><br><span class="line">multiline.parser docker, cri 用解析器剥离容器运行时的JSON封装</span><br><span class="line">Systemd_Filter 过滤某个systemd-service</span><br><span class="line"></span><br><span class="line">[FILTER]：过滤器</span><br><span class="line">Name kubernetes 启用Kubernetes元数据过滤器</span><br><span class="line">Match kube.* 仅作用于tag以 kube. 开头的日志记录</span><br><span class="line">Merge_Log On 解析为JSON</span><br><span class="line">Keep_Log Off 删除原<span class="built_in">log</span></span><br><span class="line">K8S-Logging.Parser On 启用基于Pod注解的解析</span><br><span class="line">K8S-Logging.Exclude On 注解fluentbit.io/exclude: <span class="string">&quot;true&quot;</span> 则该 Pod 的所有日志都会被丢弃</span><br><span class="line"></span><br><span class="line">[OUTPUT]:</span><br><span class="line">Name es：使用 Elasticsearch 输出插件。</span><br><span class="line">Match kube.*：仅处理标签以 kube. 开头的日志</span><br><span class="line">Host elasticsearch-master：Elasticsearch 服务的地址</span><br><span class="line">Logstash_Format On：启用 Logstash 风格的索引命名例如 logstash-2026.03.31）</span><br><span class="line">Retry_Limit False：重试次数不设限</span><br><span class="line"></span><br><span class="line">Match host.*：处理标签以 host.开头的日志，即systemd的主机日志</span><br><span class="line">Logstash_Prefix node 自定义索引前缀，例如 node-2026.03.31</span><br><span class="line"></span><br><span class="line">[PARSER]: 格式转换器</span><br><span class="line">Name docker_no_time 解析器的名称，供其他配置</span><br><span class="line">Format json</span><br><span class="line">Time_Keep Off 关闭日志自带的时间戳</span><br><span class="line">Time_Format %Y-%m-%dT%H:%M:%S.%L 定义时间戳的解析格式</span><br></pre></td></tr></table></figure><h3 id="调整配置与部署Fluent-bit"><a href="#调整配置与部署Fluent-bit" class="headerlink" title="调整配置与部署Fluent bit"></a>调整配置与部署Fluent bit</h3><p>正常fluent bit会从容器日志和systemd两种方式获取日志（默认配置）</p><p>但我这里是kind部署的k8s，所以只要用tail插件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">extraVolumes:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">varlog</span></span><br><span class="line"> <span class="attr">hostPath:</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">/var/log</span></span><br><span class="line"><span class="attr">extraVolumeMounts:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">varlog</span></span><br><span class="line"> <span class="attr">mountPath:</span> <span class="string">/var/log</span></span><br><span class="line"> <span class="attr">readOnly:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ↑这部分不需要，fluent-bit官方已经加好了</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">config:</span></span><br><span class="line"> <span class="attr">service:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> [SERVICE]</span></span><br><span class="line"><span class="string"> Daemon Off</span></span><br><span class="line"><span class="string"> Flush &#123;&#123; .Values.flush &#125;&#125;</span></span><br><span class="line"><span class="string"> Log_Level &#123;&#123; .Values.logLevel &#125;&#125;</span></span><br><span class="line"><span class="string"> Parsers_File /fluent-bit/etc/parsers.conf</span></span><br><span class="line"><span class="string"> Parsers_File /fluent-bit/etc/conf/custom_parsers.conf</span></span><br><span class="line"><span class="string"> HTTP_Server On</span></span><br><span class="line"><span class="string"> HTTP_Listen 0.0.0.0</span></span><br><span class="line"><span class="string"> HTTP_Port &#123;&#123; .Values.metricsPort &#125;&#125;</span></span><br><span class="line"><span class="string"> Health_Check On</span></span><br><span class="line"><span class="string"></span> </span><br><span class="line"> </span><br><span class="line"> <span class="attr">inputs:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> [INPUT]</span></span><br><span class="line"><span class="string"> Name tail</span></span><br><span class="line"><span class="string"> Path /var/log/containers/*.log</span></span><br><span class="line"><span class="string"> # Kind 环境建议加上 DB 记录读取位点</span></span><br><span class="line"><span class="string"> DB /fluent-bit/tail_db.db</span></span><br><span class="line"><span class="string"> multiline.parser docker, cri</span></span><br><span class="line"><span class="string"> Tag kube.*</span></span><br><span class="line"><span class="string"> # 日志缓冲区，因为积压的日志有点多</span></span><br><span class="line"><span class="string"> Mem_Buf_Limit 50MB</span></span><br><span class="line"><span class="string"> Skip_Long_Lines On</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="attr">filters:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> [FILTER]</span></span><br><span class="line"><span class="string"> Name kubernetes</span></span><br><span class="line"><span class="string"> Match kube.*</span></span><br><span class="line"><span class="string"> Merge_Log On</span></span><br><span class="line"><span class="string"> Keep_Log Off</span></span><br><span class="line"><span class="string"> K8S-Logging.Parser On</span></span><br><span class="line"><span class="string"> K8S-Logging.Exclude On</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="comment"># 修改 outputs：由直连 ES 改为转发 Fluentd</span></span><br><span class="line"> <span class="attr">outputs:</span> <span class="string">|</span></span><br><span class="line"><span class="string"> [OUTPUT]</span></span><br><span class="line"><span class="string"> Name forward</span></span><br><span class="line"><span class="string"> Match *</span></span><br><span class="line"><span class="string"> Host fluentd.fluent.svc.cluster.local</span></span><br><span class="line"><span class="string"> Port 24224</span></span><br><span class="line"><span class="string"> # 开启连接重试</span></span><br><span class="line"><span class="string"> Retry_Limit False</span></span><br><span class="line"><span class="string"> # 开启网络保持</span></span><br><span class="line"><span class="string"> net.keepalive On</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> </span><br><span class="line"><span class="comment"># helm部署</span></span><br><span class="line"><span class="string">helm</span> <span class="string">upgrade</span> <span class="string">--install</span> <span class="string">fluent-bit</span> <span class="string">.</span> <span class="string">-f</span> <span class="string">./values.yaml</span> <span class="string">-n</span> <span class="string">fluent</span></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260401174519980.png"></p><h2 id="定义索引模板"><a href="#定义索引模板" class="headerlink" title="定义索引模板"></a>定义索引模板</h2><p>现在数据已经发给es了，但是在这个搭建的流程中，没有通过grok来提取字段，在es中也没有专门为这条fluent bit+fluentd的路径定义索引模板</p><p>先搞个索引模板，让ES中可以看到它，等后面处理完数据，可以再进行完善</p><p><strong>fluent bit+fluentd的数据处理后面再说吧，今天太忙了，好累。</strong></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 用curl一眼数据结构，可以看到里面非常乱</span></span><br><span class="line"><span class="string">curl</span> <span class="string">-u</span> <span class="string">elastic:123456</span> <span class="string">-k</span> <span class="string">-X</span> <span class="string">GET</span> <span class="string">&quot;https://192.168.10.100:9200/kind-logs-*/_search?pretty&quot;</span> <span class="string">-H</span> <span class="string">&#x27;Content-Type: application/json&#x27;</span> <span class="string">-d&#x27;</span></span><br><span class="line">&#123;</span><br><span class="line"> <span class="attr">&quot;size&quot;:</span> <span class="number">1</span>,</span><br><span class="line"> <span class="attr">&quot;sort&quot;:</span> [&#123; <span class="string">&quot;@timestamp&quot;</span><span class="string">:</span> <span class="string">&quot;desc&quot;</span> &#125;]</span><br><span class="line">&#125;</span><br><span class="line"><span class="string">&#x27;</span></span><br><span class="line"><span class="string">&#123;</span></span><br><span class="line"><span class="string"> &quot;took&quot; : 16,</span></span><br><span class="line"><span class="string"> &quot;timed_out&quot; : false,</span></span><br><span class="line"><span class="string"> &quot;_shards&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;total&quot; : 1,</span></span><br><span class="line"><span class="string"> &quot;successful&quot; : 1,</span></span><br><span class="line"><span class="string"> &quot;skipped&quot; : 0,</span></span><br><span class="line"><span class="string"> &quot;failed&quot; : 0</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;hits&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;total&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;value&quot; : 1560,</span></span><br><span class="line"><span class="string"> &quot;relation&quot; : &quot;eq&quot;</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;max_score&quot; : null,</span></span><br><span class="line"><span class="string"> &quot;hits&quot; : [</span></span><br><span class="line"><span class="string"> &#123;</span></span><br><span class="line"><span class="string"> &quot;_index&quot; : &quot;kind-logs-2026.04.01&quot;,</span></span><br><span class="line"><span class="string"> &quot;_id&quot; : &quot;k3B3SJ0BhqMFurw_h4yK&quot;,</span></span><br><span class="line"><span class="string"> &quot;_score&quot; : null,</span></span><br><span class="line"><span class="string"> &quot;_source&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;time&quot; : &quot;2026-04-01T09:54:40.590735118Z&quot;,</span></span><br><span class="line"><span class="string"> &quot;stream&quot; : &quot;stderr&quot;,</span></span><br><span class="line"><span class="string"> &quot;_p&quot; : &quot;F&quot;,</span></span><br><span class="line"><span class="string"> &quot;log&quot; : &quot;I0401 09:54:40.590512 1 main.go:297] Handling node with IPs: map[172.19.0.2:&#123;&#125;]&quot;,</span></span><br><span class="line"><span class="string"> &quot;kubernetes&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;pod_name&quot; : &quot;kindnet-nncxf&quot;,</span></span><br><span class="line"><span class="string"> &quot;namespace_name&quot; : &quot;kube-system&quot;,</span></span><br><span class="line"><span class="string"> &quot;pod_id&quot; : &quot;c725a431-7ed2-446d-b658-117b2db76821&quot;,</span></span><br><span class="line"><span class="string"> &quot;labels&quot; : &#123;</span></span><br><span class="line"><span class="string"> &quot;app&quot; : &quot;kindnet&quot;,</span></span><br><span class="line"><span class="string"> &quot;controller-revision-hash&quot; : &quot;5b49848c94&quot;,</span></span><br><span class="line"><span class="string"> &quot;k8s-app&quot; : &quot;kindnet&quot;,</span></span><br><span class="line"><span class="string"> &quot;pod-template-generation&quot; : &quot;1&quot;,</span></span><br><span class="line"><span class="string"> &quot;tier&quot; : &quot;node&quot;</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;host&quot; : &quot;ws-k8s-worker&quot;,</span></span><br><span class="line"><span class="string"> &quot;pod_ip&quot; : &quot;172.19.0.4&quot;,</span></span><br><span class="line"><span class="string"> &quot;container_name&quot; : &quot;kindnet-cni&quot;,</span></span><br><span class="line"><span class="string"> &quot;docker_id&quot; : &quot;ad3a9ffe8101377b135ea0113d6612fd9d251ce2eb089cab587b484db0afbb25&quot;,</span></span><br><span class="line"><span class="string"> &quot;container_hash&quot; : &quot;sha256:50415e5d05f05adbdfd902507532ebb86f924dc2e05511a3b47920156ee4236e&quot;,</span></span><br><span class="line"><span class="string"> &quot;container_image&quot; : &quot;docker.io/kindest/kindnetd:v20241108-5c6d2daf&quot;</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;@timestamp&quot; : &quot;2026-04-01T09:54:40.590735118+00:00&quot;</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;sort&quot; : [</span></span><br><span class="line"><span class="string"> 1775037280590</span></span><br><span class="line"><span class="string"> ]</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> ]</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># 定义索引模板</span></span><br><span class="line"><span class="string">PUT _index_template/kind_logs_template</span></span><br><span class="line"><span class="string">&#123;</span></span><br><span class="line"><span class="string"> &quot;index_patterns&quot;: [&quot;kind-logs-*&quot;],</span></span><br><span class="line"><span class="string"> &quot;priority&quot;: 200,</span></span><br><span class="line"><span class="string"> &quot;template&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;settings&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;index.number_of_shards&quot;: 1,</span></span><br><span class="line"><span class="string"> &quot;index.number_of_replicas&quot;: 0,</span></span><br><span class="line"><span class="string"> &quot;index.refresh_interval&quot;: &quot;10s&quot;</span></span><br><span class="line"><span class="string"> &#125;,</span></span><br><span class="line"><span class="string"> &quot;mappings&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;properties&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;@timestamp&quot;: &#123; &quot;type&quot;: &quot;date&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;log&quot;: &#123; &quot;type&quot;: &quot;text&quot;, &quot;analyzer&quot;: &quot;standard&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;stream&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;time&quot;: &#123; &quot;type&quot;: &quot;date&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;kubernetes&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;properties&quot;: &#123;</span></span><br><span class="line"><span class="string"> &quot;pod_name&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;namespace_name&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;host&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;container_name&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;docker_id&quot;: &#123; &quot;type&quot;: &quot;keyword&quot; &#125;,</span></span><br><span class="line"><span class="string"> &quot;labels&quot;: &#123; &quot;type&quot;: &quot;object&quot;, &quot;enabled&quot;: true &#125;</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="查看今天获取的日志"><a href="#查看今天获取的日志" class="headerlink" title="查看今天获取的日志"></a>查看今天获取的日志</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">stack-management</span> <span class="string">→</span> <span class="string">data</span> <span class="string">views</span></span><br><span class="line"><span class="string">创建</span></span><br><span class="line"></span><br><span class="line"><span class="string">打开discovery</span></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260401183836599.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/04/01/Elastic-7/</id>
    <link href="https://akemi.zj.cn/2026/04/01/Elastic-7/"/>
    <published>2026-04-01T10:42:00.000Z</published>
    <summary>
      <![CDATA[<table>
<thead>
<tr>
<th><strong>特性</strong></th>
<th><strong>Logstash (ELK)</strong></th>
<th><strong>Fluent Bit]]>
    </summary>
    <title>两周复习EFK-第七天之Helm部署Fluentd+Fluent Bit</title>
    <updated>2026-04-01T10:44:10.027Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="纳甲六爻" scheme="https://akemi.zj.cn/tags/%E7%BA%B3%E7%94%B2%E5%85%AD%E7%88%BB/"/>
    <category term="AI" scheme="https://akemi.zj.cn/tags/AI/"/>
    <category term="占卜" scheme="https://akemi.zj.cn/tags/%E5%8D%A0%E5%8D%9C/"/>
    <content>
      <![CDATA[<h2 id="写在前面：AI算卦的局限性"><a href="#写在前面：AI算卦的局限性" class="headerlink" title="写在前面：AI算卦的局限性"></a>写在前面：AI算卦的局限性</h2><ul><li><strong>视角问题</strong>：卦象是以求卦人当前的处境，所揭示的未来信息。如果起卦人本身没有”陷于之中”，那卦象也不会准确</li><li><strong>AI的局限</strong>：卦象的信息是非常丰富的，实操中的解卦需要结合求卦人的具体状态进行综合分析来获取信息，而AI解卦只能解出其中通用的部分</li></ul><p><del>王盛从开始AI算卦炒股，到现在已经亏了1w了</del></p><h2 id="六爻算卦基础"><a href="#六爻算卦基础" class="headerlink" title="六爻算卦基础"></a>六爻算卦基础</h2><p>六爻是一种基于易经的算卦方法，讲究一个天人感应越信越准，用起来分”起卦”和”解卦”两个阶段。</p><ul><li><strong>起卦</strong>：动念头扔硬币6次，扔出6根爻，排盘后会得出一个卦象</li><li><strong>解卦</strong>：解读卦象中的信息</li></ul><p>传统六爻解卦上手门槛极高并且吃经验，初学者往往需要花巨时间精力学习基础知识与实战案例。</p><p>不如直接选用一个聪明的AI，将卦象的内容以图片（或将六爻以文字方式）发给AI，让AI进行解读。</p><h2 id="具体操作方式"><a href="#具体操作方式" class="headerlink" title="具体操作方式"></a>具体操作方式</h2><h3 id="起卦方法"><a href="#起卦方法" class="headerlink" title="起卦方法"></a>起卦方法</h3><p>传统起卦方式是扔六次3枚硬币，需要一定的基础知识。</p><p>现在有网页上起卦的方法：<del>用这个网站<a href="https://cm.k366.com/pp/liuyao.asp">https://cm.k366.com/pp/liuyao.asp</a></del>，用这个网站<a href="https://pp.6yao666.com/pp/p6y.php">https://pp.6yao666.com/pp/p6y.php</a></p><h3 id="解卦方法"><a href="#解卦方法" class="headerlink" title="解卦方法"></a>解卦方法</h3><p>解卦很吃AI的水平，我推荐用谷歌的AI gemini：</p><ul><li>网页版：<a href="https://gemini.google.com/app">https://gemini.google.com/app</a></li><li>注意：这个网页需要使用梯子（部分地区如香港也不行）</li><li>我一般用新加坡的节点就可以正常用</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331165255078.png"><br><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331165307627.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/31/Fortune-AI/</id>
    <link href="https://akemi.zj.cn/2026/03/31/Fortune-AI/"/>
    <published>2026-03-31T08:56:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="写在前面：AI算卦的局限性"><a href="#写在前面：AI算卦的局限性" class="headerlink"]]>
    </summary>
    <title>纳甲六爻-AI算卦方法与缺点</title>
    <updated>2026-03-31T08:57:19.505Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="纳甲六爻" scheme="https://akemi.zj.cn/tags/%E7%BA%B3%E7%94%B2%E5%85%AD%E7%88%BB/"/>
    <category term="易经" scheme="https://akemi.zj.cn/tags/%E6%98%93%E7%BB%8F/"/>
    <category term="占卜" scheme="https://akemi.zj.cn/tags/%E5%8D%A0%E5%8D%9C/"/>
    <content>
      <![CDATA[<p><strong>六爻京房纳甲</strong>，又称“纳甲筮法”，是汉代易学家京房（公元前77年—前37年）在《周易》基础上创立的占卜体系。其核心在于将十天干、十二地支纳入八卦六爻之中，形成一套精密的时间与空间模型。京房以“纳甲”之名，实则是将干支、五行、六亲等元素与卦爻结合，使得抽象的卦象能够对应具体的人事、物象与时间流转，从而进行吉凶推断。此法后世流传广泛，成为六爻占卜的主流方法之一。</p><p>本文仅记录基础知识，后续应该会更新更多完善的基础知识与实战案例</p><h2 id="阴阳与八卦"><a href="#阴阳与八卦" class="headerlink" title="阴阳与八卦"></a>阴阳与八卦</h2><h3 id="阴阳"><a href="#阴阳" class="headerlink" title="阴阳"></a>阴阳</h3><ul><li>阳爻：——</li><li>阴爻：— —</li><li>老阳→少阴，老阴→少阳</li></ul><h3 id="后天八卦"><a href="#后天八卦" class="headerlink" title="后天八卦"></a>后天八卦</h3><p>六爻只看后天八卦，离为首</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190354628.png" alt="后天八卦"></p><h2 id="天干地支"><a href="#天干地支" class="headerlink" title="天干地支"></a>天干地支</h2><h3 id="天干地支基础"><a href="#天干地支基础" class="headerlink" title="天干地支基础"></a>天干地支基础</h3><ul><li>天干：甲、乙、丙、丁、戊、己、庚、辛、壬、癸</li><li>地支：子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥</li></ul><h3 id="地支、时间、五行的关系"><a href="#地支、时间、五行的关系" class="headerlink" title="地支、时间、五行的关系"></a>地支、时间、五行的关系</h3><ul><li>寅卯主木：寅木、卯木</li><li>巳午主火：巳火、午火</li><li>申酉主金：申金、酉金</li><li>亥子主水：亥水、子水</li><li>辰未戌丑主土：辰土、未土、戌土、丑土</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190552358.png" alt="天干与地支的方位图"></p><h2 id="五行生克与六亲"><a href="#五行生克与六亲" class="headerlink" title="五行生克与六亲"></a>五行生克与六亲</h2><h3 id="五行生克"><a href="#五行生克" class="headerlink" title="五行生克"></a>五行生克</h3><ul><li>相生：火生土、土生金、金生水、水生木、木生火</li><li>相克：火克金、金克木、木克土、土克水、水克火</li></ul><h3 id="六亲生克关系"><a href="#六亲生克关系" class="headerlink" title="六亲生克关系"></a>六亲生克关系</h3><ul><li>相生：父母生兄弟、兄弟生子孙、子孙生妻财、妻财生官鬼，官鬼生父母</li><li>相克：父母克子孙、子孙克官鬼、官鬼克兄弟、兄弟克妻财、妻财克父母</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190617140.png" alt="五行与六亲的相生相克对应关系"></p><h2 id="旺相休囚死"><a href="#旺相休囚死" class="headerlink" title="旺相休囚死"></a>旺相休囚死</h2><ul><li><strong>春天</strong>：木旺、火相、水休、金囚、土死</li><li><strong>夏天</strong>：火旺、土相、木休、水囚、金死</li><li><strong>秋天</strong>：金旺、水相、土休、火囚、木死</li><li><strong>冬天</strong>：水旺、木相、金休、土囚、火死</li><li><strong>四季</strong>（每季最后一个月）：土旺、金相、火休、木囚、水死</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190528730.png" alt="太阳历的季节与月份关系"></p><h2 id="起卦方法"><a href="#起卦方法" class="headerlink" title="起卦方法"></a>起卦方法</h2><ul><li>正为阴，背为阳</li><li>以少为贵</li></ul><p>例如一个硬币，1是正面，花是反面：</p><ul><li>1xx为阴</li><li>11x为阳</li><li>111为阴，但老阴变为阳，这条爻为动爻，变出来的就叫变爻</li></ul><p>连续投6次，得到六条爻</p><h2 id="六亲与用神"><a href="#六亲与用神" class="headerlink" title="六亲与用神"></a>六亲与用神</h2><h3 id="用神系统"><a href="#用神系统" class="headerlink" title="用神系统"></a>用神系统</h3><ul><li><strong>用神</strong>：所问之事、所问之人的核心爻</li><li><strong>原神</strong>：生用神的爻</li><li><strong>忌神</strong>：克用神的爻</li><li><strong>仇神</strong>：生忌神的爻（不常用）</li><li><strong>喜神</strong>：克忌神的爻（不常用）</li></ul><h2 id="六冲六合"><a href="#六冲六合" class="headerlink" title="六冲六合"></a>六冲六合</h2><h3 id="地支相冲"><a href="#地支相冲" class="headerlink" title="地支相冲"></a>地支相冲</h3><p>子午冲、丑未冲、寅申冲、卯酉冲、辰戌冲、巳亥冲</p><h3 id="地支相合"><a href="#地支相合" class="headerlink" title="地支相合"></a>地支相合</h3><p>子丑合、寅亥合、卯戌合、辰酉合、巳申合、午未合</p><h3 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h3><ul><li><strong>冲</strong>：不久、冲散、不安、分散、争斗</li><li><strong>合</strong>：长久、合住、合作、纠缠、和好</li></ul><p>下图实线为相冲，虚线为相合；不代表吉凶</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190640033.png" alt="十二天干冲合图"></p><h2 id="日月的影响"><a href="#日月的影响" class="headerlink" title="日月的影响"></a>日月的影响</h2><p>日月可以作用于卦中的爻，卦中爻不能影响日月</p><h3 id="月令影响"><a href="#月令影响" class="headerlink" title="月令影响"></a>月令影响</h3><ul><li><strong>月令</strong>：衡量各爻的”季节性强弱”（旺相休囚死）</li><li><strong>月破</strong>：在寅月（正月），卦中如果有一个申爻，那么这个申爻就是”月破”</li><li><strong>月合（合旺）</strong>：在子月（十一月），卦中如果有一个丑爻，那么这个丑爻就是”月合”</li></ul><h3 id="日辰影响"><a href="#日辰影响" class="headerlink" title="日辰影响"></a>日辰影响</h3><ul><li><strong>日辰</strong>：衡量各爻的”日常状态”（生旺墓绝）</li><li><strong>日冲</strong>：暗动&#x2F;日破，如果是旺相，收日冲为暗动；如果是休囚收日冲为日破（冲空填实）</li><li><strong>日合</strong>：（待补充）</li></ul><h2 id="象法"><a href="#象法" class="headerlink" title="象法"></a>象法</h2><h3 id="六亲类象"><a href="#六亲类象" class="headerlink" title="六亲类象"></a>六亲类象</h3><ul><li><strong>父母</strong>：长辈、支持的东西（交通工具、椅子、结婚证、技术）</li><li><strong>官鬼</strong>：男朋友、0的1、小偷、工作、钱、心中之鬼</li><li><strong>兄弟</strong>：同龄人、合作伙伴</li><li><strong>子孙</strong>：生的东西、创意类的产物、警察、宠物</li><li><strong>妻财</strong>：女朋友、1的0、钱财、为你所用的（食物、电脑）</li></ul><h3 id="五行性情"><a href="#五行性情" class="headerlink" title="五行性情"></a>五行性情</h3><ul><li><strong>木主仁</strong>：根据旺相休囚死来判断</li><li><strong>火主礼</strong>：外向&#x2F;性子直</li><li><strong>土主信</strong>：憨厚&#x2F;顽固</li><li><strong>金主义</strong>：义气&#x2F;残暴</li><li><strong>水主智</strong>：聪明&#x2F;阴暗</li></ul><h2 id="十二长生"><a href="#十二长生" class="headerlink" title="十二长生"></a>十二长生</h2><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260331190708873.png" alt="十二长生"></p><h2 id="伏藏"><a href="#伏藏" class="headerlink" title="伏藏"></a>伏藏</h2><p>“伏藏”指的是 <strong>“伏神”</strong> 与 <strong>“飞神”</strong> 的关系：</p><ul><li><strong>伏神</strong>：<strong>隐藏</strong>在卦中的爻，代表<strong>问卦所寻找的、缺失的、或尚未显现</strong>的人、事、物。</li><li><strong>飞神</strong>：<strong>覆盖</strong>在伏神之上的爻，是卦中<strong>原本就存在</strong>的爻，它压住了伏神，是伏神藏身之所。</li></ul><h2 id="六神"><a href="#六神" class="headerlink" title="六神"></a>六神</h2><p>六神指青龙、朱雀、勾陈、腾蛇、白虎、玄武（不主吉凶）</p><h3 id="青龙"><a href="#青龙" class="headerlink" title="青龙"></a>青龙</h3><p>主仁义、善良、忠义、正义。属木</p><h3 id="朱雀"><a href="#朱雀" class="headerlink" title="朱雀"></a>朱雀</h3><p>主说话、诉讼。属火</p><ul><li>兄弟：必定代表口舌争端</li><li>子孙：代表唱K酒吧、鹦鹉</li><li>妻财：生代表会撒娇、会说话；克代表嘴毒辣</li></ul><h3 id="勾陈"><a href="#勾陈" class="headerlink" title="勾陈"></a>勾陈</h3><p>主肿胀、懒惰、田地、传统。属土</p><ul><li>父母：（交通工具）很慢</li><li>兄弟：老朋友、熟人</li><li>子孙：打游戏、孩子生慢性病</li><li>妻财：土地，房产</li><li>官鬼：（男）出轨</li></ul><h3 id="腾蛇"><a href="#腾蛇" class="headerlink" title="腾蛇"></a>腾蛇</h3><p>没有特定方位</p><ul><li>可以代表狡诈、狭小、神秘</li></ul><h3 id="白虎"><a href="#白虎" class="headerlink" title="白虎"></a>白虎</h3><p>主坚强、牢狱、血光、沉稳。属金</p><h3 id="玄武"><a href="#玄武" class="headerlink" title="玄武"></a>玄武</h3><p>主肮脏、偷摸、迷糊。属水</p><ul><li>父母：假的合同、文书</li><li>兄弟：赌博输钱</li><li>子孙：不正当的寻欢作乐</li><li>妻财：见不得光的财、出轨</li><li>官鬼：有小偷、是小偷</li></ul><h2 id="三合"><a href="#三合" class="headerlink" title="三合"></a>三合</h2><p>有很多人参与（集中力量）</p><h3 id="三合局"><a href="#三合局" class="headerlink" title="三合局"></a>三合局</h3><ul><li>寅<strong>午</strong>戌（火）</li><li>巳<strong>酉</strong>丑（金）</li><li>申<strong>子</strong>辰（水）</li><li>亥<strong>卯</strong>未（木）</li></ul><h3 id="条件"><a href="#条件" class="headerlink" title="条件"></a>条件</h3><ul><li>需要至少两根爻在卦中发动，且必须有一根是子午卯酉</li><li>如果两根都是动的，最后一根可以在变爻里找</li><li>有一根没动，就是虚一待用（静候天机）</li><li>如果有破（月破、日破），或空亡，就需要出空、解破之后才行</li></ul><h2 id="三刑"><a href="#三刑" class="headerlink" title="三刑"></a>三刑</h2><p>受刑、指责、刁难、拖累、添乱、痛苦、憎恨、斗争、嫉妒（心理活动）</p><h3 id="三刑类型"><a href="#三刑类型" class="headerlink" title="三刑类型"></a>三刑类型</h3><ul><li><strong>子卯相刑</strong>：无礼之刑（帮你又背刺）</li><li><strong>寅巳申三刑</strong>：持势之刑（用权力欺压）</li><li><strong>丑未戌三刑</strong>：无恩之刑（没感情）</li><li><strong>辰酉午亥自刑</strong>：内耗，自己折磨自己</li><li>只有两种也可以算刑，但没有三刑严重</li></ul><h2 id="进神与退神"><a href="#进神与退神" class="headerlink" title="进神与退神"></a>进神与退神</h2><p>动爻→变爻时，如果属性相同，如果向前进就是进神，往后退就是退神（能量比日月、生合、冲克大）</p><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>如动爻为寅木，变爻为卯木，就是进神</p><h3 id="特性-1"><a href="#特性-1" class="headerlink" title="特性"></a>特性</h3><ul><li><strong>进神</strong>：成长、发展、上进、采取行动、主动、变大、不断的</li><li><strong>退神</strong>：退缩、淘汰、后悔、倒退、衰弱</li></ul><h3 id="特殊情况"><a href="#特殊情况" class="headerlink" title="特殊情况"></a>特殊情况</h3><ul><li>合而不退（冲的时候退）</li><li>旺而不退（休囚的时候退）</li><li>短期不退，但长期来看这几种都是退的</li></ul>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/31/Fortune-basic/</id>
    <link href="https://akemi.zj.cn/2026/03/31/Fortune-basic/"/>
    <published>2026-03-31T08:12:00.000Z</published>
    <summary>
      <![CDATA[<p><strong>六爻京房纳甲</strong>，又称“纳甲筮法”，是汉代易学家京房（公元前77年—前37年）在《周易》基础上创立的占卜体系。其核心在于将十天干、十二地支纳入八卦六爻之中，形成一套精密的时间与空间模型。京房以“纳甲”之名，实则是将干支、五行、六亲等元素与卦爻结合，使得抽象的卦象能够对应具体的人事、物象与时间流转，从而进行吉凶推断。此法后世流传广泛，成为六爻占卜的主流方法之一。<]]>
    </summary>
    <title>纳甲六爻-基础知识笔记</title>
    <updated>2026-03-31T11:18:00.707Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="EFK" scheme="https://akemi.zj.cn/tags/EFK/"/>
    <category term="GeoIP" scheme="https://akemi.zj.cn/tags/GeoIP/"/>
    <category term="数据清洗" scheme="https://akemi.zj.cn/tags/%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97/"/>
    <content>
      <![CDATA[<h3 id="GeoIP（实时全球威胁地图）"><a href="#GeoIP（实时全球威胁地图）" class="headerlink" title="GeoIP（实时全球威胁地图）"></a>GeoIP（实时全球威胁地图）</h3><p>GeoIP 是一种将 <strong>IP 地址</strong> 映射到 <strong>地理位置</strong>（经纬度、国家、城市、邮政编码）的技术。Logstash 默认内置了 <code>geoip</code> 插件</p><p><strong>添加filiter字段</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"># 只有当 src_ip 字段存在时，才执行地理位置查询</span><br><span class="line">if <span class="punctuation">[</span>src_ip<span class="punctuation">]</span> <span class="punctuation">&#123;</span></span><br><span class="line"> geoip <span class="punctuation">&#123;</span></span><br><span class="line"> source =&gt; <span class="string">&quot;src_ip&quot;</span> # 数据源字段</span><br><span class="line"> target =&gt; <span class="string">&quot;geo&quot;</span> # 放入新字段</span><br><span class="line"> fields =&gt; <span class="punctuation">[</span><span class="string">&quot;city_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;country_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;location&quot;</span><span class="punctuation">,</span> <span class="string">&quot;region_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;country_code2&quot;</span><span class="punctuation">]</span> # 只保留国家、城市、经纬度和代码</span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line">filter <span class="punctuation">&#123;</span></span><br><span class="line"> grok <span class="punctuation">&#123;</span></span><br><span class="line"> match =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;message&quot;</span> =&gt; <span class="string">&quot;%&#123;SYSLOGTIMESTAMP:timestamp&#125; %&#123;HOSTNAME:hostname&#125; sshd\[\d+\]: %&#123;WORD:auth_result&#125; password for %&#123;USER:username&#125; from %&#123;IP:src_ip&#125; port %&#123;NUMBER:port&#125;&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"> date <span class="punctuation">&#123;</span></span><br><span class="line"> match =&gt; <span class="punctuation">[</span> <span class="string">&quot;timestamp&quot;</span><span class="punctuation">,</span> <span class="string">&quot;MMM d HH:mm:ss&quot;</span><span class="punctuation">,</span> <span class="string">&quot;MMM dd HH:mm:ss&quot;</span> <span class="punctuation">]</span></span><br><span class="line"> timezone =&gt; <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> convert =&gt; <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="string">&quot;port&quot;</span> =&gt; <span class="string">&quot;integer&quot;</span></span><br><span class="line"> <span class="string">&quot;severity&quot;</span> =&gt; <span class="string">&quot;integer&quot;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"> if <span class="punctuation">[</span>auth_result<span class="punctuation">]</span> == <span class="string">&quot;Failed&quot;</span> <span class="punctuation">&#123;</span></span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> add_field =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;event_type&quot;</span> =&gt; <span class="string">&quot;ssh_brute_force&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> replace =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;severity&quot;</span> =&gt; <span class="number">3</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line">if <span class="punctuation">[</span>src_ip<span class="punctuation">]</span> <span class="punctuation">&#123;</span></span><br><span class="line"> geoip <span class="punctuation">&#123;</span></span><br><span class="line"> source =&gt; <span class="string">&quot;src_ip&quot;</span></span><br><span class="line"> target =&gt; <span class="string">&quot;geo&quot;</span></span><br><span class="line"> fields =&gt; <span class="punctuation">[</span><span class="string">&quot;city_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;country_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;location&quot;</span><span class="punctuation">,</span> <span class="string">&quot;region_name&quot;</span><span class="punctuation">,</span> <span class="string">&quot;country_code2&quot;</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line">if <span class="punctuation">[</span>geo<span class="punctuation">]</span><span class="punctuation">[</span>geo<span class="punctuation">]</span> <span class="punctuation">&#123;</span></span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> rename =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;[geo][geo][location]&quot;</span> =&gt; <span class="string">&quot;[geo][location]&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> rename =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;[geo][geo][city_name]&quot;</span> =&gt; <span class="string">&quot;[geo][city_name]&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> rename =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;[geo][geo][country_name]&quot;</span> =&gt; <span class="string">&quot;[geo][country_name]&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> remove_field =&gt; <span class="punctuation">[</span> <span class="string">&quot;[geo][geo]&quot;</span> <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line">systemctl restart logstash.service</span><br></pre></td></tr></table></figure><p><strong>但是当前的es其实并不识别这几个新加入进去的字段，所以需要重新定义索引模板</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">这里使用kibana dev tools了，用postman太麻烦了</span><br><span class="line">PUT _index_template/syslog_template</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;index_patterns&quot;</span>: [</span><br><span class="line"> <span class="string">&quot;syslog-security-*&quot;</span></span><br><span class="line"> ],</span><br><span class="line"> <span class="string">&quot;priority&quot;</span>: 200, </span><br><span class="line"> <span class="string">&quot;template&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;settings&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;index&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;number_of_shards&quot;</span>: 3,</span><br><span class="line"> <span class="string">&quot;number_of_replicas&quot;</span>: 1,</span><br><span class="line"> <span class="string">&quot;lifecycle&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;name&quot;</span>: <span class="string">&quot;my_syslog_policy&quot;</span>,</span><br><span class="line"> <span class="string">&quot;rollover_alias&quot;</span>: <span class="string">&quot;syslog-security&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;,</span><br><span class="line"> <span class="string">&quot;mappings&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;properties&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;@timestamp&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;date&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;hostname&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;event_type&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;auth_result&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;message&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;text&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;src_ip&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;ip&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;severity&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;integer&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;port&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;integer&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;geo&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;properties&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;location&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;geo_point&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;city_name&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;country_name&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;,</span><br><span class="line"> <span class="string">&quot;region_name&quot;</span>: &#123; <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">清除今日索引</span><br><span class="line">DELETE syslog-security-2026.03.30</span><br></pre></td></tr></table></figure><p><strong>模拟真实IP攻击</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[1234]: Failed password for root from 8.8.8.8 port 5678 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[5678]: Failed password for admin from 114.55.64.10 port 9999 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[9999]: Failed password for user1 from 123.123.123.123 port 4433 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330151541841.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330145936191.png"></p><h3 id="Runtime-Fields（运行时字段）"><a href="#Runtime-Fields（运行时字段）" class="headerlink" title="Runtime Fields（运行时字段）"></a>Runtime Fields（运行时字段）</h3><p>在传统的 ELK 流程里，数据是”一锤子买卖”：</p><ol><li><strong>采集（Logstash）</strong>：你写好 Grok，把日志切开。</li><li><strong>存储（Elasticsearch）</strong>：数据按照 Mapping 存入磁盘。<strong>一旦存进去，字段类型和内容就固定了。</strong></li><li><strong>展示（Kibana）</strong>：你只能查磁盘里已有的东西。</li></ol><p>如果你今天下午开会，老板突然说：”那个 <code>severity: 3</code> 太冷冰冰了，我要在报表里直接看到’<strong>严重威胁</strong>‘四个字，而且还要能根据这个文字做饼图统计。”</p><ul><li><strong>传统做法</strong>：你得改 Logstash 脚本 -&gt; 重启服务 -&gt; 把过去几天的索引全删了重新跑（Reindex）。这对生产环境来说简直是噩耗。</li><li><strong>Runtime Fields（运行时字段）</strong>：它给了你一颗”后悔药”。它允许你在<strong>查询阶段</strong>，临时通过一段代码，把磁盘里的 <code>3</code> 变成内存里的 <code>严重威胁</code>。</li></ul><p><strong>核心原理</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">1. Schema on Write (写入时定义 - 传统方式)</span><br><span class="line">当你把数据存入索引时，Mapping 决定了数据长什么样。</span><br><span class="line"></span><br><span class="line">- **优点**：查询极快（因为数据是预处理好的）。</span><br><span class="line">- **缺点**：死板。想改字段逻辑？重写数据吧。</span><br><span class="line"></span><br><span class="line">2. Schema on Read (读取时定义 - Runtime Fields)</span><br><span class="line">磁盘里存的还是原始数据，但在你点击<span class="string">&quot;查询&quot;</span>的那一秒，ES 会启动一个轻量级的脚本引擎（Painless），现场计算出结果。</span><br><span class="line"></span><br><span class="line">- **优点**：极其灵活！不需要改旧数据，不需要重启 Logstash，随时加字段，随时改逻辑。</span><br><span class="line">- **缺点**：消耗 CPU。如果数据量是亿级的，现场计算会比查预存字段慢一点。</span><br></pre></td></tr></table></figure><p><strong>修改索引模板的运行时字段</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line">Painless语言特点</span><br><span class="line">1.语法类似 Java：变量声明、控制流（<span class="keyword">if</span>/else、<span class="keyword">for</span>、<span class="keyword">while</span>）、方法调用等都与 Java 几乎一致。</span><br><span class="line">2.专为 Elasticsearch 优化：可以直接访问文档字段（如 `doc[<span class="string">&#x27;field&#x27;</span>].value`）、支持聚合脚本、运行时字段等。</span><br><span class="line">3.安全性高：默认禁用系统调用、文件访问等危险操作，避免恶意脚本攻击。</span><br><span class="line">4.性能优异：Painless 会被编译为字节码，执行效率接近原生 Java。</span><br><span class="line"></span><br><span class="line">PUT _index_template/syslog_security_template</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;index_patterns&quot;</span>: [<span class="string">&quot;syslog-security-*&quot;</span>],</span><br><span class="line"> <span class="string">&quot;template&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;mappings&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;runtime&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;port_type&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;type&quot;</span>: <span class="string">&quot;keyword&quot;</span>,</span><br><span class="line"> <span class="string">&quot;script&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;lang&quot;</span>: <span class="string">&quot;painless&quot;</span>,</span><br><span class="line"> <span class="string">&quot;source&quot;</span>: <span class="string">&quot;&quot;</span><span class="string">&quot;</span></span><br><span class="line"><span class="string"> // 1. 获取原始数据</span></span><br><span class="line"><span class="string"> def p = params._source[&#x27;port&#x27;];</span></span><br><span class="line"><span class="string"> if (p != null) &#123;</span></span><br><span class="line"><span class="string"> try &#123;</span></span><br><span class="line"><span class="string"> // 2. 转换为长整型进行比对</span></span><br><span class="line"><span class="string"> long portVal = Long.parseLong(p.toString());</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string"> // 3. 使用 params 中定义的参数</span></span><br><span class="line"><span class="string"> if (portVal &lt; params.threshold) &#123;</span></span><br><span class="line"><span class="string"> emit(params.label_low);</span></span><br><span class="line"><span class="string"> &#125; else &#123;</span></span><br><span class="line"><span class="string"> emit(params.label_high);</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125; catch (Exception e) &#123;</span></span><br><span class="line"><span class="string"> emit(&#x27;格式错误&#x27;);</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &#125; else &#123;</span></span><br><span class="line"><span class="string"> emit(&#x27;未知端口&#x27;);</span></span><br><span class="line"><span class="string"> &#125;</span></span><br><span class="line"><span class="string"> &quot;</span><span class="string">&quot;&quot;</span>,</span><br><span class="line"> <span class="string">&quot;params&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;threshold&quot;</span>: 1024,</span><br><span class="line"> <span class="string">&quot;label_low&quot;</span>: <span class="string">&quot;系统特权端口&quot;</span>,</span><br><span class="line"> <span class="string">&quot;label_high&quot;</span>: <span class="string">&quot;用户随机端口&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">runtime.port_type 自定义的名称</span><br><span class="line">runtime.type 类型:keyword(常用)、long、double</span><br><span class="line">runtime.script 代码段</span><br><span class="line">runtime.script.lang 选择语言，默认painless，可选expression</span><br><span class="line">runtime.script.params 外部参数</span><br><span class="line">runtime.script.source 表达式正文</span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理环境，因为我之前有几天port是没有转换成数字的，无法对比</span></span><br><span class="line">PUT _cluster/settings</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;persistent&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;action.destructive_requires_name&quot;</span>: <span class="literal">false</span></span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">DELETE syslog-security-2026.03.*</span><br></pre></td></tr></table></figure><p><strong>造数据</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模拟 1: 真实的上海阿里云 IP，尝试访问 SSH (特权端口)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[1001]: Failed password for root from 106.11.248.175 port 22 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟 2: 真实的北京腾讯云 IP，访问 Web 服务 (特权端口)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[1002]: Failed password for admin from 115.159.152.210 port 443 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟 3: 真实的 Google 公共 DNS IP，模拟非标准高位端口 (随机端口)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[1003]: Failed password for testuser from 8.8.8.8 port 54321 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟 4: 真实的 Cloudflare IP，模拟另一个高位端口 (随机端口)</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;<span class="subst">$(date <span class="string">&quot;+%b %d %H:%M:%S&quot;</span>)</span> 1panel sshd[1004]: Failed password for guest from 1.1.1.1 port 33890 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330175727325.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330175646102.png"></p><h3 id="TSVB-趋势预测与去噪"><a href="#TSVB-趋势预测与去噪" class="headerlink" title="TSVB 趋势预测与去噪"></a>TSVB 趋势预测与去噪</h3><p><strong>从”快照”进化到”趋势”</strong></p><p>在安全运维中，原始数据是”骗人”的。<br>• <strong>去噪（De-noising）：识别”手抖”与”爆破”</strong><br> ◦ <strong>现象</strong>：如果你看原始 Count，某个整点突然多了 5 个 Failed，那是用户忘密码了，还是机器在试探？<br> ◦ <strong>TSVB 解决</strong>：通过 <strong>Moving Average（移动平均）</strong>，这种瞬时的毛刺会被平滑掉。如果平滑线（Trend Line）持续走高，说明攻击者不是在”路过”，而是在”驻留”尝试。<br>• <strong>指标关联（Metric Math）：看”质”不看”量”</strong><br> ◦ <strong>现象</strong>：今天有 10,000 次登录失败，听起来很恐怖？但如果今天总访问量是 100 万次，那失败率其实很低。<br> ◦ <strong>TSVB 解决</strong>：利用 <strong>Filter Ratio</strong>，直接计算 $\frac{Failed}{Total}$ 的百分比。比看绝对数量更能反映系统真实的受攻击程度。</p><p><strong>创建</strong>TSVB </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">1.创建visualization（上一次使用是创建整个数据看板）</span><br><span class="line">Create visualization-Legacy-TSVB</span><br><span class="line"></span><br><span class="line">****2.创建基础的count图表,填入panel options和data的信息</span><br><span class="line"></span><br><span class="line">3.在count图表基础上，再创建平滑趋势趋势线</span><br><span class="line"></span><br><span class="line">4.视觉分离</span><br><span class="line"></span><br><span class="line">5.模拟攻击，我用的openclaw写入文件直接模拟攻击</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330181838439.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330182202187.png"></p><p><strong>平滑趋势趋势线</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330185348906.png"></p><p><strong>换色与两个图表的叠加</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260330191247355.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/30/Elastic-6/</id>
    <link href="https://akemi.zj.cn/2026/03/30/Elastic-6/"/>
    <published>2026-03-30T11:20:00.000Z</published>
    <summary>
      <![CDATA[<h3 id="GeoIP（实时全球威胁地图）"><a href="#GeoIP（实时全球威胁地图）" class="headerlink" title="GeoIP（实时全球威胁地图）"></a>GeoIP（实时全球威胁地图）</h3><p>GeoIP 是一种将 <strong>IP 地址</strong> 映射到]]>
    </summary>
    <title>两周复习EFK第六天之深化数据清洗-GeoIP、运行时字段与TSVB图表</title>
    <updated>2026-03-30T11:28:22.128Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="EFK" scheme="https://akemi.zj.cn/tags/EFK/"/>
    <category term="Kibana" scheme="https://akemi.zj.cn/tags/Kibana/"/>
    <content>
      <![CDATA[<h3 id="创建一个lens图表"><a href="#创建一个lens图表" class="headerlink" title="创建一个lens图表"></a><strong>创建一个lens图表</strong></h3><p><strong>X 轴（时间）</strong>：依赖 <code>date</code> 插件的纠偏，否则历史数据会全部堆积在”现在”<br><strong>指标（数值）</strong>：依赖 <code>mutate</code> 的强转，否则无法进行平均值、最大值或范围聚合。<br><strong>维度（拆分）</strong>：依赖 <code>grok</code> 的精准切分（如 <code>auth_result</code>）。</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260326145545631.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260326152522146.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260326160230005.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260326172819138.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/30/Elastic-5/</id>
    <link href="https://akemi.zj.cn/2026/03/30/Elastic-5/"/>
    <published>2026-03-30T11:15:00.000Z</published>
    <summary>
      <![CDATA[<h3 id="创建一个lens图表"><a href="#创建一个lens图表" class="headerlink" title="创建一个lens图表"></a><strong>创建一个lens图表</strong></h3><p><strong>X 轴（时间）</strong>：依赖 <code>date</code>]]>
    </summary>
    <title>两周复习EFK第五天之使用Lens图表</title>
    <updated>2026-04-16T05:52:42.074Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="logstash" scheme="https://akemi.zj.cn/tags/logstash/"/>
    <category term="elasticsearch" scheme="https://akemi.zj.cn/tags/elasticsearch/"/>
    <category term="kibana" scheme="https://akemi.zj.cn/tags/kibana/"/>
    <content>
      <![CDATA[<h3 id="data插件-时间轴纠偏的意义"><a href="#data插件-时间轴纠偏的意义" class="headerlink" title="data插件-时间轴纠偏的意义"></a><strong>data插件-时间轴纠偏的意义</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">1.断点续传</span><br><span class="line">默认情况下，ES使用写入时间作为@timestamp，也就是Kibana 的右侧时间筛选器里，默认绑定的是 @timestamp</span><br><span class="line">因为现有的Filebeat 和 Logstash 性能很好，日志产生后 0.1 秒就传到了 ES。所以<span class="string">&quot;发生时间&quot;</span>和<span class="string">&quot;写入时间&quot;</span>几乎重合，在 Kibana 上感觉不出差别，但如果你的 Logstash 停机维护了 2 小时。重启后，Filebeat 会把积压的 2 小时日志瞬间发过来</span><br><span class="line">这 2 小时的陈旧日志，在 Kibana 看来全都是<span class="string">&quot;刚刚产生的&quot;</span></span><br><span class="line"></span><br><span class="line">2.补录历史数据</span><br><span class="line">如果要把去年的备份日志导入 ES 做审计，没有 <span class="built_in">date</span> 插件，这些日志全都会显示为<span class="string">&quot;今天&quot;</span>。</span><br><span class="line"></span><br><span class="line">3.时区问题</span><br><span class="line">Elasticsearch 内部强制使用 UTC（0时区） 存储时间</span><br></pre></td></tr></table></figure><h3 id="Mutate插件-字段强转的意义"><a href="#Mutate插件-字段强转的意义" class="headerlink" title="Mutate插件-字段强转的意义"></a><strong>Mutate插件-字段强转的意义</strong></h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1.</span> 从<span class="string">&quot;展示&quot;</span>到<span class="string">&quot;计算&quot;</span></span><br><span class="line">Grok 插件默认抓取的所有内容都是 String</span><br><span class="line">如果你不强转，<span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="string">&quot;8888&quot;</span> 和 <span class="attr">&quot;severity&quot;</span><span class="punctuation">:</span> <span class="string">&quot;3&quot;</span> 在 ES 看来和 <span class="string">&quot;root&quot;</span> 这个用户名没有区别</span><br><span class="line">也就无法在Kibana里对它们做任何数学运算：不能算平均值、不能算总和、不能做范围过滤</span><br><span class="line"></span><br><span class="line"><span class="number">2.</span>节省存储与查询性能</span><br><span class="line">在底层的 Lucene 引擎中，存储一个整数比存储一个等值的字符串要高效得多</span><br><span class="line"></span><br><span class="line"><span class="number">3.</span>防止<span class="string">&quot;制图失败&quot;</span></span><br><span class="line">当你尝试在 Kibana 里画一个折线图来展示<span class="string">&quot;每分钟平均严重程度&quot;</span>时，如果你没做强转，Kibana 会直接报错，或者在选择指标（Metrics）时，下拉菜单里根本找不到 severity 这个字段。</span><br><span class="line"></span><br><span class="line">Grok 只是把字符串<span class="string">&quot;切&quot;</span>出来，而 Mutate 的 convert 才是给这些碎片赋予<span class="string">&quot;灵魂&quot;</span>（数据类型）</span><br></pre></td></tr></table></figure><h3 id="logstash配置修改"><a href="#logstash配置修改" class="headerlink" title="logstash配置修改"></a><strong>logstash配置修改</strong></h3><p> <strong>&#x2F;etc&#x2F;logstash&#x2F;conf.d&#x2F;ssh_filter.conf</strong></p><p>（真实操作时，json不支持注释）</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"># 原配置</span><br><span class="line">filter <span class="punctuation">&#123;</span></span><br><span class="line"> grok <span class="punctuation">&#123;</span></span><br><span class="line"> match =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;message&quot;</span> =&gt; <span class="string">&quot;%&#123;SYSLOGTIMESTAMP:timestamp&#125; %&#123;HOSTNAME:hostname&#125; sshd\[\d+\]: %&#123;WORD:auth_result&#125; password for %&#123;USER:username&#125; from %&#123;IP:src_ip&#125; port %&#123;NUMBER:port&#125;&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> if <span class="punctuation">[</span>auth_result<span class="punctuation">]</span> == <span class="string">&quot;Failed&quot;</span> <span class="punctuation">&#123;</span></span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> add_field =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;event_type&quot;</span> =&gt; <span class="string">&quot;ssh_brute_force&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> replace =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;severity&quot;</span> =&gt; <span class="number">3</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"># 修改配置</span><br><span class="line">filter <span class="punctuation">&#123;</span></span><br><span class="line"> # <span class="number">1.</span> 基础拆分（保持你原有的逻辑，但注意字段名我们统称为 timestamp）</span><br><span class="line"> grok <span class="punctuation">&#123;</span></span><br><span class="line"> match =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;message&quot;</span> =&gt; <span class="string">&quot;%&#123;SYSLOGTIMESTAMP:timestamp&#125; %&#123;HOSTNAME:hostname&#125; sshd\[\d+\]: %&#123;WORD:auth_result&#125; password for %&#123;USER:username&#125; from %&#123;IP:src_ip&#125; port %&#123;NUMBER:port&#125;&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"> # <span class="number">2.</span> 使用data插件，让kibana中的时间轴以日志里的时间为准</span><br><span class="line"> date <span class="punctuation">&#123;</span></span><br><span class="line"> # 匹配 timestamp 字段中的内容，尽可能匹配多种格式</span><br><span class="line"> match =&gt; <span class="punctuation">[</span> <span class="string">&quot;timestamp&quot;</span><span class="punctuation">,</span> <span class="string">&quot;MMM d HH:mm:ss&quot;</span><span class="punctuation">,</span> <span class="string">&quot;MMM dd HH:mm:ss&quot;</span> <span class="punctuation">]</span></span><br><span class="line"> # 显式指定时区</span><br><span class="line"> timezone =&gt; <span class="string">&quot;Asia/Shanghai&quot;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> # <span class="number">3.</span>把字符串变成数字</span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> convert =&gt; <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="string">&quot;port&quot;</span> =&gt; <span class="string">&quot;integer&quot;</span> # 强转端口为整数，方便以后搜 port &gt; <span class="number">1024</span></span><br><span class="line"> <span class="string">&quot;severity&quot;</span> =&gt; <span class="string">&quot;integer&quot;</span> # 强转严重性为整数，方便以后算平均值</span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"> if <span class="punctuation">[</span>auth_result<span class="punctuation">]</span> == <span class="string">&quot;Failed&quot;</span> <span class="punctuation">&#123;</span></span><br><span class="line"> mutate <span class="punctuation">&#123;</span></span><br><span class="line"> add_field =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;event_type&quot;</span> =&gt; <span class="string">&quot;ssh_brute_force&quot;</span> <span class="punctuation">&#125;</span></span><br><span class="line"> replace =&gt; <span class="punctuation">&#123;</span> <span class="string">&quot;severity&quot;</span> =&gt; <span class="number">3</span> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="测试过去的日志"><a href="#测试过去的日志" class="headerlink" title="测试过去的日志"></a>测试过去的日志</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">echo <span class="string">&quot;Mar 22 14:30:05 1panel sshd[12345]: Failed password for root from 192.168.10.200 port 2222 ssh2&quot;</span> &gt;&gt; /var/log/secure</span><br><span class="line"></span><br><span class="line">api请求es，查询这条日志</span><br><span class="line"># 搜索<span class="number">23</span>号端口号大于<span class="number">2000</span>的所有安全日志</span><br><span class="line">GET /syslog-security<span class="number">-2026.03</span><span class="number">.22</span>/_search</span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;query&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;range&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;gt&quot;</span><span class="punctuation">:</span> <span class="number">2000</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line">返回</span><br><span class="line">...</span><br><span class="line"><span class="attr">&quot;@version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Mar 22 14:30:05 1panel sshd[12345]: Failed password for root from 192.168.10.200 port 2222 ssh2&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;src_ip&quot;</span><span class="punctuation">:</span> <span class="string">&quot;192.168.10.200&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">2222</span></span><br><span class="line"></span><br><span class="line">如果能搜到这条日志，就说明这条历史日志已经被正确存放到了当天<span class="number">3.22</span>的索引中了</span><br><span class="line">同时也可以看到这条日志的port已经不是<span class="string">&quot;&quot;</span>字符串了，而是整型</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/25/Elastic-4/</id>
    <link href="https://akemi.zj.cn/2026/03/25/Elastic-4/"/>
    <published>2026-03-25T10:53:35.000Z</published>
    <summary>
      <![CDATA[<h3 id="data插件-时间轴纠偏的意义"><a href="#data插件-时间轴纠偏的意义" class="headerlink" title="data插件-时间轴纠偏的意义"></a><strong>data插件-时间轴纠偏的意义</strong></h3><figure class="highlight bash"><table><tr><td]]>
    </summary>
    <title>两周复习EFK第四天之数据深加工-时间轴纠偏与Mutate字段强转</title>
    <updated>2026-03-25T10:55:23.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="Elasticsearch" scheme="https://akemi.zj.cn/tags/Elasticsearch/"/>
    <content>
      <![CDATA[<p>有没有发现今天的内容甚至有些倒退，是的，是因为gemini忘了一开始指定的计划了，我让它回想起来之后，它觉得我学的太快了，所以重新学一些基础的东西</p><h3 id="查看集群状态-cluster-health"><a href="#查看集群状态-cluster-health" class="headerlink" title="查看集群状态_cluster&#x2F;health"></a>查看集群状态_cluster&#x2F;health</h3><ul><li><strong>number_of_nodes</strong>：集群中在线的总节点数。</li><li><strong>number_of_data_nodes</strong>：专门负责存储数据的节点数。</li><li><strong>active_primary_shards</strong>：集群中所有索引处于激活状态的主分片总数。</li><li><strong>active_shards</strong>：所有激活的分片总数（主分片 + 副本分片）。</li><li><strong>relocating_shards</strong>：正在从一个节点移动到另一个节点的分片数（通常发生在扩容或缩容时）。</li><li><strong>initializing_shards</strong>：正在初始化的分片数（刚创建索引或节点重启时）。</li><li><strong>unassigned_shards</strong>：<strong>重点关注</strong>。未分配的分片数。如果非 0，集群状态通常会变黄或变红。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"> &quot;cluster_name&quot;: &quot;es-cluster&quot;,</span><br><span class="line"> &quot;status&quot;: &quot;green&quot;, </span><br><span class="line"> &quot;timed_out&quot;: false,</span><br><span class="line"> &quot;number_of_nodes&quot;: 3,</span><br><span class="line"> &quot;number_of_data_nodes&quot;: 3,</span><br><span class="line"> &quot;active_primary_shards&quot;: 49,</span><br><span class="line"> &quot;active_shards&quot;: 98,</span><br><span class="line"> &quot;relocating_shards&quot;: 0,</span><br><span class="line"> &quot;initializing_shards&quot;: 0,</span><br><span class="line"> &quot;unassigned_shards&quot;: 0,</span><br><span class="line"> &quot;unassigned_primary_shards&quot;: 0,</span><br><span class="line"> &quot;delayed_unassigned_shards&quot;: 0,</span><br><span class="line"> &quot;number_of_pending_tasks&quot;: 0,</span><br><span class="line"> &quot;number_of_in_flight_fetch&quot;: 0,</span><br><span class="line"> &quot;task_max_waiting_in_queue_millis&quot;: 0,</span><br><span class="line"> &quot;active_shards_percent_as_number&quot;: 100.0</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="查看索引清单-cat-indices"><a href="#查看索引清单-cat-indices" class="headerlink" title="查看索引清单_cat&#x2F;indices"></a>查看索引清单_cat&#x2F;indices</h3><ul><li><strong>health</strong>：这个索引自己的健康度。</li><li><strong>status</strong>：通常是 <code>open</code>。</li><li><strong>index</strong>：索引的名字（比如 <code>syslog-security-xxx</code>）。</li><li><strong>docs.count</strong>：这里面现在存了多少条日志？</li><li><strong>pri</strong> (Primary)：主分片数量。</li><li><strong>rep</strong> (Replica)：副本分片数量。</li></ul><p><strong>可以看出的内容</strong></p><ul><li><strong>.internal 开头的</strong>：这些是系统的”内账”，记录的是 Kibana 的配置、告警规则等</li><li>syslog-security 索引，pri 是 <strong>3</strong>，rep 是 <strong>1</strong>。数据被切成了 3 块（分片）存储，且每一块都有 1 个备份</li></ul><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260324190127208.png"></p><h3 id="ES的CRUD"><a href="#ES的CRUD" class="headerlink" title="ES的CRUD"></a>ES的CRUD</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">1.创建一条假日志</span><br><span class="line">PUT /test-index/_doc/1</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;user&quot;</span>: <span class="string">&quot;admin&quot;</span>,</span><br><span class="line"> <span class="string">&quot;action&quot;</span>: <span class="string">&quot;login&quot;</span>,</span><br><span class="line"> <span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line"> <span class="string">&quot;timestamp&quot;</span>: <span class="string">&quot;2026-03-24T10:00:00Z&quot;</span></span><br><span class="line">&#125;</span><br><span class="line">返回</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;_index&quot;</span>: <span class="string">&quot;test-index&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_id&quot;</span>: <span class="string">&quot;1&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_version&quot;</span>: 1,</span><br><span class="line"> <span class="string">&quot;result&quot;</span>: <span class="string">&quot;created&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_shards&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;total&quot;</span>: 2,</span><br><span class="line"> <span class="string">&quot;successful&quot;</span>: 2,</span><br><span class="line"> <span class="string">&quot;failed&quot;</span>: 0</span><br><span class="line"> &#125;,</span><br><span class="line"> <span class="string">&quot;_seq_no&quot;</span>: 0,</span><br><span class="line"> <span class="string">&quot;_primary_term&quot;</span>: 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">2.查询假日志</span><br><span class="line">GET /test-index/_doc/1</span><br><span class="line">返回</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;_index&quot;</span>: <span class="string">&quot;test-index&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_id&quot;</span>: <span class="string">&quot;1&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_version&quot;</span>: 1,</span><br><span class="line"> <span class="string">&quot;_seq_no&quot;</span>: 0,</span><br><span class="line"> <span class="string">&quot;_primary_term&quot;</span>: 1,</span><br><span class="line"> <span class="string">&quot;found&quot;</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="string">&quot;_source&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;user&quot;</span>: <span class="string">&quot;admin&quot;</span>,</span><br><span class="line"> <span class="string">&quot;action&quot;</span>: <span class="string">&quot;login&quot;</span>,</span><br><span class="line"> <span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>,</span><br><span class="line"> <span class="string">&quot;timestamp&quot;</span>: <span class="string">&quot;2026-03-24T10:00:00Z&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">3.更新日志</span><br><span class="line">POST /test-index/_update/1</span><br><span class="line">返回</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;_index&quot;</span>: <span class="string">&quot;test-index&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_id&quot;</span>: <span class="string">&quot;1&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_version&quot;</span>: 2,</span><br><span class="line"> <span class="string">&quot;result&quot;</span>: <span class="string">&quot;updated&quot;</span>,</span><br><span class="line"> <span class="string">&quot;_shards&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;total&quot;</span>: 2,</span><br><span class="line"> <span class="string">&quot;successful&quot;</span>: 2,</span><br><span class="line"> <span class="string">&quot;failed&quot;</span>: 0</span><br><span class="line"> &#125;,</span><br><span class="line"> <span class="string">&quot;_seq_no&quot;</span>: 1,</span><br><span class="line"> <span class="string">&quot;_primary_term&quot;</span>: 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">4.删除索引</span><br><span class="line">DELETE /test-index</span><br></pre></td></tr></table></figure><p>第二天创建了一个索引，syslog-security-*，索引默认会永久保存<br>现在要让他在7天后自动删除以节省空间</p><p>这个在kibana的面板上点点点也可以设置，但是我们这里用api，这俩是同步的</p><p><strong>创建生命周期策略</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">PUT _ilm/policy/my_syslog_policy</span><br><span class="line">min_age: 7d 满7天执行删除</span><br><span class="line">rollover: 如果索引满1天或者满 50GB，就自动切分出一个新索引</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;policy&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;phases&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;hot&quot;</span>: &#123; </span><br><span class="line"> <span class="string">&quot;actions&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;rollover&quot;</span>: &#123; </span><br><span class="line"> <span class="string">&quot;max_age&quot;</span>: <span class="string">&quot;1d&quot;</span>,</span><br><span class="line"> <span class="string">&quot;max_size&quot;</span>: <span class="string">&quot;50gb&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;,</span><br><span class="line"> <span class="string">&quot;delete&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;min_age&quot;</span>: <span class="string">&quot;7d&quot;</span>, </span><br><span class="line"> <span class="string">&quot;actions&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;delete&quot;</span>: &#123;&#125; </span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>绑定生命周期策略到现有索引模板</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">PUT _index_template/syslog_template</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;index_patterns&quot;</span>: [<span class="string">&quot;syslog-security-*&quot;</span>],</span><br><span class="line"> <span class="string">&quot;template&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;settings&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;index.lifecycle.name&quot;</span>: <span class="string">&quot;my_syslog_policy&quot;</span>, </span><br><span class="line"> <span class="string">&quot;index.lifecycle.rollover_alias&quot;</span>: <span class="string">&quot;syslog-security&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">syslog_template 匹配的索引模板</span><br><span class="line">index_patterns 索引模板的匹配规则</span><br><span class="line">index.lifecycle.name 绑定刚才创建的策略</span><br><span class="line">index.lifecycle.rollover_alias 用于自动滚动的别名</span><br><span class="line"></span><br><span class="line"><span class="comment"># 存量索引</span></span><br><span class="line"><span class="comment"># 给 23 号和 24 号的索引手动开启生命周期管理</span></span><br><span class="line">PUT /syslog-security-2026.03.2*/_settings</span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;index.lifecycle.name&quot;</span>: <span class="string">&quot;my_syslog_policy&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol><li><strong>匹配范围</strong>：当一个新索引（如 <code>syslog-security-2026.03.24</code>）创建时，ES 会扫描所有模板。</li><li><strong>冲突检查</strong>：如果有多个模板的 <code>index_patterns</code> 都匹配这个名字，ES 会检查 <code>priority</code>。</li><li><strong>报错触发</strong>：如果优先级相同，ES 为了防止配置混乱（比如模板 A 说要 3 个分片，模板 B 说要 1 个分片），就会抛出你看到的这个 <code>illegal_argument_exception</code>。</li></ol><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260324193637011.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/24/Elastic-3/</id>
    <link href="https://akemi.zj.cn/2026/03/24/Elastic-3/"/>
    <published>2026-03-24T15:26:00.000Z</published>
    <summary>
      <![CDATA[<p>有没有发现今天的内容甚至有些倒退，是的，是因为gemini忘了一开始指定的计划了，我让它回想起来之后，它觉得我学的太快了，所以重新学一些基础的东西</p>
<h3 id="查看集群状态-cluster-health"><a href="#查看集群状态-cluster-health" class="headerlink"]]>
    </summary>
    <title>两周复习EFK第三天之索引CRUD与生命周期管理</title>
    <updated>2026-04-16T05:52:31.018Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="Milvus" scheme="https://akemi.zj.cn/tags/Milvus/"/>
    <category term="Helm" scheme="https://akemi.zj.cn/tags/Helm/"/>
    <category term="LangChain" scheme="https://akemi.zj.cn/tags/LangChain/"/>
    <content>
      <![CDATA[<p>本文默认读者是一个helm糕手，会略过一些基础的概念，仅对关键部分做解释</p><p>Milvus是一个向量数据库，但是和之前用过的Chorma和FAISS相比，更加倾向于是一个功能完整的分布式数据库</p><table><thead><tr><th><strong>维度</strong></th><th><strong>FAISS</strong></th><th><strong>Chroma</strong></th><th><strong>Milvus</strong></th></tr></thead><tbody><tr><td><strong>定位</strong></td><td>高性能<strong>向量搜索库</strong></td><td>轻量级<strong>向量数据库</strong></td><td>云原生<strong>分布式向量数据库</strong></td></tr><tr><td><strong>核心特点</strong></td><td>极致检索速度、支持GPU加速</td><td>极简API、与LangChain等AI框架无缝集成</td><td>完整的数据管理能力、支持分布式、混合检索</td></tr><tr><td><strong>架构&#x2F;部署</strong></td><td>本地<strong>嵌入式库</strong>，无服务端</td><td>本地或Docker部署，<strong>嵌入式优先</strong></td><td>分布式、云原生，可部署在K8s上或使用云服务</td></tr><tr><td><strong>数据规模</strong></td><td><strong>十亿级</strong>（通过GPU&#x2F;多卡）</td><td><strong>百万级</strong></td><td><strong>百亿&#x2F;千亿级</strong></td></tr><tr><td><strong>索引与功能</strong></td><td>提供多种索引算法(IVF, HNSW, PQ)，但<strong>无数据持久化、无CRUD</strong>，只是搜索库</td><td>基础索引，支持元数据过滤，但<strong>不支持复杂混合检索</strong></td><td>支持向量与标量字段的<strong>混合检索</strong>、数据分区、多副本、高可用等完整数据库特性</td></tr><tr><td><strong>性能指标</strong></td><td><strong>极致快</strong>（毫秒级，尤其在GPU上），纯算法层优化</td><td>较快，但在<strong>大规模数据和高并发场景下性能衰减明显</strong></td><td><strong>快</strong>（毫秒级，&lt;50ms），且在亿级数据下性能表现<strong>稳定</strong>，高QPS</td></tr><tr><td><strong>易用性</strong></td><td><strong>较高</strong>，需自行集成和管理索引文件</td><td><strong>极高</strong>，几行Python代码即可运行</td><td><strong>中等</strong>，功能丰富，但需要一定的运维知识（尤其是自建）</td></tr><tr><td><strong>典型场景</strong></td><td>学术研究、对性能有极致要求的特定场景、作为其它数据库的<strong>核心引擎</strong></td><td><strong>快速原型验证</strong>、个人项目、Jupyter Notebook中的AI实验</td><td><strong>企业级生产环境</strong>、大规模RAG应用、推荐系统、多模态搜索</td></tr></tbody></table><p><strong>Milvus现在也支持单机部署或使用Lite轻量版直接用pip安装，不过我这里肯定是用更高级的方法部署，也就是Helm部署</strong></p><p>参考文档：<a href="https://milvus.io/docs/zh/overview.md">https://milvus.io/docs/zh/overview.md</a><br>官网推荐使用Operator或者Helm部署</p><h2 id="Helm部署"><a href="#Helm部署" class="headerlink" title="Helm部署"></a>Helm部署</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mlivus需要一个provisioner，必须搞一个</span></span><br><span class="line">kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml</span><br><span class="line"><span class="comment"># 我使用的是kind部署的测试集群，所以默认就有</span></span><br><span class="line">kubectl get sc</span><br><span class="line">NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE</span><br><span class="line">standard (default) rancher.io/local-path Delete WaitForFirstConsumer <span class="literal">false</span> 5d5h</span><br><span class="line"></span><br><span class="line"><span class="comment"># 我使用的helm版本为v4.0.4</span></span><br><span class="line">helm repo add zilliztech https://zilliztech.github.io/milvus-helm/</span><br><span class="line">helm repo update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 直接部署的方式，但我没采用这种方式，因为后面肯定主要追求helm集成到我们自己的工程文件中</span></span><br><span class="line">helm install my-release zilliztech/milvus \</span><br><span class="line"> --<span class="built_in">set</span> image.all.tag=v2.6.11 \</span><br><span class="line"> --<span class="built_in">set</span> pulsarv3.enabled=<span class="literal">false</span> \</span><br><span class="line"> --<span class="built_in">set</span> woodpecker.enabled=<span class="literal">true</span> \</span><br><span class="line"> --<span class="built_in">set</span> streaming.enabled=<span class="literal">true</span> \</span><br><span class="line"> --<span class="built_in">set</span> indexNode.enabled=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 搜索与拉取helm chart</span></span><br><span class="line">helm search repo zilliztech/milvus --versions</span><br><span class="line">NAME CHART VERSION APP VERSION DESCRIPTION </span><br><span class="line">zilliztech/milvus 5.0.16 2.6.13 Milvus is an open-source vector database built ...</span><br><span class="line">zilliztech/milvus 5.0.15 2.6.12 Milvus is an open-source vector database built ...</span><br><span class="line">zilliztech/milvus 5.0.14 2.6.11 Milvus is an open-source vector database built ...</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">helm pull zilliztech/milvus --version 5.0.14 --untar</span><br><span class="line"><span class="built_in">cd</span> milvus/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看values.yaml文件，参数说明</span></span><br><span class="line">上面他关闭和开启的几个模块：</span><br><span class="line">pulsarv3 Pulsar (消息队列)因为启用了woodpecker，所以不需要了</span><br><span class="line">woodpecker 啄木鸟 云原生预写日志（WAL）系统，作用是替代外部的消息队列</span><br><span class="line">streaming 流服务 提供流数据的接入、管理和订阅功能，默认使用minio，也可以用公有云服务</span><br><span class="line">indexNode 索引节点，用以加速向量检索，但消耗资源</span><br><span class="line"></span><br><span class="line"><span class="comment"># 调整参数（注意需要指定存储类）</span></span><br><span class="line">pulsarv3.enabled=<span class="literal">false</span></span><br><span class="line">woodpecker.enabled=<span class="literal">true</span></span><br><span class="line">streaming.enabled=<span class="literal">true</span></span><br><span class="line">indexNode.enabled=<span class="literal">false</span></span><br><span class="line">etcd.persistence.storageClass=standard</span><br><span class="line">minio.persistence.storageClass=standard</span><br><span class="line"><span class="comment"># 使用本地文件--首次部署</span></span><br><span class="line">helm upgrade --install milvus . -f ./values.yaml -n milvus --create-namespace </span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260323174458157.png"></p><h2 id="配置Milvus使用OSS"><a href="#配置Milvus使用OSS" class="headerlink" title="配置Milvus使用OSS"></a>配置M<strong>ilvus使用OSS</strong></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在开始之前可以先用mc确认一下aksk以及endpoint是否正确</span></span><br><span class="line">mc <span class="built_in">ls</span> mlivus/milvus-wangsheng-test/</span><br><span class="line">[2026-03-23 22:18:01 CST] 0B <span class="built_in">test</span>/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭原本有的minio</span></span><br><span class="line">minio:</span><br><span class="line"> enabled: <span class="literal">false</span></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置外部S3</span></span><br><span class="line"><span class="comment"># 他妈的这个b参数我真的试了几个小时，才试出来</span></span><br><span class="line">externalS3:</span><br><span class="line"> enabled: <span class="literal">true</span></span><br><span class="line"> host: <span class="string">&quot;oss-cn-beijing.aliyuncs.com&quot;</span></span><br><span class="line"> port: <span class="string">&quot;443&quot;</span></span><br><span class="line"> accessKey: <span class="string">&quot;LTAIxxxx&quot;</span></span><br><span class="line"> secretKey: <span class="string">&quot;qbfxxxxx&quot;</span></span><br><span class="line"> useSSL: <span class="literal">true</span></span><br><span class="line"> bucketName: <span class="string">&quot;milvus-wangsheng-test&quot;</span></span><br><span class="line"> rootPath: <span class="string">&quot;test&quot;</span></span><br><span class="line"> useIAM: <span class="literal">false</span></span><br><span class="line"> cloudProvider: <span class="string">&quot;aliyun&quot;</span></span><br><span class="line"> iamEndpoint: <span class="string">&quot;&quot;</span></span><br><span class="line"> region: <span class="string">&quot;cn-beijing&quot;</span></span><br><span class="line"> useVirtualHost: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理方法</span></span><br><span class="line">helm delete milvus -n milvus</span><br><span class="line">kubectl delete pvc --all -n milvus</span><br><span class="line"></span><br><span class="line"><span class="comment"># helm更新</span></span><br><span class="line">helm upgrade --install milvus . -f ./values.yaml -n milvus</span><br></pre></td></tr></table></figure><h2 id="部署Attu可视化看板"><a href="#部署Attu可视化看板" class="headerlink" title="部署Attu可视化看板"></a>部署<strong>Attu可视化看板</strong></h2><p><strong>Attu 是 Milvus 官方推出的开源图形化管理工具</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 打一个端口转发，使外部可以访问到milvus本地</span></span><br><span class="line">kubectl -n milvus port-forward --address 0.0.0.0 service/milvus 27017:19530 &amp; </span><br><span class="line">kubectl -n milvus port-forward --address 0.0.0.0 svc/milvus 9091:9091 &amp;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 现在访问端点是 192.168.10.100:27017</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 部署attu</span></span><br><span class="line">docker run -d \</span><br><span class="line"> --name attu \</span><br><span class="line"> -p 8000:3000 \</span><br><span class="line"> -e MILVUS_URL=192.168.10.100:27017 \</span><br><span class="line"> zilliz/attu:latest</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 访问端口8000就可以看到，直接点访问就可以点进去了</span></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260324133337907.png"></p><h2 id="理解Milvus"><a href="#理解Milvus" class="headerlink" title="理解Milvus"></a>理解M<strong>ilvus</strong></h2><p>要使用milvus首先要理解milvus的基本理论知识<br>Milvus 采用的是<strong>存储与计算分离</strong>的架构，它把整个系统拆成了四个层级：</p><ol><li>**接入层 (Access Layer&#x2F;Proxy)**：<br>就像酒店的前台。它不存数据，只负责校验你的请求、限流，并将请求转发给内部组件。</li><li>**协调器 (Coordinators)**：<br>系统的”大脑”。负责分配任务（比如告诉某个 Worker 该去处理哪个数据段）、管理元数据（存放在 Etcd）以及给数据分配唯一的 ID（TSO）。</li><li><strong>执行节点 (Worker Nodes)<strong>：<br>系统的”苦力”。分为 <strong>QueryNode</strong>（负责搜）、</strong>DataNode</strong>（负责写）和 <strong>IndexNode</strong>（负责建立索引）。</li><li>**存储层 (Storage)**：</li></ol><ul><li>**对象存储 (OSS&#x2F;MinIO)**：存放真正的向量数据和索引文件（你刚才折腾最久的地方）。</li><li>**元数据存储 (Etcd)**：存 Collection 结构、Pod 状态等。</li><li><strong>消息队列 (Pulsar&#x2F;Kafka)<strong>：这是 Milvus 的</strong>血液</strong>。所有的写入操作都会先变成一条消息进入队列。</li></ul><p><strong>实际上的使用流程</strong></p><ol><li><strong>定义 Schema</strong>：选好维度和距离算法。</li><li><strong>创建 Collection</strong>：定好 shards_num（影响写入吞吐）。</li><li><strong>插入数据</strong>：批量插入（Batch Insert）效率远高于单条。</li><li><strong>建立索引</strong>：选好 index_type（影响查询延迟）。</li><li><strong>Load</strong>：设置 replica_number（影响查询并发）。</li><li><strong>Search</strong>：开始你的向量检索。</li></ol><h2 id="使用Milvus"><a href="#使用Milvus" class="headerlink" title="使用Milvus"></a>使用M<strong>ilvus</strong></h2><p><del>在理解流程的基础上，我准备使用我之前用langchain写的一个streamlit的项目，小改一手让他用milvus</del></p><p><del>是我高估自己了，我是个菜逼，整了半天硬是跑不通，算了跑个简单的得了</del></p><p>哈哈，成啦，我简直是个天才</p><p>之前失败是因为调整了oss参数，却没有清空etcd数据，数据不同步<br>导致proxy向mixcoord发起创建collection的请求失败<br>所以连接是通的，但发起collection的请求一直死锁</p><p><strong>测试milvus连接</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 现在访问端点是 192.168.10.100:27017</span></span><br><span class="line"><span class="built_in">cd</span> langchain_project_PDF/</span><br><span class="line">conda activate langchain</span><br><span class="line">pip install -U pymilvus</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; test_milvus.py &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">from pymilvus import connections, utility</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">def test_connection():</span></span><br><span class="line"><span class="string"> print(&quot;正在尝试连接 Milvus...&quot;)</span></span><br><span class="line"><span class="string"> try:</span></span><br><span class="line"><span class="string"> # 设置一个短的 timeout，防止无限等待</span></span><br><span class="line"><span class="string"> connections.connect(</span></span><br><span class="line"><span class="string"> alias=&quot;default&quot;, </span></span><br><span class="line"><span class="string"> host=&quot;192.168.10.100&quot;, </span></span><br><span class="line"><span class="string"> port=&quot;27017&quot;, </span></span><br><span class="line"><span class="string"> timeout=5</span></span><br><span class="line"><span class="string"> )</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string"> # 获取服务器版本，这是最轻量的请求</span></span><br><span class="line"><span class="string"> version = utility.get_server_version()</span></span><br><span class="line"><span class="string"> print(f&quot;✅ 连接成功！Milvus 版本: &#123;version&#125;&quot;)</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string"> # 列出所有集合名</span></span><br><span class="line"><span class="string"> collections = utility.list_collections()</span></span><br><span class="line"><span class="string"> print(f&quot;当前数据库中的集合: &#123;collections&#125;&quot;)</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string"> except Exception as e:</span></span><br><span class="line"><span class="string"> print(f&quot;❌ 连接失败: &#123;e&#125;&quot;)</span></span><br><span class="line"><span class="string"> finally:</span></span><br><span class="line"><span class="string"> connections.disconnect(&quot;default&quot;)</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">if __name__ == &quot;__main__&quot;:</span></span><br><span class="line"><span class="string"> test_connection()</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line">python test_milvus.py</span><br><span class="line"></span><br><span class="line">正在尝试连接 Milvus...</span><br><span class="line">✅ 连接成功！Milvus 版本: 2.6.11</span><br><span class="line">当前数据库中的集合: []</span><br></pre></td></tr></table></figure><p><strong>集成到langchain代码</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br></pre></td><td class="code"><pre><span class="line">import streamlit as st</span><br><span class="line">from streamlit_extras.add_vertical_space import add_vertical_space</span><br><span class="line">from PyPDF2 import PdfReader</span><br><span class="line">from langchain.text_splitter import RecursiveCharacterTextSplitter</span><br><span class="line">from langchain_huggingface import HuggingFaceEmbeddings</span><br><span class="line">from langchain.vectorstores import FAISS</span><br><span class="line"><span class="comment"># from langchain_community.vectorstores import Milvus</span></span><br><span class="line">from langchain_deepseek import ChatDeepSeek</span><br><span class="line">from langchain.chains.question_answering import load_qa_chain</span><br><span class="line">from langchain.callbacks.streamlit import StreamlitCallbackHandler</span><br><span class="line">from langchain.callbacks import get_openai_callback</span><br><span class="line">import pickle</span><br><span class="line">import os</span><br><span class="line">from dotenv import load_dotenv</span><br><span class="line">import hashlib</span><br><span class="line"></span><br><span class="line"><span class="comment"># Milvus 相关导入</span></span><br><span class="line">from pymilvus import connections, utility</span><br><span class="line">from langchain_community.vectorstores import Milvus</span><br><span class="line"></span><br><span class="line">load_dotenv()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1.创建UI</span></span><br><span class="line">with st.sidebar:</span><br><span class="line"> st.title(<span class="string">&quot;Ask for PDF&quot;</span>)</span><br><span class="line"> st.markdown(<span class="string">&quot;该项目提供PDF文件上传的功能，用户可以输入问题，在PDF文件中进行搜索&quot;</span>)</span><br><span class="line"> add_vertical_space(10) <span class="comment"># 空五行</span></span><br><span class="line"> st.write(<span class="string">&quot;测试项目&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 写一个main作为程序入口</span></span><br><span class="line">def main():</span><br><span class="line"> st.header(<span class="string">&quot;Ask for PDF&quot;</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 文件上传器</span></span><br><span class="line"> pdf = st.file_uploader(<span class="string">&quot;上传PDF&quot;</span>, <span class="built_in">type</span>=<span class="string">&quot;pdf&quot;</span>)</span><br><span class="line"> <span class="keyword">if</span> pdf is not None:</span><br><span class="line"> st.write(f<span class="string">&quot;&gt;&#123;pdf.name&#125;上传完成&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># ==================== MD5 哈希处理文件名 ====================</span></span><br><span class="line"> <span class="comment"># 解决中文名报错，并实现文件去重</span></span><br><span class="line"> file_bytes = pdf.read()</span><br><span class="line"> file_hash = hashlib.md5(file_bytes).hexdigest()</span><br><span class="line"> collection_name = f<span class="string">&quot;pdf_&#123;file_hash&#125;&quot;</span> </span><br><span class="line"> pdf.seek(0) <span class="comment"># 重要：复位指针，确保下文 PdfReader 能读取内容</span></span><br><span class="line"> <span class="comment"># =============================================================</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 2.读取pdf</span></span><br><span class="line"> pdf_reader = PdfReader(pdf)</span><br><span class="line"> text = <span class="string">&quot;&quot;</span></span><br><span class="line"> <span class="keyword">for</span> page <span class="keyword">in</span> pdf_reader.pages:</span><br><span class="line"> text += page.extract_text()</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 3.文本切割</span></span><br><span class="line"> text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20, length_function=len)</span><br><span class="line"> texts = text_splitter.split_text(text)</span><br><span class="line"> st.write(texts)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 4.向量初始化</span></span><br><span class="line"> embeddings = HuggingFaceEmbeddings(</span><br><span class="line"> model_name=<span class="string">&quot;sentence-transformers/all-mpnet-base-v2&quot;</span>,</span><br><span class="line"> model_kwargs=&#123;<span class="string">&#x27;device&#x27;</span>: <span class="string">&#x27;cpu&#x27;</span>&#125;</span><br><span class="line"> )</span><br><span class="line"> st.write(<span class="string">&quot;&gt;嵌入式模型初始化完成&quot;</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 保留原有的 store_name 变量，兼容你之前的注释代码</span></span><br><span class="line"> store_name = pdf.name[:-4]</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># ==================== FAISS 原代码（保留注释）====================</span></span><br><span class="line"> <span class="comment"># 如果数据库文件已存在，直接使用</span></span><br><span class="line"> <span class="comment"># if os.path.exists(f&quot;&#123;store_name&#125;.pkl&quot;):</span></span><br><span class="line"> <span class="comment"># with open(f&quot;&#123;store_name&#125;.pkl&quot;, &quot;rb&quot;) as f:</span></span><br><span class="line"> <span class="comment"># vectorstore = pickle.load(f)</span></span><br><span class="line"> <span class="comment"># st.write(&quot;&gt;数据库已从磁盘加载&quot;)</span></span><br><span class="line"> <span class="comment"># else:</span></span><br><span class="line"> <span class="comment"># vectorstore = FAISS.from_texts(texts, embeddings)</span></span><br><span class="line"> <span class="comment"># # 数据库保存</span></span><br><span class="line"> <span class="comment"># with open(f&quot;&#123;store_name&#125;.pkl&quot;,&quot;wb&quot;) as f:</span></span><br><span class="line"> <span class="comment"># pickle.dump(vectorstore, f)</span></span><br><span class="line"> <span class="comment"># st.write(f&quot;&gt;数据库已保存为 &#123;store_name&#125;.pkl&quot;)</span></span><br><span class="line"> <span class="comment"># ================================================================</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># ==================== Milvus 新代码 (修正版) ====================</span></span><br><span class="line"> <span class="comment"># 定义统一的连接参数，避免使用 url 导致格式错误</span></span><br><span class="line"> milvus_config = &#123;</span><br><span class="line"> <span class="string">&quot;host&quot;</span>: <span class="string">&quot;192.168.10.100&quot;</span>,</span><br><span class="line"> <span class="string">&quot;port&quot;</span>: <span class="string">&quot;19530&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 连接到 Milvus</span></span><br><span class="line"> connections.connect(</span><br><span class="line"> <span class="built_in">alias</span>=<span class="string">&quot;default&quot;</span>,</span><br><span class="line"> **milvus_config</span><br><span class="line"> )</span><br><span class="line"> st.write(f<span class="string">&quot;&gt;已连接到 Milvus 服务器，映射集合名: &#123;collection_name&#125;&quot;</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 检查集合是否已存在</span></span><br><span class="line"> <span class="keyword">if</span> utility.has_collection(collection_name):</span><br><span class="line"> <span class="comment"># 从已有集合加载向量存储</span></span><br><span class="line"> vectorstore = Milvus(</span><br><span class="line"> embedding_function=embeddings,</span><br><span class="line"> connection_args=milvus_config,</span><br><span class="line"> collection_name=collection_name</span><br><span class="line"> )</span><br><span class="line"> st.write(f<span class="string">&quot;&gt;Milvus 集合 &#x27;&#123;collection_name&#125;&#x27; 已从服务器加载&quot;</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># 创建新的 Milvus 集合并插入向量</span></span><br><span class="line"> vectorstore = Milvus.from_texts(</span><br><span class="line"> texts=texts,</span><br><span class="line"> embedding=embeddings,</span><br><span class="line"> connection_args=milvus_config,</span><br><span class="line"> collection_name=collection_name,</span><br><span class="line"> drop_old=False</span><br><span class="line"> )</span><br><span class="line"> st.write(f<span class="string">&quot;&gt;Milvus 集合 &#x27;&#123;collection_name&#125;&#x27; 已创建并保存&quot;</span>)</span><br><span class="line"> <span class="comment"># ================================================================</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 5.用户输入问题，检索数据库</span></span><br><span class="line"> query = st.text_input(<span class="string">&quot;输入问题:&quot;</span>)</span><br><span class="line"> <span class="keyword">if</span> query:</span><br><span class="line"> docs = vectorstore.similarity_search(query, k=30)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># web流式输出</span></span><br><span class="line"> response_container = st.empty()</span><br><span class="line"> st_callback = StreamlitCallbackHandler(parent_container=response_container)</span><br><span class="line"></span><br><span class="line"> llm = ChatDeepSeek(</span><br><span class="line"> model=<span class="string">&quot;deepseek-chat&quot;</span>, </span><br><span class="line"> temperature=0.7,</span><br><span class="line"> streaming=True,</span><br><span class="line"> callbacks=[st_callback]</span><br><span class="line"> )</span><br><span class="line"> chain = load_qa_chain(llm, chain_type=<span class="string">&quot;stuff&quot;</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 回调统计token</span></span><br><span class="line"> with get_openai_callback() as cb:</span><br><span class="line"> reponse = chain.invoke(&#123;<span class="string">&quot;question&quot;</span>: query, <span class="string">&quot;input_documents&quot;</span>: docs&#125;)</span><br><span class="line"> st.write(f<span class="string">&quot;&gt;检索结果: &#123;reponse[&#x27;output_text&#x27;]&#125;&quot;</span>)</span><br><span class="line"> st.success(f<span class="string">&quot;&gt; 总Token数: &#123;cb.total_tokens&#125;&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"> main()</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260325105115617.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260325105221878.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/24/Helm-Milvus/</id>
    <link href="https://akemi.zj.cn/2026/03/24/Helm-Milvus/"/>
    <published>2026-03-24T09:55:00.000Z</published>
    <summary>
      <![CDATA[<p>本文默认读者是一个helm糕手，会略过一些基础的概念，仅对关键部分做解释</p>
<p>Milvus是一个向量数据库，但是和之前用过的Chorma和FAISS相比，更加倾向于是一个功能完整的分布式数据库</p>
<table>
<thead>
<tr>
<th><strong>维度</strong></th>
<th><strong>FAISS</strong></th>
<th><stro]]>
    </summary>
    <title>Helm部署Milvus与langchain集成</title>
    <updated>2026-03-25T03:00:35.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="ELK" scheme="https://akemi.zj.cn/tags/ELK/"/>
    <category term="logstash" scheme="https://akemi.zj.cn/tags/logstash/"/>
    <category term="filebeat" scheme="https://akemi.zj.cn/tags/filebeat/"/>
    <content>
      <![CDATA[<h3 id="创建一个索引模板"><a href="#创建一个索引模板" class="headerlink" title="创建一个索引模板"></a>创建一个索引模板</h3><p>昨天手动put了syslog-security-2026.03.19的索引格式，但一条一条添加肯定不行</p><p>以后任何以 <code>syslog-security-</code> 开头的索引，都会自动变成 3 分片、1 副本，并且 <code>src_ip</code> 永远是 <code>ip</code> 类型。</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320100815514.png"></p><h3 id="部署与使用Logstash"><a href="#部署与使用Logstash" class="headerlink" title="部署与使用Logstash"></a>部署与使用Logstash</h3><p>支持input→filter→ouput的工作流，特别是<strong>filter功能</strong>可以识别IP、时间格式对数据进行拆分，输出规整的精美json</p><p>参考文档：<br>二进制部署：<a href="https://www.elastic.co/docs/reference/logstash/installing-logstash">https://www.elastic.co/docs/reference/logstash/installing-logstash</a></p><p>目前我们是初学者，就先用二进制部署，用helm部署的k8s版本就再说吧</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ubuntu版本</span></span><br><span class="line">wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg</span><br><span class="line">sudo apt-get install apt-transport-https</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main&quot;</span> | sudo <span class="built_in">tee</span> -a /etc/apt/sources.list.d/elastic-9.x.list</span><br><span class="line">sudo apt-get update &amp;&amp; sudo apt-get install logstash</span><br><span class="line"></span><br><span class="line">systemctl <span class="built_in">enable</span> logstash.service --now</span><br><span class="line">systemctl is-active logstash.service</span><br><span class="line">active</span><br><span class="line"></span><br><span class="line"><span class="comment"># 红帽系</span></span><br><span class="line">rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch</span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/yum.repos.d/logstash.repo &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">[logstash-9.x]</span></span><br><span class="line"><span class="string">name=Elastic repository for 9.x packages</span></span><br><span class="line"><span class="string">baseurl=https://artifacts.elastic.co/packages/9.x/yum</span></span><br><span class="line"><span class="string">gpgcheck=1</span></span><br><span class="line"><span class="string">gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch</span></span><br><span class="line"><span class="string">enabled=1</span></span><br><span class="line"><span class="string">autorefresh=1</span></span><br><span class="line"><span class="string">type=rpm-md</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line">yum -y install logstash</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建配置文件</span></span><br><span class="line"><span class="built_in">cat</span> &gt; /etc/logstash/conf.d/ssh_filter.conf &lt;&lt;<span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">input &#123;</span><br><span class="line"> beats &#123;</span><br><span class="line"> port =&gt; 5044</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">filter &#123;</span><br><span class="line"> grok &#123;</span><br><span class="line"> match =&gt; &#123; <span class="string">&quot;message&quot;</span> =&gt; <span class="string">&quot;%&#123;SYSLOGTIMESTAMP:timestamp&#125; %&#123;HOSTNAME:hostname&#125; sshd\[\d+\]: %&#123;WORD:auth_result&#125; password for %&#123;USER:username&#125; from %&#123;IP:src_ip&#125; port %&#123;NUMBER:port&#125;&quot;</span> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">if</span> [auth_result] == <span class="string">&quot;Failed&quot;</span> &#123;</span><br><span class="line"> mutate &#123;</span><br><span class="line"> add_field =&gt; &#123; <span class="string">&quot;event_type&quot;</span> =&gt; <span class="string">&quot;ssh_brute_force&quot;</span> &#125;</span><br><span class="line"> replace =&gt; &#123; <span class="string">&quot;severity&quot;</span> =&gt; 3 &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">output &#123;</span><br><span class="line"> stdout &#123; codec =&gt; rubydebug &#125;</span><br><span class="line"> elasticsearch &#123;</span><br><span class="line"> hosts =&gt; [<span class="string">&quot;https://192.168.10.100:9200&quot;</span>]</span><br><span class="line"> index =&gt; <span class="string">&quot;syslog-security-%&#123;+YYYY.MM.dd&#125;&quot;</span></span><br><span class="line"> api_key =&gt; <span class="string">&quot;MnQxUUJaMEIzMlk0TE9TWnFaeEQ6UjAyLVloeUFNRGw4Rl85d25BeEM3dw==&quot;</span></span><br><span class="line"> ssl_verification_mode =&gt; <span class="string">&quot;none&quot;</span></span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">这里的工作流解释：</span><br><span class="line">1.接收beats插件给5044端口的数据，beats字段指插件</span><br><span class="line">2.通过filiter使用grok插件规定格式进行正则筛选</span><br><span class="line">3.对数据进行清洗，如果是Failed就标记严重性为3</span><br><span class="line">4.将输出发送给控制台(debug)，同时发送给es集群</span><br><span class="line"></span><br><span class="line">systemctl restart logstash.service</span><br><span class="line"><span class="comment"># 查看日志是否报错</span></span><br><span class="line"><span class="built_in">tail</span> -f /var/log/logstash/logstash-plain.log</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证5044端口是否监听</span></span><br><span class="line">ss -tunlp | grep 5044</span><br><span class="line">tcp LISTEN 0 4096 *:5044 *:* <span class="built_in">users</span>:((&quot;java&quot;,pid=<span class="number">62517</span>,fd=<span class="number">154</span>))</span><br></pre></td></tr></table></figure><h3 id="部署与使用filebeat"><a href="#部署与使用filebeat" class="headerlink" title="部署与使用filebeat"></a>部署与使用filebeat</h3><p>极轻量的日志收集器，只搬运不加工，支持断点续传（offset偏移量）</p><p>适用二进制部署和k8s集群部署，我这k8s集群有点问题，暂时先用二进制部署</p><p>参考文档：<a href="https://www.elastic.co/docs/reference/beats/filebeat">https://www.elastic.co/docs/reference/beats/filebeat</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-9.3.2-x86_64.rpm</span><br><span class="line">rpm -vi filebeat-9.3.2-x86_64.rpm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改配置文件/etc/filebeat/filebeat.yml，这配置文件挺好认的，一段一段的</span></span><br><span class="line">filebeat.inputs:</span><br><span class="line"><span class="comment"># 添加输入块，type决定了使用什么引擎去处理，比如filestream/log文本读取、syslog网络监听、container容器json</span></span><br><span class="line">filebeat.inputs:</span><br><span class="line">- <span class="built_in">type</span>: filestream</span><br><span class="line"> <span class="built_in">id</span>: ssh-security-logs</span><br><span class="line"> enabled: <span class="literal">true</span></span><br><span class="line"> paths:</span><br><span class="line"> - /var/log/secure</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"><span class="comment"># 添加输出块，默认有一段es的配置项，需要删除，因为我们现在用Logstash做聚合了</span></span><br><span class="line">output.logstash:</span><br><span class="line"> hosts: [<span class="string">&quot;192.168.10.100:5044&quot;</span>] </span><br><span class="line"></span><br><span class="line">systemctl restart filebeat.service</span><br></pre></td></tr></table></figure><h3 id="测试链路"><a href="#测试链路" class="headerlink" title="测试链路"></a>测试链路</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 制造假数据</span></span><br><span class="line">logger <span class="string">&quot;Mar 21 22:00:01 prod-web-01 sshd[123]: Failed password for root from 192.168.10.105 port 5566 ssh2&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 在logstash中已经可以看到相关日志了</span></span><br><span class="line">journalctl -u logstash -f</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;@version&quot;</span> =&gt; <span class="string">&quot;1&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;timestamp&quot;</span> =&gt; <span class="string">&quot;Mar 23 15:30:00&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;auth_result&quot;</span> =&gt; <span class="string">&quot;Failed&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;port&quot;</span> =&gt; <span class="string">&quot;5566&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;ecs&quot;</span> =&gt; &#123;</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;version&quot;</span> =&gt; <span class="string">&quot;8.0.0&quot;</span></span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: &#125;,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;log&quot;</span> =&gt; &#123;</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;file&quot;</span> =&gt; &#123;</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;inode&quot;</span> =&gt; <span class="string">&quot;67682980&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;fingerprint&quot;</span> =&gt; <span class="string">&quot;98136ef7ebcc4f2aaf3c2f6ec8556cf7cb6674e1d26ad145fd40c8f4b98bad95&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;path&quot;</span> =&gt; <span class="string">&quot;/var/log/secure&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;device_id&quot;</span> =&gt; <span class="string">&quot;64768&quot;</span></span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: &#125;,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;offset&quot;</span> =&gt; 14796257</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: &#125;,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;tags&quot;</span> =&gt; [</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: [0] <span class="string">&quot;beats_input_codec_plain_applied&quot;</span></span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: ],</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;input&quot;</span> =&gt; &#123;</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;type&quot;</span> =&gt; <span class="string">&quot;filestream&quot;</span></span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: &#125;,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;severity&quot;</span> =&gt; <span class="string">&quot;3&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;src_ip&quot;</span> =&gt; <span class="string">&quot;10.2.3.6&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;event_type&quot;</span> =&gt; <span class="string">&quot;ssh_brute_force&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;username&quot;</span> =&gt; <span class="string">&quot;root&quot;</span>,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;@timestamp&quot;</span> =&gt; 2026-03-23T07:30:40.640Z,</span><br><span class="line">Mar 23 15:30:42 1panel logstash[128105]: <span class="string">&quot;message&quot;</span> =&gt; <span class="string">&quot;Mar 23 15:30:38 1panel root[344379]: Mar 23 15:30:00 1panel sshd[12345]: Failed password for root from 10.2.3.6 port 5566 ssh2&quot;</span></span><br></pre></td></tr></table></figure><p><strong>初步使用kibana</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260323155534433.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">KQL还可以支持一些高级语法，比如</span><br><span class="line">排除法： NOT src_ip : <span class="string">&quot;192.168.10.1&quot;</span> <span class="comment"># 排除内网IP</span></span><br><span class="line">多重条件： event_type : <span class="string">&quot;ssh_brute_force&quot;</span> AND username : <span class="string">&quot;root&quot;</span></span><br><span class="line">范围查找： port &gt; 1024</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/23/Elastic-2/</id>
    <link href="https://akemi.zj.cn/2026/03/23/Elastic-2/"/>
    <published>2026-03-23T08:17:43.000Z</published>
    <summary>
      <![CDATA[<h3 id="创建一个索引模板"><a href="#创建一个索引模板" class="headerlink" title="创建一个索引模板"></a>创建一个索引模板</h3><p>昨天手动put了syslog-security-2026.03.19的索引格式，但一条一条添加肯定不行</p>
<p>以后任何以 <code>syslog-security-</code>]]>
    </summary>
    <title>两周复习EFK第二天之部署与使用logstash+filebeat+es</title>
    <updated>2026-03-24T15:38:43.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="MoneyPrinter" scheme="https://akemi.zj.cn/tags/MoneyPrinter/"/>
    <content>
      <![CDATA[<h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 切换WSL1到2（如果原本使用的是WSL1</span></span><br><span class="line">dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart</span><br><span class="line">wsl --set-version Ubuntu-22.04 2</span><br><span class="line">wsl --set-default-version 2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 升级wsl</span></span><br><span class="line">wsl --update</span><br><span class="line"><span class="comment"># 使用systemd</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">&quot;[boot]\nsystemd=true&quot;</span> | sudo <span class="built_in">tee</span> -a /etc/wsl.conf</span><br><span class="line">wsl --shutdown</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证systemd，如果输出为&#x27;systemd&#x27;就正常</span></span><br><span class="line">ps -p 1 -o <span class="built_in">comm</span>=</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">sudo apt update</span><br><span class="line">sudo apt install -y git python3-pip python3-venv ffmpeg imagemagick</span><br><span class="line">sudo apt install -y libjpeg-dev zlib1g-dev libpng-dev libfreetype6-dev</span><br><span class="line">sudo apt install -y build-essential python3-dev</span><br></pre></td></tr></table></figure><h2 id="安装本地大模型ollama"><a href="#安装本地大模型ollama" class="headerlink" title="安装本地大模型ollama"></a>安装本地大模型ollama</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 本地部署</span></span><br><span class="line">sudo apt-get install zstd</span><br><span class="line">curl -fsSL https://ollama.com/install.sh | sh</span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">sudo systemctl is-active ollama</span><br><span class="line">ss -tunlp | grep 11434</span><br><span class="line">tcp LISTEN 0 4096 127.0.0.1:11434 0.0.0.0:* </span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证NVIDIA驱动，windows上安装驱动即可</span></span><br><span class="line">nvidia-smi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取模型，你想用啥用啥</span></span><br><span class="line">ollama pull llama3.1:8b</span><br></pre></td></tr></table></figure><h2 id="安装与配置MoneyPrinter"><a href="#安装与配置MoneyPrinter" class="headerlink" title="安装与配置MoneyPrinter"></a>安装与配置MoneyPrinter</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆git与同步环境</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/FujiwaraChoki/MoneyPrinter.git</span><br><span class="line"><span class="built_in">cd</span> MoneyPrinter</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装uv</span></span><br><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br><span class="line"><span class="built_in">source</span> <span class="variable">$HOME</span>/.local/bin/env</span><br><span class="line">uv --version</span><br><span class="line"><span class="comment"># uv 0.10.12 (x86_64-unknown-linux-gnu)</span></span><br><span class="line"></span><br><span class="line">uv python install 3.12</span><br><span class="line">uv <span class="built_in">sync</span> --python 3.12</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置</span></span><br><span class="line"><span class="built_in">cp</span> .env.example .<span class="built_in">env</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 填入PEXELS_API_KEY（素材库</span></span><br><span class="line"><span class="comment"># 官网https://www.pexels.com/api/</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 填入AssemblyAI的api-key（字幕</span></span><br><span class="line"><span class="comment"># 官网www.assemblyai.com</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 这俩都是免费的</span></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320143026596.png"></p><h2 id="启动与管理MoneyPrinter"><a href="#启动与管理MoneyPrinter" class="headerlink" title="启动与管理MoneyPrinter"></a>启动与管理MoneyPrinter</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动后端</span></span><br><span class="line"><span class="built_in">cd</span> Backend/</span><br><span class="line"><span class="built_in">export</span> no_proxy=<span class="string">&quot;localhost,127.0.0.1&quot;</span></span><br><span class="line">python main.py</span><br><span class="line"></span><br><span class="line"> * Serving Flask app <span class="string">&#x27;main&#x27;</span></span><br><span class="line"> * Debug mode: on</span><br><span class="line">INFO:werkzeug:WARNING: This is a development server. Do not use it <span class="keyword">in</span> a production deployment. Use a production WSGI server instead.</span><br><span class="line"> * Running on all addresses (0.0.0.0)</span><br><span class="line"> * Running on http://127.0.0.1:8080</span><br><span class="line"> * Running on http://172.21.207.11:8080</span><br><span class="line">INFO:werkzeug:Press CTRL+C to quit</span><br><span class="line">INFO:werkzeug: * Restarting with <span class="built_in">stat</span></span><br><span class="line">WARNING:werkzeug: * Debugger is active!</span><br><span class="line">INFO:werkzeug: * Debugger PIN: 434-739-362</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动前端</span></span><br><span class="line"><span class="built_in">cd</span> ~/MoneyPrinter/Frontend/</span><br><span class="line">python3 -m http.server 3000</span><br><span class="line">Serving HTTP on 0.0.0.0 port 3000 (http://0.0.0.0:3000/) ...</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动消费者进程</span></span><br><span class="line"><span class="built_in">cd</span> ~/MoneyPrinter/Backend</span><br><span class="line">python worker.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 访问前端页面http://localhost:3000/</span></span><br><span class="line">就可以看到了</span><br><span class="line"></span><br><span class="line">总的流程是这样：</span><br><span class="line">1.前端请求</span><br><span class="line">2.后端将任务写入SQLite（moneyprinter.db）</span><br><span class="line">3.worker.py扫描数据库，发现有queue任务则将其改为processing</span><br><span class="line">4.worker.py调用本地模型llama3.1:8b</span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320131310080.png"></p><p><strong>使用tmux开多窗口管理</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320143613356.png"></p><h2 id="测试生成视频"><a href="#测试生成视频" class="headerlink" title="测试生成视频"></a>测试生成视频</h2><p>在网页端进行网页生成测试，提示词就简单写就行，执行后可以看到有GPU内存已经被占用了5G了</p><p>不过我这里失败了，估计跟网络环境有点关系，这个生成视频的过程中，会去访问另外那些提供音频的网站，等回家再试试</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320143901822.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260320143804997.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/20/MoneyPrinter/</id>
    <link href="https://akemi.zj.cn/2026/03/20/MoneyPrinter/"/>
    <published>2026-03-20T07:56:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span]]>
    </summary>
    <title>AIGC工具MoneyPrinter部署与使用</title>
    <updated>2026-04-16T05:52:18.252Z</updated>
  </entry>
  <entry>
    <author>
      <name>王盛</name>
    </author>
    <category term="EFK" scheme="https://akemi.zj.cn/tags/EFK/"/>
    <category term="Elasticsearch" scheme="https://akemi.zj.cn/tags/Elasticsearch/"/>
    <content>
      <![CDATA[<p>我准备使用两周时间重新学习和理解EFK&#x2F;ELK体系，之前我也学习过，但是因为没有实际可操作的项目，所以很快就忘记了，以下是AI（gemini）给我提供的学习方案</p><h2 id="学习方案"><a href="#学习方案" class="headerlink" title="学习方案"></a>学习方案</h2><h3 id="第一阶段：核心基石与可视化（第-1-3-天）"><a href="#第一阶段：核心基石与可视化（第-1-3-天）" class="headerlink" title="第一阶段：核心基石与可视化（第 1 - 3 天）"></a>第一阶段：核心基石与可视化（第 1 - 3 天）</h3><p><strong>目标：搞定存储端 Elasticsearch 和展示端 Kibana，理解数据的”家”是怎么建的。</strong></p><ul><li><strong>第 1 天：Elasticsearch 架构与索引原理</strong></li><li>复习倒排索引（Inverted Index）和分片（Shards&#x2F;Replicas）的概念。</li><li><strong>实战：</strong> 使用 Docker 部署一个三节点的 ES 集群。手动通过 <code>curl</code> 或 Kibana Dev Tools 执行 CRUD。</li><li><strong>重点：</strong> 理解 <code>Index Template</code> 和 <code>ILM</code>（索引生命周期管理），这是生产环境下防止磁盘爆满的关键。</li><li><strong>第 2 天：Kibana 数据可视化</strong></li><li><strong>实战：</strong> 导入官方示例数据集（Sample Data）。</li><li>练习创建 Index Pattern，制作 Discover 视图，搭建一个简单的 Dashboard（柱状图、饼图）。</li><li><strong>第 3 天：ES 性能调优与健康检查</strong></li><li>学习常用的集群健康检查 API (<code>_cat/indices</code>, <code>_cluster/health</code>)。</li><li><strong>思考：</strong> 当集群状态变为 <code>Yellow</code> 或 <code>Red</code> 时，你该如何排查？</li></ul><hr><h3 id="第二阶段：采集端之争-ELK-vs-EFK（第-4-8-天）"><a href="#第二阶段：采集端之争-ELK-vs-EFK（第-4-8-天）" class="headerlink" title="第二阶段：采集端之争 ELK vs. EFK（第 4 - 8 天）"></a>第二阶段：采集端之争 ELK vs. EFK（第 4 - 8 天）</h3><p><strong>目标：理解 Logstash 与 Fluentd&#x2F;Fluent Bit 的区别，掌握数据清洗（Grok&#x2F;Filter）。</strong></p><ul><li><strong>第 4 - 5 天：Logstash（ELK 的”L”）</strong></li><li>学习 Logstash 的三段式配置：<code>Input</code>, <code>Filter</code>, <code>Output</code>。</li><li><strong>实战：</strong> 模拟收集 Nginx 日志。使用 <strong>Grok</strong> 插件将非结构化日志解析成 JSON。</li><li><strong>难点：</strong> 调试 Grok 表达式（推荐使用 Kibana 内置的 Grok Debugger）。</li><li><strong>第 6 - 7 天：Fluentd &amp; Fluent Bit（EFK 的”F”）</strong></li><li>了解为什么云原生环境（K8s）更偏爱 Fluentd。</li><li><strong>实战：</strong> 部署 Fluent Bit 收集系统日志（Journald），并转发给 ES。</li><li><strong>对比：</strong> 感受 Fluentd 的”轻量化”配置与 Logstash 的区别。</li><li><strong>第 8 天：Beats 系列（运维利器）</strong></li><li>快速上手 Filebeat 和 Metricbeat。</li><li><strong>实战：</strong> 使用 Filebeat 直接对接 ES（绕过 Logstash），体验 <code>Ingest Pipeline</code> 在 ES 端做简单处理。</li></ul><hr><h3 id="第三阶段：安全、监控与实战场景（第-9-12-天）"><a href="#第三阶段：安全、监控与实战场景（第-9-12-天）" class="headerlink" title="第三阶段：安全、监控与实战场景（第 9 - 12 天）"></a>第三阶段：安全、监控与实战场景（第 9 - 12 天）</h3><p><strong>目标：结合你的安全背景，把系统”锁死”并投入实战。</strong></p><ul><li><strong>第 9 天：安全加固（RBAC &amp; TLS）</strong></li><li><strong>实战：</strong> 开启 ES 的内置安全功能。配置用户权限（Role-based Access Control），设置 Kibana 登录认证。</li><li>生成证书并开启节点间的加密传输（TLS）。</li><li><strong>第 10 天：监控与告警</strong></li><li>学习使用 Watcher 或 Kibana Alerting。</li><li><strong>场景：</strong> 设置一个告警，当 5 分钟内 Nginx 出现超过 10 次 <code>500</code> 错误时，触发通知。</li><li><strong>第 11 - 12 天：日志收集的”最后公里”</strong></li><li><strong>实战：</strong> 结合 <code>rsyslog</code>。很多旧系统只支持 syslog，练习如何用 Logstash 或 Fluentd 接收 syslog 数据流。</li><li><strong>架构思考：</strong> 引入消息队列（如 Redis 或 Kafka）作为缓冲，防止日志峰值冲垮 ES。</li></ul><hr><h3 id="第四阶段：总演练与大作业（第-13-14-天）"><a href="#第四阶段：总演练与大作业（第-13-14-天）" class="headerlink" title="第四阶段：总演练与大作业（第 13 - 14 天）"></a>第四阶段：总演练与大作业（第 13 - 14 天）</h3><p><strong>目标：从零搭建一套完整的生产级架构。</strong></p><ul><li><strong>任务：搭建一个”全栈日志审计系统”</strong></li></ul><ol><li><strong>环境：</strong> 在你的 WSL2 或服务器上，用容器起一套完整环境。</li><li><strong>采集：</strong> Filebeat 收集 <code>/var/log/auth.log</code>（安全审计）和 Nginx 日志。</li><li><strong>清洗：</strong> 经过 Logstash 过滤，提取出：访问 IP、地理位置（GeoIP 插件）、状态码。</li><li><strong>存储：</strong> 存入 ES，并配置 7 天自动删除旧索引。</li><li><strong>展示：</strong> 在 Kibana 做一个”安全监控大屏”，显示异常登录尝试和流量趋势。</li></ol><h2 id="第一天"><a href="#第一天" class="headerlink" title="第一天"></a>第一天</h2><h3 id="搭建一个es集群"><a href="#搭建一个es集群" class="headerlink" title="搭建一个es集群"></a>搭建一个es集群</h3><p><strong>二进制安装</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 二进制安装系统支持情况</span></span><br><span class="line">https://www.elastic.co/support/matrix</span><br><span class="line"></span><br><span class="line"><span class="comment"># 我使用的是eve-ng部署的3节点almalinux9.6</span></span><br><span class="line"><span class="comment"># 二进制安装</span></span><br><span class="line">wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.3.1-linux-x86_64.tar.gz</span><br><span class="line">wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.3.1-linux-x86_64.tar.gz.sha512</span><br><span class="line">shasum -a 512 -c elasticsearch-9.3.1-linux-x86_64.tar.gz.sha512</span><br><span class="line">tar -xzf elasticsearch-9.3.1-linux-x86_64.tar.gz</span><br><span class="line"><span class="built_in">cd</span> elasticsearch-9.3.1/</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>docker-compose安装</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 直接略过单机安装，直接用docker-compose装集群了</span></span><br><span class="line"><span class="built_in">mkdir</span> elasticsearch-docker-compose</span><br><span class="line"><span class="built_in">cd</span> elasticsearch-docker-compose/</span><br><span class="line"></span><br><span class="line">wget https://raw.githubusercontent.com/elastic/elasticsearch/refs/heads/main/docs/reference/setup/install/docker/.env</span><br><span class="line">wget https://raw.githubusercontent.com/elastic/elasticsearch/refs/heads/main/docs/reference/setup/install/docker/docker-compose.yml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在.env中配置es和kibana的密码</span></span><br><span class="line">ELASTIC_PASSWORD=123456</span><br><span class="line">KIBANA_PASSWORD=123456</span><br><span class="line">STACK_VERSION=9.3.1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 内核参数调整</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;vm.max_map_count=262144&quot;</span> &gt;&gt; /etc/sysctl.d/99-sysctl.conf</span><br><span class="line">sysctl -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动docker-compose</span></span><br><span class="line">docker-compose up -d</span><br><span class="line"></span><br><span class="line"><span class="comment"># 默认用户名为elastic</span></span><br><span class="line"><span class="comment"># 登录https://192.168.10.100:9200之后会返回这个，说明es已经正常运行了</span></span><br><span class="line">&#123;</span><br><span class="line"> <span class="string">&quot;name&quot;</span> : <span class="string">&quot;es01&quot;</span>,</span><br><span class="line"> <span class="string">&quot;cluster_name&quot;</span> : <span class="string">&quot;es-cluster&quot;</span>,</span><br><span class="line"> <span class="string">&quot;cluster_uuid&quot;</span> : <span class="string">&quot;uJYHX3NHS2qYSZUsk2KK6w&quot;</span>,</span><br><span class="line"> <span class="string">&quot;version&quot;</span> : &#123;</span><br><span class="line"> <span class="string">&quot;number&quot;</span> : <span class="string">&quot;9.3.1&quot;</span>,</span><br><span class="line"> <span class="string">&quot;build_flavor&quot;</span> : <span class="string">&quot;default&quot;</span>,</span><br><span class="line"> <span class="string">&quot;build_type&quot;</span> : <span class="string">&quot;docker&quot;</span>,</span><br><span class="line"> <span class="string">&quot;build_hash&quot;</span> : <span class="string">&quot;0dd66e52ba3aa076cf498264e46339dbb71f0269&quot;</span>,</span><br><span class="line"> <span class="string">&quot;build_date&quot;</span> : <span class="string">&quot;2026-02-23T23:37:38.684779921Z&quot;</span>,</span><br><span class="line"> <span class="string">&quot;build_snapshot&quot;</span> : <span class="literal">false</span>,</span><br><span class="line"> <span class="string">&quot;lucene_version&quot;</span> : <span class="string">&quot;10.3.2&quot;</span>,</span><br><span class="line"> <span class="string">&quot;minimum_wire_compatibility_version&quot;</span> : <span class="string">&quot;8.19.0&quot;</span>,</span><br><span class="line"> <span class="string">&quot;minimum_index_compatibility_version&quot;</span> : <span class="string">&quot;8.0.0&quot;</span></span><br><span class="line"> &#125;,</span><br><span class="line"> <span class="string">&quot;tagline&quot;</span> : <span class="string">&quot;You Know, for Search&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="获取es集群的api-key"><a href="#获取es集群的api-key" class="headerlink" title="获取es集群的api key"></a>获取es集群的api key</h3><p>我这里下载了postman</p><p><strong>使用最简单的basic auth</strong>（账密）</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319155524714.png"></p><p><strong>获取id和api-key</strong></p><p>记录id与encoded的值，encoded是id 和 api_key组合后经过 Base64 编码的结果</p><p>2t1QBZ0B32Y4LOSZqZxD<br>MnQxUUJaMEIzMlk0TE9TWnFaeEQ6UjAyLVloeUFNRGw4Rl85d25BeEM3dw&#x3D;&#x3D;</p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319165830775.png"></p><p><strong>使用api key进行连接es集群测试</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319170429023.png"></p><h3 id="向es集群中传入数据"><a href="#向es集群中传入数据" class="headerlink" title="向es集群中传入数据"></a>向es集群中传入数据</h3><p><strong>创建索引并定义 Mapping（手动创建</strong></p><p>这个行为类似于建立数据库中的一个表，一行数据有很多键，每个键都有对应的字段行为，比如自增、字符串格式、时间格式等</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">将索引PUT进去，这个syslog表就手动创建了一个索引，用来对syslog日志中的字段进行分类</span><br><span class="line"></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;number_of_shards&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span> <span class="comment">//分片数</span></span><br><span class="line"> <span class="attr">&quot;number_of_replicas&quot;</span><span class="punctuation">:</span> <span class="number">1</span> <span class="comment">//副本数</span></span><br><span class="line"> <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">&quot;mappings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;properties&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line"> <span class="attr">&quot;@timestamp&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;date&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span> <span class="comment">//作为时间格式存储</span></span><br><span class="line"> <span class="attr">&quot;hostname&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span> <span class="comment">//精确匹配，不分词</span></span><br><span class="line"> <span class="attr">&quot;event_type&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;keyword&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span> </span><br><span class="line"> <span class="attr">&quot;message&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span> <span class="comment">//全文索引，分词</span></span><br><span class="line"> <span class="attr">&quot;src_ip&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;ip&quot;</span> <span class="punctuation">&#125;</span><span class="punctuation">,</span> <span class="comment">//作为ip类型存储</span></span><br><span class="line"> <span class="attr">&quot;severity&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;integer&quot;</span> <span class="punctuation">&#125;</span><span class="comment">//作为数字类型存储</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"> <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319174634458.png"></p><p><strong>手动传入数据</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319180557778.png"></p><p><strong>查找数据</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319180522770.png"></p><h3 id="在kibana中查看数据"><a href="#在kibana中查看数据" class="headerlink" title="在kibana中查看数据"></a>在kibana中查看数据</h3><p><strong>在kibana-stack management中创建一手图表</strong></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319181421077.png"></p><p><img src="https://ws-blog-img.oss-cn-hangzhou.aliyuncs.com/wangsheng/20260319182256803.png"></p>]]>
    </content>
    <id>https://akemi.zj.cn/2026/03/19/Elastic-1/</id>
    <link href="https://akemi.zj.cn/2026/03/19/Elastic-1/"/>
    <published>2026-03-19T10:34:00.000Z</published>
    <summary>
      <![CDATA[<p>我准备使用两周时间重新学习和理解EFK&#x2F;ELK体系，之前我也学习过，但是因为没有实际可操作的项目，所以很快就忘记了，以下是AI（gemini）给我提供的学习方案</p>
<h2 id="学习方案"><a href="#学习方案" class="headerlink" title="学习方案"></a>学习方案</h2><h3]]>
    </summary>
    <title>两周复习EFK-第一天之部署与访问ES集群</title>
    <updated>2026-03-19T10:35:43.000Z</updated>
  </entry>
</feed>
