<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>WF&#39;s Blog</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://linuxwf.com/"/>
  <updated>2022-10-31T16:37:22.000Z</updated>
  <id>http://linuxwf.com/</id>
  
  <author>
    <name>Wu Fei</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>1.多节点安装ks+k8s</title>
    <link href="http://linuxwf.com/2022/11/01/1-%E5%A4%9A%E8%8A%82%E7%82%B9%E5%AE%89%E8%A3%85ks-k8s/"/>
    <id>http://linuxwf.com/2022/11/01/1-%E5%A4%9A%E8%8A%82%E7%82%B9%E5%AE%89%E8%A3%85ks-k8s/</id>
    <published>2022-10-31T16:36:00.000Z</published>
    <updated>2022-10-31T16:37:22.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p><strong>1.多节点安装ks+k8s</strong></p><h1 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h1><p>多节点集群由至少一个主节点和一个工作节点组成。您可以使用任何节点作为任务机来执行安装任务，也可以在安装之前或之后根据需要新增节点（例如，为了实现高可用性）。</p><ul><li>Control plane node：主节点，通常托管控制平面，控制和管理整个系统。</li><li>Worker node：工作节点，运行部署在工作节点上的实际应用程序。</li></ul><h1 id="步骤-1：准备-Linux-主机"><a href="#步骤-1：准备-Linux-主机" class="headerlink" title="步骤 1：准备 Linux 主机"></a>步骤 1：准备 Linux 主机</h1><p><strong>硬件推荐配置</strong></p><table><thead><tr><th>操作系统</th><th>最低配置</th></tr></thead><tbody><tr><td>Ubuntu 16.04, 18.04</td><td>2 核 CPU，4 GB 内存，40 GB 磁盘空间</td></tr><tr><td>Debian Buster, Stretch</td><td>2 核 CPU，4 GB 内存，40 GB 磁盘空间</td></tr><tr><td>CentOS 7.x</td><td>2 核 CPU，4 GB 内存，40 GB 磁盘空间</td></tr><tr><td>Red Hat Enterprise Linux 7</td><td>2 核 CPU，4 GB 内存，40 GB 磁盘空间Debian Buster, Stretch</td></tr><tr><td>SUSE Linux Enterprise Server 15/openSUSE Leap 15.2</td><td>2 核 CPU，4 GB 内存，40 GB 磁盘空间Debian Buster, Stretch</td></tr></tbody></table><p><strong>依赖项要求</strong></p><p>KubeKey 可以将 Kubernetes 和 KubeSphere 一同安装。针对不同的 Kubernetes 版本，需要安装的依赖项可能有所不同。您可以参考以下列表，查看是否需要提前在节点上安装相关的依赖项。</p><table><thead><tr><th>依赖项</th><th>Kubernetes 版本 ≥ 1.18</th><th>Kubernetes 版本 &lt; 1.18</th></tr></thead><tbody><tr><td>socat</td><td>必须</td><td>可选但建议</td></tr><tr><td>conntrack</td><td>必须</td><td>可选但建议</td></tr><tr><td>ebtables</td><td>可选但建议</td><td>可选但建议</td></tr><tr><td>ipset</td><td>可选但建议</td><td>可选但建议</td></tr></tbody></table><p><strong>项目准备</strong></p><table><thead><tr><th>主机 IP</th><th>主机名</th><th>角色</th></tr></thead><tbody><tr><td>10.0.0.200</td><td>control plane</td><td>control plane, etcd</td></tr><tr><td>10.0.0.201</td><td>node01</td><td>worker</td></tr><tr><td>10.0.0.202</td><td>node02</td><td>worker+harbor</td></tr></tbody></table><p><strong>节点要求</strong></p><ul><li>所有节点必须都能通过 SSH 访问。</li><li>所有节点时间同步。</li><li>所有节点都应使用 sudo/curl/openssl/tar。</li></ul><p>配置所有节点ssh互相访问：</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></pre></td><td class="code"><pre><span class="line">1.三台机器分别执行以下命令</span><br><span class="line">ssh-keygen</span><br><span class="line"></span><br><span class="line">2.查看公钥</span><br><span class="line">cat id_rsa.pub</span><br><span class="line"></span><br><span class="line">3.把公钥加入到authorized_keys文件</span><br><span class="line">[root@master ~/.ssh]<span class="comment"># cat authorized_keys </span></span><br><span class="line">ssh-rsa xxx root@master</span><br><span class="line">ssh-rsa xxx root@node01</span><br><span class="line">ssh-rsa xxx root@node02</span><br><span class="line"></span><br><span class="line">4.验证</span><br><span class="line">ssh 10.0.0.201 hostname</span><br><span class="line">ssh 10.0.0.202 hostname</span><br></pre></td></tr></table></figure><h1 id="步骤-2：下载-KubeKey"><a href="#步骤-2：下载-KubeKey" class="headerlink" title="步骤 2：下载 KubeKey"></a>步骤 2：下载 KubeKey</h1><p>提前准备工作：</p><figure class="highlight plain"><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><br><span class="line">systemctl stop firewalld</span><br><span class="line">systemctl disable firewalld</span><br><span class="line"></span><br><span class="line">#关闭 selinux</span><br><span class="line">sentenforce 0</span><br><span class="line">sed -i &#39;s&#x2F;enforcing&#x2F;disabled&#x2F;&#39; &#x2F;etc&#x2F;selinux&#x2F;config</span><br><span class="line"></span><br><span class="line">#关闭 swap</span><br><span class="line">swapoff -a  #临时</span><br><span class="line">sed -ri &#39;s&#x2F;.*swap.*&#x2F;#&amp;&#x2F;&#39; &#x2F;etc&#x2F;fstab  #永久</span><br></pre></td></tr></table></figure><p>下载 KubeKey：</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#创建kk目录</span></span><br><span class="line">mkdir /data &amp;&amp; <span class="built_in">cd</span> /data</span><br><span class="line"></span><br><span class="line"><span class="comment">#如果您能正常访问 GitHub/Googleapis</span></span><br><span class="line">curl -sfL https://get-kk.kubesphere.io | VERSION=v2.2.1 sh -</span><br><span class="line"></span><br><span class="line"><span class="comment">#如果您访问 GitHub/Googleapis 受限</span></span><br><span class="line"><span class="built_in">export</span> KKZONE=cn</span><br><span class="line">curl -sfL https://get-kk.kubesphere.io | VERSION=v2.2.1 sh -</span><br><span class="line"></span><br><span class="line"><span class="comment">#为 kk 添加可执行权限：</span></span><br><span class="line">chmod +x kk</span><br></pre></td></tr></table></figure><h1 id="步骤-3：创建集群"><a href="#步骤-3：创建集群" class="headerlink" title="步骤 3：创建集群"></a>步骤 3：创建集群</h1><p>对于多节点安装，您需要通过指定配置文件来创建集群。</p><h2 id="1-创建示例配置文件"><a href="#1-创建示例配置文件" class="headerlink" title="1. 创建示例配置文件"></a>1. 创建示例配置文件</h2><p>命令如下：</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">./kk create config --with-kubernetes v1.22.10 --with-kubesphere v3.3.0</span><br></pre></td></tr></table></figure><h2 id="2-编辑配置文件"><a href="#2-编辑配置文件" class="headerlink" title="2. 编辑配置文件"></a>2. 编辑配置文件</h2><p>如果您不更改名称，那么将创建默认文件 config-sample.yaml。编辑文件，以下是多节点集群（具有一个主节点）配置文件的示例。</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></pre></td><td class="code"><pre><span class="line">apiVersion: kubekey.kubesphere.io/v1alpha2</span><br><span class="line">kind: Cluster</span><br><span class="line">metadata:</span><br><span class="line">  name: sample</span><br><span class="line">spec:</span><br><span class="line">  hosts:</span><br><span class="line">  - &#123;name: master, address: 10.0.0.200, internalAddress: 10.0.0.200, privateKeyPath: <span class="string">"~/.ssh/id_rsa"</span>&#125;</span><br><span class="line">  - &#123;name: node01, address: 10.0.0.201, internalAddress: 10.0.0.201, privateKeyPath: <span class="string">"~/.ssh/id_rsa"</span>&#125;</span><br><span class="line">  - &#123;name: node02, address: 10.0.0.202, internalAddress: 10.0.0.202, privateKeyPath: <span class="string">"~/.ssh/id_rsa"</span>&#125;</span><br><span class="line">  roleGroups:</span><br><span class="line">    etcd:</span><br><span class="line">    - master</span><br><span class="line">    control-plane:</span><br><span class="line">    - master</span><br><span class="line">    worker:</span><br><span class="line">    - node01</span><br><span class="line">    - node02</span><br><span class="line">    registry:</span><br><span class="line">    - node02</span><br><span class="line"></span><br><span class="line">network:</span><br><span class="line">    plugin: calico</span><br><span class="line">    kubePodsCIDR: 10.233.64.0/18</span><br><span class="line">    kubeServiceCIDR: 10.233.0.0/18</span><br><span class="line">    <span class="comment">## multus support. https://github.com/k8snetworkplumbingwg/multus-cni</span></span><br><span class="line">    multusCNI:</span><br><span class="line">      enabled: <span class="literal">false</span></span><br><span class="line">  registry:</span><br><span class="line">    <span class="built_in">type</span>: harbor</span><br><span class="line">    privateRegistry: <span class="string">""</span></span><br><span class="line">    namespaceOverride: <span class="string">""</span></span><br><span class="line">    registryMirrors: []</span><br><span class="line">    insecureRegistries: []</span><br><span class="line">  addons: []</span><br><span class="line">  </span><br><span class="line">  alerting:</span><br><span class="line">    enabled: <span class="literal">true</span>    <span class="comment">#告警系统</span></span><br><span class="line">  auditing:</span><br><span class="line">    enabled: <span class="literal">true</span>    <span class="comment">#审计日志</span></span><br><span class="line">  devops:</span><br><span class="line">    enabled: <span class="literal">true</span>    <span class="comment">#devops</span></span><br><span class="line">  openpitrix:</span><br><span class="line">    store:</span><br><span class="line">      enabled: <span class="literal">true</span>  <span class="comment">#应用商店</span></span><br></pre></td></tr></table></figure><blockquote><p>备注：<br><strong>roleGroups</strong></p><ul><li>etcd：etcd 节点名称</li><li>control-plane：主节点名称</li><li>worker：工作节点名称   </li></ul></blockquote><p><strong>使用 SSH 密钥的无密码登录示例：</strong></p><figure class="highlight bash"><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">hosts:</span><br><span class="line">  - &#123;name: master, address: 10.0.0.200, internalAddress: 10.0.0.200, privateKeyPath: <span class="string">"~/.ssh/id_rsa"</span>&#125;</span><br></pre></td></tr></table></figure><h2 id="3-使用配置文件创建集群"><a href="#3-使用配置文件创建集群" class="headerlink" title="3. 使用配置文件创建集群"></a>3. 使用配置文件创建集群</h2><p><strong>备注：每个节点安装依赖项</strong></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">yum install -y  socat conntrack ebtables ipset</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></pre></td><td class="code"><pre><span class="line">./kk create cluster -f config-sample.yaml</span><br></pre></td></tr></table></figure><h2 id="4-验证安装"><a href="#4-验证安装" class="headerlink" title="4. 验证安装"></a>4. 验证安装</h2><p>执行以下命令查看集群状态：</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">kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l <span class="string">'app in (ks-install, ks-installer)'</span> -o jsonpath=<span class="string">'&#123;.items[0].metadata.name&#125;'</span>) -f</span><br></pre></td></tr></table></figure><blockquote><p>报错：提示 -bash: kubectl: command not found ，这里配置环境变量使之生效</p></blockquote><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">[root@master ~]<span class="comment"># whereis is kubectl</span></span><br><span class="line">[root@master ~]<span class="comment"># vim /etc/profile              最后一行加入</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">"/usr/local/bin/:<span class="variable">$PATH</span>"</span></span><br><span class="line">[root@master ~]<span class="comment"># source /etc/profile</span></span><br></pre></td></tr></table></figure><p>安装完成后，您会看到如下内容：</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"><span class="comment">#####################################################</span></span><br><span class="line"><span class="comment">###              Welcome to KubeSphere!           ###</span></span><br><span class="line"><span class="comment">#####################################################</span></span><br><span class="line"></span><br><span class="line">Console: http://10.0.0.200:30880</span><br><span class="line">Account: admin</span><br><span class="line">Password: P@88w0rd</span><br><span class="line"></span><br><span class="line">NOTES：</span><br><span class="line">  1. After you <span class="built_in">log</span> into the console, please check the</span><br><span class="line">     monitoring status of service components <span class="keyword">in</span></span><br><span class="line">     the <span class="string">"Cluster Management"</span>. If any service is not</span><br><span class="line">     ready, please <span class="built_in">wait</span> patiently until all components</span><br><span class="line">     are up and running.</span><br><span class="line">  2. Please change the default password after login.</span><br><span class="line"></span><br><span class="line"><span class="comment">#####################################################</span></span><br><span class="line">https://kubesphere.io             20xx-xx-xx xx:xx:xx</span><br><span class="line"><span class="comment">#####################################################</span></span><br></pre></td></tr></table></figure><p>现在，您可以通过 &lt;NodeIP:30880 使用默认帐户和密码 (admin/P@88w0rd) 访问 KubeSphere 的 Web 控制台。</p><p><img src="/" class="lazyload" data-src="https://kubesphere.com.cn/images/docs/v3.3/zh-cn/upgrade/air-gapped-upgrade-with-ks-installer/kubesphere-login.PNG"  alt="image"></p><h1 id="步骤-4：启用-kubectl-自动补全"><a href="#步骤-4：启用-kubectl-自动补全" class="headerlink" title="步骤 4：启用 kubectl 自动补全"></a>步骤 4：启用 kubectl 自动补全</h1><p>KubeKey 不会启用 kubectl 自动补全功能，请参见以下内容并将其打开：</p><blockquote><p>备注：</p><p>请确保已安装 bash-autocompletion 并可以正常工作。</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Install bash-completion</span></span><br><span class="line">apt-get install bash-completion</span><br><span class="line"></span><br><span class="line"><span class="comment"># Source the completion script in your ~/.bashrc file</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">'source &lt;(kubectl completion bash)'</span> &gt;&gt;~/.bashrc</span><br><span class="line"></span><br><span class="line"><span class="comment"># Add the completion script to the /etc/bash_completion.d directory</span></span><br><span class="line">kubectl completion bash &gt;/etc/bash_completion.d/kubectl</span><br></pre></td></tr></table></figure><h1 id="步骤-5：安装内网穿透工具-ZeroTier"><a href="#步骤-5：安装内网穿透工具-ZeroTier" class="headerlink" title="步骤 5：安装内网穿透工具 ZeroTier"></a>步骤 5：安装内网穿透工具 ZeroTier</h1><h2 id="1-注册账号"><a href="#1-注册账号" class="headerlink" title="1.注册账号"></a>1.注册账号</h2><p>访问：<a href="https://www.zerotier.com/" target="_blank" rel="noopener">https://www.zerotier.com/</a> 注册账号；</p><h2 id="2-创建虚拟网络"><a href="#2-创建虚拟网络" class="headerlink" title="2.创建虚拟网络"></a>2.创建虚拟网络</h2><ol><li>点击“Create A Network”创建一个虚拟网络：</li><li>记住Network ID，后边会用到；<br>Name随便写；<br>Access Control选择：PRIVATE；</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/20221020115538.png"  alt=""></p><h2 id="3-配置网段"><a href="#3-配置网段" class="headerlink" title="3.配置网段"></a>3.配置网段</h2><ol><li>IPV4 Auto-Assign 选择“Easy”，然后从下发的网段选择一个即可；</li><li>这里选择的是10.242.<em>.</em>，上方的Managed Routes会自动修改为：10.242.0.0/16 (LAN);</li><li>表示：10.242.<em>.</em>的虚拟网段，由ZeroTier进行路由转发；</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/20221020112550.png"  alt=""></p><ol start="4"><li>剩下部分保留默认配置即可；接下来配置客户端。</li></ol><h2 id="4-客户端配置"><a href="#4-客户端配置" class="headerlink" title="4.客户端配置"></a>4.客户端配置</h2><ol><li><p>下载并安装ZeroTier客户端：<a href="https://www.zerotier.com/download/" target="_blank" rel="noopener">https://www.zerotier.com/download/</a></p></li><li><p>按照官网提示，安装ZeroTier客户端即可；</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">curl -s https://install.zerotier.com | sudo bash</span><br></pre></td></tr></table></figure><p>若需要，可以通过以下命令获取设备的address地址：</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">cat /var/lib/zerotier-one/identity.public |cut -d : -f 1</span><br></pre></td></tr></table></figure></li><li><p>配置客户端，加入虚拟网络：</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">zerotier-cli join &lt;Network ID&gt;</span><br></pre></td></tr></table></figure><p>MacOS和Windows系统，打开客户端，粘贴Network ID，然后点击“Join Network”：</p></li><li><p>回到管理UI，找到刚刚申请加入的设备，点击左侧的“Auth?”复选框，给新加入的设备授权：</p><blockquote><p>“Name”随便写；<br>“Managed IPs”，输入“10.242.0.0”至“10.242.255.255”之间的任意IP，网段对应上一步创建的网段即可；<br>点击“Managed IPs”左侧的“+”，生成虚拟IP；</p></blockquote></li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/20221020115412.png"  alt=""></p><ol start="5"><li>客户端配置完成；可以回到客户端，查看是否正常：</li><li>将多个设备加入虚拟网络；如果是云服务器，记得开放相应的端口；</li><li>多个设备之间，可以使用虚拟IP互联；</li></ol><h2 id="5-moon节点配置"><a href="#5-moon节点配置" class="headerlink" title="5.moon节点配置"></a>5.moon节点配置</h2><p>官方的节点，速度比较慢；可以通过自建中继节点（moon）的方式，提高连接速度；<br>自建的moon节点服务器必须有外网IP，才有意义；</p><ol><li>在Linux的服务器上，配置moon服务器：</li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/lib/zerotier-one</span><br><span class="line"><span class="comment">#生成moon</span></span><br><span class="line">zerotier-idtool initmoon identity.public &gt;&gt;moon.json</span><br></pre></td></tr></table></figure><ol start="2"><li>修改 moon.json文件的id地址、stableEndpoints值</li></ol><figure class="highlight bash"><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"><span class="string">"id"</span>: <span class="string">"12345678"</span>,</span><br><span class="line"><span class="string">"stableEndpoints"</span>: [<span class="string">"1.2.3.4/9993"</span>]</span><br></pre></td></tr></table></figure><ol start="3"><li>启动moon服务器：</li></ol><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="comment">#生成签名文件</span></span><br><span class="line">zerotier-idtool genmoon moon.json                <span class="comment">#会生成类似：000000xxxxxxxx.moon的文件</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#将 moon 节点加入网络</span></span><br><span class="line">mkdir moons.d</span><br><span class="line">cp 000000xxxxxxxx.moon /moons.d/</span><br><span class="line">systemctl restart zerotier-one.service</span><br></pre></td></tr></table></figure><ol start="4"><li>其他客户端连接moon服务器：</li></ol><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="comment">#Linux</span></span><br><span class="line"><span class="comment">#连接moon节点：</span></span><br><span class="line"><span class="comment">#注意这里的12345678为上边moon.json里的id</span></span><br><span class="line"><span class="comment">#orbit后边跟两个id</span></span><br><span class="line">zerotier-cli orbit 12345678 12345678</span><br></pre></td></tr></table></figure><ol start="5"><li>如果是Windows系统：</li></ol><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">C:\Program Files (x86)\ZeroTier\One&gt; .\zerotier-cli.bat orbit 12345678 12345678</span><br></pre></td></tr></table></figure><ol start="6"><li>查看节点连接信息：</li></ol><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></pre></td><td class="code"><pre><span class="line">zerotier-cli listpeers</span><br><span class="line"><span class="comment">#结果中可以看到新加入的moon节点；</span></span><br><span class="line"><span class="comment">#如果没有，可以稍等一会；</span></span><br></pre></td></tr></table></figure><ol start="7"><li>卸载Zerotier-one</li></ol><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">1.通过dpkg删除zerotier-one服务</span><br><span class="line">dpkg -P zerotier-one</span><br><span class="line"></span><br><span class="line">2.删除zerotier-one文件夹，该文件夹存储了address地址，删除后再次安装会获得新的address地址</span><br><span class="line">rm -rf /var/lib/zerotier-one/</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="KubeSphere" scheme="http://linuxwf.com/categories/KubeSphere/"/>
    
    
      <category term="k8s" scheme="http://linuxwf.com/tags/k8s/"/>
    
      <category term="KubeSphere" scheme="http://linuxwf.com/tags/KubeSphere/"/>
    
  </entry>
  
  <entry>
    <title>Nginx优化之高并发配置</title>
    <link href="http://linuxwf.com/2022/11/01/Nginx%E4%BC%98%E5%8C%96%E4%B9%8B%E9%AB%98%E5%B9%B6%E5%8F%91%E9%85%8D%E7%BD%AE/"/>
    <id>http://linuxwf.com/2022/11/01/Nginx%E4%BC%98%E5%8C%96%E4%B9%8B%E9%AB%98%E5%B9%B6%E5%8F%91%E9%85%8D%E7%BD%AE/</id>
    <published>2022-10-31T16:23:00.000Z</published>
    <updated>2022-10-31T16:23:38.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p><strong>Nginx优化之高并发配置</strong></p><h1 id="1-高并发简介"><a href="#1-高并发简介" class="headerlink" title="1.高并发简介"></a>1.高并发简介</h1><p>高并发（High Concurrency）通常是指通过设计保证系统能够同时并行处理很多请求。通俗来讲，高并发是指在同一个时间点，有很多用户同时的访问同一 API 接口或者 Url 地址。它经常会发生在有大活跃用户量，用户高聚集的业务场景中。</p><h1 id="2-优化思路"><a href="#2-优化思路" class="headerlink" title="2.优化思路"></a>2.优化思路</h1><h2 id="2-1-系统层面优化"><a href="#2-1-系统层面优化" class="headerlink" title="2.1 系统层面优化"></a>2.1 系统层面优化</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#调整同时打开文件数量</span></span><br><span class="line"><span class="built_in">ulimit</span> -n 65536</span><br><span class="line"></span><br><span class="line"><span class="comment">#TCP最大连接数(somaxconn)</span></span><br><span class="line"><span class="built_in">echo</span> 10000 &gt; /proc/sys/net/core/somaxconn</span><br><span class="line"></span><br><span class="line"><span class="comment">#TCP连接立即回收、回用(recycle、reuse)</span></span><br><span class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/tcp_tw_reuse</span><br><span class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/tcp_tw_recycle</span><br><span class="line"></span><br><span class="line"><span class="comment">#不做TCP洪水抵御</span></span><br><span class="line"><span class="built_in">echo</span> 0 &gt; /proc/sys/net/ipv4/tcp_syncookies</span><br></pre></td></tr></table></figure><h2 id="2-2-Linux内核参数优化"><a href="#2-2-Linux内核参数优化" class="headerlink" title="2.2 Linux内核参数优化"></a>2.2 Linux内核参数优化</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#优化内核参数</span></span><br><span class="line">vim /etc/sysctl.conf</span><br><span class="line"></span><br><span class="line">net.core.somaxconn = 262144</span><br><span class="line">net.core.rmem_default = 262144</span><br><span class="line">net.core.wmem_default = 262144</span><br><span class="line">net.core.rmem_max = 16777216</span><br><span class="line">net.core.wmem_max = 16777216</span><br><span class="line">net.ipv4.tcp_rmem = 4096 4096 16777216</span><br><span class="line">net.ipv4.tcp_wmem = 4096 4096 16777216</span><br><span class="line">net.ipv4.tcp_mem = 786432 2097152 3145728</span><br><span class="line">net.ipv4.tcp_max_syn_backlog = 16384</span><br><span class="line">net.core.netdev_max_backlog = 20000</span><br><span class="line">net.ipv4.tcp_fin_timeout = 15</span><br><span class="line">net.ipv4.tcp_max_syn_backlog = 16384</span><br><span class="line">net.ipv4.tcp_tw_reuse = 1</span><br><span class="line">net.ipv4.tcp_tw_recycle = 1</span><br><span class="line">net.ipv4.tcp_max_orphans = 131072</span><br><span class="line">net.ipv4.tcp_syncookies = 0</span><br><span class="line"></span><br><span class="line"><span class="comment">#生效</span></span><br><span class="line">sysctl -p</span><br></pre></td></tr></table></figure><h2 id="2-3-Nginx配置文件优化"><a href="#2-3-Nginx配置文件优化" class="headerlink" title="2.3 Nginx配置文件优化"></a>2.3 Nginx配置文件优化</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></pre></td><td class="code"><pre><span class="line">vim /etc/nginx/nginx.conf</span><br><span class="line"></span><br><span class="line">worker_processes auto; <span class="comment">#工作进程数</span></span><br><span class="line">worker_rlimit_nofile 65535;<span class="comment">#工作进程最大打开文件数</span></span><br><span class="line">events &#123;</span><br><span class="line">    use epoll;<span class="comment">#使用epoll事件驱动模型</span></span><br><span class="line">    worker_connections 65535;<span class="comment">#工作进程最大连接数</span></span><br><span class="line">    multi_accept on;<span class="comment">#设置工作进程同时接收多个网络连接</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">http &#123;</span><br><span class="line">    sendfile            on;<span class="comment">#开启高效文件传输模式</span></span><br><span class="line">    send_timeout       10s;<span class="comment">#设置服务器和客户端连接超时时间</span></span><br><span class="line">    client_header_buffer_size 4k;<span class="comment">#客户端请求头部的缓冲区大小</span></span><br><span class="line">    tcp_nopush          on;<span class="comment">#将响应头和正文的开始部分一起发送，而不一个接一个的发送。</span></span><br><span class="line">    tcp_nodelay         on;<span class="comment">#不要缓存数据</span></span><br><span class="line">    keepalive_timeout   0;<span class="comment">#服务器和客户端保持活动的时间是65s，之后断开，高并发时可以设置为0    </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="2-4-扩展服务器的CPU和内存"><a href="#2-4-扩展服务器的CPU和内存" class="headerlink" title="2.4 扩展服务器的CPU和内存"></a>2.4 扩展服务器的CPU和内存</h2><p>这个就不在这里说了，这个大家都懂的操作，再说就没意义了。无非就是联系厂商增加CPU和内存，或者自己买CPU和内存，是云上的就扩展CPU和内存就可以了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="LNMP" scheme="http://linuxwf.com/categories/LNMP/"/>
    
    
      <category term="lnmp" scheme="http://linuxwf.com/tags/lnmp/"/>
    
      <category term="nginx" scheme="http://linuxwf.com/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>7.Pipeline分布式构建</title>
    <link href="http://linuxwf.com/2020/04/15/7-Pipeline%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%84%E5%BB%BA/"/>
    <id>http://linuxwf.com/2020/04/15/7-Pipeline%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%84%E5%BB%BA/</id>
    <published>2020-04-15T11:58:00.000Z</published>
    <updated>2020-04-15T11:59:33.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="pipeline分布式构建"><a href="#pipeline分布式构建" class="headerlink" title="pipeline分布式构建"></a>pipeline分布式构建</h1><h2 id="第1章-Jenkins-Pipeline项目"><a href="#第1章-Jenkins-Pipeline项目" class="headerlink" title="第1章 Jenkins Pipeline项目"></a>第1章 Jenkins Pipeline项目</h2><p><code>CI/CD</code>持续集成/持续部署</p><p>持续集成(Continuous integration)是一种软件开发实践，即团队开发成员经常集成它们的工作，通过每个成员每天至少集成一次，也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建（包括编译，发布，自动化测试）来验证，从而尽早地发现集成错误。比如（你家装修厨房，其中一项是铺地砖，边角地砖要切割大小。如果一次全切割完再铺上去，发现尺寸有误的话浪费和返工时间就大了，不如切一块铺一块。这就是持续集成。）</p><p>持续部署（continuous deployment）是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度，毕竟快速运转的互联网公司人力成本会高于机器，投资机器优化开发流程化</p><p>相对也提高了人的效率。比如（装修厨房有很多部分，每个部分都有检测手段，如地砖铺完了要测试漏水与否，线路铺完了要通电测试电路通顺，水管装好了也要测试冷水热水。如果全部装完了再测，出现问题可能会互相影响，比如电路不行可能要把地砖给挖开……。那么每完成一部分就测试，这是持续部署。）</p><p>持续交付 Continuous Delivery:频繁地将软件的新版本，交付给质量团队或者用户，以供评审尽早发现生产环境</p><p>中存在的问题；如果评审通过，代码就进入生产阶段</p><p>比如（全部装修完了，你去验收，发现地砖颜色不合意，水池太小，灶台位置不对，返工吗？所以不如没完成一部分，你就去用一下试用验收，这就是持续交付。）</p><p>敏捷思想中提出的这三个观点，还强调一件事：通过技术手段自动化这三个工作。加快交付速度。</p><h3 id="什么是pipeline"><a href="#什么是pipeline" class="headerlink" title="什么是pipeline"></a>什么是pipeline</h3><p>Jenkins 2.0的精髓是Pipeline as Code，是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline，简单</p><p>来说，就是一套运行于Jenkins上的工作流框架，将原本独立运行于单个或者多个节点的任务连接起来，实现单个</p><p>任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL，任何发布流程都可以表述为一段Groovy</p><p>脚本，并且Jenkins支持从代码库直接读取脚本，从而实现了Pipeline as Code的理念。</p><h3 id="Pipeline-概念"><a href="#Pipeline-概念" class="headerlink" title="Pipeline 概念"></a>Pipeline 概念</h3><p><code>Pipeline</code> 是一个用户定义的 CD 流水线模式。<code>Pipeline</code> 代码定义了通常包含构建、测试和发布步骤的完整的构</p><p>建过程。</p><p><strong>Node</strong></p><p><code>node</code> 是一个机器，它是 Jenkins 环境的一部分，并且能够执行 Pipeline。同时，node 代码块也是脚本式</p><p>Pipeline 语法的关键特性。</p><p><strong>Stage</strong></p><p><code>Stage</code> 块定义了在整个 Pipeline 中执行的概念上不同的任务子集（例如“构建”，“测试”和“部署”阶段），</p><p>许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。</p><p><strong>Step</strong></p><p>一项任务。从根本上讲，一个步骤告诉 Jenkins 在特定时间点（或过程中的“步骤”）要做什么。例如，使用</p><p>sh step：sh ‘make’ 可以执行 make 这个 shell 命令。</p><h3 id="jenkins-file"><a href="#jenkins-file" class="headerlink" title="jenkins file"></a>jenkins file</h3><p>脚本式语法格式：</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">pipeline&#123;</span><br><span class="line">    agent any</span><br><span class="line">    stages&#123;</span><br><span class="line">        stage(<span class="string">"get code"</span>)&#123;</span><br><span class="line">           steps&#123;</span><br><span class="line">               <span class="built_in">echo</span> <span class="string">"get code from scm"</span></span><br><span class="line">           &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        stage(<span class="string">"package"</span>)&#123;</span><br><span class="line">            steps&#123;</span><br><span class="line">                <span class="built_in">echo</span> <span class="string">"packge code"</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        stage(<span class="string">"deploy"</span>)&#123;</span><br><span class="line">            steps&#123;</span><br><span class="line">                <span class="built_in">echo</span> <span class="string">"deploy packge to node1"</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></pre></td></tr></table></figure><h3 id="创建一个pipeline测试"><a href="#创建一个pipeline测试" class="headerlink" title="创建一个pipeline测试"></a>创建一个pipeline测试</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe01.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe02.png"  alt=""></p><p>使用测试pipeline脚本测试</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe03.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe04.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe05.png"  alt=""></p><h3 id="创建一个jenkinsfile项目"><a href="#创建一个jenkinsfile项目" class="headerlink" title="创建一个jenkinsfile项目"></a>创建一个jenkinsfile项目</h3><figure class="highlight sh"><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">pipeline&#123;</span><br><span class="line">    agent any</span><br><span class="line">    stages&#123;</span><br><span class="line">        stage(<span class="string">"get code"</span>)&#123;</span><br><span class="line">           steps&#123;</span><br><span class="line">                <span class="built_in">echo</span> <span class="string">"get code"</span></span><br><span class="line">           &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        stage(<span class="string">"unit test"</span>)&#123;</span><br><span class="line">           steps&#123;</span><br><span class="line">                sh <span class="string">'/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=html  -Dsonar.projectName=$&#123;JOB_NAME&#125; -Dsonar.sources=.'</span></span><br><span class="line">           &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        stage(<span class="string">"package"</span>)&#123;</span><br><span class="line">            steps&#123;</span><br><span class="line">                sh <span class="string">'tar zcf /opt/web-$&#123;BUILD_ID&#125;.tar.gz ./* --exclude=./git --exclude=jenkinsfile'</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        stage(<span class="string">"deploy"</span>)&#123;</span><br><span class="line">            steps&#123;</span><br><span class="line">                sh <span class="string">'ssh 10.0.1.7 "cd /code/www/ &amp;&amp; mkdir web-$&#123;BUILD_ID&#125;"'</span></span><br><span class="line">                sh <span class="string">'scp /opt/web-$&#123;BUILD_ID&#125;.tar.gz 10.0.1.7:/code/www/web-$&#123;BUILD_ID&#125;'</span></span><br><span class="line">                sh <span class="string">'ssh 10.0.1.7 "cd /code/www/web-$&#123;BUILD_ID&#125; &amp;&amp; tar xf web-$&#123;BUILD_ID&#125;.tar.gz &amp;&amp; rm -rf web-$&#123;BUILD_ID&#125;.tar.gz"'</span></span><br><span class="line">                sh <span class="string">'ssh 10.0.1.7 "cd /code/www/ &amp;&amp; rm -rf html &amp;&amp; ln -s web-$&#123;BUILD_ID&#125; /code/www/html"'</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></pre></td></tr></table></figure><p>配置<code>pipeline</code>流水线</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe06.png"  alt=""></p><p>在gitlab上创建Jenkinsfile，并写入脚本</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe07.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe08.png"  alt=""></p><p>返回<code>jenkins</code>重新构建</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe09.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe10.png"  alt=""></p><p>使用<code>Blue Ocean</code>查看</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe11.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe12.png"  alt=""></p><h2 id="第2章-分布式构建"><a href="#第2章-分布式构建" class="headerlink" title="第2章 分布式构建"></a>第2章 分布式构建</h2><p><strong>分布式构建</strong></p><p>如果项目需要定期集成，同时每次集成都需要较长时间。如果都运行在master服务器上，会消耗过多资源，导致其他项目搁置无法集成，这时就需要在建立多台设备，并配置作为slave机器来为master提供负载服务。</p><h3 id="1-环境准备"><a href="#1-环境准备" class="headerlink" title="1.环境准备"></a>1.环境准备</h3><p>找一台或者目前已有的服务器配置为slave端 #当前使用soar服务器作为slave测试</p><p>在<code>sonar上</code>安装<code>java</code>  <code>jdk</code>  <code>git</code> 和<code>soanr</code> 客户端 </p><p>#如已安装则略过</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install java git</span><br></pre></td></tr></table></figure><p><code>scp jenkins</code>上已配置好的客户端到此服务器 <code>sonar</code>和<code>maven</code></p><p><code>jenkins</code>服务器操作 注意带版本号做软链接</p><figure class="highlight sh"><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">scp -r /usr/<span class="built_in">local</span>/sonar-scanner-4.0.0.1744-linux 10.0.1.203:/usr/<span class="built_in">local</span>/</span><br><span class="line">scp -r /usr/<span class="built_in">local</span>/apache-maven-3.3.9 10.0.1.203:/usr/<span class="built_in">local</span>/</span><br><span class="line">ssh 10.0.1.203 <span class="string">"mkdir /server/scripts -p"</span></span><br><span class="line">scp /server/scripts/* 10.0.1.203:/server/scripts/</span><br><span class="line"></span><br><span class="line"><span class="comment">#做免秘钥认证拷贝jenkins公钥到slave，私钥配置到jenkins</span></span><br><span class="line"><span class="built_in">cd</span> &amp;&amp; ssh-copy-id -i .ssh/id_rsa.pub 10.0.1.203</span><br></pre></td></tr></table></figure><p>返回<code>sonar</code>上创建软链接</p><figure class="highlight sh"><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">ln -s sonar-scanner-4.0.0.1744-linux sonar-scanner</span><br><span class="line">ln -s apache-maven-3.3.9 maven</span><br></pre></td></tr></table></figure><p>slave服务器上做连接web的免秘钥认证</p><figure class="highlight sh"><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">ssh-keygen -t rsa</span><br><span class="line">ssh-copy-id -i .ssh/id_rsa.pub 10.0.1.7</span><br></pre></td></tr></table></figure><h3 id="2-新建节点"><a href="#2-新建节点" class="headerlink" title="2.新建节点"></a>2.新建节点</h3><p>点击系统管理-&gt;节点管理-&gt;新建节点</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe13.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe14.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe15.png"  alt=""></p><p>配置工具默认目录</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe16.png"  alt=""></p><p>配置成功后的状态</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe17.png"  alt=""></p><p>显示已经同步成功</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe18.png"  alt=""></p><h3 id="3-构建多个项目测试"><a href="#3-构建多个项目测试" class="headerlink" title="3.构建多个项目测试"></a>3.构建多个项目测试</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/pipe19.png"  alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="pipeline" scheme="http://linuxwf.com/tags/pipeline/"/>
    
  </entry>
  
  <entry>
    <title>6.nexus参数化构建</title>
    <link href="http://linuxwf.com/2020/04/15/6-nexus%E5%8F%82%E6%95%B0%E5%8C%96%E6%9E%84%E5%BB%BA/"/>
    <id>http://linuxwf.com/2020/04/15/6-nexus%E5%8F%82%E6%95%B0%E5%8C%96%E6%9E%84%E5%BB%BA/</id>
    <published>2020-04-15T11:41:00.000Z</published>
    <updated>2020-04-15T11:42:30.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="nexus参数化构建"><a href="#nexus参数化构建" class="headerlink" title="nexus参数化构建"></a>nexus参数化构建</h1><h2 id="第1章-nexus私有仓库"><a href="#第1章-nexus私有仓库" class="headerlink" title="第1章 nexus私有仓库"></a>第1章 nexus私有仓库</h2><p>部署私服 nexus 下载<a href="https://www.sonatype.com/download‐oss‐sonatype" target="_blank" rel="noopener">https://www.sonatype.com/download‐oss‐sonatype</a></p><p>配置仓库两个选项</p><ol><li><p>项目下的pom.xml配置、只生效当前的项目</p></li><li><p>在maven配置全局所有项目生效</p></li></ol><h3 id="上传JDK和nexus安装包"><a href="#上传JDK和nexus安装包" class="headerlink" title="上传JDK和nexus安装包"></a>上传JDK和nexus安装包</h3><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">rpm -ivh jdk-8u181-linux-x64.rpm</span><br><span class="line">tar xf nexus-3.13.0-01-unix.tar.gz -C /usr/<span class="built_in">local</span>/</span><br><span class="line">ln -s nexus-3.13.0-01 nexus</span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/nexus/bin/</span><br><span class="line">./nexus start</span><br><span class="line">./nexus status</span><br><span class="line">netstat -lntup</span><br><span class="line">tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      3286/java</span><br></pre></td></tr></table></figure><h3 id="访问10-0-1-202-8081测试"><a href="#访问10-0-1-202-8081测试" class="headerlink" title="访问10.0.1.202:8081测试"></a>访问10.0.1.202:8081测试</h3><p>登录更改默认源为阿里源，登录用户<code>admin</code>密码<code>admin123</code></p><blockquote><p>阿里源地址：<a href="http://maven.aliyun.com/nexus/content/groups/public" target="_blank" rel="noopener">http://maven.aliyun.com/nexus/content/groups/public</a></p></blockquote><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus01.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus02.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus03.png"  alt=""></p><h3 id="修改maven配置文件"><a href="#修改maven配置文件" class="headerlink" title="修改maven配置文件"></a>修改maven配置文件</h3><p>上传新文件，更改三处IP地址，指向<code>nexus</code>私服</p><figure class="highlight sh"><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"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/maven/conf/</span><br><span class="line">mv settings.xml settings.xml.bak</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus04.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus05.png"  alt=""></p><p>具体配置方法,查看附件nexus.txt文件：</p><h3 id="配置完成后去jenkins使用mvn测试"><a href="#配置完成后去jenkins使用mvn测试" class="headerlink" title="配置完成后去jenkins使用mvn测试"></a>配置完成后去jenkins使用mvn测试</h3><figure class="highlight sh"><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">mvn clean</span><br><span class="line">mvn package</span><br></pre></td></tr></table></figure><p>返回nexus <a href="http://10.0.1.202:8081/查看，已经搭建完成" target="_blank" rel="noopener">http://10.0.1.202:8081/查看，已经搭建完成</a></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus06.png"  alt=""></p><h2 id="第2章-参数化构建"><a href="#第2章-参数化构建" class="headerlink" title="第2章 参数化构建"></a>第2章 参数化构建</h2><p>参数化构建，通过tag传递参数达到发布和代码回滚的操作</p><h3 id="修改项目配置"><a href="#修改项目配置" class="headerlink" title="修改项目配置"></a>修改项目配置</h3><p>注: 接下来安装插件、在可选插件中搜索Git Parameter 直接安装即可，已安装则忽略次步骤</p><p>进入到项目把前面的参数化去掉重新选择使用<code>git parameter</code></p><p>修改参数化构建</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus07.png"  alt=""></p><blockquote><p>修改<code>test-job</code>的 <code>Branches to build</code> 为<code>${git_version}</code></p></blockquote><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus08.png"  alt=""></p><h3 id="返回test-job查看"><a href="#返回test-job查看" class="headerlink" title="返回test-job查看"></a>返回test-job查看</h3><p>立即构建变成<code>Build with Parameters</code></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus09.png"  alt=""></p><h3 id="gitlab下创建标签并上传远程仓库"><a href="#gitlab下创建标签并上传远程仓库" class="headerlink" title="gitlab下创建标签并上传远程仓库"></a>gitlab下创建标签并上传远程仓库</h3><figure class="highlight sh"><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.查看标签     git tag</span><br><span class="line">2.编辑网页内容，并提交，打上标签   </span><br><span class="line">/root/dzp &amp;&amp; vim index.html</span><br><span class="line">git commit -am <span class="string">"vx.0"</span></span><br><span class="line">git tag -a vx.0 -m <span class="string">"vx.0"</span></span><br><span class="line"></span><br><span class="line">3.上传到远程仓库</span><br><span class="line">git push -u origin vx.0</span><br><span class="line"></span><br><span class="line"><span class="comment">#分别创建标签v1.0 v2.0 v3.0 v4.0</span></span><br></pre></td></tr></table></figure><h3 id="使用devploy发布版本和使用rollback回滚版本"><a href="#使用devploy发布版本和使用rollback回滚版本" class="headerlink" title="使用devploy发布版本和使用rollback回滚版本"></a>使用devploy发布版本和使用rollback回滚版本</h3><p><strong><code>devploy</code>发布<code>1.0-4.0</code>版本</strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus10.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus11.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus12.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus13.png"  alt=""></p><p><strong><code>rollback</code>进行版本回滚，从<code>v4.0</code>返回<code>v3.0</code></strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus14.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/nexus15.png"  alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="nexus" scheme="http://linuxwf.com/tags/nexus/"/>
    
  </entry>
  
  <entry>
    <title>5.jenkins+sonar</title>
    <link href="http://linuxwf.com/2020/04/15/5-jenkins-sonar/"/>
    <id>http://linuxwf.com/2020/04/15/5-jenkins-sonar/</id>
    <published>2020-04-15T10:50:00.000Z</published>
    <updated>2020-04-15T10:51:31.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="安装jenkins"><a href="#安装jenkins" class="headerlink" title="安装jenkins"></a>安装jenkins</h2><h3 id="安装准备"><a href="#安装准备" class="headerlink" title="安装准备"></a>安装准备</h3><p>装备两台服务器 关闭selinux和防火墙</p><blockquote><p>jenkins 10.0.1.201   内存2G 50G+硬盘 </p><p>sonar 10.0.1.203     内存4G 50G+硬盘</p></blockquote><h3 id="安装JDK运行环境和jenkins服务"><a href="#安装JDK运行环境和jenkins服务" class="headerlink" title="安装JDK运行环境和jenkins服务"></a>安装JDK运行环境和jenkins服务</h3><p>上传JDK和jenkins rpm安装包，使用rpm ‐ivh进行安装,安装完JDK运维java测试是否安装成功</p><figure class="highlight sh"><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">rpm -ivh jdk-8u181-linux-x64.rpm</span><br><span class="line">rpm -ivh jenkins-2.176.1-1.1.noarch.rpm</span><br><span class="line">rpm -ql jenkins  ---&gt;查看安装内容</span><br></pre></td></tr></table></figure><h3 id="配置jenkins"><a href="#配置jenkins" class="headerlink" title="配置jenkins"></a>配置jenkins</h3><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">#启动用户修改为root</span></span><br><span class="line">vim /etc/sysconfig/jenkins</span><br><span class="line">JENKINS_USER=<span class="string">"root"</span></span><br><span class="line"></span><br><span class="line">systemctl start jenkins</span><br><span class="line">systemctl <span class="built_in">enable</span> jenkins</span><br></pre></td></tr></table></figure><p><strong>访问页面进行配置</strong></p><p><a href="http://10.0.0.201:8080" target="_blank" rel="noopener">http://10.0.0.201:8080</a></p><p><strong>查看管理员密码</strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar01.png"  alt=""></p><figure class="highlight sh"><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">[root@jenkins2 ~]<span class="comment"># cat /var/lib/jenkins/secrets/initialAdminPassword</span></span><br><span class="line">9429ed982c10419e89ff06443eb3ac09</span><br></pre></td></tr></table></figure><p>选择不安装插件，直接X掉，然后修改admin密码为123</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar02.png"  alt=""></p><h3 id="插件安装"><a href="#插件安装" class="headerlink" title="插件安装"></a>插件安装</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar03.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar04.png"  alt=""></p><p>更改下载地址</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar05.png"  alt=""></p><p>（跳过安装插件，直接上传插件到目录）和修改登录密码</p><ol><li><p>自动安装可选插件</p></li><li><p>手动下载插件上传安装</p></li><li><p>插件放入插件目录</p></li></ol><figure class="highlight sh"><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">[root@jenkins2 ~]<span class="comment"># cd /var/lib/jenkins/</span></span><br><span class="line">[root@jenkins2 /var/lib/jenkins]<span class="comment"># ll</span></span><br><span class="line">drwxr-xr-x   4 root root    39 Nov  6 23:14 <span class="built_in">jobs</span>  </span><br><span class="line">drwxr-xr-x 132 root root 12288 Nov  1 18:51 plugins</span><br><span class="line"></span><br><span class="line"><span class="built_in">jobs</span>为每次构建后构建的结果目录</span><br><span class="line">plugins为插件目录</span><br><span class="line"><span class="built_in">cd</span> /var/lib/jenkins/plugins</span><br><span class="line">tar xf jenkins_plugins.tar.gz     解压手动上传的插件</span><br><span class="line">rm -rf jenkins_plugins.tar.gz</span><br><span class="line">mv plugins/* .</span><br><span class="line">systemctl restart jenkins</span><br></pre></td></tr></table></figure><ol start="4"><li>jenkins主要的目录</li></ol><figure class="highlight sh"><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">/usr/lib/jenkins/：jenkins安装目录，WAR包会放在这里</span><br><span class="line">/etc/sysconfig/jenkins：jenkins配置文件，“端口”，“JENKINS_HOME”等都可以在这里配置</span><br><span class="line">/var/lib/jenkins/：默认的JENKINS_HOME</span><br><span class="line">/var/<span class="built_in">log</span>/jenkins/jenkins.log：Jenkins日志文件</span><br></pre></td></tr></table></figure><p>安装玩插件后变成中文版</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar06.png"  alt=""></p><h3 id="创建一个自由风格的项目test‐job"><a href="#创建一个自由风格的项目test‐job" class="headerlink" title="创建一个自由风格的项目test‐job"></a>创建一个自由风格的项目test‐job</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar07.png"  alt=""></p><p>丢弃旧的构建</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar08.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar09.png"  alt=""></p><p>返回jenkins主机生成密钥对</p><figure class="highlight sh"><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">[root@jenkins2 ~]<span class="comment"># ssh-keygen -t rsa</span></span><br><span class="line">[root@jenkins2 ~]<span class="comment"># cat .ssh/id_rsa.pub</span></span><br></pre></td></tr></table></figure><p>将公钥放到gitlab服务器上</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar10.png"  alt=""></p><p>添加公钥</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar11.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar12.png"  alt=""></p><h3 id="配置完成后点击保存，选择立即构建测试"><a href="#配置完成后点击保存，选择立即构建测试" class="headerlink" title="配置完成后点击保存，选择立即构建测试"></a>配置完成后点击保存，选择立即构建测试</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar13.png"  alt=""></p><p>查看创建的项目</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@jenkins2 /var/lib/jenkins/workspace/<span class="built_in">test</span>-job]<span class="comment"># ll</span></span><br><span class="line">total 388</span><br><span class="line">-rw-r--r-- 1 root root   6398 Nov  7 02:38 awardrotate.js</span><br><span class="line">drwxr-xr-x 2 root root   4096 Nov  7 02:38 images</span><br><span class="line">-rw-r--r-- 1 root root  26696 Nov  7 02:38 index.html</span><br><span class="line">-rw-r--r-- 1 root root  93628 Nov  7 02:38 jquery-1.10.2.js</span><br><span class="line">-rw-r--r-- 1 root root 257551 Nov  7 02:38 jquery-2.2.4.js</span><br><span class="line">-rw-r--r-- 1 root root   1334 Nov  7 02:38 README.md</span><br></pre></td></tr></table></figure><h2 id="SonarQube"><a href="#SonarQube" class="headerlink" title="SonarQube"></a>SonarQube</h2><h3 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h3><blockquote><ol><li>SonarQube基础java开发，需安装open JDK8版本 </li><li>SonarQube需要依赖MySQL数据库，至少5.6版本以上 </li><li>SonarQube的小型实例至少4G内存，如果大型实例需要16G内存</li></ol></blockquote><h3 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h3><p>安装jdk软件</p><figure class="highlight sh"><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">rpm -ivh jdk-8u181-linux-x64.rpm</span><br><span class="line">yum ‐y install git java unzip wget</span><br></pre></td></tr></table></figure><p>安装数据库（略）</p><p>如果端口监听到tcp6，增加一条配置重启即可</p><figure class="highlight sh"><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">[root@sonar ~]<span class="comment"># grep bind /etc/my.cnf</span></span><br><span class="line"><span class="built_in">bind</span>‐address=0.0.0.0</span><br></pre></td></tr></table></figure><p>或者关闭系统的tcp6</p><figure class="highlight sh"><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">vim /etc/sysctl.conf  <span class="comment">#加入以下三条配置</span></span><br><span class="line">net.ipv6.conf.all.disable_ipv6 = 1</span><br><span class="line">net.ipv6.conf.default.disable_ipv6 = 1</span><br><span class="line">net.ipv6.conf.lo.disable_ipv6 = 1</span><br><span class="line">sysctl -p</span><br></pre></td></tr></table></figure><p>创建sonar库，并授权</p><figure class="highlight sh"><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">create database sonar charset utf8;</span><br><span class="line">show databases;</span><br></pre></td></tr></table></figure><h3 id="安装SonarQube"><a href="#安装SonarQube" class="headerlink" title="安装SonarQube"></a>安装SonarQube</h3><ol><li>下载<a href="https://www.sonarqube.org/downloads/" target="_blank" rel="noopener">sonar</a> 并使用sonar用户启动</li></ol><figure class="highlight sh"><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">unzip sonarqube-7.0.zip</span><br><span class="line">mv sonarqube-7.0 /usr/<span class="built_in">local</span>/</span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/</span><br><span class="line">ln -s sonarqube-7.0 sonarqube</span><br></pre></td></tr></table></figure><ol start="2"><li>创建用户sonar并授权</li></ol><figure class="highlight sh"><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">useradd sonar</span><br><span class="line">chown -R sonar.sonar /usr/<span class="built_in">local</span>/sonarqube</span><br><span class="line">chown -R sonar.sonar /usr/<span class="built_in">local</span>/sonarqube-7.0</span><br></pre></td></tr></table></figure><ol start="3"><li>配置sonar连接本地数据库</li></ol><figure class="highlight sh"><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">vim /usr/<span class="built_in">local</span>/sonarqube/conf/sonar.properties</span><br><span class="line">sonar.jdbc.username=root</span><br><span class="line">sonar.jdbc.password=123</span><br><span class="line">sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=<span class="literal">true</span>&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=<span class="literal">true</span>&amp;useConfigs=maxPerformance&amp;useSSL=<span class="literal">false</span></span><br></pre></td></tr></table></figure><ol start="4"><li>使用普通用户启动sonarqube</li></ol><figure class="highlight sh"><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">[root@sonar /usr/<span class="built_in">local</span>]<span class="comment"># su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"</span></span><br><span class="line">Starting SonarQube...</span><br><span class="line">Started SonarQube.</span><br><span class="line">[root@sonar /usr/<span class="built_in">local</span>]<span class="comment"># netstat -lntup</span></span><br></pre></td></tr></table></figure><ol start="5"><li>启动sonar</li></ol><p>启动后的端口为9000使用浏览器直接访问<a href="http://10.0.1.203:9000/about" target="_blank" rel="noopener">http://10.0.1.203:9000/about</a> </p><p>用户名<code>admin</code> 密码<code>admin</code>，生成一个<code>tokin</code>,只显示一次记录好</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar14.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar15.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar16.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar17.png"  alt=""></p><h3 id="配置管理sonar-安装插件"><a href="#配置管理sonar-安装插件" class="headerlink" title="配置管理sonar 安装插件"></a>配置管理sonar 安装插件</h3><p><strong>1.安装中文汉化插件</strong></p><p>在页面上找到<code>administrator</code> &gt; <code>Marketplace</code> &gt; 搜索框 <code>chinese</code>，出现一个<code>chinese pack</code> 然后点击<code>install</code>，安装完点击 <code>restart</code> 重启生效</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar18.png"  alt=""></p><p><strong>2.默认已安装C JAVA Python PHP JS 等代码质量分析工具</strong></p><p>如果一个项目使用了<code>JAVA</code>  <code>CSS</code>  <code>JS</code>  <code>HTML</code> ，默认情况下sonar只会检测JAVA,JS等代码的漏洞和bug，如果安装了HTML、CSS等插件，则会检测该项目代码中JAVA JS HTML CSS代码的漏洞和bug</p><p>手动安装插件</p><figure class="highlight sh"><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="comment">#备份源目录</span></span><br><span class="line">mv /usr/<span class="built_in">local</span>/sonarqube/extensions/plugins /usr/<span class="built_in">local</span>/sonarqube/extensions/plugins_back</span><br><span class="line">tar xf sonar_plugins.tar.gz -C /usr/<span class="built_in">local</span>/sonarqube/extensions/</span><br><span class="line">chown -R sonar.sonar /usr/<span class="built_in">local</span>/sonarqube</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启sonar服务</span></span><br><span class="line">[root@sonar ~]<span class="comment"># su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"</span></span><br><span class="line">Stopping SonarQube...</span><br><span class="line">Waiting <span class="keyword">for</span> SonarQube to <span class="built_in">exit</span>...</span><br><span class="line">Stopped SonarQube.</span><br><span class="line">Starting SonarQube...</span><br><span class="line">Started SonarQube.</span><br></pre></td></tr></table></figure><p>重启后重新登陆，显示汉化完成</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar19.png"  alt=""></p><h3 id="使用jenkins的test-job推送到web01测试"><a href="#使用jenkins的test-job推送到web01测试" class="headerlink" title="使用jenkins的test-job推送到web01测试"></a>使用jenkins的test-job推送到web01测试</h3><p>jenkins服务器测试推送html代码至SonarQube检测 下载客户端</p><p>客户端其他版本下载地址搜索对应版本 例如:SonarScanner 4.0</p><figure class="highlight sh"><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">unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d /usr/<span class="built_in">local</span>/</span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/ &amp;&amp; ln -s sonar-scanner-4.0.0.1744-linux sonar-scanner</span><br></pre></td></tr></table></figure><p>进入jenkins项目目录下推送测试</p><figure class="highlight sh"><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">cd</span> /var/lib/jenkins/workspace/<span class="built_in">test</span>-job</span><br><span class="line"></span><br><span class="line">/usr/<span class="built_in">local</span>/sonar-scanner/bin/sonar-scanner \</span><br><span class="line">  -Dsonar.projectKey=html \</span><br><span class="line">  -Dsonar.sources=. \</span><br><span class="line">  -Dsonar.host.url=http://10.0.1.203:9000 \</span><br><span class="line">  -Dsonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br></pre></td></tr></table></figure><p>进入sonar主页刷新后可以看到已推送成功</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar20.png"  alt=""></p><h3 id="使用jenkins自动推送"><a href="#使用jenkins自动推送" class="headerlink" title="使用jenkins自动推送"></a>使用jenkins自动推送</h3><p>到项目目录下进行代码推送分析 打开认证</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar21.png"  alt=""></p><p>将sonar集成到jenkins中需要安装插件，前面安装包已下载</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar22.png"  alt=""></p><p>进入jenkins主机编写脚本</p><figure class="highlight sh"><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">mkdir -p /server/scripts</span><br><span class="line"><span class="built_in">cd</span> /server/scripts/</span><br><span class="line">[root@jenkins2 /server/scripts]<span class="comment"># cat deploy.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">DATE=$(date +%Y-%m-%d-%H-%M-%S)</span><br><span class="line"><span class="comment">#CODE_DIR="/var/lib/jenkins/workspace/my-freestyle-job"</span></span><br><span class="line">CODE_DIR=<span class="string">"<span class="variable">$&#123;WORKSPACE&#125;</span>"</span></span><br><span class="line">WEB_DIR=<span class="string">"/code/www/"</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">get_code_tar</span></span>()&#123;</span><br><span class="line">        <span class="built_in">cd</span> <span class="variable">$CODE_DIR</span> &amp;&amp; tar zcf /opt/web-<span class="variable">$DATE</span>.tar.gz ./*</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">scp_code_web</span></span>()&#123;</span><br><span class="line">        scp /opt/web-<span class="variable">$DATE</span>.tar.gz 10.0.1.7:<span class="variable">$WEB_DIR</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">code_tarxf</span></span>()&#123;</span><br><span class="line">        ssh 10.0.1.7 <span class="string">"cd <span class="variable">$WEB_DIR</span> &amp;&amp;mkdir web-<span class="variable">$DATE</span> &amp;&amp; tar xf web-<span class="variable">$DATE</span>.tar.gz -C web-<span class="variable">$DATE</span>"</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="title">ln_html</span></span>()&#123;</span><br><span class="line">         ssh 10.0.1.7 <span class="string">"cd <span class="variable">$WEB_DIR</span> &amp;&amp; rm -rf html &amp;&amp; ln -s web-<span class="variable">$DATE</span> html"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">main</span></span>()&#123;</span><br><span class="line"></span><br><span class="line">        get_code_tar;</span><br><span class="line">        scp_code_web;</span><br><span class="line">        code_tarxf;</span><br><span class="line">        ln_html;</span><br><span class="line">&#125;</span><br><span class="line">main</span><br></pre></td></tr></table></figure><p><code>jenkins</code>把公钥分发给<code>web01</code>主机</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.1.7</span><br></pre></td></tr></table></figure><p><code>jenkins</code>主机test-job重新部署</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar23png.png"  alt=""></p><p>立即构建测试，推送成功</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar24.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar25.png"  alt=""></p><h2 id="jenkins配置SonarQube"><a href="#jenkins配置SonarQube" class="headerlink" title="jenkins配置SonarQube"></a>jenkins配置SonarQube</h2><p><strong>1）jenkins上配置SonarQube服务端</strong></p><p>系统管理-&gt;系统设置-&gt;sonarQube 告诉jenkins SonarQubeServer服务端地址</p><ol><li><p>Name随意填写</p></li><li><p>URL添加SonarQube的地址</p></li><li><p>token添加一个secret text 填写之前安装SonarQube的Token</p></li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar26.png"  alt=""></p><p>保存后，重新打开，添加用户</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar27.png"  alt=""></p><p><code>token</code>添加一个secret text 填写之前安装SonarQube的Token，配置完成后保存</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar28.png"  alt=""></p><p><strong>2) jenkins配置执行sonar-scanner命令的家目录</strong></p><p>让jenkins能找到该命令 系统管理-&gt;全局工具配置</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar29.png"  alt=""></p><p><strong>3）再次配置test-job的配置</strong></p><p>Analysis properties项填写完保存执行，最后在SonarQube中查看结果</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar30.png"  alt=""></p><p><strong>4)测试</strong></p><p>查看<code>sonar</code>服务器，发现<code>jenkins</code>推送成功</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar31.png"  alt=""></p><h2 id="jenkins推送java项目"><a href="#jenkins推送java项目" class="headerlink" title="jenkins推送java项目"></a>jenkins推送java项目</h2><p>推送<code>java</code>代码进行分析，使用以下方式</p><figure class="highlight sh"><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</span></span><br><span class="line"><span class="built_in">cd</span> /var/lib/jenkins/workspace/maven-job</span><br><span class="line">/usr/<span class="built_in">local</span>/sonar-scanner/bin/sonar-scanner \</span><br><span class="line">-Dsonar.projectKey=java \</span><br><span class="line">-Dsonar.sources=.</span><br><span class="line"></span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line"><span class="built_in">cd</span> /var/lib/jenkins/workspace/maven-job</span><br><span class="line">mvn sonar:sonar \</span><br><span class="line">  -Dsonar.host.url=http://10.0.1.203:9000 \</span><br><span class="line">  -Dsonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br></pre></td></tr></table></figure><h3 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h3><p><code>gitlab</code>主机上新建一个项目</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar32.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar33.png"  alt=""></p><p>上传<code>java</code>项目到<code>gitlab</code></p><figure class="highlight sh"><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">tar xf hello-world-war.tar.gz</span><br><span class="line"><span class="built_in">cd</span> hello-world-war/</span><br><span class="line"></span><br><span class="line">git remote -v</span><br><span class="line">git remote remove origin </span><br><span class="line">git remote add origin git@10.0.1.200:oldboy/java.git</span><br><span class="line">git push -u origin --all</span><br></pre></td></tr></table></figure><p><code>web01</code>上部署tomcat服务器</p><ol><li>安装JDK</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rpm -ivh jdk-8u181-linux-x64.rpm</span><br></pre></td></tr></table></figure><ol start="2"><li>安装TOMCAT</li></ol><figure class="highlight sh"><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">tar xf apache-tomcat-8.0.27.tar.gz -C /usr/<span class="built_in">local</span>/</span><br><span class="line">ln -s apache-tomcat-8.0.27 tomcat</span><br><span class="line">/usr/<span class="built_in">local</span>/tomcat/bin/startup.sh    ---&gt;启动tomcat</span><br></pre></td></tr></table></figure><ol start="3"><li>访问10.0.1.7:8080测试启动</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar34.png"  alt=""></p><h3 id="创建一个maven-job项目"><a href="#创建一个maven-job项目" class="headerlink" title="创建一个maven-job项目"></a>创建一个maven-job项目</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar35.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar36.png"  alt=""></p><p>拉去<code>gitlab</code>的<code>java</code>项目</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar37.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar38.png"  alt=""></p><p>上传<code>maven</code>包</p><figure class="highlight sh"><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">tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/<span class="built_in">local</span>/</span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/</span><br><span class="line">ln -s apache-maven-3.3.9 maven</span><br><span class="line"></span><br><span class="line">vim /usr/<span class="built_in">local</span>/maven/conf/settings.xml  <span class="comment">#更改maven配置文件为阿里云下载</span></span><br><span class="line">&lt;mirror&gt; </span><br><span class="line">&lt;id&gt;nexus-aliyun&lt;/id&gt; </span><br><span class="line">&lt;mirrorOf&gt;*&lt;/mirrorOf&gt; </span><br><span class="line">&lt;name&gt;Nexus aliyun&lt;/name&gt; </span><br><span class="line">&lt;url&gt;http://maven.aliyun.com/nexus/content/groups/public&lt;/url&gt; </span><br><span class="line">&lt;/mirror&gt;</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar39.png"  alt=""></p><p>从<code>gitlab</code>克隆<code>java</code>项目</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@jenkins2 ~]<span class="comment"># git clone git@10.0.1.200:oldboy/java.git</span></span><br><span class="line">[root@jenkins2 ~]<span class="comment"># echo $PATH</span></span><br><span class="line">[root@jenkins2 ~]<span class="comment"># vim /etc/profile</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/maven/bin'</span></span><br><span class="line">[root@jenkins2 ~]<span class="comment"># source /etc/profile</span></span><br><span class="line">[root@jenkins2 ~]<span class="comment"># cd java/</span></span><br><span class="line">[root@jenkins2 ~/java]<span class="comment"># mvn clean</span></span><br><span class="line">[root@jenkins2 ~/java]<span class="comment"># mvn package</span></span><br></pre></td></tr></table></figure><p>返回设置jenkins上的maven配置</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar40.png"  alt=""></p><p>返回设置发现已经正常</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar41.png"  alt=""></p><p><code>jenkins</code>编写<code>tomcat</code>的脚本</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@jenkins2 /server/scripts]<span class="comment"># cat tomcat.sh</span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">TIME=`date +%F`</span><br><span class="line">WEB_DIR=<span class="string">"/usr/local/tomcat/webapps"</span></span><br><span class="line">ssh 10.0.1.7 <span class="string">"cd <span class="variable">$&#123;WEB_DIR&#125;</span> &amp;&amp; mkdir <span class="variable">$&#123;TIME&#125;</span>-<span class="variable">$&#123;BUTLD_ID&#125;</span>"</span></span><br><span class="line">scp <span class="variable">$&#123;WORKSPACE&#125;</span>/target/*.war 10.0.1.7:<span class="variable">$&#123;WEB_DIR&#125;</span>/<span class="variable">$&#123;TIME&#125;</span>-<span class="variable">$&#123;BUTLD_ID&#125;</span></span><br><span class="line">ssh 10.0.1.7 <span class="string">"cd <span class="variable">$&#123;WEB_DIR&#125;</span> &amp;&amp; rm -rf ROOT &amp;&amp; ln -s <span class="variable">$&#123;TIME&#125;</span>-<span class="variable">$&#123;BUTLD_ID&#125;</span> ROOT"</span></span><br><span class="line">ssh 10.0.1.7 <span class="string">"cd <span class="variable">$&#123;WEB_DIR&#125;</span>/ROOT &amp;&amp; unzip *.war &amp;&amp; rm -rf *.war"</span></span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar42.png"  alt=""></p><p>保存后，立即构建测试</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@web01 /usr/<span class="built_in">local</span>/tomcat/webapps]<span class="comment"># ll</span></span><br><span class="line">total 4</span><br><span class="line">drwxr-xr-x  4 root root   54 Nov  7 18:51 2019-11-07_</span><br><span class="line">drwxr-xr-x 14 root root 4096 Nov  7 18:04 docs</span><br><span class="line">drwxr-xr-x  6 root root   83 Nov  7 18:04 examples</span><br><span class="line">drwxr-xr-x  5 root root   87 Nov  7 18:04 host-manager</span><br><span class="line">drwxr-xr-x  5 root root  103 Nov  7 18:04 manager</span><br><span class="line">lrwxrwxrwx  1 root root   11 Nov  7 18:51 ROOT -&gt; 2019-11-07_</span><br></pre></td></tr></table></figure><p>访问10.0.1.7:8080测试</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar43png.png"  alt=""></p><h3 id="java项目推送sonar"><a href="#java项目推送sonar" class="headerlink" title="java项目推送sonar"></a>java项目推送sonar</h3><figure class="highlight sh"><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</span></span><br><span class="line"><span class="built_in">cd</span> /var/lib/jenkins/workspace/maven-job</span><br><span class="line">/usr/<span class="built_in">local</span>/sonar-scanner/bin/sonar-scanner \</span><br><span class="line">-Dsonar.projectKey=java \</span><br><span class="line">-Dsonar.sources=.</span><br><span class="line"></span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line"><span class="built_in">cd</span> /var/lib/jenkins/workspace/maven-job</span><br><span class="line">mvn sonar:sonar \</span><br><span class="line">  -Dsonar.host.url=http://10.0.1.203:9000 \</span><br><span class="line">  -Dsonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br></pre></td></tr></table></figure><p>进入<code>jenkins</code>主机手动推送测试</p><figure class="highlight sh"><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="built_in">cd</span> /var/lib/jenkins/workspace/maven‐job</span><br><span class="line">mvn sonar:sonar \</span><br><span class="line">‐Dsonar.host.url=http://10.0.1.203:9000 \</span><br><span class="line">‐Dsonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br></pre></td></tr></table></figure><p>访问10.0.1.203:9000测试</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar44.png"  alt=""></p><p><code>sonar</code>客户端更改<code>配置文件</code>地址</p><figure class="highlight sh"><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">[root@jenkins2 ~]<span class="comment"># vim /usr/local/sonar-scanner/conf/sonar-scanner.properties</span></span><br><span class="line">sonar.host.url=http://10.0.1.203:9000</span><br><span class="line">sonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br><span class="line">sonar.sourceEncoding=UTF-8</span><br></pre></td></tr></table></figure><p>配置<code>java</code>项目，增加构建项<code>sonar</code></p><ol><li>方法一</li></ol><figure class="highlight sh"><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">Analysis properties 项填写(看项目选择第一个或第二个)</span><br><span class="line">sonar.projectName=<span class="variable">$&#123;JOB_NAME&#125;</span></span><br><span class="line">sonar.projectKey=java</span><br><span class="line">sonar.sources=.</span><br><span class="line">sonar.java.binaries=target/sonar</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar45.png"  alt=""></p><ol start="2"><li>方法二</li></ol><figure class="highlight sh"><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">clean</span><br><span class="line">verify</span><br><span class="line">sonar:sonar</span><br><span class="line">-Dsonar.host.url=http://10.0.1.203:9000 </span><br><span class="line">-Dsonar.login=92668754d1dcfc3bc895e09e22ab15f44e2f04ec</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar46.png"  alt=""></p><p>构建成功后测试</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar47.png"  alt=""></p><h2 id="jenkins集成企业微信"><a href="#jenkins集成企业微信" class="headerlink" title="jenkins集成企业微信"></a>jenkins集成企业微信</h2><p><code>jenkins</code>集成<code>微信</code>，工作中档git有新代码提交会触发钩子自动完成上线，运维和开发人员不须时刻盯着jenkins，通过微信的方式显示给运维和开发人员</p><h3 id="1-注册微信企业公众号"><a href="#1-注册微信企业公众号" class="headerlink" title="1.注册微信企业公众号"></a>1.注册微信企业公众号</h3><p>搜索微信公众平台-&gt;注册-&gt;选择企业微信</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin01.jpg"  alt=""></p><p>选择完成后把下面信息进行完善-&gt;使用自己微信扫描二维码进行管理后-点注册</p><p>注册成功登陆后点击应用管理-&gt;创建应用</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin02.png"  alt=""></p><p>上次一张图片-&gt;填写应用名称-可见范围-&gt;创建应用-保存好agentld和secret写入py脚本</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin03.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin04.png"  alt=""></p><h3 id="2-更改py脚本内对应的内容-touser为账号名称"><a href="#2-更改py脚本内对应的内容-touser为账号名称" class="headerlink" title="2.更改py脚本内对应的内容-touser为账号名称"></a>2.更改py脚本内对应的内容-touser为账号名称</h3><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@jenkins2 /server/scripts]<span class="comment"># cat jenkins_notify.py </span></span><br><span class="line"><span class="comment">#!/usr/bin/python2.7</span></span><br><span class="line"><span class="comment">#_*_coding:utf-8 _*_</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">import requests,sys,json</span><br><span class="line">import urllib3</span><br><span class="line">urllib3.disable_warnings()</span><br><span class="line"> </span><br><span class="line">reload(sys)</span><br><span class="line">sys.setdefaultencoding(<span class="string">'utf-8'</span>)</span><br><span class="line"> </span><br><span class="line">def GetToken(Corpid,Secret):</span><br><span class="line">    Url = <span class="string">"https://qyapi.weixin.qq.com/cgi-bin/gettoken"</span></span><br><span class="line">    Data = &#123;</span><br><span class="line">        <span class="string">"corpid"</span>:Corpid,</span><br><span class="line">        <span class="string">"corpsecret"</span>:Secret</span><br><span class="line">    &#125;</span><br><span class="line">    r = requests.get(url=Url,params=Data,verify=False)</span><br><span class="line">    Token = r.json()[<span class="string">'access_token'</span>]</span><br><span class="line">    <span class="built_in">return</span> Token</span><br><span class="line"> </span><br><span class="line">def SendMessage(Token,Subject,Content, ProName):</span><br><span class="line">    <span class="comment">#Url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s" % Token</span></span><br><span class="line">    Url = <span class="string">"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s"</span> % Token</span><br><span class="line">    <span class="comment">#Data = &#123;</span></span><br><span class="line">    <span class="comment">#    "chatid": "JenkinsAlarm",  # 此处不明白请参考企业微信官网</span></span><br><span class="line">    <span class="comment">#    "msgtype": "text",</span></span><br><span class="line">    <span class="comment">#    "text": &#123;</span></span><br><span class="line">    <span class="comment">#        "content": "[项目名称] : " + ProName + '\n' + "[项目地址] : " + Subject + '\n' + Content + '\n'</span></span><br><span class="line">    <span class="comment">#    &#125;,</span></span><br><span class="line">    <span class="comment">#    "safe": "0"</span></span><br><span class="line">    <span class="comment">#&#125;</span></span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">"touser"</span> : <span class="string">"WuFei"</span>,</span><br><span class="line">        <span class="string">"msgtype"</span> : <span class="string">"text"</span>,</span><br><span class="line">        <span class="string">"agentid"</span> : 1000002,</span><br><span class="line">        <span class="string">"text"</span> : &#123;</span><br><span class="line">           <span class="string">"content"</span> : <span class="string">"[项目名称] : "</span> + ProName + <span class="string">'\n'</span> + <span class="string">"[项目地址] : "</span> + Subject + <span class="string">'\n'</span> + </span><br><span class="line">Content + <span class="string">'\n'</span></span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="string">"safe"</span>:0</span><br><span class="line">    &#125;</span><br><span class="line">    r = requests.post(url=Url,data=json.dumps(data),verify=False)</span><br><span class="line">    <span class="built_in">return</span> r.text</span><br><span class="line"> </span><br><span class="line">def action_from_file(filename):</span><br><span class="line">    try:</span><br><span class="line">        str1 = <span class="string">'[变更日志] : '</span></span><br><span class="line">        with open(filename, <span class="string">'r'</span>) as f:</span><br><span class="line">            <span class="keyword">for</span> i <span class="keyword">in</span> f.readlines():</span><br><span class="line">                str1 += i</span><br><span class="line"><span class="built_in">print</span> str1</span><br><span class="line">        <span class="keyword">if</span> len(str1) == 17:</span><br><span class="line">            str1 += <span class="string">" 无变更"</span></span><br><span class="line"><span class="comment"># print str1</span></span><br><span class="line">        <span class="built_in">return</span> str1</span><br><span class="line">    except Exception as e:</span><br><span class="line">        <span class="comment">#print('[ERROR] &#123;0&#125;'.format(e))</span></span><br><span class="line">str1 += str(e)</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line">    Corpid = <span class="string">"ww92914ec6b1198c60"</span></span><br><span class="line">    Secret = <span class="string">"N7uT7xiIAipasfOYSs9QQ5LcNqwPqooi6beJT1P7x-Y"</span></span><br><span class="line"> </span><br><span class="line">    Subject = sys.argv[1]</span><br><span class="line">    Content = action_from_file(sys.argv[2])</span><br><span class="line">    ProName = sys.argv[3]</span><br><span class="line"> </span><br><span class="line">    Token = GetToken(Corpid, Secret)</span><br><span class="line">    Status = SendMessage(Token,Subject,Content,ProName)</span><br><span class="line">    <span class="built_in">print</span> Status</span><br></pre></td></tr></table></figure><p><code>Corpid</code>为企业ID 这里只把<code>corpid</code>写入对应的位置</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin05.png"  alt=""></p><h3 id="3-完成后配置jenkins"><a href="#3-完成后配置jenkins" class="headerlink" title="3.完成后配置jenkins"></a>3.完成后配置jenkins</h3><p><strong>1.下载安装插件</strong></p><p>由于jenkins没有官网的插件来完成此功能，所以我们只能用网络上一些开源的插件（线下班不需要以下步骤，已集合在plugins）</p><p>github下载代码：<a href="https://github.com/daniel-beck/changelog-environment-plugin" target="_blank" rel="noopener">https://github.com/daniel-beck/changelog-environment-plugin</a></p><p>解压到某个目录-》进入目录执行以下操作</p><p><code>cd</code> 到 <code>changelog-environment-plugin-master</code> 下，执行 <code>mvn verify</code></p><p>时间较长，会在<code>changelog-environment-plugin-master/target/</code>下有个<code>changelog-environment.hpi</code>文件，上传到<code>jenkins</code>即可使用</p><p><strong>2.配置jenkins的test-job</strong></p><p><code>jenkins</code>进入到项目中-&gt;构建环境多了<code>Add Changelog Information to Environment</code>-&gt;点击<code>选择</code></p><figure class="highlight sh"><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">Entry Format   </span><br><span class="line">%3<span class="variable">$s</span>(at %4<span class="variable">$s</span> via %1<span class="variable">$s</span>)    参数分别为ChangeLog内容，时间，提交人</span><br><span class="line"></span><br><span class="line">Date Format</span><br><span class="line">yyyy‐MM‐dd HH:mm:ss       就是时间格式</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar48.png"  alt=""></p><p>构建后操作选择<code>Post build task</code></p><p> # 如果没有此选择请安装<code>Hudson Post build task</code> 插件，<code>SCM_CHANGELOG</code>须安装<code>changelog</code>插件</p><figure class="highlight sh"><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="built_in">echo</span> <span class="string">"==========Start Notify=============="</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;SCM_CHANGELOG&#125;</span> &gt; /tmp/<span class="variable">$&#123;JOB_NAME&#125;</span>_change.log</span><br><span class="line">python /server/scripts/jenkins_notify.py <span class="variable">$&#123;BUILD_URL&#125;</span> /tmp/<span class="variable">$&#123;JOB_NAME&#125;</span>_change.log <span class="variable">$&#123;JOB_NAME&#125;</span></span><br><span class="line">rm ‐fv /tmp/<span class="variable">$&#123;JOB_NAME&#125;</span>_change.log</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar49.png"  alt=""></p><p><strong>3.上传py脚本-&gt;jenkins服务器上安装python requests模块</strong></p><figure class="highlight sh"><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">wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo</span><br><span class="line">yum -y install python-pip</span><br><span class="line">pip2.7 install requests</span><br></pre></td></tr></table></figure><p><strong>4.打开构建触发器</strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/sonar50.png"  alt=""></p><p><strong>5.gitlab克隆项目修改并推送</strong></p><figure class="highlight sh"><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">git <span class="built_in">clone</span> git@10.0.1.200:oldboy/dzp.git</span><br><span class="line"><span class="built_in">cd</span> dzp/</span><br><span class="line">git commit -am <span class="string">"修改测试微信消息"</span></span><br><span class="line">git push -u origin master</span><br></pre></td></tr></table></figure><p><strong>6.jenkins上构建测试消息</strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin06.png"  alt=""></p><p>企业微信收到信息</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/weixin07.jpg"  alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="sonar" scheme="http://linuxwf.com/tags/sonar/"/>
    
  </entry>
  
  <entry>
    <title>4.Maven+jeesns</title>
    <link href="http://linuxwf.com/2020/04/15/4-Maven-jeesns/"/>
    <id>http://linuxwf.com/2020/04/15/4-Maven-jeesns/</id>
    <published>2020-04-15T08:40:00.000Z</published>
    <updated>2020-04-15T08:41:37.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Maven-jeesns项目"><a href="#Maven-jeesns项目" class="headerlink" title="Maven+jeesns项目"></a>Maven+jeesns项目</h1><h2 id="第1章-Maven介绍"><a href="#第1章-Maven介绍" class="headerlink" title="第1章 Maven介绍"></a>第1章 Maven介绍</h2><p><code>Maven</code>是一个项目管理和综合工具。<code>Maven</code>提供给开发人员构建一个完整的生命周期框架。</p><p>开发团队可以自动完成该项目的基础设施建设，<code>Maven</code>使用标准的目录结构和默认构建生命周期。</p><p>Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。</p><p>Project Object Model，项目对象模型。通过xml格式保存的<code>pom.xml</code>文件。该文件用于管理：源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护，我们运维人员可以不用去关心。</p><h2 id="第2章-安装部署"><a href="#第2章-安装部署" class="headerlink" title="第2章 安装部署"></a>第2章 安装部署</h2><ol><li><p>下载Maven 3安装包<br>官网：<a href="http://maven.apache.org/download.cgi" target="_blank" rel="noopener">http://maven.apache.org/download.cgi</a><br>清华镜像：<a href="https://mirrors.tuna.tsinghua.edu.cn/apache/maven/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/apache/maven/</a></p></li><li><p>安装Maven</p></li></ol><figure class="highlight sh"><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">tar xf apache‐maven‐3.3.9‐bin.tar.gz</span><br><span class="line">mv apache‐maven‐3.3.9 /usr/<span class="built_in">local</span>/</span><br><span class="line">ln ‐s /usr/<span class="built_in">local</span>/apache‐maven‐3.3.9/ /usr/<span class="built_in">local</span>/maven</span><br><span class="line">/usr/<span class="built_in">local</span>/maven/bin/mvn ‐v</span><br></pre></td></tr></table></figure><ol start="3"><li>编辑/etc/profile文件</li></ol><figure class="highlight sh"><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="built_in">export</span> PATH=/usr/<span class="built_in">local</span>/apache-maven-3.3.9/bin/:<span class="variable">$PATH</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br><span class="line">mvn ‐v 查看版本号</span><br></pre></td></tr></table></figure><p>#进入目录执行打包命令</p><figure class="highlight sh"><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">validate（验证）: 验证项目正确，并且所有必要信息可用。</span><br><span class="line">compile（编译）: 编译项目源码</span><br><span class="line"><span class="built_in">test</span>（测试）: 使用合适的单元测试框架测试编译后的源码。</span><br><span class="line">package（打包）: 源码编译之后，使用合适的格式（例如JAR格式）对编译后的源码进行打包。</span><br><span class="line">integration‐<span class="built_in">test</span>（集成测试）: 如果有需要，把包处理并部署到可以运行集成测试的环境中去。</span><br><span class="line">verify（验证）: 进行各种测试来验证包是否有效并且符合质量标准。</span><br><span class="line">install（安装）: 把包安装到本地仓库，使该包可以作为其他本地项目的依赖。</span><br><span class="line">deploy（部署）: 在集成或发布环境中完成，将最终软件包复制到远程存储库，以与其他开发人员和项目共享。</span><br><span class="line">mvn clean (清除) : 清除上次编译的结果</span><br></pre></td></tr></table></figure><h3 id="1-上传一个简单的java项目apache-tomcat-8-0-27-tar-gz，并安装及创建数据库"><a href="#1-上传一个简单的java项目apache-tomcat-8-0-27-tar-gz，并安装及创建数据库" class="headerlink" title="1.上传一个简单的java项目apache-tomcat-8.0.27.tar.gz，并安装及创建数据库"></a>1.上传一个简单的java项目apache-tomcat-8.0.27.tar.gz，并安装及创建数据库</h3><figure class="highlight sh"><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">mkdir /applocation</span><br><span class="line">tar xf apache-tomcat-8.0.27.tar.gz</span><br><span class="line">mv apache-tomcat-8.0.27 /applocation/tomcat</span><br></pre></td></tr></table></figure><p><code>tomcat</code>启动加速的方法</p><figure class="highlight sh"><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">vim /usr/java/jdk1.8.0_181‐amd64/jre/lib/security/java.security</span><br><span class="line">修改117行为：securerandom.source=file:/dev/urandom</span><br><span class="line">/applocation/tomcat/bin/startup.sh     <span class="comment">#启动tomcat</span></span><br><span class="line">netstat -tunlp</span><br></pre></td></tr></table></figure><p>数据库准备</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">yum -y install mariadb-server</span><br><span class="line">systemctl start mariadb.service</span><br><span class="line">netstat -tunlp</span><br><span class="line">mysqladmin password oldboy</span><br><span class="line">mysql -uroot -poldboy</span><br><span class="line">MariaDB [(none)]&gt; create database jeesns;   <span class="comment">#创建数据库</span></span><br></pre></td></tr></table></figure><h3 id="2-在gitlab上创建jeesns项目"><a href="#2-在gitlab上创建jeesns项目" class="headerlink" title="2.在gitlab上创建jeesns项目"></a>2.在gitlab上创建jeesns项目</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven01.png"  alt=""></p><h3 id="3-在gitlab-200主机解压jeesns，并上传代码到gitlab"><a href="#3-在gitlab-200主机解压jeesns，并上传代码到gitlab" class="headerlink" title="3.在gitlab-200主机解压jeesns，并上传代码到gitlab"></a>3.在gitlab-200主机解压jeesns，并上传代码到gitlab</h3><figure class="highlight sh"><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">1.解压jeesns包，并修改mysql密码</span><br><span class="line">tar xf jeesns.tar.gz</span><br><span class="line"><span class="built_in">cd</span> jeesns</span><br><span class="line">grep -r <span class="string">"mysql"</span></span><br><span class="line">cat jeesns-web/src/main/resources/jeesns.properties</span><br><span class="line">jdbc.password=oldboy      <span class="comment">#更改mysql登录密码</span></span><br><span class="line"></span><br><span class="line">2.创建仓库并上传代码</span><br><span class="line">git remote add origin git@10.0.1.200:oldboy/jeesns.git  </span><br><span class="line">git add .</span><br><span class="line">git commit -am <span class="string">"xxx"</span></span><br><span class="line">git push -u origin master</span><br></pre></td></tr></table></figure><h3 id="4-在jenkins主机上克隆代码，并导入数据库"><a href="#4-在jenkins主机上克隆代码，并导入数据库" class="headerlink" title="4.在jenkins主机上克隆代码，并导入数据库"></a>4.在jenkins主机上克隆代码，并导入数据库</h3><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">1.克隆代码</span><br><span class="line">git <span class="built_in">clone</span> git@10.0.1.200:oldboy/jeesns.git    </span><br><span class="line"></span><br><span class="line">2.导入数据库</span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># scp /var/lib/jenkins/workspace/jeesns-job/jeesns-web/database/jeesns.sql 10.0.1.7:/root/</span></span><br><span class="line"> mysql ‐uroot ‐proot jeesns &lt;/tmp/jeesns.sql</span><br></pre></td></tr></table></figure><h3 id="5-配置jenkins"><a href="#5-配置jenkins" class="headerlink" title="5.配置jenkins"></a>5.配置jenkins</h3><p>系统管理-全局工具配置-maven安装</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven02.png"  alt=""></p><h3 id="6-新建Item-jeesns-job"><a href="#6-新建Item-jeesns-job" class="headerlink" title="6.新建Item    jeesns-job"></a>6.新建Item    jeesns-job</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven03.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven04.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven05.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven06.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven07.png"  alt=""></p><h2 id="第3章-tomcat网页测试"><a href="#第3章-tomcat网页测试" class="headerlink" title="第3章 tomcat网页测试"></a>第3章 tomcat网页测试</h2><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/maven08.png"  alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="maven" scheme="http://linuxwf.com/tags/maven/"/>
    
  </entry>
  
  <entry>
    <title>3.jenkins安装部署</title>
    <link href="http://linuxwf.com/2020/04/15/3-jenkins%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
    <id>http://linuxwf.com/2020/04/15/3-jenkins%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/</id>
    <published>2020-04-15T08:34:00.000Z</published>
    <updated>2020-04-15T08:35:24.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Jenkins安装部署"><a href="#Jenkins安装部署" class="headerlink" title="Jenkins安装部署"></a>Jenkins安装部署</h1><h2 id="第1章-jenkins介绍"><a href="#第1章-jenkins介绍" class="headerlink" title="第1章 jenkins介绍"></a>第1章 jenkins介绍</h2><p><code>Jenkins</code>是一个开源软件项目，是基于Java开发的一种持续集成工具，用于监控持续重复的工作，旨在提供一个开放易用的软件平台，使软件的持续集成变成可能。</p><p>官网 ：<a href="https://jenkins.io" target="_blank" rel="noopener">https://jenkins.io</a></p><h2 id="第2章-准备环境"><a href="#第2章-准备环境" class="headerlink" title="第2章 准备环境"></a>第2章 准备环境</h2><blockquote><p>jenkins     10.0.0.201</p></blockquote><figure class="highlight sh"><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">[root@jenkins-201 ~]<span class="comment"># cat /etc/redhat-release</span></span><br><span class="line">CentOS Linux release 7.4.1708 (Core)</span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># uname -r</span></span><br><span class="line">3.10.0-693.el7.x86_64</span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># getenforce</span></span><br><span class="line">Disabled</span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># systemctl stop firewalld</span></span><br></pre></td></tr></table></figure><h2 id="第3章-安装部署"><a href="#第3章-安装部署" class="headerlink" title="第3章 安装部署"></a>第3章 安装部署</h2><h3 id="3-1-安装JDK运行环境和jenkins服务"><a href="#3-1-安装JDK运行环境和jenkins服务" class="headerlink" title="3.1 安装JDK运行环境和jenkins服务"></a>3.1 安装JDK运行环境和jenkins服务</h3><figure class="highlight sh"><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">rpm ‐ivh jdk‐8u181‐linux‐x64.rpm</span><br><span class="line">rpm ‐ivh jenkins‐2.99‐1.1.noarch.rpm</span><br></pre></td></tr></table></figure><h3 id="3-2-配置jenkins"><a href="#3-2-配置jenkins" class="headerlink" title="3.2 配置jenkins"></a>3.2 配置jenkins</h3><p>启动用户修改为root</p><figure class="highlight sh"><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">[root@jenkins-201 ~]<span class="comment"># grep "JENKINS_USER" /etc/sysconfig/jenkins</span></span><br><span class="line">JENKINS_USER=<span class="string">"root"</span></span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># systemctl start jenkins</span></span><br><span class="line">[root@jenkins-201 ~]<span class="comment"># systemctl enable jenkins</span></span><br></pre></td></tr></table></figure><h3 id="3-3-打开页面配置"><a href="#3-3-打开页面配置" class="headerlink" title="3.3 打开页面配置"></a>3.3 打开页面配置</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins01.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins02.png"  alt=""></p><h3 id="3-4-插件安装"><a href="#3-4-插件安装" class="headerlink" title="3.4 插件安装"></a>3.4 插件安装</h3><p>（跳过安装插件，直接上传插件到目录）和修改登录密码</p><ol><li>自动安装可选插件 </li><li>手动下载插件上传安装 </li><li>插件放入插件目录</li></ol><figure class="highlight sh"><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">[root@jenkins-201 ~]<span class="comment"># cd /var/lib/jenkins/</span></span><br><span class="line">[root@jenkins-201 ~]<span class="comment">#ll   #jobs为每次构建后构建的结果目录，plugins为插件目录</span></span><br><span class="line">drwxr-xr-x 97 root root      8192 Sep  4 22:32 plugins</span><br><span class="line">​</span><br><span class="line"><span class="comment">#上传插件包解压到plugins下执行重启 systemctl restart jenkins</span></span><br></pre></td></tr></table></figure><ol start="4"><li>jenkins主要的目录</li></ol><figure class="highlight sh"><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">/usr/lib/jenkins/：jenkins安装目录，WAR包会放在这里</span><br><span class="line">/etc/sysconfig/jenkins：jenkins配置文件，“端口”，“JENKINS_HOME”等都可以在这里配置</span><br><span class="line">/var/lib/jenkins/：默认的JENKINS_HOME</span><br><span class="line">/var/<span class="built_in">log</span>/jenkins/jenkins.log：Jenkins日志文件</span><br><span class="line">/etc/sysconfig/jenkins：jenkins配置文件，“端口”，“JENKINS_HOME”等都可以在这里配置</span><br></pre></td></tr></table></figure><ol start="5"><li>创建一个自由风格的项目freestyle‐job</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins03.png"  alt=""></p><p>丢失旧的构建</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins04.png"  alt=""></p><p>执行一条shell命令、查看运行的当前路径,构建后的产物存在/var/lib/jenkins/workspace/</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins05.png"  alt=""></p><ol start="6"><li>jenkins获取git源码</li></ol><p>这里我们有码云导入一个HTML页面的监控平台到gitlab仓库</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins06.png"  alt=""></p><p><code>jenkins</code>端配置从<code>git</code>获取代码，由于我们dev用户是配置在<code>jenkins</code>上，所以无需认证即可下载代码</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins07.png"  alt=""></p><ol start="7"><li>执行立即构建获取到代码</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins08.png"  alt=""></p><ol start="8"><li>写一个脚本把从git仓库里获取的代码上传到web服务器站点目录下</li></ol><figure class="highlight sh"><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">[root@jenkins-201 /server/scripts]<span class="comment"># cat deploy.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">CODEDIR=/var/lib/jenkins/workspace/freestyle-job/</span><br><span class="line">TIME=`date +%F-%H-%M-%S`</span><br><span class="line">IP=10.0.1.7</span><br><span class="line"><span class="function"><span class="title">TAR</span></span>()&#123;</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$CODEDIR</span></span><br><span class="line">tar zcf /opt/web-<span class="variable">$&#123;TIME&#125;</span>.tar.gz ./*</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="title">CP</span></span>()&#123;</span><br><span class="line">scp /opt/web-<span class="variable">$&#123;TIME&#125;</span>.tar.gz <span class="variable">$IP</span>:/code/</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">XF</span></span>()&#123;</span><br><span class="line">ssh <span class="variable">$IP</span> <span class="string">"cd /code &amp;&amp; mkdir web-<span class="variable">$TIME</span>"</span></span><br><span class="line">ssh <span class="variable">$IP</span> <span class="string">"cd /code &amp;&amp; tar xf web-<span class="variable">$&#123;TIME&#125;</span>.tar.gz -C web-<span class="variable">$TIME</span>"</span></span><br><span class="line">ssh <span class="variable">$IP</span> <span class="string">"rm -rf /code/web-<span class="variable">$&#123;TIME&#125;</span>.tar.gz"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">LN</span></span>()&#123;</span><br><span class="line">        ssh <span class="variable">$IP</span> <span class="string">"rm -rf /code/www &amp;&amp; ln -s /code/web-<span class="variable">$TIME</span> /code/www"</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">main</span></span>()&#123;</span><br><span class="line">TAR</span><br><span class="line">CP</span><br><span class="line">XF</span><br><span class="line">LN</span><br><span class="line">&#125;</span><br><span class="line">main</span><br></pre></td></tr></table></figure><ol start="9"><li>使用jenkins调用部署脚本（此处写脚本全路径脚本名称）测试</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins09.png"  alt=""></p><ol start="10"><li>配置自动触发构建、需要设置安全令牌Secret token</li></ol><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins10.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins11.png"  alt=""></p><ol start="11"><li>克隆代码到master上更改代码后进行推送测试是否自动触发</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@10.0.1.200:oldboy/dzp.git</span><br></pre></td></tr></table></figure><ol start="12"><li>Jenkins配置jenkins返回构建状态到gitlab</li></ol><p>系统管理‐系统设置选项下</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins12.png"  alt=""></p><p>进行认证配置进入gitlab点击用户设置找到访问令牌Access Tokens</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins13.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins14.png"  alt=""></p><p>下一步设置项目中的执行后操作。然后进行构建测试返回结果</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins15.png"  alt=""></p><p>查看测试结果</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/jenkins16.png"  alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="jenkins" scheme="http://linuxwf.com/tags/jenkins/"/>
    
  </entry>
  
  <entry>
    <title>2.gitlab安装部署</title>
    <link href="http://linuxwf.com/2020/04/15/2-gitlab%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
    <id>http://linuxwf.com/2020/04/15/2-gitlab%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/</id>
    <published>2020-04-15T07:54:00.000Z</published>
    <updated>2020-04-15T08:38:20.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="gitlab安装部署"><a href="#gitlab安装部署" class="headerlink" title="gitlab安装部署"></a>gitlab安装部署</h1><h2 id="第一章-简介"><a href="#第一章-简介" class="headerlink" title="第一章 简介"></a>第一章 简介</h2><p><code>GitLab</code> 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具，并在此基础上搭建起来的web服务。可 通过Web界面进行访问公开的或者私人项目。它拥有与<code>Github</code>类似的功能，能够浏览源代码，管理缺陷和注释。可 以管理团队对仓库的访问，它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊 天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。 </p><p>常用的网站： 官网：<a href="https://about.gitlab.com/" target="_blank" rel="noopener">https://about.gitlab.com/</a> </p><p>国内镜像：<a href="https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/</a></p><h2 id="第2章-gitlab安装部署"><a href="#第2章-gitlab安装部署" class="headerlink" title="第2章 gitlab安装部署"></a>第2章 gitlab安装部署</h2><figure class="highlight sh"><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="comment">#git官网</span></span><br><span class="line">https://about.gitlab.com/installation/<span class="comment">#centos‐7</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#安装依赖</span></span><br><span class="line">yum install -y curl policycoreutils-python openssh-server openssh-clients postfix cronie</span><br></pre></td></tr></table></figure><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight sh"><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="comment"># mkdir -p /home/oldboy/tools</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># cd /home/oldboy/tools</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># rz -bye gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm # 上传gitlab安装包 下载方式可通过国内清华源gitlab-ce社区版本下载</span></span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><figure class="highlight sh"><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"><span class="comment"># vim /etc/gitlab/gitlab.rb       # gitlab 配置文件更改url地址为本机IP地址 external_url 'http://10.0.1.200'</span></span><br><span class="line">gitlab-ctl reconfigure            <span class="comment"># 更改配置文件后需重新配置</span></span><br><span class="line">/opt/gitlab/                  <span class="comment"># gitlab的程序安装目录</span></span><br><span class="line">/var/opt/gitlab               <span class="comment"># gitlab目录数据目录</span></span><br><span class="line">/var/opt/gitlab/git-data     <span class="comment"># 存放仓库数据</span></span><br><span class="line">gitlab‐ctl status             <span class="comment"># 查看目前gitlab所有服务运维状态</span></span><br><span class="line">gitlab‐ctl stop               <span class="comment"># 停止gitlab服务</span></span><br><span class="line">gitlab‐ctl stop nginx         <span class="comment"># 单独停止某个服务</span></span><br><span class="line">gitlab‐ctl tail               <span class="comment"># 查看所有服务的日志</span></span><br></pre></td></tr></table></figure><p>通过浏览器输入IP地址进行访问gitlab</p><figure class="highlight sh"><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">10.0.1.200</span><br><span class="line">Gitlab的服务构成：</span><br><span class="line">nginx： 静态web服务器</span><br><span class="line">gitlab‐workhorse: 轻量级的反向代理服务器</span><br><span class="line">logrotate：日志文件管理工具</span><br><span class="line">postgresql：数据库</span><br><span class="line">redis：缓存数据库</span><br><span class="line">sidekiq：用于在后台执行队列任务（异步执行）。（Ruby）</span><br><span class="line">unicorn：An HTTP server <span class="keyword">for</span> Rack applications，GitLab Rails应用是托管在这个服务器上面的。（RubyWeb Server,主要使用Ruby编写）</span><br></pre></td></tr></table></figure><h3 id="gitlab汉化"><a href="#gitlab汉化" class="headerlink" title="gitlab汉化"></a>gitlab汉化</h3><ol><li>停止服务器</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># gitlab‐ctl stop</span></span><br></pre></td></tr></table></figure><ol start="2"><li>下载汉化补丁</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git clone https://gitlab.com/xhang/gitlab.git</span></span><br></pre></td></tr></table></figure><ol start="3"><li>查看gitlab版本信息及汉化版本</li></ol><figure class="highlight sh"><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"><span class="comment"># head -1 /opt/gitlab/version-manifest.txt </span></span><br><span class="line"><span class="comment"># cat /root/gitlab/VERSION</span></span><br></pre></td></tr></table></figure><ol start="4"><li>对比版本、生成补丁包</li></ol><figure class="highlight sh"><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"><span class="comment"># cd gitlab </span></span><br><span class="line"><span class="comment"># git diff v10.2.2 v10.2.2-zh  &gt; /root/10.2.2-zh.diff</span></span><br></pre></td></tr></table></figure><ol start="5"><li>打补丁</li></ol><figure class="highlight sh"><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"><span class="comment"># yum -y install patch </span></span><br><span class="line"><span class="comment"># patch ‐d /opt/gitlab/embedded/service/gitlab‐rails ‐p1 &lt; /tmp/10.2.2‐zh.diff</span></span><br></pre></td></tr></table></figure><ol start="6"><li>启动和重新配置</li></ol><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># gitlab‐ctl start # gitlab-ctl reconfigure</span></span><br></pre></td></tr></table></figure><h2 id="第3章-gitlab使用"><a href="#第3章-gitlab使用" class="headerlink" title="第3章 gitlab使用"></a>第3章 gitlab使用</h2><h3 id="1-配置外观"><a href="#1-配置外观" class="headerlink" title="1.配置外观"></a>1.配置外观</h3><p>管理区域‐外观</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git03.png"  alt=""></p><h3 id="2-关闭自动注册"><a href="#2-关闭自动注册" class="headerlink" title="2.关闭自动注册"></a>2.关闭自动注册</h3><p>可根据实际需求操作 管理区域‐设置‐关闭自动注册</p><h3 id="3-创建组‐用户‐项目"><a href="#3-创建组‐用户‐项目" class="headerlink" title="3.创建组‐用户‐项目"></a>3.创建组‐用户‐项目</h3><p>创建组</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git04.png"  alt=""></p><p>设置组名称、描述等创建群组</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git05.png"  alt=""></p><p>创建用户</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git06.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git07.png"  alt=""></p><p>编辑密码</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git08.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git09.png"  alt=""></p><h3 id="4-把用户添加到组里面"><a href="#4-把用户添加到组里面" class="headerlink" title="4.把用户添加到组里面"></a>4.把用户添加到组里面</h3><p>管理区域-选择创建的oldboy组进行添加用户、权限给开发人员-增加用户到群组</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git10.png"  alt=""></p><h3 id="gitlab添加用户自动邮件通知"><a href="#gitlab添加用户自动邮件通知" class="headerlink" title="gitlab添加用户自动邮件通知"></a>gitlab添加用户自动邮件通知</h3><p>-检查<code>postfix</code>状态</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl status postfix</span><br></pre></td></tr></table></figure><p>-编辑<code>gitlab</code>的配置文件，打开邮件通知</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></pre></td><td class="code"><pre><span class="line"><span class="string">gitlab-ctl</span> <span class="string">stop</span></span><br><span class="line"><span class="string">vim</span> <span class="string">/etc/gitlab/gitlab.rb</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_enable']</span> <span class="string">=</span> <span class="literal">true</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_address']</span> <span class="string">=</span> <span class="string">"smtp.qq.com"</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_port']</span> <span class="string">=</span> <span class="number">465</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_user_name']</span> <span class="string">=</span> <span class="string">"wufei008@qq.com"</span>   <span class="comment">#你自己QQ号</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_password']</span> <span class="string">=</span> <span class="string">"xxxxxxxxx"</span>          <span class="comment">#QQ授权码</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_domain']</span> <span class="string">=</span> <span class="string">"smtp.qq.com"</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_authentication']</span> <span class="string">=</span> <span class="string">"login"</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_enable_starttls_auto']</span> <span class="string">=</span> <span class="literal">true</span></span><br><span class="line"><span class="string">gitlab_rails['smtp_tls']</span> <span class="string">=</span> <span class="literal">true</span></span><br><span class="line"><span class="string">gitlab_rails['gitlab_email_from']</span> <span class="string">=</span> <span class="string">'wufei008@qq.com'</span> <span class="comment">#你自己QQ号</span></span><br><span class="line"></span><br><span class="line"><span class="string">gitlab-ctl</span> <span class="string">start</span></span><br><span class="line"><span class="string">gitlab-ctl</span> <span class="string">reconfigure</span></span><br></pre></td></tr></table></figure><p>-测试邮箱是否正常发送</p><p>执行 <code>gitlab-rails console</code>进入控制台交互界面, 然后在控制台提示符后输入下面内容发送一封测试邮件，测试完成后<code>exit()</code>退出。</p><figure class="highlight sh"><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">[root@gitlab ~]<span class="comment"># gitlab-rails console</span></span><br><span class="line">--------------------------------------------------------------------------------</span><br><span class="line"> GitLab:       12.3.5 (2417d5becc7)</span><br><span class="line"> GitLab Shell: 10.0.0</span><br><span class="line"> PostgreSQL:   10.9</span><br><span class="line">--------------------------------------------------------------------------------</span><br><span class="line">Loading production environment (Rails 5.2.3)</span><br><span class="line">irb(main):001:0&gt; Notify.test_email(<span class="string">'wufei008@qq.com'</span>, <span class="string">'邮件标题_test'</span>, <span class="string">'邮件正文_test'</span>).deliver_now </span><br><span class="line">Notify<span class="comment">#test_email: processed outbound mail in 0.7ms</span></span><br><span class="line">Sent mail to wufei008@qq.com (1344.4ms)</span><br><span class="line">Date: Thu, 05 Dec 2019 18:57:37 +0800</span><br><span class="line">From: GitLab &lt;wufei008@qq.com&gt;</span><br><span class="line">Reply-To: GitLab &lt;noreply@192.168.124.200&gt;</span><br><span class="line">To: wufei008@qq.com</span><br><span class="line">Message-ID: &lt;5de8e2a1858a1_7993f8fddccf98c6189e@gitlab.mail&gt;</span><br><span class="line">Subject: =?UTF-8?Q?=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98=5Ftest?=</span><br><span class="line">Mime-Version: 1.0</span><br><span class="line">Content-Type: text/html;</span><br><span class="line"> charset=UTF-8</span><br><span class="line">Content-Transfer-Encoding: 7bit</span><br><span class="line">Auto-Submitted: auto-generated</span><br><span class="line">X-Auto-Response-Suppress: All</span><br><span class="line"></span><br><span class="line">&lt;!DOCTYPE html PUBLIC <span class="string">"-//W3C//DTD HTML 4.0 Transitional//EN"</span> <span class="string">"http://www.w3.org/TR/REC-html40/loose.dtd"</span>&gt;</span><br><span class="line">&lt;html&gt;&lt;body&gt;&lt;p&gt;&amp;<span class="comment">#37038;&amp;#20214;&amp;#27491;&amp;#25991;_test&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</span></span><br><span class="line"></span><br><span class="line">=&gt; <span class="comment">#&lt;Mail::Message:69886775708240, Multipart: false, Headers: &lt;Date: Thu, 05 Dec 2019 18:57:37 +0800&gt;, &lt;From: GitLab &lt;wufei008@qq.com&gt;&gt;, &lt;Reply-To: GitLab &lt;noreply@192.168.124.200&gt;&gt;, &lt;To: wufei008@qq.com&gt;, &lt;Message-ID: &lt;5de8e2a1858a1_7993f8fddccf98c6189e@gitlab.mail&gt;&gt;, &lt;Subject: 邮件标题_test&gt;, &lt;Mime-Version: 1.0&gt;, &lt;Content-Type: text/html; charset=UTF-8&gt;, &lt;Content-Transfer-Encoding: 7bit&gt;, &lt;Auto-Submitted: auto-generated&gt;, &lt;X-Auto-Response-Suppress: All&gt;&gt;</span></span><br><span class="line">irb(main):002:0&gt; <span class="built_in">exit</span></span><br></pre></td></tr></table></figure><h3 id="5-创建仓库"><a href="#5-创建仓库" class="headerlink" title="5.创建仓库"></a>5.创建仓库</h3><p>管理区域-创建仓库</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git11.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git12.png"  alt=""></p><h3 id="6-登陆dev用户测试是否能看到空的git‐test仓库"><a href="#6-登陆dev用户测试是否能看到空的git‐test仓库" class="headerlink" title="6.登陆dev用户测试是否能看到空的git‐test仓库"></a>6.登陆dev用户测试是否能看到空的git‐test仓库</h3><h3 id="7-添加ssh‐keys到gitlab"><a href="#7-添加ssh‐keys到gitlab" class="headerlink" title="7.添加ssh‐keys到gitlab"></a>7.添加ssh‐keys到gitlab</h3><p>注：一个服务器的key只能添加到一个gitlab服务器上，一个用户可以添加多个key</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure><h3 id="8-添加远程仓库、推送本地代码到远程仓库"><a href="#8-添加远程仓库、推送本地代码到远程仓库" class="headerlink" title="8.添加远程仓库、推送本地代码到远程仓库"></a>8.添加远程仓库、推送本地代码到远程仓库</h3><figure class="highlight sh"><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">git remote add origin git@10.0.1.200:oldboy/git_data.git   <span class="comment"># 添加远程仓库</span></span><br><span class="line"></span><br><span class="line">git remote rename origin old‐origin <span class="comment"># 远程 origin 如果已经存在则重新命名或者新添加仓库名称不同</span></span><br><span class="line"></span><br><span class="line">git push ‐u origin ‐‐all <span class="comment"># 推送代码到远程仓库</span></span><br></pre></td></tr></table></figure><h3 id="9-克隆代码到另外一台主机"><a href="#9-克隆代码到另外一台主机" class="headerlink" title="9.克隆代码到另外一台主机"></a>9.克隆代码到另外一台主机</h3><p>如果不做认证会让输入gitlab的密码、我们使用key进行认证</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure><p>把公钥复制到dev用户下进行测试</p><p>然后在克隆代码</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@10.0.1.200:oldboy/git_data.git</span><br></pre></td></tr></table></figure><p>测试推送代码到dev下</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">git branch dev </span><br><span class="line">git checkout dev </span><br><span class="line">touch dev </span><br><span class="line">git add . </span><br><span class="line">git commit ‐m <span class="string">"add dev"</span> </span><br><span class="line">git push ‐u origin dev <span class="comment"># 推送dev分支到远程仓库</span></span><br></pre></td></tr></table></figure><p>提交合并请求进行分支合并到<code>master</code>主分支</p><p>合并后在<code>gitlab</code>服务端<code>master</code>上没有dev、要先进行<code>pull</code></p><figure class="highlight sh"><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"><span class="built_in">cd</span> /root/git_data </span><br><span class="line">git pull</span><br></pre></td></tr></table></figure><h3 id="9-设置保护主分支"><a href="#9-设置保护主分支" class="headerlink" title="9.设置保护主分支"></a>9.设置保护主分支</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git13.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git14.png"  alt=""></p><p>测试dev分支推送代码则显示为拒绝，如果还是可以推送请查看配置保护分支选项</p><figure class="highlight sh"><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">git checkout master </span><br><span class="line">git merge dev </span><br><span class="line">git push ‐u origin master</span><br></pre></td></tr></table></figure><h3 id="10-返回master端测试推送"><a href="#10-返回master端测试推送" class="headerlink" title="10.返回master端测试推送"></a>10.返回master端测试推送</h3><p>由于其他分支进行推送，和<code>master</code>端内容不一致，所以无法进行推送，使用<code>git pull</code>把代码拉取到本地，或者<code>git fetch</code>把代码拉取到本地仓库后进行合并<code>（注意：git pull = git fetch+git merge）</code></p><h3 id="11-dev分支发起合并流程"><a href="#11-dev分支发起合并流程" class="headerlink" title="11.dev分支发起合并流程"></a>11.dev分支发起合并流程</h3><p>dev分支提交代码</p><figure class="highlight sh"><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">[root@jenkins2 ~/git_data]<span class="comment"># git branch </span></span><br><span class="line">* dev</span><br><span class="line">  master</span><br><span class="line">[root@jenkins2 ~/git_data]<span class="comment"># echo dd &gt; dd.txt</span></span><br><span class="line">[root@jenkins2 ~/git_data]<span class="comment"># git add .</span></span><br><span class="line">[root@jenkins2 ~/git_data]<span class="comment"># git commit -m "add dd.txt"</span></span><br><span class="line">[dev 77010d9] add dd.txt</span><br><span class="line"> 1 file changed, 1 insertion(+)</span><br><span class="line"> create mode 100644 dd.txt</span><br><span class="line">[root@jenkins2 ~/git_data]<span class="comment"># git push -u origin dev</span></span><br><span class="line">Counting objects: 4, <span class="keyword">done</span>.</span><br><span class="line">Compressing objects: 100% (2/2), <span class="keyword">done</span>.</span><br><span class="line">Writing objects: 100% (3/3), 256 bytes | 0 bytes/s, <span class="keyword">done</span>.</span><br><span class="line">Total 3 (delta 1), reused 0 (delta 0)</span><br><span class="line">remote: </span><br><span class="line">remote: View merge request <span class="keyword">for</span> dev:</span><br><span class="line">remote:   http://10.0.1.200/oldboy/git_data/merge_requests/5</span><br><span class="line">remote: </span><br><span class="line">To git@10.0.1.200:oldboy/git_data.git</span><br><span class="line">   eeb87fd..77010d9  dev -&gt; dev</span><br><span class="line">Branch dev <span class="built_in">set</span> up to track remote branch dev from origin.</span><br></pre></td></tr></table></figure><p>代码提交后，<code>dev</code>用户登录<code>gitlab</code>提交合并请求</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git15.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git16.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git17.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git18.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git19.png"  alt=""></p><p><strong>root用户进行合并</strong></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git20.png"  alt=""></p><p>查看master主分支，发现已合并</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git21.png"  alt=""></p><h2 id="第4章-gitlab备份"><a href="#第4章-gitlab备份" class="headerlink" title="第4章 gitlab备份"></a>第4章 gitlab备份</h2><p>对<code>gitlab</code>进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitlab相同的版本。将<code>gitlab</code>迁移到另一台服务器上的最佳方法就是通过备份和还原。</p><p>gitlab提供了一个简单的命令行来备份整个<code>gitlab</code>，并且能灵活的满足需求。</p><p>备份文件将保存在配置文件中定义的<code>backup_path</code>中，文件名为TIMESTAMP_gitlab_backup.tar,</p><p><code>TIMESTAMP</code>为备份时的时间戳。<code>TIMESTAMP的</code>格式为：EPOCH_YYYY_MM_DD_Gitlab‐version。</p><p>如果自定义备份目录需要赋予git权限</p><p>配置文件中加入</p><figure class="highlight sh"><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">gitlab_rails[<span class="string">'backup_path'</span>] = <span class="string">"/var/opt/gitlab/backups"</span> </span><br><span class="line">gitlab_rails[<span class="string">'backup_keep_time'</span>] = 604800 <span class="comment">#备份保留的时间（以秒为单位，这个是七天默认值）</span></span><br><span class="line">gitlab‐ctl reconfigure <span class="comment">#完成后执行</span></span><br></pre></td></tr></table></figure><h3 id="4-1-手动备份"><a href="#4-1-手动备份" class="headerlink" title="4.1 手动备份"></a>4.1 手动备份</h3><p>执行：<code>gitlab-rake gitlab:backup:create</code>生成一次备份</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">[root@gitlab-200 ~]<span class="comment"># gitlab-rake gitlab:backup:create</span></span><br><span class="line">Dumping database ... </span><br><span class="line">Dumping PostgreSQL database gitlabhq_production ... [DONE]</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping repositories ...</span><br><span class="line"> * oldboy/git_data ... [DONE]</span><br><span class="line"> * oldboy/git_data.wiki ...  [SKIPPED]</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping uploads ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping builds ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping artifacts ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping pages ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping lfs objects ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Dumping container registry images ... </span><br><span class="line">[DISABLED]</span><br><span class="line">Creating backup archive: 1567562451_2019_09_04_10.2.2_gitlab_backup.tar ... <span class="keyword">done</span></span><br><span class="line">Uploading backup archive to remote storage  ... skipped</span><br><span class="line">Deleting tmp directories ... <span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Deleting old backups ... <span class="keyword">done</span>. (0 removed)</span><br></pre></td></tr></table></figure><h3 id="4-2-定时备份"><a href="#4-2-定时备份" class="headerlink" title="4.2 定时备份"></a>4.2 定时备份</h3><p>在定时任务里添加：</p><figure class="highlight sh"><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"><span class="comment">#定时备份gitlab</span></span><br><span class="line">0 2 * * *  /usr/bin/gitlab-rake gitlab:backup:create  &gt;/dev/null 2&gt;&amp;1</span><br></pre></td></tr></table></figure><h3 id="4-3-恢复"><a href="#4-3-恢复" class="headerlink" title="4.3 恢复"></a>4.3 恢复</h3><p>只能还原到与备份文件相同的<code>gitlab</code>版本。</p><p>执行恢复操作时，需要<code>gitlab</code>处于运行状态，备份文件位于<code>gitlab_rails[&#39;backup_path&#39;]</code></p><figure class="highlight sh"><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">[root@gitlab-200 ~]<span class="comment"># ll /var/opt/gitlab/backups/</span></span><br><span class="line">-rw------- 1 git git 204800 Sep  4 10:00 1567562451_2019_09_04_10.2.2_gitlab_backup.tar</span><br></pre></td></tr></table></figure><p>停止连接到数据库的进程（也就是停止数据写入服务），但是保持GitLab是运行的。</p><figure class="highlight sh"><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">[root@gitlab-200 ~]<span class="comment"># gitlab-ctl stop unicorn</span></span><br><span class="line">ok: down: unicorn: 1s, normally up</span><br><span class="line">[root@gitlab-200 ~]<span class="comment">#  gitlab-ctl stop sidekiq</span></span><br><span class="line">ok: down: sidekiq: 0s, normally up</span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># gitlab-ctl status    #确认状态</span></span><br><span class="line">run: gitaly: (pid 11111) 18801s; run: <span class="built_in">log</span>: (pid 1040) 23368s</span><br><span class="line">run: gitlab-monitor: (pid 11149) 18785s; run: <span class="built_in">log</span>: (pid 1138) 23367s</span><br><span class="line">run: gitlab-workhorse: (pid 11166) 18781s; run: <span class="built_in">log</span>: (pid 1038) 23368s</span><br><span class="line">run: logrotate: (pid 25081) 2346s; run: <span class="built_in">log</span>: (pid 1044) 23368s</span><br><span class="line">run: nginx: (pid 11187) 18777s; run: <span class="built_in">log</span>: (pid 1036) 23369s</span><br><span class="line">run: node-exporter: (pid 11190) 18776s; run: <span class="built_in">log</span>: (pid 1052) 23369s</span><br><span class="line">run: postgres-exporter: (pid 11193) 18775s; run: <span class="built_in">log</span>: (pid 1147) 23368s</span><br><span class="line">run: postgresql: (pid 11207) 18773s; run: <span class="built_in">log</span>: (pid 1042) 23369s</span><br><span class="line">run: prometheus: (pid 11217) 18771s; run: <span class="built_in">log</span>: (pid 1139) 23368s</span><br><span class="line">run: redis: (pid 11225) 18770s; run: <span class="built_in">log</span>: (pid 1046) 23369s</span><br><span class="line">run: redis-exporter: (pid 11264) 18770s; run: <span class="built_in">log</span>: (pid 1143) 23368s</span><br><span class="line">down: sidekiq: 8s, normally up; run: <span class="built_in">log</span>: (pid 1048) 23369s</span><br><span class="line">down: unicorn: 19s, normally up; run: <span class="built_in">log</span>: (pid 1035) 23369s</span><br></pre></td></tr></table></figure><p>接下我们进行恢复，指定时间戳你要从那个备份恢复：</p><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line">gitlab-rake gitlab:backup:restore BACKUP=1567562451_2019_09_04_10.2.2  <span class="comment">#恢复</span></span><br><span class="line">Unpacking backup ... <span class="keyword">done</span></span><br><span class="line">Before restoring the database, we will remove all existing</span><br><span class="line">tables to avoid future upgrade problems. Be aware that <span class="keyword">if</span> you have</span><br><span class="line">custom tables <span class="keyword">in</span> the GitLab database these tables and all data will be</span><br><span class="line">removed.</span><br><span class="line"></span><br><span class="line">Do you want to <span class="built_in">continue</span> (yes/no)?  <span class="comment">#将移除我们自建的表。回答yes</span></span><br><span class="line">Restoring uploads ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Restoring builds ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Restoring artifacts ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Restoring pages ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">Restoring lfs objects ... </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">This will rebuild an authorized_keys file.</span><br><span class="line">You will lose any data stored <span class="keyword">in</span> authorized_keys file.</span><br><span class="line">Do you want to <span class="built_in">continue</span> (yes/no)? <span class="comment">#将移除所有的认证Key。回答yes</span></span><br><span class="line">....</span><br><span class="line">Deleting tmp directories ... <span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># gitlab-ctl restart  #完成后重启GitLab服务</span></span><br><span class="line">ok: run: gitaly: (pid 29450) 0s</span><br><span class="line">ok: run: gitlab-monitor: (pid 29466) 1s</span><br><span class="line">ok: run: gitlab-workhorse: (pid 29469) 0s</span><br><span class="line">ok: run: logrotate: (pid 29477) 0s</span><br><span class="line">ok: run: nginx: (pid 29483) 0s</span><br><span class="line">ok: run: node-exporter: (pid 29488) 1s</span><br><span class="line">ok: run: postgres-exporter: (pid 29492) 0s</span><br><span class="line">ok: run: postgresql: (pid 29514) 0s</span><br><span class="line">ok: run: prometheus: (pid 29522) 0s</span><br><span class="line">ok: run: redis: (pid 29527) 1s</span><br><span class="line">ok: run: redis-exporter: (pid 29558) 0s</span><br><span class="line">ok: run: sidekiq: (pid 29573) 1s</span><br><span class="line">ok: run: unicorn: (pid 29580) 0s</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">检查GitLab的服务</span><br><span class="line"></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># gitlab-rake gitlab:check SANITIZE=true</span></span><br><span class="line">Checking GitLab Shell ...</span><br><span class="line"></span><br><span class="line">GitLab Shell version &gt;= 5.9.4 ? ... OK (5.9.4)</span><br><span class="line">Repo base directory exists?</span><br><span class="line">default... yes</span><br><span class="line">Repo storage directories are symlinks?</span><br><span class="line">default... no</span><br><span class="line">Repo paths owned by git:root, or git:git?</span><br><span class="line">default... yes</span><br><span class="line">Repo paths access is drwxrws---?</span><br><span class="line">default... yes</span><br><span class="line">hooks directories <span class="keyword">in</span> repos are links: ... </span><br><span class="line">2/1 ... ok</span><br><span class="line">Running /opt/gitlab/embedded/service/gitlab-shell/bin/check</span><br><span class="line">Check GitLab API access: OK</span><br><span class="line">Redis available via internal API: OK</span><br><span class="line"></span><br><span class="line">Access to /var/opt/gitlab/.ssh/authorized_keys: OK</span><br><span class="line">gitlab-shell self-check successful</span><br><span class="line"></span><br><span class="line">Checking GitLab Shell ... Finished</span><br><span class="line"></span><br><span class="line">Checking Sidekiq ...</span><br><span class="line"></span><br><span class="line">Running? ... yes</span><br><span class="line">Number of Sidekiq processes ... 1</span><br><span class="line"></span><br><span class="line">Checking Sidekiq ... Finished</span><br><span class="line"></span><br><span class="line">Reply by email is disabled <span class="keyword">in</span> config/gitlab.yml</span><br><span class="line">Checking LDAP ...</span><br><span class="line"></span><br><span class="line">LDAP is disabled <span class="keyword">in</span> config/gitlab.yml</span><br><span class="line"></span><br><span class="line">Checking LDAP ... Finished</span><br><span class="line"></span><br><span class="line">Checking GitLab ...</span><br><span class="line"></span><br><span class="line">Git configured correctly? ... yes</span><br><span class="line">Database config exists? ... yes</span><br><span class="line">All migrations up? ... yes</span><br><span class="line">Database contains orphaned GroupMembers? ... no</span><br><span class="line">GitLab config exists? ... yes</span><br><span class="line">GitLab config up to date? ... yes</span><br><span class="line">Log directory writable? ... yes</span><br><span class="line">Tmp directory writable? ... yes</span><br><span class="line">Uploads directory exists? ... yes</span><br><span class="line">Uploads directory has correct permissions? ... yes</span><br><span class="line">Uploads directory tmp has correct permissions? ... yes</span><br><span class="line">Init script exists? ... skipped (omnibus-gitlab has no init script)</span><br><span class="line">Init script up-to-date? ... skipped (omnibus-gitlab has no init script)</span><br><span class="line">Projects have namespace: ... </span><br><span class="line">2/1 ... yes</span><br><span class="line">Redis version &gt;= 2.8.0? ... yes</span><br><span class="line">Ruby version &gt;= 2.3.5 ? ... yes (2.3.5)</span><br><span class="line">Git version &gt;= 2.7.3 ? ... yes (2.13.6)</span><br><span class="line">Git user has default SSH configuration? ... yes</span><br><span class="line">Active users: ... 2</span><br><span class="line"></span><br><span class="line">Checking GitLab ... Finished</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
      <category term="gitlab" scheme="http://linuxwf.com/tags/gitlab/"/>
    
  </entry>
  
  <entry>
    <title>1.DevOps</title>
    <link href="http://linuxwf.com/2020/04/15/1-DevOps/"/>
    <id>http://linuxwf.com/2020/04/15/1-DevOps/</id>
    <published>2020-04-15T07:23:00.000Z</published>
    <updated>2020-04-15T07:24:57.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="DevOps"><a href="#DevOps" class="headerlink" title="DevOps"></a>DevOps</h1><h2 id="第1章-什么是DevOps"><a href="#第1章-什么是DevOps" class="headerlink" title="第1章 什么是DevOps"></a>第1章 什么是DevOps</h2><p>开发 development</p><p>运维 operations</p><h3 id="1-1-DevOps能做什么？"><a href="#1-1-DevOps能做什么？" class="headerlink" title="1.1 DevOps能做什么？"></a>1.1 DevOps能做什么？</h3><p>提高产品质量<br>1 自动化测试<br>2 持续集成<br>3 代码质量管理工具<br>4 程序员鼓励师</p><h3 id="1-2-Devops如何实现"><a href="#1-2-Devops如何实现" class="headerlink" title="1.2 Devops如何实现"></a>1.2 Devops如何实现</h3><p>既然这么好？为什么有些公司没有<br>设计架构规划‐代码的存储‐构建‐测试、预生产、部署、监控</p><h2 id="第2章-Git版本控制系统"><a href="#第2章-Git版本控制系统" class="headerlink" title="第2章 Git版本控制系统"></a>第2章 Git版本控制系统</h2><h3 id="2-1-版本控制系统简介"><a href="#2-1-版本控制系统简介" class="headerlink" title="2.1 版本控制系统简介"></a>2.1 版本控制系统简介</h3><p>一个标准的版本控制系统 Version Control System (VCS)，通常需要有以下功能：</p><ul><li>能够创建 Repository (仓库)，用来保存代码</li><li>协同开发时方便将代码分发给团队成员</li><li>记录每次修改代码的内容、时间、原因等信息</li><li>能够创建 Branch (分支)，可以根据不同的场景进行开发</li><li>能够创建 Tag (标签)，建立项目里程碑</li></ul><h3 id="2-2-为什么需要版本控制"><a href="#2-2-为什么需要版本控制" class="headerlink" title="2.2 为什么需要版本控制"></a>2.2 为什么需要版本控制</h3><p>在软件开发过程，每天都会产生新的代码，代码合并的过程中可能会出现如下问题：</p><ul><li>代码被覆盖或丢失</li><li>代码写的不理想希望还原之前的版本</li><li>希望知道与之前版本的差别</li><li>是谁修改了代码以及为什么修改</li><li>发版时希望分成不同的版本(测试版、发行版等)</li></ul><p>因此，我们希望有一种机制，能够帮助我们：</p><ul><li>可以随时回滚到之前的版本</li><li>协同开发时不会覆盖别人的代码</li><li>留下修改记录，以便随时查看</li><li>发版时可以方便的管理不同的版本</li></ul><h3 id="2-3-常见版本管理工具"><a href="#2-3-常见版本管理工具" class="headerlink" title="2.3 常见版本管理工具"></a>2.3 常见版本管理工具</h3><p>Cvs：是一个C/S系统,是一个常用的代码版本控制软件。主要在开源软件管理中使用。多个开发人员通过一个中心版本控制系统来记录文件版本，从而达到保证文件同步的目的。是一种很古老的版本控制工具了，但是是很典型的集中式版本控制工具</p><p>SVN： 是一个开放源代码的版本控制系统，相较于RCS、CVS，它采用了分支管理系统，它的设计目标就是取代CVS。可以说是集中式版本控制的集大成者</p><p>Git：   是一个开源的分布式版本控制系统，可以有效、高速的处理从很小到非常大的项目版本管理。是一种分布式的版本控制工具</p><p>GitHub：gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。</p><p>2个概念：</p><p>分布式版本控制：分布式的版本控制就是每个人都可以创建一个独立的代码仓库用于管理，各种版本控制的操作都可以在本地完成。每个人修改的代码都可以推送合并到另外一个代码仓库中。</p><p>集中式版本控制：只有一个中央控制，所有的开发人员都必须依赖于这个代码仓库。每次版本控制的操作也必须链接到服务器才能完成。所以很多公司喜欢用集中式的版本控制是为了更好的控制代码。如果个人开发，就可以选择Git这种分布式的。并不存在那个更加好或者其他的。</p><h2 id="第3章-Git安装部署"><a href="#第3章-Git安装部署" class="headerlink" title="第3章 Git安装部署"></a>第3章 Git安装部署</h2><h3 id="3-1-系统环境准备"><a href="#3-1-系统环境准备" class="headerlink" title="3.1 系统环境准备"></a>3.1 系统环境准备</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></pre></td><td class="code"><pre><span class="line">[root@gitlab-200 ~]<span class="comment"># cat /etc/redhat-release    #查看系统版本</span></span><br><span class="line">CentOS Linux release 7.4.1708 (Core) </span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># uname -r                   #查看系统内核</span></span><br><span class="line">3.10.0-693.el7.x86_64 </span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># getenforce                 #关闭SElinux</span></span><br><span class="line">Disabled</span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># systemctl stop firefalld   #关闭防火墙</span></span><br></pre></td></tr></table></figure><h3 id="3-2-安装部署"><a href="#3-2-安装部署" class="headerlink" title="3.2 安装部署"></a>3.2 安装部署</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></pre></td><td class="code"><pre><span class="line">[root@gitlab-200 ~]<span class="comment"># yum -y install git      #安装git</span></span><br><span class="line">[root@git ~]<span class="comment"># git config</span></span><br><span class="line">‐‐global                         <span class="comment">#使用全局配置文件</span></span><br><span class="line">‐‐system                         <span class="comment">#使用系统级配置文件</span></span><br><span class="line">‐‐<span class="built_in">local</span>                          <span class="comment">#使用版本库级配置文件</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># git config –‐global user.name ‘wufei’  </span></span><br><span class="line"><span class="comment"># 配置git使用账户</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># git config –‐global user.email ‘wufei008@qq.com’ </span></span><br><span class="line"><span class="comment"># 配置git使用邮箱</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># git config –‐global color.ui true</span></span><br><span class="line"><span class="comment"># 语法高亮</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># git config --list     #查看git用户信息</span></span><br><span class="line">user.name=wufei</span><br><span class="line">user.email=wufei008@qq.com</span><br><span class="line">color.ui=<span class="literal">true</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># cat .gitconfig </span></span><br><span class="line">[user]</span><br><span class="line">name = wufei</span><br><span class="line">email = wufei008@qq.com</span><br><span class="line">[color]</span><br><span class="line">ui = <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="3-3-Git初始化"><a href="#3-3-Git初始化" class="headerlink" title="3.3 Git初始化"></a>3.3 Git初始化</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#初始化工作目录、对已存在的目录或者对已存在的目录都可进行初始化</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># mkdir /git_date</span></span><br><span class="line">[root@gitlab-200 ~]<span class="comment"># cd /git_date/</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git init    #初始化工作目录</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status   # 查看工作区状态</span></span><br><span class="line"><span class="comment">#隐藏文件介绍</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># tree -L 1 .git/    </span></span><br><span class="line">.git/</span><br><span class="line">├── branches                <span class="comment">#分支目录</span></span><br><span class="line">├── COMMIT_EDITMSG</span><br><span class="line">├── config                  <span class="comment">#定义项目特有的配置选项</span></span><br><span class="line">├── description             <span class="comment">#仅供git web程序使用</span></span><br><span class="line">├── HEAD                    <span class="comment">#指示当前的分支</span></span><br><span class="line">├── hooks                   <span class="comment">#包含git钩子文件</span></span><br><span class="line">├── index                   <span class="comment">#保存暂存区信息，在执行git init的时候，这个文件还没有</span></span><br><span class="line">├── info                    <span class="comment">#包含一个全局排除文件(exclude文件)</span></span><br><span class="line">├── logs</span><br><span class="line">├── objects                 <span class="comment">#存放所有数据内容，有info和pack两个子文件夹</span></span><br><span class="line">├── ORIG_HEAD</span><br><span class="line">└── refs                    <span class="comment">#存放指向数据(分支)的提交对象的指针</span></span><br></pre></td></tr></table></figure><h3 id="3-4-Git常规使用"><a href="#3-4-Git常规使用" class="headerlink" title="3.4 Git常规使用"></a>3.4 Git常规使用</h3><h4 id="3-4-1-创建数据-提交数据"><a href="#3-4-1-创建数据-提交数据" class="headerlink" title="3.4.1 创建数据-提交数据"></a>3.4.1 创建数据-提交数据</h4><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git01.png"  alt=""></p><h4 id="3-4-2-git四种状态"><a href="#3-4-2-git四种状态" class="headerlink" title="3.4.2 git四种状态"></a>3.4.2 git四种状态</h4><p>git库所在的文件夹中的文件大致有4种状态</p><ul><li><strong>Untracked</strong>: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过<code>git add</code> 状态变为<code>Staged</code>.</li><li><strong>Unmodify</strong>: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为<code>Modified</code>. 如果使用<code>git rm</code>移出版本库, 则成为<code>Untracked</code>文件</li><li><strong>Modified</strong>: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过<code>git add</code>可进入暂存<code>staged</code>状态, 使用<code>git checkout</code> 则丢弃修改过, 返回到<code>unmodify</code>状态, 这个<code>git checkout</code>即从库中取出文件, 覆盖当前修改</li><li><strong>Staged</strong>: 暂存状态. 执行<code>git commit</code>则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为<code>Unmodify</code>状态. 执行<code>git reset HEAD filename</code>取消暂存, 文件状态为<code>Modified</code></li></ul><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/cicd/git02.png"  alt=""></p><h4 id="3-4-3-git基础命令"><a href="#3-4-3-git基础命令" class="headerlink" title="3.4.3 git基础命令"></a>3.4.3 git基础命令</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><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></pre></td><td class="code"><pre><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status</span></span><br><span class="line"><span class="comment"># On branch master                            #位于分支 master</span></span><br><span class="line">nothing to commit, working directory clean    </span><br><span class="line"><span class="comment">#无文件要提交（创建/拷贝文件并使用 "git add" 建立跟踪）</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># touch a b c</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status</span></span><br><span class="line"><span class="comment"># 位于分支 master</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 初始提交</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># 未跟踪的文件:</span></span><br><span class="line"><span class="comment"># （使用 "git add &lt;file&gt;..." 以包含要提交的内容）</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># a</span></span><br><span class="line"><span class="comment"># b</span></span><br><span class="line"><span class="comment"># c</span></span><br><span class="line"><span class="comment">#提交为空，但是存在尚未跟踪的文件（使用 "git add" 建立跟踪）</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add a  </span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add .           </span></span><br><span class="line"><span class="comment">#使用git add . 或者* 添加目录中所有改动过的文件</span></span><br><span class="line"></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git rm ‐‐cached c    #撤销操作 从暂存区删除文件</span></span><br><span class="line"><span class="comment">#删除文件步骤：</span></span><br><span class="line">1.先从暂存区撤回到工作区、然后直接删除文件</span><br><span class="line">git rm ‐‐cached c</span><br><span class="line">rm ‐f c</span><br><span class="line">2.直接从暂存区域同工作区域一同删除文件命令</span><br><span class="line">git rm -f b</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git commit ‐m "add newfile a" #提交到本地仓库</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#修改文件名称两种方法</span></span><br><span class="line">1.</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># mv a a.txt</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add a.txt</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git commit ‐m "commit a.txt"</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status</span></span><br><span class="line">2.直接用git命令重命名</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git mv a.txt a</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git commit ‐m "rename a.txt a"</span></span><br><span class="line"><span class="comment">#git status 只能查看区域状态的不同，不能查看文件内容的变化。</span></span><br><span class="line"><span class="comment">#git diff 查看内容的不同</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git diff a   </span></span><br><span class="line"><span class="comment"># 比对本地工作目录和暂存区文件的不同</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add a</span></span><br><span class="line"><span class="comment"># 提交a文件到暂存区域、在用git diff是相同的</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git diff ‐‐cached a</span></span><br><span class="line"><span class="comment"># 比对的是暂存区和本地仓库文件的不同处</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git commit ‐m "modified a" </span></span><br><span class="line"><span class="comment"># 提交后在比对则暂存区和本地仓库内容相同</span></span><br><span class="line"></span><br><span class="line">git commit <span class="comment"># 相当于虚拟机的镜像、任何操作都被做了一次快照，可恢复到任意一个位置</span></span><br><span class="line"></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log 查看历史的git commit快照操作</span></span><br><span class="line">commit f3a56773c5c08cbffcb4fe331696a2725c03b3c9  <span class="comment"># 哈希唯一标识的字符串</span></span><br><span class="line">Merge: 4c81d52 9ff69f6                   </span><br><span class="line">Author: wufei &lt;wufei008@qq.com&gt;                  <span class="comment"># 作者个人信息</span></span><br><span class="line">Date:   Tue Sep 3 01:10:10 2019 +0800            <span class="comment"># 时间</span></span><br><span class="line"></span><br><span class="line">    merge                                        <span class="comment"># ‐m 个人写的提交描述信息</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log --oneline   # 一行简单的显示commit信息</span></span><br><span class="line">f3a5677 merge</span><br><span class="line">9ff69f6 xxx</span><br><span class="line">4c81d52 xxx</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log --oneline --decorate # 显示当前的指针指向哪里</span></span><br><span class="line">f3a5677 (HEAD, tag: v2.0, origin/master, testing, master) merge</span><br><span class="line">9ff69f6 xxx</span><br><span class="line">4c81d52 xxx</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log ‐p # 显示具体内容的变化</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log ‐1 # 只显示1条内容</span></span><br></pre></td></tr></table></figure><p>恢复历史数据</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">1.只更改了当前目录</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git checkout ‐‐ a  # 从暂存区覆盖本地工作目录</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git status</span></span><br><span class="line">2.修改了本地目录且同时提交到 了暂存区</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># echo ccc &gt;&gt; a         # 添加新内容</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add .             #提交到暂存区</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git diff ‐‐cached #比对暂存区和本地仓库的内容</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git reset HEAD a     # 本地仓库覆盖暂存区域</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git diff a</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git diff ‐‐cached a</span></span><br><span class="line">3.修改了工作目录后提交到了暂存区和本地仓库后进行数据恢复</span><br><span class="line"><span class="built_in">echo</span> bbb &gt;&gt;a <span class="comment"># 提交新的bbb文件到a</span></span><br><span class="line">git commit ‐m <span class="string">"add bbb"</span></span><br><span class="line"><span class="built_in">echo</span> ccc &gt;&gt; a</span><br><span class="line">git commit ‐am <span class="string">"add ccc"</span> <span class="comment"># 这时候发现改错代码了，想还原某一次提交的文件快照</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log ‐‐oneline</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git reset ‐‐hard 4c57a60</span></span><br><span class="line"><span class="comment">#当当前窗口不小心关闭，找不到哈希值</span></span><br><span class="line">git reflog <span class="comment"># 使用git reflog 可查看总历史内容</span></span><br></pre></td></tr></table></figure><h4 id="3-4-4-git分支"><a href="#3-4-4-git分支" class="headerlink" title="3.4.4 git分支"></a>3.4.4 git分支</h4><p><code>分支</code>即是<code>平行空间</code>，假设你在为某个手机系统研发拍照功能，代码已经完成了80%，但如果将这不完整的代码直接提交到git仓库中，又有可能影响到其他人的工作，此时我们便可以在该软件的项目之上创建一个名叫”拍照功能”的分支，这种分支只会属于你自己，而其他人看不到，等代码编写完成后再与原来的项目主分支合并下即可，这样即能保证代码不丢失，又不影响其他人的工作。</p><p>一般在实际的项目开发中，我们要尽量保证master分支是非常稳定的，仅用于发布新版本，平时不要随便直接修改里面的数据文件，而工作的时候则可以新建不同的工作分支，等到工作完成后在合并到master分支上面，所以团队的合作分支看起来会像上面图那样。</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></pre></td><td class="code"><pre><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log --oneline --decorate</span></span><br><span class="line">f3a5677 (HEAD, tag: v2.0, origin/master, testing, master) merge  <span class="comment"># 默认分支指向你最后一次的提交 HEAD头、指针</span></span><br><span class="line">9ff69f6 xxx</span><br><span class="line">4c81d52 xxx</span><br><span class="line">7353a92 Merge branch <span class="string">'testing'</span></span><br><span class="line">7363b5e add newfile master.txt</span><br><span class="line">7768c8d add newfile test.txt</span><br><span class="line">061d4cf (tag: v1.0) newfile b.txt</span><br><span class="line"></span><br><span class="line"><span class="comment">#HEAD 指针指向哪个分支、说明你当前在哪个分支下工作`</span></span><br><span class="line">git branch testing   <span class="comment"># 新建testing分支</span></span><br><span class="line">git branch -d testing<span class="comment">#删除分支</span></span><br><span class="line">git checkout testing  <span class="comment">#切换分支</span></span><br><span class="line">git checkout -b testing  <span class="comment"># 创建并切换到testing分支</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git branch</span></span><br><span class="line">* master          <span class="comment"># *号在哪里就说明当前在哪个分支上入下图所示</span></span><br><span class="line">  testing</span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git log ‐‐oneline ‐‐decorate # 通过命令查看分支指向</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># touch test</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git add .</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git commit ‐m "commit test"</span></span><br><span class="line">[root@gitlab-200 /git_date]<span class="comment"># git checkout master    # 切换到master分支后指针指向到了master</span></span><br><span class="line">touch master</span><br><span class="line">git add .</span><br><span class="line">git commit ‐m <span class="string">"commit master"</span></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></pre></td><td class="code"><pre><span class="line">git merge testing    <span class="comment"># 在master分支上进行合并testing分支</span></span><br><span class="line">git <span class="built_in">log</span> ‐‐oneline ‐‐decorate</span><br><span class="line"><span class="comment">#删除分支‐d参数</span></span><br><span class="line">git branch ‐d testing</span><br></pre></td></tr></table></figure><h4 id="3-4-5-git标签使用"><a href="#3-4-5-git标签使用" class="headerlink" title="3.4.5 git标签使用"></a>3.4.5 git标签使用</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><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"><span class="comment">#标签也是指向了一次commit提交，是一个里程碑式的标签，回滚打标签直接加标签号，不需要加唯一字符串不好记</span></span><br><span class="line">git tag ‐a v1.0 ‐m <span class="string">"aaa bbb master tesing version v1.0"</span>  </span><br><span class="line"><span class="comment"># ‐a指定标签名字 ‐m 指定说明文字</span></span><br><span class="line">git tag    <span class="comment">#查看标签</span></span><br><span class="line">git tag ‐a v2.0 dbead4c ‐m <span class="string">"add bbb version v2.0"</span> </span><br><span class="line"><span class="comment"># 指定某一次的提交为标签</span></span><br><span class="line">git show v1.0              <span class="comment"># 查看v1.0的信息 git show 加标签查看</span></span><br><span class="line">git reset ‐‐hard v2.0      <span class="comment"># 直接还原数据到v2.0</span></span><br><span class="line">git tag ‐d v2.0            <span class="comment"># 删除标签 ‐d参数</span></span><br></pre></td></tr></table></figure><h2 id="第4章-github使用"><a href="#第4章-github使用" class="headerlink" title="第4章 github使用"></a>第4章 github使用</h2><p><code>Github</code>顾名思义是一个Git版本库的托管服务，是目前全球最大的软件仓库，拥有上百万的开发者用户，也是软件开发和寻找资源的最佳途径，<code>Github</code>不仅可以托管各种Git版本仓库，还拥有了更美观的Web界面，您的代码文件可以被任何人克隆，使得开发者为开源项贡献代码变得更加容易，当然也可以付费购买私有库，这样高性价比的私有库真的是帮助到了很多团队和企业</p><ol><li>注册用户 </li><li>配置ssh‐key</li><li>创建项目</li><li>克隆项目到本地</li><li>推送新代码到github</li></ol><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">git remote add origin git@github.com:wf3512638/git_data.git   <span class="comment">#创建远程仓库</span></span><br><span class="line">git remote remove origin 删除远程仓库</span><br><span class="line">[root@gitlab-200 /git_data]<span class="comment"># git remote   #查看远程仓库</span></span><br><span class="line">origin</span><br><span class="line">yum update ‐y nss curl libcurl <span class="comment">#升级版本</span></span><br><span class="line">git push ‐u origin master   <span class="comment">#推送本地仓库到远程仓库</span></span><br><span class="line">git pull   <span class="comment">#拉取远程仓库最新代码</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="代码上线" scheme="http://linuxwf.com/categories/%E4%BB%A3%E7%A0%81%E4%B8%8A%E7%BA%BF/"/>
    
    
      <category term="DevOps" scheme="http://linuxwf.com/tags/DevOps/"/>
    
      <category term="Github" scheme="http://linuxwf.com/tags/Github/"/>
    
      <category term="CI-CD" scheme="http://linuxwf.com/tags/CI-CD/"/>
    
  </entry>
  
  <entry>
    <title>4.Shell 编程总结</title>
    <link href="http://linuxwf.com/2020/04/15/4-Shell-%E7%BC%96%E7%A8%8B%E6%80%BB%E7%BB%93/"/>
    <id>http://linuxwf.com/2020/04/15/4-Shell-%E7%BC%96%E7%A8%8B%E6%80%BB%E7%BB%93/</id>
    <published>2020-04-15T03:38:00.000Z</published>
    <updated>2020-04-15T03:39:27.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Shell-编程总结"><a href="#Shell-编程总结" class="headerlink" title="Shell 编程总结"></a>Shell 编程总结</h1><h2 id="第1章-基础知识"><a href="#第1章-基础知识" class="headerlink" title="第1章 基础知识"></a>第1章 基础知识</h2><p><strong>1.linux下默认的shell是?</strong>   </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">bash</span><br></pre></td></tr></table></figure><p><strong>2.shell脚本书写规范?</strong></p><p>1.shell脚本存放统一的目录 /server/scripts</p><p>2.脚本名字的结尾使用.sh</p><p>3.脚本的开头 必须有解释器 #!/bin/bash</p><p>4.脚本内有作者信息 脚本信息</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="comment">#Date: 20111111</span></span><br><span class="line"><span class="comment">#Author: wufei</span></span><br><span class="line"><span class="comment">#Blog:            #博客</span></span><br><span class="line"><span class="comment">#Descriptsion:    #描述</span></span><br><span class="line"><span class="comment">#Version： 1.0    #版本</span></span><br></pre></td></tr></table></figure><p>5.每段代码块有注释(尽量使用英文)</p><p>6.标点符号 (语法尽量一次性书写完毕</p><p>7.成对的符号 一次性书写完毕</p><p><strong>3.执行脚本的三种方法?</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#方法1：直接使用解释器执行</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># bash hello.sh </span></span><br><span class="line">hello world!</span><br><span class="line"><span class="comment">#方法2: 全路径方式执行 需要执行权限</span></span><br><span class="line"><span class="comment"># chmod +x hello.sh</span></span><br><span class="line">[root@backup ~]<span class="comment"># . /server/scripts/hello.sh </span></span><br><span class="line">hello world!</span><br><span class="line"><span class="comment">#方法3 source .执行脚本  子shell中的内容调用到父shell中执行</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># source hello.sh </span></span><br><span class="line">hello world!</span><br></pre></td></tr></table></figure><p><strong>4.变量可分为两类？</strong></p><p>变量可分为两类：环境变量（全局变量）和普通变量（局部变量）</p><p>全局变量(环境变量) 针对系统所有用户生效</p><p>局部变量(普通变量) 针对当前登录用户生效</p><p><strong>5.如何显示默认的环境变量**</strong></p><p>1.使用echo命令查看单个环境变量。例如： echo $PATH </p><p>2.使用env查看所有环境变量。例如： env </p><p>3.使用set查看所有本地定义的环境变量。</p><p><strong>6.如何设置环境变量与局部变量</strong></p><p>1.在/etc/profile文件中添加变量【对所有用户生效(永久的)】，注意：修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。</p><p>2.在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】</p><p>3.直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】</p><p><strong>7.定义变量内容，不加引号、单引号、双引号、反引号结果有什么不同？应该怎么用？</strong></p><p>不加引号：直接定义变量的内容，一般用于连续的数字、字符串、路径名等</p><p>单引号：所见即所得，引号内是什么就输出什么</p><p>双引号：输出变量内容时引号的变量及命令会经过解析后再输出内容</p><p>反引号：一般用于引用命令，执行的时候命令会被执行，相当于S0，赋值和输出都要用引号将命令引起来</p><p><strong>8.以下参数含义</strong></p><table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td>$0</td><td>获取当前执行的shell脚本的文件名，如果包含路径，则包括脚本路径</td></tr><tr><td>$n</td><td>获取当前执行脚本的第n个参数值，参数从$1开始 $9 以后需要加{}</td></tr><tr><td>$#</td><td>获取当前执行的脚本后面接的参数的总个数</td></tr><tr><td>$*</td><td>脚本所有传参的参数，加双引号将所有参数视为一个整体</td></tr><tr><td>$@</td><td>脚本所有传参的参数，加双引号将所有参数视为不通的独立字符串</td></tr><tr><td>$?</td><td>上一个指令的状态返回值（0为成功，非0失败）</td></tr><tr><td>$$</td><td>当前执行脚本的PID进程号</td></tr><tr><td>$!</td><td>上一个在后台工作的进程的PID</td></tr><tr><td>$_</td><td>获取在此之前的命令或脚本的最后一个参数</td></tr></tbody></table><p><strong>9.echo参数含义</strong></p><table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td>-n</td><td>不换行输出内容</td></tr><tr><td>-e</td><td>解析转义字符</td></tr><tr><td><strong>转义字符</strong></td><td></td></tr><tr><td>\n</td><td>换行</td></tr><tr><td>\r</td><td>回车</td></tr><tr><td>\t</td><td>制表符(tab)</td></tr><tr><td>\b</td><td>退格</td></tr><tr><td>\v</td><td>纵向制表符</td></tr></tbody></table><p><strong>10.变量传参的三种方式？</strong></p><p>1.直接传参</p><p>2.赋值传参</p><p>3.read传参</p><p><strong>11.统计字符串长度？</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># echo $test</span></span><br><span class="line">I am oldboy</span><br><span class="line"><span class="comment"># echo $&#123;#test&#125;   #变量前加#可以打印变量的长度</span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># echo $test|wc -L  </span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># expr length "$test"</span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># echo $test|awk '&#123;print length&#125;'</span></span><br><span class="line">11</span><br></pre></td></tr></table></figure><p><strong>12.输出字符串长度小于3的单词</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat for.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> I am lizhenya teacher I am 18</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   [ <span class="variable">$&#123;#i&#125;</span> -lt 3 ] &amp;&amp; <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh for.sh </span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "I am lizhenya teacher I am 18"|xargs -n1|awk '&#123;if(length&lt;3)print&#125;'</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "I am lizhenya teacher I am 18"|xargs -n1|awk '&#123;for(i=1;i&lt;=NF;i++)if(length&lt;3)print&#125;'</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br></pre></td></tr></table></figure><p><strong>13.变量子串的删除和替换</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#截取从第二个字符之后的内容，不包含第二个字符</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $test</span></span><br><span class="line">I am oldboy</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># </span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test:2&#125;</span></span><br><span class="line">am oldboy</span><br><span class="line"><span class="comment">#从第二个字符开始截取之后的二个字符</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test:2:2&#125;</span></span><br><span class="line">am</span><br></pre></td></tr></table></figure><p><strong>14.写出下面特殊变量扩展的意义</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></pre></td><td class="code"><pre><span class="line"><span class="variable">$&#123;oldboy&#125;</span>   <span class="comment">#返回变量$oldboy的内容</span></span><br><span class="line"><span class="variable">$&#123;#oldboy&#125;</span>   <span class="comment">#返回变量$oldboy的内容的字符长度</span></span><br><span class="line"><span class="variable">$&#123;url#*.&#125;</span>      <span class="comment">#从.开始删除前面的内容输出</span></span><br><span class="line"><span class="variable">$&#123;url##*.&#125;</span>   <span class="comment">#从.开始删除最后一个.后面的内容输出</span></span><br><span class="line"><span class="variable">$&#123;url%.*&#125;</span>   <span class="comment">#删除最后一个.后面的内容输出</span></span><br><span class="line"><span class="variable">$&#123;url%%.*&#125;</span>     <span class="comment">#删除第一个.后面的内容输出</span></span><br></pre></td></tr></table></figure><p><strong>15.常见的Shell算术运算符</strong></p><table><thead><tr><th>算术运算符</th><th>意义（*表示常用）</th></tr></thead><tbody><tr><td>+ 、-</td><td>加（或正号）、减（或负号）*</td></tr><tr><td>*、/、%</td><td>乘法、除法、取余 *</td></tr><tr><td>**</td><td>冥运算 *</td></tr><tr><td>++ 、–</td><td>增加、减少，可前置也可放在变量的结尾 *</td></tr><tr><td>！、&amp;&amp;、||</td><td>非（取反）、相当于and 、相当于or *</td></tr><tr><td>&lt; 、&lt;= 、&gt; 、&gt;=</td><td>比较符号（小于、小于等于、大于、大于等于）</td></tr><tr><td>== 、!= 、=</td><td>比较符号 （相等、不相等、对于字符串=也可表示相当于）*</td></tr><tr><td>&lt;&lt; 、&gt;&gt;</td><td>向左移位、向右移位</td></tr><tr><td>~ 、| 、&amp; 、^</td><td>按位取反、按位异或、按位于、按位或</td></tr><tr><td>= 、+=、-= 、*= 、%=</td><td>赋值运算符，例如 a+=1 相当于 a=a+1 , a-=1 相当于 a=a-1 *</td></tr></tbody></table><p><strong>16.常见的运算命令</strong></p><table><thead><tr><th>运算操作符号与运算命令</th><th>意义</th></tr></thead><tbody><tr><td>(())</td><td>用于整数的运算、效率很高</td></tr><tr><td>let</td><td>用于证书运算，类似于(())</td></tr><tr><td>expr</td><td>可用于整数运算，还有其他功能</td></tr><tr><td>bc</td><td>Linux下的计算程序、可用于整数及小数运算</td></tr><tr><td>$[]</td><td>用于整数运算</td></tr><tr><td>awk</td><td>awk既可用于整数运算，也可用于小数运算</td></tr><tr><td>declare</td><td>定义变量值和属性，-i参数可用于定义整形变量，做运算</td></tr></tbody></table><p><strong>17.常用的条件表达式</strong></p><table><thead><tr><th>语法</th><th>意义</th></tr></thead><tbody><tr><td>test -f file</td><td>表示如果file文件存在，则为真（0），否则为假（非0）</td></tr><tr><td>test -z</td><td>表示如果字符串长度是为0，则表达式成立</td></tr><tr><td>[ -e file ]</td><td>文件存在则为真</td></tr><tr><td>[ -f file ]</td><td>是否存在并且为普通文件</td></tr><tr><td>[ -d file ]</td><td>是否为目录</td></tr><tr><td>[ -r file ]</td><td>是否可读</td></tr><tr><td>[ -w file ]</td><td>是否可写</td></tr><tr><td>[ -x file ]</td><td>是否可执行</td></tr></tbody></table><p><strong>18.数值表达式</strong></p><p>[ 整数1 比较符 整数2 ]</p><table><thead><tr><th>在[]以及test 中使用的比较符号</th><th>在(())和[[]] 中使用的比较符号</th><th>说明</th></tr></thead><tbody><tr><td>-eq</td><td>== 或 =</td><td>等于</td></tr><tr><td>-ne</td><td>!=</td><td>不等于</td></tr><tr><td>-gt</td><td>&gt;</td><td>大于</td></tr><tr><td>-ge</td><td>&gt;=</td><td>大于等于</td></tr><tr><td>-lt</td><td>&lt;</td><td>小于</td></tr><tr><td>-le</td><td>&lt;=</td><td>小于等于</td></tr></tbody></table><p><strong>19.循环控制及状态返回值参数</strong></p><table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td>exit</td><td>退出脚本</td></tr><tr><td>return</td><td>退出函数</td></tr><tr><td>local</td><td>局部变量</td></tr><tr><td>breadk</td><td>跳出循环体</td></tr><tr><td>continue</td><td>跳过本次循环，进行下一次循环</td></tr></tbody></table><h2 id="第2章-脚本案例"><a href="#第2章-脚本案例" class="headerlink" title="第2章 脚本案例"></a>第2章 脚本案例</h2><p><strong>1.查看磁盘/当前使用状态，如果使用率超过80%则把结果输出</strong></p><figure class="highlight plain"><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">#!&#x2F;bin&#x2F;sh</span><br><span class="line">usedisk&#x3D;&#96;df -h|awk &#39;NR&#x3D;&#x3D;2&#123;print $(NF-1)&#125;&#39;&#96;</span><br><span class="line">[ $&#123;usedisk%\%&#125; -gt 80 ] &amp;&amp; echo &quot;send mail 当前使用为$usedisk&quot; || echo &quot;磁盘使用正常,当前使用率为$usedisk&quot;</span><br><span class="line">[ &#96;df -h|awk -F &quot;[ %]+&quot; &#39;NR&#x3D;&#x3D;2&#123;print $(NF-1)&#125;&#39;&#96; -gt 5 ] &amp;&amp; echo &quot;send mail&quot; || echo &quot;磁盘使用正常&quot;</span><br></pre></td></tr></table></figure><p>统计磁盘使用率 如果磁盘使用率大于 5% 则发邮件报警 当前使用率为? 小于5% 则提示磁盘使用正常 当前使用率为?</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat disk.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">usedisk=`df -h|awk <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>`</span><br><span class="line">[ <span class="variable">$&#123;usedisk%\%&#125;</span> -gt 80 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"send mail 当前使用为<span class="variable">$usedisk</span>"</span> || <span class="built_in">echo</span> <span class="string">"磁盘使用正常,当前使用率为<span class="variable">$usedisk</span>"</span></span><br><span class="line">[ `df -h|awk -F <span class="string">"[ %]+"</span> <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>` -gt 5 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"send mail"</span> || <span class="built_in">echo</span> <span class="string">"磁盘使用正常"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh disk.sh </span></span><br><span class="line">磁盘使用正常,当前使用率为4%</span><br><span class="line">磁盘使用正常</span><br></pre></td></tr></table></figure><p><strong>2.加大文件描述符</strong></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"><span class="built_in">echo</span> <span class="string">'*                -       nofile          65535'</span>&gt;&gt;/etc/security/limits.conf</span><br></pre></td></tr></table></figure><p><strong>3.使用脚本 统计系统的 主机名 IP地址 虚拟平台 版本号 磁盘使用率 内存使用率 外网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><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">[root@backup /server/scripts]<span class="comment"># cat os.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">eth0=$(ip a|awk <span class="string">'BEGIN&#123;FS="[ /]+"&#125;/eth0$/&#123;print $3&#125;'</span>)</span><br><span class="line">eth1=$(ip a|awk <span class="string">'BEGIN&#123;FS="[ /]+"&#125;/eth1$/&#123;print $3&#125;'</span>)</span><br><span class="line">net_IP=$(curl -s ifconfig.me)  <span class="comment"># 或者 curl icanhazip.com</span></span><br><span class="line">VMW=$(hostnamectl | awk <span class="string">'/Virtuali/&#123;print $NF&#125;'</span>)</span><br><span class="line">version=$(awk <span class="string">'&#123;print $1,$(NF-1)&#125;'</span> /etc/redhat-release)</span><br><span class="line">disk=$(df|awk <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>)</span><br><span class="line">mem=<span class="string">"<span class="variable">$(free|awk 'NR==2&#123;print $3/$2*100&#125;')</span>%"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"内网IP为：<span class="variable">$&#123;eth0&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"外网IP为：<span class="variable">$&#123;eth1&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"公网IP为：<span class="variable">$&#123;net_IP&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"虚拟平台为：<span class="variable">$&#123;VMW&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"操作系统为：<span class="variable">$&#123;version&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"磁盘使用率为：<span class="variable">$&#123;disk&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"内存使用率为：<span class="variable">$&#123;mem&#125;</span>"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh os.sh </span></span><br><span class="line">内网IP为：10.0.1.41</span><br><span class="line">外网IP为：172.16.1.41</span><br><span class="line">公网IP为：113.88.12.225</span><br><span class="line">虚拟平台为：vmware</span><br><span class="line">操作系统为：CentOS 7.4.1708</span><br><span class="line">磁盘使用率为：4%</span><br><span class="line">内存使用率为：10.2867%</span><br></pre></td></tr></table></figure><p><strong>4.反向破解 RANDOM 0-32767</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></pre></td><td class="code"><pre><span class="line">案例:反向破解 RANDOM 0-32767</span><br><span class="line">d2c74151</span><br><span class="line">a9982990</span><br><span class="line">4462a9fd</span><br><span class="line">b195fe48</span><br><span class="line">5e77d38</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># cat RANDOM.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> &#123;0..32767&#125;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   num1=`<span class="built_in">echo</span> <span class="variable">$i</span>|md5sum|cut -c1-8`</span><br><span class="line">   [ <span class="variable">$num1</span> = <span class="string">"d2c74151"</span> -o <span class="variable">$num1</span> = <span class="string">"a9982990"</span> -o <span class="variable">$num1</span> = <span class="string">"4462a9fd"</span> -o <span class="variable">$num1</span> = <span class="string">"b195fe48"</span> ];</span><br><span class="line">   [ $? = 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span> is <span class="variable">$i</span>"</span></span><br><span class="line">   num2=`<span class="built_in">echo</span> <span class="variable">$i</span>|md5sum|cut -c1-7`</span><br><span class="line">   [ <span class="variable">$num2</span> = <span class="string">"5e77d38"</span> ];[ $? = 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"<span class="variable">$num2</span> is <span class="variable">$i</span>"</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh RANDOM.sh </span></span><br><span class="line">4462a9fd is 2458</span><br><span class="line">5e77d38 is 2945</span><br><span class="line">d2c74151 is 6420</span><br><span class="line">a9982990 is 13008</span><br><span class="line">b195fe48 is 29193</span><br></pre></td></tr></table></figure><p><strong>5.使用if分支 来比较两个数字的大小</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat count.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input two number: "</span> num1 num2</span><br><span class="line"><span class="keyword">if</span> [[ ! <span class="string">"<span class="variable">$num1</span>"</span> =~ ^[0-9]+$ || ! <span class="string">"<span class="variable">$num2</span>"</span> =~ ^[0-9]+$ ]]</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请输入正确的整数"</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$num1</span> -gt <span class="variable">$num2</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>&gt;<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$num1</span> -lt <span class="variable">$num2</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>&lt;<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>=<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh count.sh </span></span><br><span class="line">please input two number: 10 20</span><br><span class="line">10&lt;20</span><br></pre></td></tr></table></figure><p><strong>6.随机生成一个随机数1-100 判断生成的随机数和输入的随机数是否相等,如果相等则退出,大了提示大了,小则提示小了,总共猜了多少次</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat 1_100.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">ran=`<span class="built_in">echo</span> $((RANDOM%100+1))`</span><br><span class="line">&gt; ran.txt</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"请回车开始系统自动猜: "</span> re</span><br><span class="line">i=1</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$re</span> <span class="keyword">in</span></span><br><span class="line">y)</span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">ra=`<span class="built_in">echo</span> $((RANDOM%100+1))`</span><br><span class="line"><span class="keyword">if</span> [ `grep -w <span class="variable">$ra</span> ran.txt|wc -l` -eq 1  ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">continue</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$ra</span> -gt <span class="variable">$ran</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"系统猜的数字为 <span class="variable">$ra</span> 猜大了"</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="variable">$ra</span> &gt;&gt; ran.txt</span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$ra</span> -lt <span class="variable">$ran</span> ];<span class="keyword">then</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"系统猜的数字为 <span class="variable">$ra</span> 猜小了"</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="variable">$ra</span> &gt;&gt; ran.txt</span><br><span class="line"><span class="keyword">else</span> </span><br><span class="line"><span class="built_in">echo</span> <span class="string">"系统猜对了数字为<span class="variable">$ra</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"总共猜了 <span class="variable">$i</span> 次"</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="built_in">let</span> i++</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">echo</span> hehe</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p><strong>7.按照系统版本号的不同 更改默认YUM源</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat yum.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">. /etc/init.d/<span class="built_in">functions</span></span><br><span class="line">os=`cat /etc/redhat-release |awk <span class="string">'&#123;print $4&#125;'</span>`</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">"<span class="variable">$os</span>"</span> = <span class="string">"(Final)"</span> ]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">os=`cat /etc/redhat-release|awk <span class="string">'&#123;print $3&#125;'</span>`</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">ping -c 1 -W1 www.baidu.com &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">if</span> [ $? -ne 0 ];<span class="keyword">then</span></span><br><span class="line">systemctl restart network</span><br><span class="line">action <span class="string">"请检查网络"</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$&#123;os%%.*&#125;</span> -eq 7 ];<span class="keyword">then</span></span><br><span class="line">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">   action <span class="string">"yum源已更新完成......."</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   action <span class="string">"yum源更新失败,请检查.."</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$&#123;os%%.*&#125;</span> -eq 6 ];<span class="keyword">then</span></span><br><span class="line">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo &amp;&gt;/dev/null</span><br><span class="line">        <span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">   action <span class="string">"yum源已更新完成......."</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   action <span class="string">"yum源更新失败,请检查.."</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请检查你的版本号"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh yum.sh </span></span><br><span class="line">yum源已更新完成.......                                     [  OK  ]</span><br></pre></td></tr></table></figure><p><strong>8.nginx启动脚本</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat nginx_start.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">[ -f /etc/init.d/<span class="built_in">functions</span> ] &amp;&amp; . /etc/init.d/<span class="built_in">functions</span></span><br><span class="line">te=<span class="variable">$1</span></span><br><span class="line"><span class="function"><span class="title">test</span></span>()&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">action <span class="string">"Nginx <span class="variable">$te</span> is"</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">action <span class="string">"Nginx <span class="variable">$te</span> is"</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$1</span> <span class="keyword">in</span> </span><br><span class="line">  start)</span><br><span class="line">/usr/sbin/nginx</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">  stop)</span><br><span class="line">/usr/sbin/nginx -s stop</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line"> restart)</span><br><span class="line">/usr/sbin/nginx -s stop</span><br><span class="line">sleep 1</span><br><span class="line">/usr/sbin/nginx</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">reload)</span><br><span class="line">/usr/sbin/nginx -s reload</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">status)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"WEB端口号: `netstat -tnulp|grep master|grep '\&lt;tcp\&gt;'|awk '&#123;print <span class="variable">$4</span>&#125;'`"</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"WEB-PID: `ps axu|grep [n]ginx|grep master|awk '&#123;print <span class="variable">$2</span>&#125;'`"</span></span><br><span class="line">;;</span><br><span class="line">     *)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"Usage: <span class="variable">$0</span> &#123;start|stop|status|restart|reload&#125;"</span></span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p><strong>9.生活案例: 吃饭</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat eat.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">cat&lt;&lt;EOF</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><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">EOF</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"想吃什么，请按回车键 :"</span> </span><br><span class="line">ran=`<span class="built_in">echo</span> $((RANDOM%9+1))`</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$ran</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"皇萌鸡"</span></span><br><span class="line">;;</span><br><span class="line">2)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"酸笋鱼"</span></span><br><span class="line">;;</span><br><span class="line">3)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"瓦香鸡"</span></span><br><span class="line">;;</span><br><span class="line">4)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"炒菜"</span></span><br><span class="line">;;</span><br><span class="line">5)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"酸辣粉"</span></span><br><span class="line">;;</span><br><span class="line">6)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"炒粉"</span></span><br><span class="line">;;</span><br><span class="line">7)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"面"</span></span><br><span class="line">;;</span><br><span class="line">8)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"饺子"</span></span><br><span class="line">;;</span><br><span class="line">9)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"不吃"</span></span><br><span class="line">;;</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p><strong>10.脚本批量创建10个用户，密码统一为123，需要对用户输入是否为数字和输入的名字是否为空做判断</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat useradd.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"请输入用户名的前缀: "</span> prefix</span><br><span class="line">[ -z <span class="variable">$prefix</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"请输入前缀"</span> &amp;&amp; <span class="built_in">exit</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"请输入要创建多少个用户: "</span> num</span><br><span class="line">expr 1 + <span class="variable">$num</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -ne 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"请输入整数"</span> &amp;&amp; <span class="built_in">exit</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `seq <span class="variable">$num</span>`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$prefix</span><span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"你确定要创建以上用户吗?[y|yse|Y|YES|n|N|NO]"</span> re</span><br><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> `seq <span class="variable">$num</span>`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">user=<span class="variable">$prefix</span><span class="variable">$n</span></span><br><span class="line"><span class="keyword">case</span> <span class="variable">$re</span> <span class="keyword">in</span></span><br><span class="line">   y|yes|Y|YES)</span><br><span class="line">  id <span class="variable">$user</span> &amp;&gt;/dev/null</span><br><span class="line"> <span class="keyword">if</span> [ $? -ne 0 ];<span class="keyword">then</span></span><br><span class="line">mm=`mkpasswd -l 8`</span><br><span class="line"> useradd <span class="variable">$user</span>  &amp;&amp; <span class="built_in">echo</span> <span class="variable">$mm</span>|passwd --stdin <span class="variable">$user</span> &amp;&gt;/dev/null</span><br><span class="line"> [ $? -eq 0 ]  </span><br><span class="line"><span class="comment">#echo -e "$user\t$mm" &gt;&gt; /tmp/useradd.txt</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"用户: <span class="variable">$user</span>\t创建成功\t密码是：<span class="variable">$mm</span>"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"用户已存在"</span></span><br><span class="line"><span class="built_in">continue</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">;;</span><br><span class="line">n|N|no|NO)</span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"不创建则退出"</span></span><br><span class="line"> <span class="built_in">exit</span></span><br><span class="line"> ;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"你确定要创建以上用户吗?[y|yse|Y|YES|n|N|NO]"</span> re</span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>11.简单jumpserver脚本</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat jum.sh </span></span><br><span class="line"><span class="comment">#/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">menu</span></span>()&#123;</span><br><span class="line">cat&lt;&lt;EOF </span><br><span class="line">1)WEB01=10.0.1.7</span><br><span class="line">2)WEB02=10.0.1.8</span><br><span class="line">3)MySQL=10.0.1.51</span><br><span class="line">4)NFS=10.0.1.31</span><br><span class="line">5)BACKUP=10.0.1.41</span><br><span class="line">6)<span class="built_in">help</span></span><br><span class="line">EOF</span><br><span class="line">&#125;</span><br><span class="line">menu</span><br><span class="line"><span class="built_in">trap</span> <span class="string">"echo 不要乱输入,小心爆炸"</span> INT HUP TSTP</span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"请输入需要连接的服务器: "</span> num</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$num</span> <span class="keyword">in</span></span><br><span class="line">        1)</span><br><span class="line">         ssh 10.0.1.7</span><br><span class="line">        ;;</span><br><span class="line">        2)</span><br><span class="line">        ssh 10.0.1.8</span><br><span class="line">        ;;</span><br><span class="line">        3)</span><br><span class="line">        ssh 10.0.1.51</span><br><span class="line">        ;;</span><br><span class="line">        4)</span><br><span class="line">        ssh 10.0.1.31</span><br><span class="line">        ;;</span><br><span class="line">        5)</span><br><span class="line">        ssh 10.0.1.41</span><br><span class="line">        ;;</span><br><span class="line">        6|h)</span><br><span class="line">        clear</span><br><span class="line">        menu</span><br><span class="line">        ;;</span><br><span class="line">        woshiyunwei)</span><br><span class="line">        <span class="built_in">exit</span></span><br><span class="line">        ;;</span><br><span class="line">        *)</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"请输入正确信息！"</span></span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>12.取10位随机小写字母</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat az.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">randstr</span></span>() &#123;</span><br><span class="line">  index=0</span><br><span class="line">  str=<span class="string">""</span></span><br><span class="line">  <span class="keyword">for</span> i <span class="keyword">in</span> &#123;a..z&#125;; <span class="keyword">do</span> arr[index]=<span class="variable">$i</span>; index=`expr <span class="variable">$&#123;index&#125;</span> + 1`; <span class="keyword">done</span></span><br><span class="line">  <span class="keyword">for</span> i <span class="keyword">in</span> &#123;1..10&#125;; <span class="keyword">do</span> str=<span class="string">"<span class="variable">$str</span><span class="variable">$&#123;arr[$RANDOM%$index]&#125;</span>"</span>; <span class="keyword">done</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="variable">$str</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">echo</span> `randstr`</span><br></pre></td></tr></table></figure><p><strong>13.Ping10.0.1.0/24网段那些能通</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">[root@backup /server/scripts]<span class="comment"># cat ping.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> `seq 254`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   &#123;</span><br><span class="line">   IP=10.0.1.<span class="variable">$i</span></span><br><span class="line">   ping -c 1 -W 1 <span class="variable">$IP</span> &amp;&gt;/dev/null</span><br><span class="line">   <span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">"10.0.1.<span class="variable">$i</span> is OK"</span></span><br><span class="line"><span class="keyword">fi</span> </span><br><span class="line">&#125; &amp;  </span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="built_in">wait</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"在线取IP完成..."</span></span><br></pre></td></tr></table></figure><p><strong>14.输入两个整数计算这两个整数的相加，相减，相乘，相除，求余的结果</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input num1: "</span> num1</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input num2: "</span> num2</span><br><span class="line">expr <span class="variable">$num1</span> + 1 &amp;&gt;/dev/null</span><br><span class="line">RERVAL_A=$?</span><br><span class="line">expr <span class="variable">$num2</span> + 1 &amp;&gt;/dev/null</span><br><span class="line">RERVAL_B=$?</span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$RERVAL_A</span> -ne 0 -o <span class="variable">$RERVAL_B</span> -ne 0 ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请输入整数"</span> </span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"mun1+num2 =<span class="variable">$(( num1 + num2 )</span>)"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"mun1-num2 =<span class="variable">$(( num1 - num2 )</span>)"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"mun1*num2 =<span class="variable">$(( num1 * num2 )</span>)"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"mun1/num2 =<span class="variable">$(( num1 / num2 )</span>)"</span></span><br></pre></td></tr></table></figure><p><strong>15.打印下面这句话中字母数小于5的单词  I am lizhenya teacher I am 18</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> I am lizhenya teacher I am 18</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$&#123;#i&#125;</span> -lt 5 ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>16.写个shell，看看你的linux系统中是否有自定义用户（普通用户），若是有，一共有几个？</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">user=`awk <span class="string">'NR!=1'</span> /etc/passwd|awk -F: <span class="string">'/\/bin\/bash$/&#123;print $1&#125;'</span>`</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$user</span></span><br></pre></td></tr></table></figure><p><strong>17.写一个shell脚本来看看你使用最多的命令是哪些，列出你最常用的命令top10</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="meta">#!/bin/bash</span></span><br><span class="line">HISTFILE=~/.bash_history</span><br><span class="line"><span class="built_in">set</span> -o <span class="built_in">history</span></span><br><span class="line">re=`<span class="built_in">history</span>|awk <span class="string">'&#123;print $2&#125;'</span>|sort|uniq -c|sort -nr|head`</span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"最近使用最多的前个命令10是:\n<span class="variable">$re</span>"</span></span><br></pre></td></tr></table></figure><p><strong>18.编写一个脚本，计算100以内所有能被3整除数字的和</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">sum=0</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> &#123;1..100&#125;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="keyword">if</span> [ $((i % 3)) -eq 0 ];<span class="keyword">then</span></span><br><span class="line">sum=$[<span class="variable">$sum</span>+<span class="variable">$i</span>]</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$sum</span></span><br></pre></td></tr></table></figure><p><strong>19.写一个脚本计算一下Linux系统所有进程占用内存大小的和</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">sum=0</span><br><span class="line"><span class="keyword">for</span> mem <span class="keyword">in</span> `ps aux |awk <span class="string">'&#123;print $6&#125;'</span> |grep -v <span class="string">'RSS'</span>`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">sum=$[<span class="variable">$sum</span>+<span class="variable">$mem</span>]</span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"The total memory is <span class="variable">$sum</span>."</span></span><br></pre></td></tr></table></figure><p><strong>20.打印一个菜单如下，然后用循环加case语句输出用户输入菜单选项的结果</strong><br>h 显示命令帮助<br>f 显示登陆信息<br>d 显示磁盘挂载<br>m 查看内存使用<br>u 查看系统负载<br>q 退出程序</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="meta">#!/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">nume</span></span>()&#123;</span><br><span class="line">cat&lt;&lt;EOF</span><br><span class="line">h 显示命令帮助    </span><br><span class="line">f 显示登陆信息 </span><br><span class="line">d 显示磁盘挂载 </span><br><span class="line">m 查看内存使用 </span><br><span class="line">u 查看系统负载 </span><br><span class="line">q 退出程序</span><br><span class="line">EOF</span><br><span class="line">&#125;</span><br><span class="line">nume</span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">read</span> -p “please input num”num</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$num</span> <span class="keyword">in</span></span><br><span class="line">h)</span><br><span class="line">man</span><br><span class="line">;;</span><br><span class="line">f)</span><br><span class="line">who</span><br><span class="line">;;</span><br><span class="line">d)</span><br><span class="line">df -h</span><br><span class="line">;;</span><br><span class="line">m)</span><br><span class="line">free -h</span><br><span class="line">;;</span><br><span class="line">u)</span><br><span class="line">w</span><br><span class="line">;;</span><br><span class="line">q)</span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">echo</span> “请输入正确编号 ”</span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>21.写一个数组脚本统计/var/log/nginx.log里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><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">awk ‘&#123;<span class="built_in">print</span> <span class="variable">$1</span>&#125; /var/<span class="built_in">log</span>/nginx.log &gt;ip.txt</span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">declare</span> -A array</span><br><span class="line"><span class="keyword">while</span> <span class="built_in">read</span> line</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">let</span> array[<span class="variable">$line</span>]++</span><br><span class="line"><span class="keyword">done</span>&lt;ip.txt</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$&#123;!array[*]&#125;</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">echo</span> “nginx 的<span class="variable">$i</span> 访问次数为 <span class="variable">$i</span>|sort -nr|wc -l”</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>22.统计下面这句话中字母数不大于6的单词（至少两种方式）</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></pre></td><td class="code"><pre><span class="line">1.echo “I am oldboy teacher welcome to oldboy training class”|xargs -n1|awk ‘<span class="keyword">if</span>(length&lt;7)&#123;<span class="built_in">print</span>&#125;’</span><br><span class="line">2.<span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> I am oldboy teacher welcome to oldboy training class</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$&#123;#i&#125;</span> -le 6 ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p><strong>23.使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat oldboy.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">dir=/oldboy</span><br><span class="line">[ ! -d <span class="variable">$dir</span> ] &amp;&amp; mkdir <span class="variable">$dir</span></span><br><span class="line"><span class="keyword">for</span> n <span class="keyword">in</span> `seq 10`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="function"><span class="title">randstr</span></span>() &#123;</span><br><span class="line">index=0</span><br><span class="line">str=<span class="string">""</span></span><br><span class="line">  <span class="keyword">for</span> i <span class="keyword">in</span> &#123;a..z&#125;; <span class="keyword">do</span> arr[index]=<span class="variable">$i</span>; index=`expr <span class="variable">$&#123;index&#125;</span> + 1`; <span class="keyword">done</span></span><br><span class="line">  <span class="keyword">for</span> i <span class="keyword">in</span> &#123;1..10&#125;; <span class="keyword">do</span> str=<span class="string">"<span class="variable">$str</span><span class="variable">$&#123;arr[$RANDOM%$index]&#125;</span>"</span>; <span class="keyword">done</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="variable">$str</span></span><br><span class="line">&#125;</span><br><span class="line">touch <span class="variable">$dir</span>/`randstr`_oldboy.html</span><br><span class="line"><span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> `randstr`_oldboy.html create successful</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Shell编程" scheme="http://linuxwf.com/categories/Shell%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="shell" scheme="http://linuxwf.com/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>3.if语句和case语句</title>
    <link href="http://linuxwf.com/2020/04/15/3-if%E8%AF%AD%E5%8F%A5%E5%92%8Ccase%E8%AF%AD%E5%8F%A5/"/>
    <id>http://linuxwf.com/2020/04/15/3-if%E8%AF%AD%E5%8F%A5%E5%92%8Ccase%E8%AF%AD%E5%8F%A5/</id>
    <published>2020-04-15T03:34:00.000Z</published>
    <updated>2020-04-15T03:35:30.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>[TOC]</p><h1 id="第3课-if语句和case语句"><a href="#第3课-if语句和case语句" class="headerlink" title="第3课 if语句和case语句"></a>第3课 if语句和case语句</h1><h2 id="第1章-if条件语句"><a href="#第1章-if条件语句" class="headerlink" title="第1章 if条件语句"></a>第1章 if条件语句</h2><h3 id="1-1-单分支结构"><a href="#1-1-单分支结构" class="headerlink" title="1.1 单分支结构"></a>1.1 单分支结构</h3><p>第一种语法：</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="keyword">if</span> &lt;条件表达式&gt;</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>第二种语法：</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> &lt;条件表达式&gt;; <span class="keyword">then</span></span><br><span class="line">   指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>嵌套语法：</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> &lt;条件表达式&gt;</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     <span class="keyword">if</span> &lt;条件表达式&gt;</span><br><span class="line">       <span class="keyword">then</span></span><br><span class="line">         指令 </span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="1-2-双分支结构"><a href="#1-2-双分支结构" class="headerlink" title="1.2 双分支结构"></a>1.2 双分支结构</h3><p>如果…那么…，否则…</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> &lt;条件表达式&gt;</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令1</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">     指令2</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ -f <span class="string">"<span class="variable">$file</span>"</span>]</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     <span class="built_in">echo</span> 1</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">     <span class="built_in">echo</span> 2</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="1-3-多分支结构"><a href="#1-3-多分支结构" class="headerlink" title="1.3 多分支结构"></a>1.3 多分支结构</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"><span class="keyword">if</span> &lt;条件表达式&gt;</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令1</span><br><span class="line"><span class="keyword">elif</span> &lt;条件表达式&gt;</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令2</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">     指令3</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>注意：</p><p>1）多分支elif，每个elif后都有then</p><p>2）最后结尾的else后面不带then</p><h2 id="第2章-if语句的多种条件表达式语法"><a href="#第2章-if语句的多种条件表达式语法" class="headerlink" title="第2章 if语句的多种条件表达式语法"></a>第2章 if语句的多种条件表达式语法</h2><h3 id="2-1-test-条件表达式"><a href="#2-1-test-条件表达式" class="headerlink" title="2.1 test 条件表达式"></a>2.1 test 条件表达式</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="built_in">test</span> 表达式</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="2-2-条件表达式"><a href="#2-2-条件表达式" class="headerlink" title="2.2 [] 条件表达式"></a>2.2 [] 条件表达式</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ 字符串或算术表达式 ]</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="2-3-条件表达式"><a href="#2-3-条件表达式" class="headerlink" title="2.3 [[]] 条件表达式"></a>2.3 [[]] 条件表达式</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ 字符串表达式 ]</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="2-4-条件表达式"><a href="#2-4-条件表达式" class="headerlink" title="2.4 (()) 条件表达式"></a>2.4 (()) 条件表达式</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (( 算术表达式 ))</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="2-5-命令表达式"><a href="#2-5-命令表达式" class="headerlink" title="2.5 命令表达式"></a>2.5 命令表达式</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> 命令</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     指令</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="2-6-案例"><a href="#2-6-案例" class="headerlink" title="2.6 案例"></a>2.6 案例</h3><p>案例1 使用if分支 来比较两个数字的大小</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">[root@backup /server/scripts]<span class="comment"># cat count.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input two number: "</span> num1 num2</span><br><span class="line"><span class="keyword">if</span> [[ ! <span class="string">"<span class="variable">$num1</span>"</span> =~ ^[0-9]+$ || ! <span class="string">"<span class="variable">$num2</span>"</span> =~ ^[0-9]+$ ]]</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请输入正确的整数"</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$num1</span> -gt <span class="variable">$num2</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>&gt;<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$num1</span> -lt <span class="variable">$num2</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>&lt;<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span>=<span class="variable">$num2</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh count.sh </span></span><br><span class="line">please input two number: 10 20</span><br><span class="line">10&lt;20</span><br></pre></td></tr></table></figure><p>案例2 随机生成一个随机数1-100 判断生成的随机数和输入的随机数是否相等,如果相等则退出,大了提示大了,小则提示小了,总共猜了多少次</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"><span class="built_in">echo</span> $((<span class="variable">$RANDOM</span>%100+1))</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># cat ran.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">ran=`<span class="built_in">echo</span> $((RANDOM%100+1))`</span><br><span class="line">i=0</span><br><span class="line"><span class="keyword">while</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"><span class="built_in">let</span> i++</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"请输入你猜的数字[1-100]: "</span> num</span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$num</span> -gt <span class="variable">$ran</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"你猜的数字大了"</span></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$num</span> -lt <span class="variable">$ran</span> ];<span class="keyword">then</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"你猜的数字小了"</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"恭喜你猜对了"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"总共猜了<span class="variable">$&#123;i&#125;</span>次"</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p>案例3: 按照系统版本号的不同 更改默认YUM源</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat yum.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">. /etc/init.d/<span class="built_in">functions</span></span><br><span class="line">os=`cat /etc/redhat-release |awk <span class="string">'&#123;print $4&#125;'</span>`</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">"<span class="variable">$os</span>"</span> = <span class="string">"(Final)"</span> ]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">os=`cat /etc/redhat-release|awk <span class="string">'&#123;print $3&#125;'</span>`</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">ping -c 1 -W1 www.baidu.com &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">if</span> [ $? -ne 0 ];<span class="keyword">then</span></span><br><span class="line">systemctl restart network</span><br><span class="line">action <span class="string">"请检查网络"</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$&#123;os%%.*&#125;</span> -eq 7 ];<span class="keyword">then</span></span><br><span class="line">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &amp;&gt;/dev/null</span><br><span class="line"><span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">   action <span class="string">"yum源已更新完成......."</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   action <span class="string">"yum源更新失败,请检查.."</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">elif</span> [ <span class="variable">$&#123;os%%.*&#125;</span> -eq 6 ];<span class="keyword">then</span></span><br><span class="line">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup</span><br><span class="line">wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo &amp;&gt;/dev/null</span><br><span class="line">        <span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">   action <span class="string">"yum源已更新完成......."</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">   action <span class="string">"yum源更新失败,请检查.."</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请检查你的版本号"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh yum.sh </span></span><br><span class="line">yum源已更新完成.......                                     [  OK  ]</span><br></pre></td></tr></table></figure><h2 id="第3章-比较大小案例"><a href="#第3章-比较大小案例" class="headerlink" title="第3章 比较大小案例"></a>第3章 比较大小案例</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="keyword">if</span> [ <span class="variable">$#</span> -ne 2 ];<span class="keyword">then</span>              <span class="comment">#判断传参个数</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"USAGE:<span class="variable">$0</span> arg1 arg2"</span>      <span class="comment">#传参个数不符合要求，则打印提示后退出</span></span><br><span class="line">   <span class="built_in">exit</span> 2</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">expr <span class="variable">$a</span> + 1 &amp;&gt;/dev/null           <span class="comment">#判断变量a是否为整数</span></span><br><span class="line">RETVAL1=$?                        <span class="comment">#获取expr命令返回值并赋值给RETVAL1</span></span><br><span class="line">expr <span class="variable">$b</span> + 1 &amp;&gt;/dev/null           <span class="comment">#判断变量b是否为整数</span></span><br><span class="line">RETVAL2=$?                        <span class="comment">#获取expr命令返回值并赋值给RETVAL2</span></span><br><span class="line"><span class="keyword">if</span> [ RETVAL1 -ne 0 -a RETVAL2 -ne 0 ];<span class="keyword">then</span>  <span class="comment">#判断前后均为整数</span></span><br><span class="line">   <span class="built_in">echo</span> <span class="string">"please input two int again"</span></span><br><span class="line">   <span class="built_in">exit</span> 3</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h2 id="第4章-菜单的使用"><a href="#第4章-菜单的使用" class="headerlink" title="第4章 菜单的使用"></a>第4章 菜单的使用</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\t\t\t1 PHP5.5"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\t\t\t2 PHP5.7"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\t\t\t3 PHP7.1"</span></span><br><span class="line"><span class="built_in">echo</span> -e <span class="string">"\t\t\t4 PHP7.2"</span></span><br><span class="line">cat&lt;&lt;EOF</span><br><span class="line">* * * * * * * * * * * * *</span><br><span class="line">*1. MySQL*</span><br><span class="line">*2. redis*</span><br><span class="line">*3. PHP*</span><br><span class="line">*4. iptables*</span><br><span class="line">*5. zabbix       *</span><br><span class="line">* * * * * * * * * * * * *</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h2 id="第5章-Shell函数"><a href="#第5章-Shell函数" class="headerlink" title="第5章 Shell函数"></a>第5章 Shell函数</h2><h3 id="5-1-函数介绍"><a href="#5-1-函数介绍" class="headerlink" title="5.1 函数介绍"></a>5.1 函数介绍</h3><p>使用shell函数的优势：</p><p>1.把相同的程序段定义为函数，可减少整个程序的代码量，提示开发效率</p><p>2.增加程序的可读性、易读性，提升管理效率</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="keyword">function</span> 函数名()&#123;</span><br><span class="line">    指令</span><br><span class="line">    <span class="built_in">return</span> n</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>shell函数的执行</p><p>1.执行shell函数时，函数名前的function 和函数后的小括号都不带</p><p>2.函数的定义必须要在执行的程序前加定义或加载</p><p>3.shell执行系统中各种程序的执行顺序，系统别名-函数-系统命令-可执行文件</p><p>4.函数执行时，会调用他的脚本公用变量，也可以为函数设置局部变量及特殊位置参数</p><p>5.在shell函数中，return 命令和exit相似，return的作用时退出函数，二exit时推出脚本</p><p>6.return语句会返回一个退出值给调用函数的房钱程序，而exit会返回一个退出值给当前shell</p><p>7.如果要将函数存放在独立的文件中，被脚本加载使用时，需要使用source 或 “.”</p><p>8.在函数中一般使用local定义局部变量 ，这些变量离开函数后会消失</p><h3 id="5-2-函数实践"><a href="#5-2-函数实践" class="headerlink" title="5.2 函数实践"></a>5.2 函数实践</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"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#定义两个函数，名字为oldboy和oldgirl</span></span><br><span class="line"><span class="function"><span class="title">oldboy</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"I am oldboy"</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">oldgirl</span></span>()&#123;</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"I am oldgirl"</span></span><br><span class="line">&#125;</span><br><span class="line">oldboy   <span class="comment">#调用函数</span></span><br><span class="line">oldgirl  <span class="comment">#调用函数</span></span><br></pre></td></tr></table></figure><h2 id="第6章-case条件语句"><a href="#第6章-case条件语句" class="headerlink" title="第6章 case条件语句"></a>第6章 case条件语句</h2><p>case语法</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> 变量 <span class="keyword">in</span></span><br><span class="line">变量内容1)</span><br><span class="line">命令组</span><br><span class="line">;;</span><br><span class="line">变量内容2)</span><br><span class="line">命令组</span><br><span class="line">;;</span><br><span class="line">变量内容3)</span><br><span class="line">命令组</span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"请输入正确的变量"</span></span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><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">[root@backup /server/scripts]<span class="comment"># cat case.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input [shell|MySQL|kvm]: "</span> name</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$name</span> <span class="keyword">in</span></span><br><span class="line">shell)</span><br><span class="line">     <span class="built_in">echo</span> <span class="string">"shell...."</span></span><br><span class="line">             ;;</span><br><span class="line">MySQL)</span><br><span class="line">     <span class="built_in">echo</span> <span class="string">"mysql hehe ......"</span></span><br><span class="line">             ;;</span><br><span class="line">kvm)</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"kvm hehe ......"</span></span><br><span class="line">    ;;</span><br><span class="line">*)</span><br><span class="line">           <span class="built_in">echo</span> <span class="string">"请输入正确参数： "</span></span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p>case案例: 使用case开发一个启动脚本</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat nginx_start.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">[ -f /etc/init.d/<span class="built_in">functions</span> ] &amp;&amp; . /etc/init.d/<span class="built_in">functions</span></span><br><span class="line">te=<span class="variable">$1</span></span><br><span class="line"><span class="function"><span class="title">test</span></span>()&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">action <span class="string">"Nginx <span class="variable">$te</span> is"</span> /bin/<span class="literal">true</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">action <span class="string">"Nginx <span class="variable">$te</span> is"</span> /bin/<span class="literal">false</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$1</span> <span class="keyword">in</span> </span><br><span class="line">  start)</span><br><span class="line">/usr/sbin/nginx</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">  stop)</span><br><span class="line">/usr/sbin/nginx -s stop</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line"> restart)</span><br><span class="line">/usr/sbin/nginx -s stop</span><br><span class="line">sleep 1</span><br><span class="line">/usr/sbin/nginx</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">reload)</span><br><span class="line">/usr/sbin/nginx -s reload</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">;;</span><br><span class="line">status)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"WEB端口号: `netstat -tnulp|grep master|grep '\&lt;tcp\&gt;'|awk '&#123;print <span class="variable">$4</span>&#125;'`"</span></span><br><span class="line">        <span class="built_in">echo</span> <span class="string">"WEB-PID: `ps axu|grep [n]ginx|grep master|awk '&#123;print <span class="variable">$2</span>&#125;'`"</span></span><br><span class="line">;;</span><br><span class="line">     *)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"Usage: <span class="variable">$0</span> &#123;start|stop|status|restart|reload&#125;"</span></span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p>生活案例: 吃饭</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat eat.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">cat&lt;&lt;EOF</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><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">EOF</span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"想吃什么，请按回车键 :"</span> </span><br><span class="line">ran=`<span class="built_in">echo</span> $((RANDOM%9+1))`</span><br><span class="line"><span class="keyword">case</span> <span class="variable">$ran</span> <span class="keyword">in</span></span><br><span class="line">1)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"皇萌鸡"</span></span><br><span class="line">;;</span><br><span class="line">2)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"酸笋鱼"</span></span><br><span class="line">;;</span><br><span class="line">3)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"瓦香鸡"</span></span><br><span class="line">;;</span><br><span class="line">4)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"炒菜"</span></span><br><span class="line">;;</span><br><span class="line">5)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"酸辣粉"</span></span><br><span class="line">;;</span><br><span class="line">6)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"炒粉"</span></span><br><span class="line">;;</span><br><span class="line">7)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"面"</span></span><br><span class="line">;;</span><br><span class="line">8)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"饺子"</span></span><br><span class="line">;;</span><br><span class="line">9)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"不吃"</span></span><br><span class="line">;;</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Shell编程" scheme="http://linuxwf.com/categories/Shell%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="shell" scheme="http://linuxwf.com/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>2.Shell脚本的条件测试与比较</title>
    <link href="http://linuxwf.com/2020/04/15/2-Shell%E8%84%9A%E6%9C%AC%E7%9A%84%E6%9D%A1%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%AF%94%E8%BE%83/"/>
    <id>http://linuxwf.com/2020/04/15/2-Shell%E8%84%9A%E6%9C%AC%E7%9A%84%E6%9D%A1%E4%BB%B6%E6%B5%8B%E8%AF%95%E4%B8%8E%E6%AF%94%E8%BE%83/</id>
    <published>2020-04-15T03:17:00.000Z</published>
    <updated>2020-04-15T03:18:04.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Shell条件表达式与整数比较"><a href="#Shell条件表达式与整数比较" class="headerlink" title="Shell条件表达式与整数比较"></a>Shell条件表达式与整数比较</h1><h2 id="第1章-常用的条件表达式"><a href="#第1章-常用的条件表达式" class="headerlink" title="第1章 常用的条件表达式"></a>第1章 常用的条件表达式</h2><table><thead><tr><th>语法</th><th>意义</th></tr></thead><tbody><tr><td>test -f  file</td><td>表示如果file文件存在，则为真（0），否则为假（非0）</td></tr><tr><td>test -z</td><td>表示如果字符串长度是为0，则表达式成立</td></tr><tr><td>[ -e file ]</td><td>文件存在则为真</td></tr><tr><td>[ -f file ]</td><td>是否存在并且为普通文件</td></tr><tr><td>[ -d file ]</td><td>是否为目录</td></tr><tr><td>[ -r file ]</td><td>是否可读</td></tr><tr><td>[ -w file ]</td><td>是否可写</td></tr><tr><td>[ -x file ]</td><td>是否可执行</td></tr></tbody></table><h3 id="1-1-test"><a href="#1-1-test" class="headerlink" title="1.1 test"></a>1.1 test</h3><figure class="highlight bash"><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"><span class="comment">#如果file文件存在，则输出true,否则则输出false</span></span><br><span class="line"><span class="built_in">test</span> -f file &amp;&amp; <span class="built_in">echo</span> <span class="literal">true</span> || <span class="built_in">echo</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>用test -z 来测试字符段长度是否为0</p><figure class="highlight bash"><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">[root@backup ~]<span class="comment"># test -z "oldboy" &amp;&amp; echo 1||echo 0</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="1-2"><a href="#1-2" class="headerlink" title="1.2 []"></a>1.2 []</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># [ -e /etc ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -e /etc/hosts ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -e /etcccc ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -f /etcccc ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -f /etc ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -f /etc/passwd ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件存在</span><br></pre></td></tr></table></figure><p>案例:</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"><span class="comment"># [ -f /etc/init.d/functions ] &amp;&amp; source /etc/init.d/functions</span></span><br></pre></td></tr></table></figure><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">[root@backup ~]<span class="comment"># [ -d /etc/passwd ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -d /etc/ ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ ! -d /etc/ ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -d /etc/ ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ -d /etcc ] &amp;&amp; echo "文件存在"||echo "文件不存在"</span></span><br><span class="line">文件不存在</span><br><span class="line">[root@backup ~]<span class="comment"># [ ! -d /etccc ] &amp;&amp; mkdir /etccc</span></span><br><span class="line">[root@backup ~]<span class="comment"># [ -x /etc/shadow ] &amp;&amp; echo "可读" || echo "不可读"</span></span><br><span class="line">不可读</span><br></pre></td></tr></table></figure><p>案例: 如果目录不存在则创建</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># [ -d /etcc ] || mkdir /etcc</span></span><br><span class="line">[root@backup ~]<span class="comment"># ll /etcc</span></span><br><span class="line">total 0</span><br></pre></td></tr></table></figure><h3 id="1-3-正则"><a href="#1-3-正则" class="headerlink" title="1.3 [[]] 正则"></a>1.3 [[]] 正则</h3><p>[[]]与[]的区别：</p><p>[[]]中可以使用通配符进行匹配</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"><span class="comment"># [[ -f /tmp/oldboy.txt ]] &amp;&amp; echo 1 || echo 0</span></span><br></pre></td></tr></table></figure><h2 id="第2章-数值表达式"><a href="#第2章-数值表达式" class="headerlink" title="第2章 数值表达式"></a>第2章 数值表达式</h2><h3 id="整数比较"><a href="#整数比较" class="headerlink" title="整数比较"></a>整数比较</h3><p>[ 整数1 比较符 整数2 ]</p><table><thead><tr><th>在[]以及test 中使用的比较符号</th><th>在(())和[[]] 中使用的比较符号</th><th>说明</th></tr></thead><tbody><tr><td>-eq</td><td>== 或 =</td><td>等于</td></tr><tr><td>-ne</td><td>!=</td><td>不等于</td></tr><tr><td>-gt</td><td>&gt;</td><td>大于</td></tr><tr><td>-ge</td><td>&gt;=</td><td>大于等于</td></tr><tr><td>-lt</td><td>&lt;</td><td>小于</td></tr><tr><td>-le</td><td>&lt;=</td><td>小于等于</td></tr></tbody></table><h3 id="2-1"><a href="#2-1" class="headerlink" title="2.1 []"></a>2.1 []</h3><p>具体实例：</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># [ 10 -eq 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 10 -gt 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">不成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 10 -ge 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 10 -le 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -le 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">不成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -ne 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -gt 10 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -gt 100 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">不成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -lt 100 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br><span class="line">[root@backup ~]<span class="comment"># [ 11 -ne 100 ] &amp;&amp; echo "成立" || echo "不成立"</span></span><br><span class="line">成立</span><br></pre></td></tr></table></figure><h3 id="2-2"><a href="#2-2" class="headerlink" title="2.2 (())  [[]]"></a>2.2 (())  [[]]</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></pre></td><td class="code"><pre><span class="line">=或==</span><br><span class="line">&gt;</span><br><span class="line">&gt;=</span><br><span class="line">&lt;</span><br><span class="line">&lt;=</span><br><span class="line">1=</span><br></pre></td></tr></table></figure><p>案例: 统计磁盘使用率 如果磁盘使用率大于 5% 则发邮件报警 当前使用率为?  小于5% 则提示磁盘使用正常 当前使用率为?</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat disk.sh </span></span><br><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">usedisk=`df -h|awk <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>`</span><br><span class="line">[ <span class="variable">$&#123;usedisk%\%&#125;</span> -gt 80 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"send mail 当前使用为<span class="variable">$usedisk</span>"</span> || <span class="built_in">echo</span> <span class="string">"磁盘使用正常,当前使用率为<span class="variable">$usedisk</span>"</span></span><br><span class="line">[ `df -h|awk -F <span class="string">"[ %]+"</span> <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>` -gt 5 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"send mail"</span> || <span class="built_in">echo</span> <span class="string">"磁盘使用正常"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh disk.sh </span></span><br><span class="line">磁盘使用正常,当前使用率为4%</span><br><span class="line">磁盘使用正常</span><br></pre></td></tr></table></figure><p>案例2: 统计内存使用率 如果大于5% 发邮件 小于5 提示正常</p><ol><li>如何查看使用率 并取出数值  计算百分比  使用/总的*100</li><li>如何做比较 [ ]</li><li>如何输出内容</li><li>测试</li></ol><figure class="highlight bash"><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">[root@backup /server/scripts]<span class="comment"># [ `free|awk 'NR==2&#123;print $3/$2*100&#125;'|awk -F. '&#123;print $1&#125;'` -gt 11 ] &amp;&amp; echo "send mail"|| echo ok</span></span><br><span class="line">ok</span><br></pre></td></tr></table></figure><p>案例3: 统计系统负载 负载超过2则发邮件 小于1则正常</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">ab -n 500000 -c 20000 http://127.0.0.1/index.html</span><br><span class="line">加大文件描述符</span><br><span class="line"><span class="built_in">echo</span> <span class="string">'*                -       nofile          65535'</span>&gt;&gt;/etc/security/limits.conf</span><br><span class="line">重新打开窗口</span><br></pre></td></tr></table></figure><p>案例4：使用脚本 统计系统的 主机名 IP地址 虚拟平台 版本号 磁盘使用率 内存使用率 外网IP地址</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">[root@backup /server/scripts]<span class="comment"># cat os.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">eth0=$(ip a|awk <span class="string">'BEGIN&#123;FS="[ /]+"&#125;/eth0$/&#123;print $3&#125;'</span>)</span><br><span class="line">eth1=$(ip a|awk <span class="string">'BEGIN&#123;FS="[ /]+"&#125;/eth1$/&#123;print $3&#125;'</span>)</span><br><span class="line">net_IP=$(curl -s ifconfig.me)  <span class="comment"># 或者 curl icanhazip.com</span></span><br><span class="line">VMW=$(hostnamectl | awk <span class="string">'/Virtuali/&#123;print $NF&#125;'</span>)</span><br><span class="line">version=$(awk <span class="string">'&#123;print $1,$(NF-1)&#125;'</span> /etc/redhat-release)</span><br><span class="line">disk=$(df|awk <span class="string">'NR==2&#123;print $(NF-1)&#125;'</span>)</span><br><span class="line">mem=<span class="string">"<span class="variable">$(free|awk 'NR==2&#123;print $3/$2*100&#125;')</span>%"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"内网IP为：<span class="variable">$&#123;eth0&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"外网IP为：<span class="variable">$&#123;eth1&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"公网IP为：<span class="variable">$&#123;net_IP&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"虚拟平台为：<span class="variable">$&#123;VMW&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"操作系统为：<span class="variable">$&#123;version&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"磁盘使用率为：<span class="variable">$&#123;disk&#125;</span>"</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"内存使用率为：<span class="variable">$&#123;mem&#125;</span>"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh os.sh </span></span><br><span class="line">内网IP为：10.0.1.41</span><br><span class="line">外网IP为：172.16.1.41</span><br><span class="line">公网IP为：113.88.12.225</span><br><span class="line">虚拟平台为：vmware</span><br><span class="line">操作系统为：CentOS 7.4.1708</span><br><span class="line">磁盘使用率为：4%</span><br><span class="line">内存使用率为：10.2867%</span><br></pre></td></tr></table></figure><h2 id="第3章-多整数比较"><a href="#第3章-多整数比较" class="headerlink" title="第3章 多整数比较"></a>第3章 多整数比较</h2><table><thead><tr><th>在[] 和 test 中使用的符号</th><th>在[[]] 和 (()) 中使用的符号</th><th>说明</th></tr></thead><tbody><tr><td>-a</td><td>&amp;&amp;</td><td>and 与，两端都为真，则结果为真</td></tr><tr><td>-o</td><td>||</td><td>or 或，两端有一个为真，则为真</td></tr><tr><td>!</td><td>!</td><td>not 非，两端相反为真，则结果为真</td></tr></tbody></table><figure class="highlight bash"><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">[ 整数1 比较符 整数2 -o 整数3 比较符 整数4 ]</span><br><span class="line">[ 整数1 比较符 整数2 -a 整数3 比较符 整数4 ]</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># [ 10 -eq 10 -o 100 -ne 100 ]</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@backup ~]<span class="comment"># [ 10 -eq 10 -a 100 -ne 100 ]</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">1</span><br></pre></td></tr></table></figure><p>案例:反向破解 RANDOM 0-32767</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></pre></td><td class="code"><pre><span class="line">案例:反向破解 RANDOM 0-32767</span><br><span class="line">d2c74151</span><br><span class="line">a9982990</span><br><span class="line">4462a9fd</span><br><span class="line">b195fe48</span><br><span class="line">5e77d38</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># cat RANDOM.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> &#123;0..32767&#125;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   num1=`<span class="built_in">echo</span> <span class="variable">$i</span>|md5sum|cut -c1-8`</span><br><span class="line">   [ <span class="variable">$num1</span> = <span class="string">"d2c74151"</span> -o <span class="variable">$num1</span> = <span class="string">"a9982990"</span> -o <span class="variable">$num1</span> = <span class="string">"4462a9fd"</span> -o <span class="variable">$num1</span> = <span class="string">"b195fe48"</span> ];</span><br><span class="line">   [ $? = 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"<span class="variable">$num1</span> is <span class="variable">$i</span>"</span></span><br><span class="line">   num2=`<span class="built_in">echo</span> <span class="variable">$i</span>|md5sum|cut -c1-7`</span><br><span class="line">   [ <span class="variable">$num2</span> = <span class="string">"5e77d38"</span> ];[ $? = 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"<span class="variable">$num2</span> is <span class="variable">$i</span>"</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh RANDOM.sh </span></span><br><span class="line">4462a9fd is 2458</span><br><span class="line">5e77d38 is 2945</span><br><span class="line">d2c74151 is 6420</span><br><span class="line">a9982990 is 13008</span><br><span class="line">b195fe48 is 29193</span><br></pre></td></tr></table></figure><h2 id="第4章-字符串比较"><a href="#第4章-字符串比较" class="headerlink" title="第4章 字符串比较"></a>第4章 字符串比较</h2><p>字符串比较 必须加双引号</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># [ "$USER" = root ]</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>-z  值为0 则为真<br>-n  值不为0 则为真</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">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@backup ~]<span class="comment"># name=alex</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $name</span></span><br><span class="line">alex</span><br><span class="line">[root@backup ~]<span class="comment"># [ -z $name ]</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">1</span><br><span class="line">[root@backup ~]<span class="comment"># [ -n $name ]</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>案例: 判断传参是否为空</p><figure class="highlight plain"><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"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="第5章-正则比对"><a href="#第5章-正则比对" class="headerlink" title="第5章 正则比对"></a>第5章 正则比对</h2><p>正则比对 [[]]<br> 取反 ! 写在表达式的前面</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># [ "$USER" =~ ^r ]</span></span><br><span class="line">-bash: [: =~: binary operator expected</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># [[ "$USER" =~ ^r ]]   #必须[[]]</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># [[ ! "$USER" =~ ^n ]]   #取反卸载最前面</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>判断数字是否为整数</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">[[ <span class="string">"<span class="variable">$num</span>"</span> =~ ^[0-9]+$ ]]</span><br></pre></td></tr></table></figure><p>案例: 使用read 传参方式 传入两个数字 做比较 大了则提示大了 小了则提示小了 等于则等于=<br>    禁止使用if</p><figure class="highlight plain"><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"></span><br><span class="line"></span><br></pre></td></tr></table></figure><pre><code></code></pre>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Shell编程" scheme="http://linuxwf.com/categories/Shell%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="shell" scheme="http://linuxwf.com/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>1.shell编程介绍及变量</title>
    <link href="http://linuxwf.com/2020/04/15/1-shell%E7%BC%96%E7%A8%8B%E4%BB%8B%E7%BB%8D%E5%8F%8A%E5%8F%98%E9%87%8F/"/>
    <id>http://linuxwf.com/2020/04/15/1-shell%E7%BC%96%E7%A8%8B%E4%BB%8B%E7%BB%8D%E5%8F%8A%E5%8F%98%E9%87%8F/</id>
    <published>2020-04-15T03:13:00.000Z</published>
    <updated>2020-04-15T03:14:33.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="shell编程介绍及变量"><a href="#shell编程介绍及变量" class="headerlink" title="shell编程介绍及变量"></a>shell编程介绍及变量</h1><h2 id="第1章-如何学好shell编程"><a href="#第1章-如何学好shell编程" class="headerlink" title="第1章 如何学好shell编程"></a>第1章 如何学好shell编程</h2><h3 id="1-1-为什么学习shell编程"><a href="#1-1-为什么学习shell编程" class="headerlink" title="1.1 为什么学习shell编程"></a>1.1 为什么学习shell编程</h3><p> shell编程在工作中做什么?</p><p>shell脚本语言是实现Linux系统管理及自动化运维必须的重要工具。</p><ol><li><p>安装操作系统(手动安全ISO) 自动化安装(kickstart cobbler)shell脚本</p></li><li><p>初始化操作系统 优化(SSH优化 关闭SElinux 优化防火墙 c6.x iptables C7.xfirewalld NTP时间同步    更改默认YUM源 字符集 安装常用的软件 lrzsz net-tools tree.. wget 隐藏版本信息 加大文件描述符 内核优化…)<br>初始化写入脚本 自动化执行</p></li><li><p>安装服务(Nginx PHP MySQL MariaDB NFS sersync REDIS keepalived docker….zabbix  shell     脚本自动选择安装)</p></li><li><p>配置文件(优化)</p></li><li><p>启动—-停止(centos6.x /etc/init.d/server start  centos7 systemctl start server) 系统默认的启动方式 shell脚本<br> py写的程序 jumpserver<br> python3.5 test.py 传参 –redis 10.0.0.22 –prot 6379 –IPlog – – –<br> python3.5 test.py -h<br> 放入shell脚本命名  log_count.start<br> 停止py服务          log_count.stop  ps axu|grep test.py|grep -v grep|awk ‘{print $2}’|xargs kill -9</p></li><li><p>监控 zabbix cacti(流程) nagios ELK (公司研发监控平台)<br> 监控的值(shell脚本统计)</p></li><li><p>日志统计 三剑客 日志切割(脚本+定时任务)</p></li></ol><h3 id="1-2-学习shell编程所需基础知识"><a href="#1-2-学习shell编程所需基础知识" class="headerlink" title="1.2 学习shell编程所需基础知识"></a>1.2 学习shell编程所需基础知识</h3><p>学好shell编程并通过shell脚本轻松实现自动化管理企业生产系统必备基础如下：</p><ol><li><p>熟练使用vim编辑器，熟悉SSH终端及“vimrc”等的配置。</p></li><li><p>掌握一定Linux命令基础，至少80个，熟练使用。</p></li><li><p>熟练掌握Linux正则表达式及三剑客（grep、sed、awk）</p></li><li><p>熟悉常见的Linux网络服务器部署、优化、日志分析和排错</p></li></ol><h3 id="1-3-如何才能学好shell"><a href="#1-3-如何才能学好shell" class="headerlink" title="1.3 如何才能学好shell"></a>1.3 如何才能学好shell</h3><ol><li><p>掌握Shell基本语法</p></li><li><p>掌握常见语法  环境变量—数值比较–条件表达式—if判断—for循环–while循环–case语句–函数–数组—条件控制语句 exit continue break</p></li><li><p>修改脚本内容(完善脚本)形成自己的开发风格</p></li><li><p>套用 框架(公司中大部分脚本的写法) 熟能生巧，从简单坐骑，简单判断、简单循环</p></li><li><p>多模仿、多思考</p></li><li><p>学会分析问题，形成编程思维</p></li><li><p>编程名字要规范、采用驼峰语法</p></li><li><p>不要拿来主义，特别是新手</p></li></ol><h2 id="第2章-shell脚本入门"><a href="#第2章-shell脚本入门" class="headerlink" title="第2章 shell脚本入门"></a>第2章 shell脚本入门</h2><h3 id="2-1-什么是shell"><a href="#2-1-什么是shell" class="headerlink" title="2.1 什么是shell?"></a>2.1 什么是shell?</h3><p><code>shell 是一个命令解释器</code></p><p>shell存在于操作系统最外层，负责与用户直接对话，对用户的输入解析给操作系统，并处理各种各样的输出结果，然后输出到屏幕返回给用户。</p><p>面试题: linux下默认的shell是?  bash</p><p>命令解释器 pwd ls</p><p>bash?   当前的命令行 和shell脚本 文本内有可执行命令 bash</p><p>当前的bash 父shell 文本内的命令 子shell</p><p>子shell可继承父shell的变量  父shell无法继续子shell的变量</p><p>交互式shell shll等待输入  输入命令 shell执行并返回结果 交互式</p><p>非交互式  把可执行命令 放入文本中 定时任务执行 称为非交互式</p><h3 id="2-2-什么是shell脚本"><a href="#2-2-什么是shell脚本" class="headerlink" title="2.2 什么是shell脚本"></a>2.2 什么是shell脚本</h3><p>shell脚本：当命令或程序语句不在命令行下执行，而是通过一个程序文件来执行时，该程序被称为shell脚本。</p><p>命令的大礼包  把可执行命令放到文件中 称为shell脚本(判断语句 循环语句 数组….)</p><h3 id="2-3-shell脚本语言的种类"><a href="#2-3-shell脚本语言的种类" class="headerlink" title="2.3 shell脚本语言的种类"></a>2.3 shell脚本语言的种类</h3><p>1.Bourne shell</p><p>2.C shell</p><p>常用的脚本语言：</p><p><code>PHP</code>  <code>Perl</code>  <code>Python</code>   <code>Shell</code></p><p>Shell脚本语言 优势在于处理偏系统底层的业务，如：一键自动化、优化、监控报警、软件启动、日志分析等脚本。shell更符合Linux运维简单、易用、高效的三大基本原则。</p><h3 id="2-4-Shell的书写规范"><a href="#2-4-Shell的书写规范" class="headerlink" title="2.4 Shell的书写规范"></a>2.4 Shell的书写规范</h3><p>1) shell脚本存放统一的目录   /server/scripts</p><p>2) 脚本名字的结尾使用.sh</p><p>3) 脚本的开头 必须有解释器 #!/bin/bash</p><p>4) 脚本内有作者信息 脚本信息</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="comment">#Date: 20111111</span></span><br><span class="line"><span class="comment">#Author: wufei</span></span><br><span class="line"><span class="comment">#Blog:            #博客</span></span><br><span class="line"><span class="comment">#Descriptsion:    #描述</span></span><br><span class="line"><span class="comment">#Version： 1.0    #版本</span></span><br></pre></td></tr></table></figure><p>5) 每段代码块有注释(尽量使用英文)</p><p>6) 标点符号 (语法尽量一次性书写完毕</p><p>7) 成对的符号 一次性书写完毕</p><h3 id="2-5-第1个Shell脚本"><a href="#2-5-第1个Shell脚本" class="headerlink" title="2.5 第1个Shell脚本"></a>2.5 第1个Shell脚本</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat hello.sh </span></span><br><span class="line"><span class="meta">#!bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"hello world!"</span></span><br></pre></td></tr></table></figure><p>执行脚本的三种方法：</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"><span class="comment">#方法1：直接使用解释器执行</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># bash hello.sh </span></span><br><span class="line">hello world!</span><br><span class="line"><span class="comment">#方法2: 全路径方式执行 需要执行权限</span></span><br><span class="line"><span class="comment"># chmod +x hello.sh</span></span><br><span class="line">[root@backup ~]<span class="comment"># . /server/scripts/hello.sh </span></span><br><span class="line">hello world!</span><br><span class="line"><span class="comment">#方法3 source .执行脚本  子shell中的内容调用到父shell中执行</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># source hello.sh </span></span><br><span class="line">hello world!</span><br></pre></td></tr></table></figure><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="keyword">if</span> 条件内容</span><br><span class="line">   <span class="keyword">then</span></span><br><span class="line">     内容</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>一次性完成for循环语句格式</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="keyword">for</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">    内容</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h2 id="第3章-Shell变量"><a href="#第3章-Shell变量" class="headerlink" title="第3章 Shell变量"></a>第3章 Shell变量</h2><h3 id="3-1-什么是变量？"><a href="#3-1-什么是变量？" class="headerlink" title="3.1 什么是变量？"></a>3.1 什么是变量？</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># echo $LANG</span></span><br><span class="line">en_US.UTF-8</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># oldboy="i am oldboy"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $oldboy</span></span><br><span class="line">i am oldboy</span><br></pre></td></tr></table></figure><h3 id="3-2-变量类型："><a href="#3-2-变量类型：" class="headerlink" title="3.2 变量类型："></a>3.2 变量类型：</h3><p>变量可分为两类：环境变量（全局变量）和普通变量（局部变量）</p><p>全局变量(环境变量)   针对系统所有用户生效<br>局部变量(普通变量)   针对当前登录用户生效</p><p>变量生存周期分类 两类<br>临时性  export 声明变量即可 或者 name=oldboy<br>永久性  修改配置文件  /etc/profile</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">环境变量文件执行顺序</span><br><span class="line">1. /etc/profile</span><br><span class="line">2. .bash_profile</span><br><span class="line">3. .bashrc</span><br><span class="line">4. /etc/bashrc</span><br><span class="line">如果按照文件内容的生效顺序</span><br><span class="line">1. /etc/profile</span><br><span class="line">2. .bashrc</span><br><span class="line">3. /etc/bashrc</span><br><span class="line">4. .bash_profile</span><br></pre></td></tr></table></figure><h3 id="3-3-如何定义变量"><a href="#3-3-如何定义变量" class="headerlink" title="3.3 如何定义变量"></a>3.3 如何定义变量</h3><p>要求以字母 数字 和下划线组合  只能以字母和_开头 等号两端不允许有空格 名字 见名直其意</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><br><span class="line">OLDBOY_AGE=18  系统用的变量都是大写</span><br><span class="line">oldboy_age=18  全小写</span><br><span class="line">oldboy_Age=18  小驼峰语法</span><br><span class="line">Oldboy_Age=18  大驼峰语法</span><br></pre></td></tr></table></figure><p>普通变量定义：</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></pre></td><td class="code"><pre><span class="line">变量名=value           <span class="comment">#赋值时不加引号</span></span><br><span class="line">变量名=<span class="string">'value'</span>         <span class="comment">#赋值时加单引号</span></span><br><span class="line">变量名=“value“         <span class="comment">#赋值时加双引号</span></span><br></pre></td></tr></table></figure><p>变量值得定义:</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></pre></td><td class="code"><pre><span class="line">1.数字定义  连续的数字    oldboy=188888</span><br><span class="line">2.字符串定义 连续的字符串 name=<span class="string">"oldboy alex lidao"</span> 不知道加什么就加双引号</span><br><span class="line">  例子: CODE_DIR=/etc/sysconfig/network-scripts/</span><br><span class="line">name=<span class="string">'$oldboy'</span>  所见即所得 不解析变量</span><br><span class="line">[root@backup ~]<span class="comment"># name=oldboy</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo "$name"</span></span><br><span class="line">oldboy</span><br><span class="line">[root@backup ~]<span class="comment"># echo '$name'</span></span><br><span class="line"><span class="variable">$name</span></span><br><span class="line">3.命令的定义</span><br><span class="line">  方法1  time=`date +%F`</span><br><span class="line">  方法2  time=$(date +%F)</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># time=`date +%F-%H-%M-%S`</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $time</span></span><br><span class="line">2019-08-22-22-02-18</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $time   #第二次运行还是一样</span></span><br><span class="line">2019-08-22-22-02-18</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># time=`date +%F-%H-%M-%S`   #重新再次赋值</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $time                 #重新赋值后结果不同</span></span><br><span class="line">2019-08-22-22-02-28</span><br></pre></td></tr></table></figure><h2 id="第4章-特殊的位置参数变量"><a href="#第4章-特殊的位置参数变量" class="headerlink" title="第4章 特殊的位置参数变量"></a>第4章 特殊的位置参数变量</h2><table><thead><tr><th>位置变量</th><th>作用说明</th></tr></thead><tbody><tr><td>$0</td><td>获取当前执行的shell脚本的文件名，如果包含路径，则包括脚本路径</td></tr><tr><td>$n</td><td>获取当前执行脚本的第n个参数值，参数从$1开始 $9 以后需要加{}</td></tr><tr><td>$#</td><td>获取当前执行的脚本后面接的参数的总个数</td></tr><tr><td>$*</td><td>获取当前执行脚本所有传参的参数，不加引号和$@相同</td></tr><tr><td>$@</td><td>获取脚本的所有的参数 不加双引号和$* 相同 加上双引号则把参数视为独立的(在循环体中)</td></tr></tbody></table><h3 id="4-1-设置15个参数，用于传递"><a href="#4-1-设置15个参数，用于传递" class="headerlink" title="4.1 设置15个参数，用于传递"></a>4.1 设置15个参数，用于传递</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat n.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span> <span class="variable">$2</span> <span class="variable">$3</span> <span class="variable">$4</span> <span class="variable">$5</span> <span class="variable">$6</span> <span class="variable">$7</span> <span class="variable">$8</span> <span class="variable">$9</span> <span class="variable">$10</span> <span class="variable">$11</span> <span class="variable">$12</span> <span class="variable">$13</span> <span class="variable">$14</span> <span class="variable">$15</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh &#123;a..z&#125;</span></span><br><span class="line">a b c d e f g h i a0 a1 a2 a3 a4 a5</span><br><span class="line"></span><br><span class="line"><span class="comment">#当位置参数数字&gt;9时，需要用&#123;&#125;将数字括起来，才能正常显示</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># cat n.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span> <span class="variable">$2</span> <span class="variable">$3</span> <span class="variable">$4</span> <span class="variable">$5</span> <span class="variable">$6</span> <span class="variable">$7</span> <span class="variable">$8</span> <span class="variable">$9</span> <span class="variable">$&#123;10&#125;</span> <span class="variable">$&#123;11&#125;</span> <span class="variable">$&#123;12&#125;</span> <span class="variable">$&#123;13&#125;</span> <span class="variable">$&#123;14&#125;</span> <span class="variable">$&#123;15&#125;</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh &#123;a..z&#125;</span></span><br><span class="line">a b c d e f g h i j k l m n o</span><br></pre></td></tr></table></figure><h3 id="4-2-特殊变量-0"><a href="#4-2-特殊变量-0" class="headerlink" title="4.2 特殊变量$0"></a>4.2 特殊变量$0</h3><p>获取脚本名称及路径</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">[root@backup /server/scripts]<span class="comment"># cat n.sh</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$0</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh</span></span><br><span class="line">n.sh</span><br><span class="line">[root@backup ~]<span class="comment"># sh /server/scripts/n.sh </span></span><br><span class="line">/server/scripts/n.sh</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># dirname /server/scripts/n.sh  #dirname只获取路径</span></span><br><span class="line">/server/scripts</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># basename /server/scripts/n.sh </span></span><br><span class="line">n.sh                                                       <span class="comment">#basename只获取脚本名称</span></span><br></pre></td></tr></table></figure><h3 id="4-3-特殊变量"><a href="#4-3-特殊变量" class="headerlink" title="4.3 特殊变量$#"></a>4.3 特殊变量$#</h3><p>通过$#获取脚本传参的总个数</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat n.sh </span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span> <span class="variable">$2</span> <span class="variable">$3</span> <span class="variable">$4</span> <span class="variable">$5</span> <span class="variable">$6</span> <span class="variable">$7</span> <span class="variable">$8</span> <span class="variable">$9</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$#</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh &#123;a..z&#125;</span></span><br><span class="line">a b c d e f g h i</span><br><span class="line">26</span><br></pre></td></tr></table></figure><p>案例一</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># [ $# -eq 2 ] || echo "请重新输入两个参数"</span></span><br><span class="line">请重新输入两个参数</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># [ 3 -ne 2 ] &amp;&amp; echo ok|| echo error</span></span><br><span class="line">ok</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># [ 2 -ne 2 ] &amp;&amp; echo ok|| echo error</span></span><br><span class="line">error</span><br></pre></td></tr></table></figure><p>案例二</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat n.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$#</span> -ne 2 ]</span><br><span class="line">   <span class="keyword">then</span> </span><br><span class="line">    <span class="built_in">echo</span> <span class="string">"USAGE:/bin/bash -bash arg1 arg2"</span></span><br><span class="line">   <span class="built_in">exit</span> 1</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$1</span> <span class="variable">$2</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh </span></span><br><span class="line">USAGE:/bin/bash -bash arg1 arg2</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh n.sh oldboy 123456</span></span><br><span class="line">oldboy 123456</span><br></pre></td></tr></table></figure><h3 id="4-4-特殊变量-和"><a href="#4-4-特殊变量-和" class="headerlink" title="4.4 特殊变量$*和$@"></a>4.4 特殊变量$*和$@</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># set -- "I am" oldboy teacher</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $*</span></span><br><span class="line">I am oldboy teacher</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $@</span></span><br><span class="line">I am oldboy teacher</span><br><span class="line"><span class="comment">#在循环中先对比不带“”时，2者无区别</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># for i in $*;do echo $i;done</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">oldboy</span><br><span class="line">teacher</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># for i in $@;do echo $i;done</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">oldboy</span><br><span class="line">teacher</span><br><span class="line"><span class="comment">#在循环中带“”时，2者的区别</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># for i in "$*";do echo $i;done</span></span><br><span class="line">I am oldboy teacher</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># for i in "$@";do echo $i;done</span></span><br><span class="line">I am</span><br><span class="line">oldboy</span><br><span class="line">teacher</span><br></pre></td></tr></table></figure><h2 id="第5章-特殊的位置状态变量"><a href="#第5章-特殊的位置状态变量" class="headerlink" title="第5章 特殊的位置状态变量"></a>第5章 特殊的位置状态变量</h2><table><thead><tr><th>位置变量</th><th>作用说明</th></tr></thead><tbody><tr><td>$?</td><td>获取上一个指令的执行状态并返回值（0为成功，非0为失败）</td></tr><tr><td>$$</td><td>获取当前执行的shell脚本的进程号（pid），脚本名字相同时使用</td></tr><tr><td>$!</td><td>获取上一个后台工作的进程的进程号（pid） ，调试脚本时使用</td></tr><tr><td>$_</td><td>获取在此之前执行的命令或脚本的最后一个参数 ，相当于ESE.</td></tr></tbody></table><h3 id="5-1-特殊变量-0使用"><a href="#5-1-特殊变量-0使用" class="headerlink" title="5.1 特殊变量$0使用"></a>5.1 特殊变量$0使用</h3><p>判断上一个命令是否执行成功,可用于判断服务是否正确执行或命令是否执行成功</p><p>当备份数据时，可通过$?来判断是否成功，备份数据是否完整</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># pwd</span></span><br><span class="line">/server/scripts</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $?</span></span><br><span class="line">0</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># lll</span></span><br><span class="line">-bash: lll: <span class="built_in">command</span> not found</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $?</span></span><br><span class="line">127</span><br></pre></td></tr></table></figure><h3 id="5-2-特殊变量-使用"><a href="#5-2-特殊变量-使用" class="headerlink" title="5.2 特殊变量$$使用"></a>5.2 特殊变量$$使用</h3><p>获取脚本执行的进程号pid</p><figure class="highlight plain"><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">[root@backup &#x2F;server&#x2F;scripts]# cat test.sh </span><br><span class="line">#!&#x2F;bin&#x2F;bash</span><br><span class="line">echo $$ &gt; &#x2F;tmp&#x2F;test.pid</span><br><span class="line">sleep 300</span><br><span class="line">[root@backup &#x2F;server&#x2F;scripts]# sh test.sh </span><br><span class="line">[root@backup ~]# ps -ef |grep test.sh</span><br><span class="line">root       5641   4909  0 09:51 pts&#x2F;1    00:00:00 sh test.sh</span><br><span class="line">root       5667   5643  0 09:51 pts&#x2F;2    00:00:00 grep --color&#x3D;auto test.sh</span><br><span class="line">[root@backup ~]# cat &#x2F;tmp&#x2F;test.pid </span><br><span class="line">5641</span><br></pre></td></tr></table></figure><h3 id="5-3-特殊变量-使用"><a href="#5-3-特殊变量-使用" class="headerlink" title="5.3 特殊变量$_使用"></a>5.3 特殊变量$_使用</h3><p>获取上一条命令的最后一个参数</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># cd /server/scripts/</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $_</span></span><br><span class="line">/server/scripts/</span><br></pre></td></tr></table></figure><h3 id="5-4-特殊变量-使用"><a href="#5-4-特殊变量-使用" class="headerlink" title="5.4 特殊变量$!使用"></a>5.4 特殊变量$!使用</h3><p>用于获取上一次执行脚本的pid</p><h2 id="第6章-变量传参的三种方法"><a href="#第6章-变量传参的三种方法" class="headerlink" title="第6章 变量传参的三种方法"></a>第6章 变量传参的三种方法</h2><h3 id="6-1-直接传参"><a href="#6-1-直接传参" class="headerlink" title="6.1 直接传参"></a>6.1 直接传参</h3><figure class="highlight bash"><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">[root@backup /server/scripts]<span class="comment"># sh n.sh oldboy 123456</span></span><br><span class="line">oldboy 123456</span><br></pre></td></tr></table></figure><h3 id="6-2-赋值传参"><a href="#6-2-赋值传参" class="headerlink" title="6.2 赋值传参"></a>6.2 赋值传参</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat ping.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line">url=<span class="variable">$1</span></span><br><span class="line">ping -c 1  <span class="variable">$url</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -eq 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is ok"</span> || <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is error"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh ping.sh www.qq.com</span></span><br><span class="line">ping www.qq.com is ok</span><br></pre></td></tr></table></figure><h3 id="6-3-read传参"><a href="#6-3-read传参" class="headerlink" title="6.3 read传参"></a>6.3 read传参</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat ping.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#方法3</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input url is: "</span> url</span><br><span class="line">ping -c 1  <span class="variable">$url</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -eq 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is ok"</span> || <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is error"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh ping.sh</span></span><br><span class="line">please input url is: www.qq.com</span><br><span class="line">ping www.qq.com is ok</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh ping.sh </span></span><br><span class="line">please input url is: www.qqq.com</span><br><span class="line">ping www.qqq.com is error</span><br></pre></td></tr></table></figure><h3 id="6-4-案例-使用三种传参方式-做ping-url"><a href="#6-4-案例-使用三种传参方式-做ping-url" class="headerlink" title="6.4 案例 使用三种传参方式 做ping url"></a>6.4 案例 使用三种传参方式 做ping url</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat ping.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#方法1</span></span><br><span class="line">ping -c 1  <span class="variable">$1</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -eq 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$1</span> is ok"</span> || <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$1</span> is error"</span></span><br><span class="line"><span class="comment">#方法2</span></span><br><span class="line">url=<span class="variable">$1</span></span><br><span class="line">ping -c 1  <span class="variable">$url</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -eq 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is ok"</span> || <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is error"</span></span><br><span class="line"><span class="comment">#方法3</span></span><br><span class="line"><span class="built_in">read</span> -p <span class="string">"please input url is: "</span> url</span><br><span class="line">ping -c 1  <span class="variable">$url</span> &amp;&gt;/dev/null</span><br><span class="line">[ $? -eq 0 ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is ok"</span> || <span class="built_in">echo</span> <span class="string">"ping <span class="variable">$url</span> is error"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh ping.sh www.qq.com</span></span><br><span class="line">ping www.qq.com is ok</span><br><span class="line">ping www.qq.com is ok</span><br><span class="line">please input url is: www.qq.com</span><br><span class="line">ping www.qq.com is ok</span><br></pre></td></tr></table></figure><h3 id="第7章-变量的子串-常用"><a href="#第7章-变量的子串-常用" class="headerlink" title="第7章 变量的子串(常用)"></a>第7章 变量的子串(常用)</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># test="I am oldboy"</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $test</span></span><br><span class="line">I am oldboy</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;#test&#125;   #变量前加#可以打印变量的长度</span></span><br><span class="line">11</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $test|wc -L  </span></span><br><span class="line">11</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># expr length "$test"</span></span><br><span class="line">11</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test&#125;|awk '&#123;print $2&#125;'</span></span><br><span class="line">am</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test&#125;|cut -c3-4</span></span><br><span class="line">am</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test&#125;|grep -o am</span></span><br><span class="line">am</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test:2:2&#125;</span></span><br><span class="line">am</span><br></pre></td></tr></table></figure><p>面试题: 统计字符串长度</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"><span class="comment"># echo $test</span></span><br><span class="line">I am oldboy</span><br><span class="line"><span class="comment"># echo $&#123;#test&#125;   #变量前加#可以打印变量的长度</span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># echo $test|wc -L  </span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># expr length "$test"</span></span><br><span class="line">11</span><br><span class="line"><span class="comment"># echo $test|awk '&#123;print length&#125;'</span></span><br><span class="line">11</span><br></pre></td></tr></table></figure><p>面试题2: 输出字符串长度小于3的单词</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># cat for.sh </span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> I am lizhenya teacher I am 18</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">   [ <span class="variable">$&#123;#i&#125;</span> -lt 3 ] &amp;&amp; <span class="built_in">echo</span> <span class="variable">$i</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sh for.sh </span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "I am lizhenya teacher I am 18"|xargs -n1|awk '&#123;if(length&lt;3)print&#125;'</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "I am lizhenya teacher I am 18"|xargs -n1|awk '&#123;for(i=1;i&lt;=NF;i++)if(length&lt;3)print&#125;'</span></span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">I</span><br><span class="line">am</span><br><span class="line">18</span><br></pre></td></tr></table></figure><p>变量子串的删除和替换</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#截取从第二个字符之后的内容，不包含第二个字符</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $test</span></span><br><span class="line">I am oldboy</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># </span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test:2&#125;</span></span><br><span class="line">am oldboy</span><br><span class="line"><span class="comment">#从第二个字符开始截取之后的二个字符</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;test:2:2&#125;</span></span><br><span class="line">am</span><br></pre></td></tr></table></figure><p>#从前面往后删除 ## 贪婪匹配 </p><p>%从后往前删除 </p><p>// 替换</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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># url=www.baidu.com</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url#*.&#125;    #从.开始删除前面的内容输出</span></span><br><span class="line">baidu.com</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url#*.*.&#125;  #从第二个.开始删除前面的内容输出</span></span><br><span class="line">com</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url##*.&#125;   #贪婪匹配</span></span><br><span class="line">com</span><br><span class="line"></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url%.*&#125;</span></span><br><span class="line">www.baidu</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url%.*.*&#125;</span></span><br><span class="line">www</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url%%.*&#125;   #贪婪匹配</span></span><br><span class="line">www</span><br><span class="line"></span><br><span class="line"><span class="comment">#url// 替换</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $url</span></span><br><span class="line">www.baidu.com</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url/baidu/qq&#125;</span></span><br><span class="line">www.qq.com</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url/w/S&#125;</span></span><br><span class="line">Sww.baidu.com</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $&#123;url//w/S&#125;</span></span><br><span class="line">SSS.baidu.com</span><br></pre></td></tr></table></figure><h2 id="第8章-变量的数值计算"><a href="#第8章-变量的数值计算" class="headerlink" title="第8章 变量的数值计算"></a>第8章 变量的数值计算</h2><p>常见的Shell算术运算符</p><table><thead><tr><th>算术运算符</th><th>意义（*表示常用）</th></tr></thead><tbody><tr><td>+ 、-</td><td>加（或正号）、减（或负号）*</td></tr><tr><td>*、/、%</td><td>乘法、除法、取余  *</td></tr><tr><td>**</td><td>冥运算  *</td></tr><tr><td>++ 、–</td><td>增加、减少，可前置也可放在变量的结尾   *</td></tr><tr><td>！、&amp;&amp;、||</td><td>非（取反）、相当于and 、相当于or   *</td></tr><tr><td>&lt; 、&lt;= 、&gt; 、&gt;=</td><td>比较符号（小于、小于等于、大于、大于等于）</td></tr><tr><td>== 、!= 、=</td><td>比较符号 （相等、不相等、对于字符串=也可表示相当于）*</td></tr><tr><td>&lt;&lt; 、&gt;&gt;</td><td>向左移位、向右移位</td></tr><tr><td>~ 、| 、&amp; 、^</td><td>按位取反、按位异或、按位于、按位或</td></tr><tr><td>= 、+=、-= 、*= 、%=</td><td>赋值运算符，例如 a+=1 相当于 a=a+1 ,  a-=1 相当于 a=a-1    *</td></tr></tbody></table><p>常见的运算命令</p><table><thead><tr><th>运算操作符号与运算命令</th><th>意义</th></tr></thead><tbody><tr><td>(())</td><td>用于整数的运算、效率很高</td></tr><tr><td>let</td><td>用于证书运算，类似于(())</td></tr><tr><td>expr</td><td>可用于整数运算，还有其他功能</td></tr><tr><td>bc</td><td>Linux下的计算程序、可用于整数及小数运算</td></tr><tr><td>$[]</td><td>用于整数运算</td></tr><tr><td>awk</td><td>awk既可用于整数运算，也可用于小数运算</td></tr><tr><td>declare</td><td>定义变量值和属性，-i参数可用于定义整形变量，做运算</td></tr></tbody></table><h3 id="8-1-双小括号-数值运算"><a href="#8-1-双小括号-数值运算" class="headerlink" title="8.1 双小括号(())数值运算"></a>8.1 双小括号(())数值运算</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((6+2))</span></span><br><span class="line">8</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((6-2))</span></span><br><span class="line">4</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((6*2))</span></span><br><span class="line">12</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((6/2))</span></span><br><span class="line">3</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># a=3</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((a=a+1))     #将a赋值给a+1，输出结果</span></span><br><span class="line">4</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((a+=1))      #相当于a=a+1</span></span><br><span class="line">5</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $((a**2))      #计算a的平方</span></span><br><span class="line">25</span><br></pre></td></tr></table></figure><h3 id="8-2-let数值运算"><a href="#8-2-let数值运算" class="headerlink" title="8.2 let数值运算"></a>8.2 let数值运算</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">[root@backup /server/scripts]<span class="comment"># sum=10</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># let sum=sum+1</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $sum</span></span><br><span class="line">11</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sum1=10</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># sum2=20</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># let sum=sum1+sum2</span></span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $sum</span></span><br><span class="line">30</span><br></pre></td></tr></table></figure><h3 id="8-3-expr数值运算"><a href="#8-3-expr数值运算" class="headerlink" title="8.3  expr数值运算"></a>8.3  expr数值运算</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">[root@backup /server/scripts]<span class="comment"># expr 2 + 2</span></span><br><span class="line">4</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># expr 2 - 2</span></span><br><span class="line">0</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># expr 2 * 2</span></span><br><span class="line">expr: syntax error</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># expr 2 \* 2</span></span><br><span class="line">4</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># expr 2 / 2</span></span><br><span class="line">1</span><br></pre></td></tr></table></figure><h3 id="8-4-bc数值运算"><a href="#8-4-bc数值运算" class="headerlink" title="8.4 bc数值运算"></a>8.4 bc数值运算</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># echo 10+10|bc</span></span><br><span class="line">20</span><br><span class="line">[root@backup ~]<span class="comment"># echo 10+10.5|bc</span></span><br><span class="line">20.5</span><br><span class="line">[root@backup ~]<span class="comment"># echo 10*10.5|bc</span></span><br><span class="line">105.0</span><br><span class="line">[root@backup ~]<span class="comment"># echo 10/10.5|bc</span></span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="8-5-数值运算"><a href="#8-5-数值运算" class="headerlink" title="8.5 $[] 数值运算"></a>8.5 $[] 数值运算</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># echo $[10+10]</span></span><br><span class="line">20</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $[10-10]</span></span><br><span class="line">0</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $[10*10]</span></span><br><span class="line">100</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo $[10/10]</span></span><br><span class="line">1</span><br></pre></td></tr></table></figure><h3 id="8-6-awk数值运算"><a href="#8-6-awk数值运算" class="headerlink" title="8.6 awk数值运算"></a>8.6 awk数值运算</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></pre></td><td class="code"><pre><span class="line">[root@backup /server/scripts]<span class="comment"># echo "10 1.5"|awk '&#123;print $1+$2&#125;'</span></span><br><span class="line">11.5</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "10 1.5"|awk '&#123;print $1-$2&#125;'</span></span><br><span class="line">8.5</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "10 1.5"|awk '&#123;print $1*$2&#125;'</span></span><br><span class="line">15</span><br><span class="line">[root@backup /server/scripts]<span class="comment"># echo "10 1.5"|awk '&#123;print $1/$2&#125;'</span></span><br><span class="line">6.66667</span><br></pre></td></tr></table></figure><h3 id="8-7-declare命令的用法"><a href="#8-7-declare命令的用法" class="headerlink" title="8.7 declare命令的用法"></a>8.7 declare命令的用法</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></pre></td><td class="code"><pre><span class="line">[root@backup ~]<span class="comment"># declare -i A=30 B=7</span></span><br><span class="line">[root@backup ~]<span class="comment"># A=A+B</span></span><br><span class="line">[root@backup ~]<span class="comment"># echo $A</span></span><br><span class="line">37</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Shell编程" scheme="http://linuxwf.com/categories/Shell%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="shell" scheme="http://linuxwf.com/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Mongo命令与副本集</title>
    <link href="http://linuxwf.com/2020/04/15/Mongo%E5%91%BD%E4%BB%A4%E4%B8%8E%E5%89%AF%E6%9C%AC%E9%9B%86/"/>
    <id>http://linuxwf.com/2020/04/15/Mongo%E5%91%BD%E4%BB%A4%E4%B8%8E%E5%89%AF%E6%9C%AC%E9%9B%86/</id>
    <published>2020-04-15T03:01:00.000Z</published>
    <updated>2020-04-15T03:08:40.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Mongo进阶"><a href="#Mongo进阶" class="headerlink" title="Mongo进阶"></a>Mongo进阶</h1><h2 id="第1章-Mongo基本操作"><a href="#第1章-Mongo基本操作" class="headerlink" title="第1章 Mongo基本操作"></a>第1章 Mongo基本操作</h2><h3 id="1-1-介绍"><a href="#1-1-介绍" class="headerlink" title="1.1 介绍"></a>1.1 介绍</h3><p>CRUD 操作是create(创建)， read(读取)， update(更新)和delete(删除) 文档。<br>MongoDB 不支持SQL 但是支持自己的丰富的查询语言。<br>在MongoDB 中，存储在集合中的每个文档都需要一个唯一的_id 字段，作为主键。如果插入的文档省略了该_id字段，则MongoDB 驱动程序将自动为该字段生成一个ObjectId_id。也用于通过更新操作插入的文档upsert: true.<br>如果文档包含一个_id 字段，该_id 值在集合中必须是唯一的，以避免重复键错误。<br>在MongoDB 中，插入操作针对单个集合。MongoDB 中的所有写操作都是在单个文档的级别上进行的</p><h3 id="1-2-显示命令"><a href="#1-2-显示命令" class="headerlink" title="1.2 显示命令"></a>1.2 显示命令</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></pre></td><td class="code"><pre><span class="line">Help: 显示帮助。</span><br><span class="line">db.help() 显示数据库方法的帮助。</span><br><span class="line">db.&lt;collection&gt;.<span class="built_in">help</span>() 显示收集方法的帮助， &lt;collection&gt;可以是现有的集合或不存在的集合的名称。</span><br><span class="line">show dbs 打印服务器上所有数据库的列表。</span><br><span class="line">use &lt;db&gt; 将当前数据库切换到&lt;db&gt;。该mongoshell 变量db 被设置为当前数据库。</span><br><span class="line">show collections 打印当前数据库的所有集合的列表</span><br><span class="line">show users 打印当前数据库的用户列表。</span><br><span class="line">show roles 打印用于当前数据库的用户定义和内置的所有角色的列表。</span><br><span class="line">show profile 打印需要1 毫秒或更多的五个最近的操作。有关详细信息，请参阅数据库分析器上的文档。</span><br><span class="line">show databases 打印所有可用数据库的列表。</span><br><span class="line">load() 执行一个JavaScript 文件。</span><br></pre></td></tr></table></figure><h3 id="1-3-MongoDB-CRUD操作"><a href="#1-3-MongoDB-CRUD操作" class="headerlink" title="1.3 MongoDB CRUD操作"></a>1.3 MongoDB CRUD操作</h3><p>官方文档 <a href="https://docs.mongodb.com/manual/crud/" target="_blank" rel="noopener">https://docs.mongodb.com/manual/crud/</a></p><h4 id="1-插入文件"><a href="#1-插入文件" class="headerlink" title="1.插入文件"></a>1.插入文件</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></pre></td><td class="code"><pre><span class="line">db.inventory.insertOne()</span><br><span class="line">db.inventory.insertMany()</span><br><span class="line">db.inventory.find( &#123;&#125; )  ---&gt; 查询</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></pre></td><td class="code"><pre><span class="line">db.inventory.insertOne(</span><br><span class="line">   &#123; item: <span class="string">"canvas"</span>, qty: 100, tags: [<span class="string">"cotton"</span>], size: &#123; h: 28, w: 35.5, uom: <span class="string">"cm"</span> &#125; &#125;</span><br><span class="line">)</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></pre></td><td class="code"><pre><span class="line">db.inventory.insertMany([</span><br><span class="line">   &#123; item: <span class="string">"journal"</span>, qty: 25, tags: [<span class="string">"blank"</span>, <span class="string">"red"</span>], size: &#123; h: 14, w: 21, uom: <span class="string">"cm"</span> &#125; &#125;,</span><br><span class="line">   &#123; item: <span class="string">"mat"</span>, qty: 85, tags: [<span class="string">"gray"</span>], size: &#123; h: 27.9, w: 35.5, uom: <span class="string">"cm"</span> &#125; &#125;,</span><br><span class="line">   &#123; item: <span class="string">"mousepad"</span>, qty: 25, tags: [<span class="string">"gel"</span>, <span class="string">"blue"</span>], size: &#123; h: 19, w: 22.85, uom: <span class="string">"cm"</span> &#125; &#125;</span><br><span class="line">])</span><br></pre></td></tr></table></figure><h4 id="2-查询数据"><a href="#2-查询数据" class="headerlink" title="2.查询数据"></a>2.查询数据</h4><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></pre></td><td class="code"><pre><span class="line">db.inventory.find( &#123;&#125; )</span><br><span class="line">SELECT * FROM inventory   --&gt; MySQL查询</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></pre></td><td class="code"><pre><span class="line">db.inventory.find( &#123; status: <span class="string">"D"</span> &#125; )</span><br><span class="line">SELECT * FROM inventory WHERE status = <span class="string">"D"</span>--&gt; MySQL查询</span><br></pre></td></tr></table></figure><p><strong>指定条件下使用查询运算符</strong></p><p>从inventory 集合中检索status等于”A”或的所有文档”D”</p><figure class="highlight bash"><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">db.inventory.find( &#123; status: &#123; <span class="variable">$in</span>: [ <span class="string">"A"</span>, <span class="string">"D"</span> ] &#125; &#125; )</span><br><span class="line">SELECT * FROM inventory WHERE status <span class="keyword">in</span> (<span class="string">"A"</span>, <span class="string">"D"</span>)--&gt; MySQL查询</span><br></pre></td></tr></table></figure><p><strong>指定AND条件</strong></p><p>检索inventory 集合中status等于”A” 和 qty数量$lt小于30的所有文档</p><figure class="highlight bash"><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">db.inventory.find( &#123; status: <span class="string">"A"</span>, qty: &#123; <span class="variable">$lt</span>: 30 &#125; &#125; )</span><br><span class="line">SELECT * FROM inventory WHERE status = <span class="string">"A"</span> AND qty &lt; 30</span><br></pre></td></tr></table></figure><p><strong>指定OR条件</strong></p><p>检索inventory 集合中status等于”A” 或 qty数量$lt小于30的所有文档</p><figure class="highlight bash"><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">db.inventory.find( &#123; <span class="variable">$or</span>: [ &#123; status: <span class="string">"A"</span> &#125;, &#123; qty: &#123; <span class="variable">$lt</span>: 30 &#125; &#125; ] &#125; )</span><br><span class="line">SELECT * FROM inventory WHERE status = <span class="string">"A"</span> OR qty &lt; 30--&gt; MySQL查询</span><br></pre></td></tr></table></figure><p><strong>指定AND和OR条件</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></pre></td><td class="code"><pre><span class="line">db.inventory.find( &#123;</span><br><span class="line">     status: <span class="string">"A"</span>,</span><br><span class="line">     <span class="variable">$or</span>: [ &#123; qty: &#123; <span class="variable">$lt</span>: 30 &#125; &#125;, &#123; item: /^p/ &#125; ]</span><br><span class="line">&#125; )</span><br><span class="line"></span><br><span class="line">SELECT * FROM inventory WHERE status = <span class="string">"A"</span> AND ( qty &lt; 30 OR item LIKE <span class="string">"p%"</span>)</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></pre></td><td class="code"><pre><span class="line">&gt; show dbs</span><br><span class="line">admin 0.000GB</span><br><span class="line"><span class="built_in">local</span> 0.000GB</span><br><span class="line"><span class="built_in">test</span> 0.000GB</span><br><span class="line">test2 0.000GB</span><br><span class="line">&gt; use <span class="built_in">test</span></span><br><span class="line">switched to db <span class="built_in">test</span></span><br><span class="line">&gt; db</span><br><span class="line"><span class="built_in">test</span></span><br><span class="line">&gt; show collections</span><br><span class="line">inventory</span><br><span class="line"><span class="built_in">test</span></span><br></pre></td></tr></table></figure><h4 id="3-更新数据"><a href="#3-更新数据" class="headerlink" title="3.更新数据"></a>3.更新数据</h4><p>以下集合为例</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></pre></td><td class="code"><pre><span class="line">db.inventory.insertMany( [</span><br><span class="line">   &#123; item: <span class="string">"canvas"</span>, qty: 100, size: &#123; h: 28, w: 35.5, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"journal"</span>, qty: 25, size: &#123; h: 14, w: 21, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"mat"</span>, qty: 85, size: &#123; h: 27.9, w: 35.5, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"mousepad"</span>, qty: 25, size: &#123; h: 19, w: 22.85, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"P"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"notebook"</span>, qty: 50, size: &#123; h: 8.5, w: 11, uom: <span class="string">"in"</span> &#125;, status: <span class="string">"P"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"paper"</span>, qty: 100, size: &#123; h: 8.5, w: 11, uom: <span class="string">"in"</span> &#125;, status: <span class="string">"D"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"planner"</span>, qty: 75, size: &#123; h: 22.85, w: 30, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"D"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"postcard"</span>, qty: 45, size: &#123; h: 10, w: 15.25, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"sketchbook"</span>, qty: 80, size: &#123; h: 14, w: 21, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"sketch pad"</span>, qty: 95, size: &#123; h: 22.85, w: 30.5, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;</span><br><span class="line">] );</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></pre></td><td class="code"><pre><span class="line">db.inventory.updateOne(</span><br><span class="line">   &#123; item: <span class="string">"paper"</span> &#125;,</span><br><span class="line">   &#123;</span><br><span class="line">     <span class="variable">$set</span>: &#123; <span class="string">"size.uom"</span>: <span class="string">"cm"</span>, status: <span class="string">"P"</span> &#125;,</span><br><span class="line">     <span class="variable">$currentDate</span>: &#123; lastModified: <span class="literal">true</span> &#125;</span><br><span class="line">   &#125;</span><br><span class="line">)</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></pre></td><td class="code"><pre><span class="line">db.inventory.updateMany(</span><br><span class="line">   &#123; <span class="string">"qty"</span>: &#123; <span class="variable">$lt</span>: 50 &#125; &#125;,</span><br><span class="line">   &#123;</span><br><span class="line">     <span class="variable">$set</span>: &#123; <span class="string">"size.uom"</span>: <span class="string">"in"</span>, status: <span class="string">"P"</span> &#125;,</span><br><span class="line">     <span class="variable">$currentDate</span>: &#123; lastModified: <span class="literal">true</span> &#125;</span><br><span class="line">   &#125;</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p><strong>更换文件</strong></p><p>下面的示例替换集合中的<em>第一个</em>文档， <code>inventory</code>其中：<code>item: &quot;paper&quot;</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></pre></td><td class="code"><pre><span class="line">db.inventory.replaceOne(</span><br><span class="line">   &#123; item: <span class="string">"paper"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"paper"</span>, instock: [ &#123; warehouse: <span class="string">"A"</span>, qty: 60 &#125;, &#123; warehouse: <span class="string">"B"</span>, qty: 40 &#125; ] &#125;</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h4 id="4-删除文件"><a href="#4-删除文件" class="headerlink" title="4.删除文件"></a>4.删除文件</h4><p>以下集合为例</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">db.inventory.insertMany( [</span><br><span class="line">   &#123; item: <span class="string">"journal"</span>, qty: 25, size: &#123; h: 14, w: 21, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"notebook"</span>, qty: 50, size: &#123; h: 8.5, w: 11, uom: <span class="string">"in"</span> &#125;, status: <span class="string">"P"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"paper"</span>, qty: 100, size: &#123; h: 8.5, w: 11, uom: <span class="string">"in"</span> &#125;, status: <span class="string">"D"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"planner"</span>, qty: 75, size: &#123; h: 22.85, w: 30, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"D"</span> &#125;,</span><br><span class="line">   &#123; item: <span class="string">"postcard"</span>, qty: 45, size: &#123; h: 10, w: 15.25, uom: <span class="string">"cm"</span> &#125;, status: <span class="string">"A"</span> &#125;,</span><br><span class="line">] );</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></pre></td><td class="code"><pre><span class="line">db.inventory.deleteMany(&#123;&#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></pre></td><td class="code"><pre><span class="line">db.inventory.deleteMany(&#123; status : <span class="string">"A"</span> &#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></pre></td><td class="code"><pre><span class="line">db.inventory.deleteOne( &#123; status: <span class="string">"D"</span> &#125; )</span><br></pre></td></tr></table></figure><h3 id="1-4-创建索引"><a href="#1-4-创建索引" class="headerlink" title="1.4 创建索引"></a>1.4 创建索引</h3><p>默认情况下，创建索引将阻止数据库上的所有其他操作。在集合上构建索引时，保存集合的数据库对于读取或写入操作是不可用的，直到索引构建完成。任何需要对所有数据库（例如listDatabases）进行读或写锁定的操作将等待前台索引构建完成。<br>对于可能需要长时间运行的索引创建操作，可以考虑background 选项，这样MongoDB 数据库在索引创建期间仍然是可用的。例如，在people 集合的zipcode 键上创建一个索引，这个过程在后台运行，可以使用如下方式：<br>db.people.createIndex( { zipcode: 1}, {background: true} )<br>默认MongoDB 索引创建的background 是false 。<br>索引优化： db.test.find({“id”:100}).explain()</p><h4 id="1-查看执行计划"><a href="#1-查看执行计划" class="headerlink" title="1.查看执行计划"></a>1.查看执行计划</h4><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">db.test.find(&#123;<span class="string">"age"</span>:&#123; <span class="variable">$lt</span>: 30 &#125;&#125;).explain()</span><br></pre></td></tr></table></figure><h4 id="2-创建索引"><a href="#2-创建索引" class="headerlink" title="2.创建索引"></a>2.创建索引</h4><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">db.test.createIndex( &#123; age: 1 &#125; )</span><br></pre></td></tr></table></figure><h4 id="3-查看索引"><a href="#3-查看索引" class="headerlink" title="3.查看索引"></a>3.查看索引</h4><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">db.test.getIndexes()</span><br></pre></td></tr></table></figure><h4 id="4-再次查看执行计划"><a href="#4-再次查看执行计划" class="headerlink" title="4.再次查看执行计划"></a>4.再次查看执行计划</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></pre></td><td class="code"><pre><span class="line">关键词</span><br><span class="line"><span class="string">"stage"</span> : <span class="string">"IXSCAN"</span></span><br><span class="line"><span class="string">"indexName"</span> : <span class="string">"age_1"</span></span><br></pre></td></tr></table></figure><h2 id="第2章-工具介绍"><a href="#第2章-工具介绍" class="headerlink" title="第2章 工具介绍"></a>第2章 工具介绍</h2><p>官网地址</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">https://docs.mongodb.com/manual/reference/program/</span><br></pre></td></tr></table></figure><p>MongoDB软件包中的核心组件是：mongod核心数据库进程；mongos分片集群的控制器和查询路由器; 以及 mongo交互式MongoDB Shell。</p><h3 id="2-1-mongod"><a href="#2-1-mongod" class="headerlink" title="2.1 mongod"></a>2.1 mongod</h3><figure class="highlight bash"><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">Mongod 是Mongodb 系统的主要守护进程，它处理数据请求，管理数据访问，并执行后台</span><br><span class="line">管理操作。启动进程指定配置文件，控制数据库的行为</span><br></pre></td></tr></table></figure><h3 id="2-2-mongos"><a href="#2-2-mongos" class="headerlink" title="2.2 mongos"></a>2.2 mongos</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></pre></td><td class="code"><pre><span class="line">mongos 对于“ MongoDB Shard”，是用于处理来自应用层的查询的MongoDB 分片配置的路由服务，并确</span><br><span class="line">定此数据在分片集群中的位置， 以完成这些操作。从应用程序的角度来看，一个mongos 实例与任何其他</span><br><span class="line">MongoDB 实例的行为相同</span><br></pre></td></tr></table></figure><h3 id="2-3-Mongostat"><a href="#2-3-Mongostat" class="headerlink" title="2.3 Mongostat"></a>2.3 Mongostat</h3><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">Mongostat 实用程序可以快速概览当前正在运行的mongod 或mongos 实例的状态。mongostat 在功能上类似于UNIX / Linux 文件系统实用程序vmstat，但提供有关的数据mongod 和mongos 实例</span><br></pre></td></tr></table></figure><h3 id="2-4-Mongotop"><a href="#2-4-Mongotop" class="headerlink" title="2.4 Mongotop"></a>2.4 Mongotop</h3><figure class="highlight bash"><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">Mongotop 提供了一种跟踪MongoDB 实例读取和写入数据的时间量的方法。mongotop 提供每个收集级别</span><br><span class="line">的统计信息。默认情况下，mongotop 每秒返回一次值</span><br></pre></td></tr></table></figure><h3 id="2-5-Mongooplog"><a href="#2-5-Mongooplog" class="headerlink" title="2.5 Mongooplog"></a>2.5 Mongooplog</h3><figure class="highlight bash"><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">Mongooplog 是一个简单的工具，可以从远程服务器的复制oplog 轮询操作，并将其应用于本地服务器。此功能支持某些类型的实时迁移，这些迁移要求源服务器保持联机并在整个迁移过程中运行。通常，此命令将采用以下形式:</span><br><span class="line">mongooplog - from mongodb0.example.net --host mongodb1.example.net</span><br></pre></td></tr></table></figure><h2 id="第3章-授权认证"><a href="#第3章-授权认证" class="headerlink" title="第3章 授权认证"></a>第3章 授权认证</h2><h3 id="3-1-官方网址"><a href="#3-1-官方网址" class="headerlink" title="3.1 官方网址"></a>3.1 官方网址</h3><figure class="highlight bash"><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">https://docs.mongodb.com/manual/reference/configuration-options/<span class="comment">#security-options</span></span><br><span class="line">https://docs.mongodb.com/manual/tutorial/<span class="built_in">enable</span>-authentication/</span><br></pre></td></tr></table></figure><h3 id="3-2-授权介绍"><a href="#3-2-授权介绍" class="headerlink" title="3.2 授权介绍"></a>3.2 授权介绍</h3><figure class="highlight plain"><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><br><span class="line">要添加用户， MongoDB 提供了该db.createUser()方法。添加用户时，您可以为用户分配色以授予权限。</span><br><span class="line">注意：</span><br><span class="line">在数据库中创建的第一个用户应该是具有管理其他用户的权限的用户管理员。</span><br><span class="line">您还可以更新现有用户，例如更改密码并授予或撤销角色。</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">db.auth() 将用户验证到数据库。</span><br><span class="line">db.changeUserPassword() 更改现有用户的密码。</span><br><span class="line">db.createUser() 创建一个新用户。</span><br><span class="line">db.dropUser() 删除单个用户。</span><br><span class="line">db.dropAllUsers() 删除与数据库关联的所有用户。</span><br><span class="line">db.getUser() 返回有关指定用户的信息。</span><br><span class="line">db.getUsers() 返回有关与数据库关联的所有用户的信息。</span><br><span class="line">db.grantRolesToUser() 授予用户角色及其特权。</span><br><span class="line">db.removeUser() 已过时。从数据库中删除用户。</span><br><span class="line">db.revokeRolesFromUser() 从用户中删除角色。</span><br><span class="line">db.updateUser() 更新用户数据。</span><br></pre></td></tr></table></figure><h3 id="3-3-创建用户和角色"><a href="#3-3-创建用户和角色" class="headerlink" title="3.3 创建用户和角色"></a>3.3 创建用户和角色</h3><p>1.创建管理用户</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">mongo db01:27017</span><br><span class="line">use admin </span><br><span class="line">db.createUser(</span><br><span class="line">&#123;</span><br><span class="line">user: <span class="string">"admin"</span>,</span><br><span class="line"><span class="built_in">pwd</span>: <span class="string">"123456"</span>,</span><br><span class="line">roles:[ </span><br><span class="line">&#123; </span><br><span class="line">role: <span class="string">"root"</span>, </span><br><span class="line">db:<span class="string">"admin"</span></span><br><span class="line">&#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>2.查看创建的用户</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">db.getUsers()</span><br></pre></td></tr></table></figure><p>3.配置文件添加权限认证参数</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">security: <span class="comment">#认证</span></span><br><span class="line">authorization: enabled </span><br><span class="line"><span class="comment">#启用或者禁用基于角色的访问控制来管理每个用户对数据库资源和操作的访问</span></span><br><span class="line">enabled 或者 disables</span><br></pre></td></tr></table></figure><p>4.重启mongo</p><figure class="highlight bash"><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">mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown</span><br><span class="line">mongod -f /opt/mongo_27017/conf/mongodb.conf</span><br></pre></td></tr></table></figure><p>5.登录</p><p>配置问权限认证后需要重启节点，再次登陆如果不使用账号密码就查看不了数据</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">mongo db01:27017 -uadmin -p --authenticationDatabase admin</span><br></pre></td></tr></table></figure><p>6.创建其他用户</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></pre></td><td class="code"><pre><span class="line">use <span class="built_in">test</span></span><br><span class="line">db.createUser(</span><br><span class="line">  &#123;</span><br><span class="line">    user: <span class="string">"mysun"</span>,</span><br><span class="line">    <span class="built_in">pwd</span>: <span class="string">"123456"</span>,</span><br><span class="line">    roles: [ &#123; role: <span class="string">"readWrite"</span>, db: <span class="string">"write"</span> &#125;,</span><br><span class="line">             &#123; role: <span class="string">"read"</span>, db: <span class="string">"read"</span> &#125; ]</span><br><span class="line">  &#125;</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>7.创建测试数据</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></pre></td><td class="code"><pre><span class="line">use write</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"yazhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"xiaozhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"xiaozhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>,<span class="string">"sex"</span>:<span class="string">"boy"</span>&#125;)</span><br><span class="line"></span><br><span class="line">use <span class="built_in">read</span></span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"yazhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"xiaozhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"xiaozhang"</span>,<span class="string">"age"</span>:28,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>,<span class="string">"sex"</span>:<span class="string">"boy"</span>&#125;)</span><br></pre></td></tr></table></figure><p>8.退出admin，使用mysun用户登录</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></pre></td><td class="code"><pre><span class="line">mongo db01:27017 -umysun -p --authenticationDatabase <span class="built_in">test</span></span><br><span class="line">use write</span><br><span class="line">db.write.find()</span><br><span class="line">db.write.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br><span class="line"></span><br><span class="line">use <span class="built_in">read</span></span><br><span class="line">db.read.find()</span><br><span class="line">db.read.insert(&#123;<span class="string">"name"</span>:<span class="string">"zhangya"</span>,<span class="string">"age"</span>:27,<span class="string">"ad"</span>:<span class="string">"北京市朝阳区"</span>&#125;)</span><br></pre></td></tr></table></figure><h2 id="第4章-副本集配置"><a href="#第4章-副本集配置" class="headerlink" title="第4章 副本集配置"></a>第4章 副本集配置</h2><h3 id="4-1-官方网站"><a href="#4-1-官方网站" class="headerlink" title="4.1 官方网站"></a>4.1 官方网站</h3><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">https://docs.mongodb.com/manual/replication/</span><br></pre></td></tr></table></figure><p>在MongoDB中复制<br>副本集是一组mongod维护相同数据集的实例。一个副本集包含多个数据承载节点和一个仲裁器节点（可选）。在数据承载节点中，只有一个成员被视为主要节点，而其他节点则被视为次要节点。</p><p>所述主节点接收所有的写操作。副本集只能有一个能够确认与 写入有关的写入的主数据库。尽管在某些情况下，另一个mongod实例可能会暂时认为自己也是主要实例。 [1]主数据库在其操作日志（即oplog）中记录对其数据集的所有更改</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mongodb01.png"  alt=""></p><p>该次级复制初级的OPLOG和应用操作的数据集，使得次级数据集反映了主要的数据集。如果主要节点不可用，则符合条件的次要节点将进行选举以自行选举新的主要节点。</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mongodb02.png"  alt=""></p><p>您可以将一个额外的<a href="https://docs.mongodb.com/manual/reference/program/mongod/#bin.mongod" target="_blank" rel="noopener"><code>mongod</code></a>实例作为<a href="https://docs.mongodb.com/manual/core/replica-set-arbiter/" target="_blank" rel="noopener">仲裁器</a>添加到副本集 。仲裁者不维护数据集。仲裁程序的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。由于仲裁器不存储数据集，因此它是提供副本集仲裁功能且资源成本比具有数据集的功能齐全的副本集成员便宜的好方法。如果您的副本集成员数为偶数，请添加仲裁程序以<a href="https://docs.mongodb.com/manual/reference/command/replSetGetStatus/#replSetGetStatus.majorityVoteCount" target="_blank" rel="noopener"><code>majority</code></a>在主要选举中获得票数。仲裁器不需要专用硬件。</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mongodb03.png"  alt=""></p><p><strong>异步复制</strong></p><p>辅助节点复制主节点的操作日志，并将操作异步应用于其数据集。通过使次要节点的数据集反映主要节点的数据集，即使一个或多个成员失败，副本集也可以继续运行。</p><p><strong>复制延迟和流控制</strong></p><p><a href="https://docs.mongodb.com/manual/reference/glossary/#term-replication-lag" target="_blank" rel="noopener">复制滞后</a>是指将<a href="https://docs.mongodb.com/manual/reference/glossary/#term-primary" target="_blank" rel="noopener">主</a>操作上的写操作复制（即复制）到<a href="https://docs.mongodb.com/manual/reference/glossary/#term-secondary" target="_blank" rel="noopener">辅助</a>上所花费的时间 。可以接受一些小的延迟时间，但是随着复制滞后的增加会出现严重的问题，包括在主数据库上增加缓存压力。</p><p>从MongoDB 4.2开始，管理员可以限制主数据库应用其写入的速率，以将延迟保持在可配置的最大值以下。<a href="https://docs.mongodb.com/manual/reference/command/replSetGetStatus/#replSetGetStatus.optimes.lastCommittedOpTime" target="_blank" rel="noopener"><code>majority committed</code></a><a href="https://docs.mongodb.com/manual/reference/parameters/#param.flowControlTargetLagSeconds" target="_blank" rel="noopener"><code>flowControlTargetLagSeconds</code></a></p><p>默认情况下，流量控制为<a href="https://docs.mongodb.com/manual/reference/parameters/#param.enableFlowControl" target="_blank" rel="noopener"><code>enabled</code></a>。</p><figure class="highlight bash"><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"><span class="comment">#注意</span></span><br><span class="line">为了启用流控制，副本集/分片集群必须具有：featureCompatibilityVersion（FCV） of 4.2并读取关注。也就是说，如果未启用FCV 或禁用了多数读功能，则启用的流控制无效。majority enabled4.2</span><br></pre></td></tr></table></figure><p><strong>自动故障转移</strong></p><p>当主节点与集合中的其他成员的通信<code>electionTimeoutMillis</code>时间超过配置的时间段（默认为10秒）时，合格的辅助节点将要求选举以提名自己为新的主节点。群集尝试完成新主数据库的选择并恢复正常操作。</p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mongodb04.png"  alt=""></p><h3 id="4-2-创建多实例副本集"><a href="#4-2-创建多实例副本集" class="headerlink" title="4.2 创建多实例副本集"></a>4.2 创建多实例副本集</h3><h4 id="1-创建节点目录和数据目录"><a href="#1-创建节点目录和数据目录" class="headerlink" title="1.创建节点目录和数据目录"></a>1.创建节点目录和数据目录</h4><figure class="highlight bash"><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">mkdir -p /opt/mongo_2801&#123;7,8,9&#125;/&#123;conf,logs,pid&#125;</span><br><span class="line">mkdir /data/mongo_2801&#123;7,8,9&#125; -p</span><br></pre></td></tr></table></figure><h4 id="2-创建配置文件"><a href="#2-创建配置文件" class="headerlink" title="2.创建配置文件"></a>2.创建配置文件</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><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">cat &gt;/opt/mongo_28017/conf/mongo_28017.conf &lt;&lt;EOF</span><br><span class="line">systemLog:</span><br><span class="line">  destination: file   </span><br><span class="line">  logAppend: <span class="literal">true</span>  </span><br><span class="line">  path: /opt/mongo_28017/logs/mongodb.log</span><br><span class="line"></span><br><span class="line">storage:</span><br><span class="line">  journal:</span><br><span class="line">    enabled: <span class="literal">true</span></span><br><span class="line">  dbPath: /data/mongo_28017</span><br><span class="line">  directoryPerDB: <span class="literal">true</span></span><br><span class="line">  wiredTiger:</span><br><span class="line">     engineConfig:</span><br><span class="line">        cacheSizeGB: 0.5 </span><br><span class="line">        directoryForIndexes: <span class="literal">true</span></span><br><span class="line">     collectionConfig:</span><br><span class="line">        blockCompressor: zlib</span><br><span class="line">     indexConfig:</span><br><span class="line">        prefixCompression: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">processManagement:</span><br><span class="line">  fork: <span class="literal">true</span></span><br><span class="line">  pidFilePath: /opt/mongo_28017/pid/mongod.pid</span><br><span class="line"></span><br><span class="line">net:</span><br><span class="line">  port: 28017</span><br><span class="line">  bindIp: 127.0.0.1,10.0.1.51</span><br><span class="line"></span><br><span class="line">replication:</span><br><span class="line">   oplogSizeMB: 1024 </span><br><span class="line">   replSetName: dba</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h4 id="3-复制配置文件到其他节点"><a href="#3-复制配置文件到其他节点" class="headerlink" title="3.复制配置文件到其他节点"></a>3.复制配置文件到其他节点</h4><figure class="highlight bash"><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">cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28018/conf/mongo_28018.conf</span><br><span class="line">cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28019/conf/mongo_28019.conf</span><br></pre></td></tr></table></figure><h4 id="4-替换端口号"><a href="#4-替换端口号" class="headerlink" title="4.替换端口号"></a>4.替换端口号</h4><figure class="highlight bash"><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">sed -i <span class="string">'s#28017#28018#g'</span> /opt/mongo_28018/conf/mongo_28018.conf  </span><br><span class="line">sed -i <span class="string">'s#28017#28019#g'</span> /opt/mongo_28019/conf/mongo_28019.conf</span><br></pre></td></tr></table></figure><h4 id="5-启动所有节点"><a href="#5-启动所有节点" class="headerlink" title="5.启动所有节点"></a>5.启动所有节点</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></pre></td><td class="code"><pre><span class="line">mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown</span><br><span class="line">mongod -f /opt/mongo_28017/conf/mongo_28017.conf </span><br><span class="line">mongod -f /opt/mongo_28018/conf/mongo_28018.conf </span><br><span class="line">mongod -f /opt/mongo_28019/conf/mongo_28019.conf</span><br></pre></td></tr></table></figure><h4 id="6-初始化集群"><a href="#6-初始化集群" class="headerlink" title="6.初始化集群"></a>6.初始化集群</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><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">mongo db01:28017</span><br><span class="line">config = &#123;</span><br><span class="line">_id : <span class="string">"dba"</span>, </span><br><span class="line">members : [</span><br><span class="line">&#123;_id : 0, host : <span class="string">"db01:28017"</span>&#125;,</span><br><span class="line">&#123;_id : 1, host : <span class="string">"db01:28018"</span>&#125;,</span><br><span class="line">&#123;_id : 2, host : <span class="string">"db01:28019"</span>&#125;,</span><br><span class="line">] </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rs.initiate(config) </span><br><span class="line"></span><br><span class="line">rs.status()  ---&gt; 查看状态</span><br></pre></td></tr></table></figure><h4 id="7-插入数据"><a href="#7-插入数据" class="headerlink" title="7.插入数据"></a>7.插入数据</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">db.inventory.insertMany( [</span><br><span class="line">    &#123; <span class="string">"item"</span>: <span class="string">"journal"</span>, <span class="string">"qty"</span>: 25, <span class="string">"size"</span>: &#123; <span class="string">"h"</span>: 14, <span class="string">"w"</span>: 21, <span class="string">"uom"</span>: <span class="string">"cm"</span> &#125;, <span class="string">"status"</span>: <span class="string">"A"</span> &#125;,</span><br><span class="line">    &#123; <span class="string">"item"</span>: <span class="string">"notebook"</span>, <span class="string">"qty"</span>: 50, <span class="string">"size"</span>: &#123; <span class="string">"h"</span>: 8.5, <span class="string">"w"</span>: 11, <span class="string">"uom"</span>: <span class="string">"in"</span> &#125;, <span class="string">"status"</span>: <span class="string">"A"</span> &#125;,</span><br><span class="line">    &#123; <span class="string">"item"</span>: <span class="string">"paper"</span>, <span class="string">"qty"</span>: 100, <span class="string">"size"</span>: &#123; <span class="string">"h"</span>: 8.5, <span class="string">"w"</span>: 11, <span class="string">"uom"</span>: <span class="string">"in"</span> &#125;, <span class="string">"status"</span>: <span class="string">"D"</span> &#125;,</span><br><span class="line">    &#123; <span class="string">"item"</span>: <span class="string">"planner"</span>, <span class="string">"qty"</span>: 75, <span class="string">"size"</span>: &#123; <span class="string">"h"</span>: 22.85, <span class="string">"w"</span>: 30, <span class="string">"uom"</span>: <span class="string">"cm"</span> &#125;, <span class="string">"status"</span>: <span class="string">"D"</span> &#125;,</span><br><span class="line">    &#123; <span class="string">"item"</span>: <span class="string">"postcard"</span>, <span class="string">"qty"</span>: 45, <span class="string">"size"</span>: &#123; <span class="string">"h"</span>: 10, <span class="string">"w"</span>: 15.25, <span class="string">"uom"</span>: <span class="string">"cm"</span> &#125;, <span class="string">"status"</span>: <span class="string">"A"</span> &#125;</span><br><span class="line"> ]);</span><br></pre></td></tr></table></figure><h4 id="8-副本节点登录查看数据"><a href="#8-副本节点登录查看数据" class="headerlink" title="8.副本节点登录查看数据"></a>8.副本节点登录查看数据</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">mongo db01:28018</span><br><span class="line">rs.slaveOk();</span><br><span class="line">show dbs </span><br><span class="line">use <span class="built_in">test</span></span><br><span class="line">db.inventory.find()</span><br></pre></td></tr></table></figure><h4 id="9-设置副本可读"><a href="#9-设置副本可读" class="headerlink" title="9.设置副本可读"></a>9.设置副本可读</h4><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"><span class="built_in">echo</span> <span class="string">"rs.slaveOk();"</span> &gt; /root/.mongorc.js</span><br></pre></td></tr></table></figure><h3 id="4-3-副本集权重调整"><a href="#4-3-副本集权重调整" class="headerlink" title="4.3 副本集权重调整"></a>4.3 副本集权重调整</h3><h4 id="1-查看当前副本集配置"><a href="#1-查看当前副本集配置" class="headerlink" title="1.查看当前副本集配置"></a>1.查看当前副本集配置</h4><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">rs.conf()</span><br></pre></td></tr></table></figure><h4 id="2-设置权重"><a href="#2-设置权重" class="headerlink" title="2.设置权重"></a>2.设置权重</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></pre></td><td class="code"><pre><span class="line">config=rs.conf()</span><br><span class="line">config.members[0].priority=100</span><br><span class="line">rs.reconfig(config)</span><br></pre></td></tr></table></figure><h4 id="3-主节点主动降级"><a href="#3-主节点主动降级" class="headerlink" title="3.主节点主动降级"></a>3.主节点主动降级</h4><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">rs.stepDown()</span><br></pre></td></tr></table></figure><h3 id="4-4-增加新节点和删除旧节点"><a href="#4-4-增加新节点和删除旧节点" class="headerlink" title="4.4 增加新节点和删除旧节点"></a>4.4 增加新节点和删除旧节点</h3><h4 id="1-创建新节点并启动"><a href="#1-创建新节点并启动" class="headerlink" title="1.创建新节点并启动"></a>1.创建新节点并启动</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">mkdir /opt/mongo_28010/&#123;conf,logs,pid&#125; -p</span><br><span class="line">mkdir /data/mongo_28010</span><br><span class="line">cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28010/conf/mongo_28010.conf</span><br><span class="line">sed -i <span class="string">'s#28017#28010#g'</span> /opt/mongo_28010/conf/mongo_28010.conf</span><br><span class="line">mongod -f /opt/mongo_28010/conf/mongo_28010.conf</span><br><span class="line">mongo db01:28010</span><br></pre></td></tr></table></figure><h4 id="2-集群添加节点"><a href="#2-集群添加节点" class="headerlink" title="2.集群添加节点"></a>2.集群添加节点</h4><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">rs.add(<span class="string">"db01:28010"</span>)</span><br></pre></td></tr></table></figure><h4 id="3-删除节点"><a href="#3-删除节点" class="headerlink" title="3.删除节点"></a>3.删除节点</h4><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">rs.remove(<span class="string">"db01:28010"</span>)</span><br></pre></td></tr></table></figure><h3 id="4-5-仲裁节点"><a href="#4-5-仲裁节点" class="headerlink" title="4.5 仲裁节点"></a>4.5 仲裁节点</h3><h4 id="1-创建新节点并启动-1"><a href="#1-创建新节点并启动-1" class="headerlink" title="1.创建新节点并启动"></a>1.创建新节点并启动</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">mkdir /opt/mongo_28011/&#123;conf,logs,pid&#125; -p</span><br><span class="line">mkdir /data/mongo_28011</span><br><span class="line">cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28011/conf/mongo_28011.conf</span><br><span class="line">sed -i <span class="string">'s#28017#28011#g'</span> /opt/mongo_28011/conf/mongo_28011.conf</span><br><span class="line">mongod -f /opt/mongo_28011/conf/mongo_28011.conf</span><br><span class="line">mongo db01:28011</span><br></pre></td></tr></table></figure><h4 id="2-将仲裁节点加入集群"><a href="#2-将仲裁节点加入集群" class="headerlink" title="2.将仲裁节点加入集群"></a>2.将仲裁节点加入集群</h4><figure class="highlight bash"><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">mongo db01:28018</span><br><span class="line">rs.addArb(<span class="string">"db01:28011"</span>)</span><br></pre></td></tr></table></figure><h2 id="第5章-mongo备份与恢复"><a href="#第5章-mongo备份与恢复" class="headerlink" title="第5章 mongo备份与恢复"></a>第5章 mongo备份与恢复</h2><h3 id="1-工具介绍"><a href="#1-工具介绍" class="headerlink" title="1.工具介绍"></a>1.工具介绍</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#（1）mongoexport/mongoimport</span></span><br><span class="line">mongoimport提供了一种获取JSON， CSV或TSV中的数据并将其导入mongod 实例的方法。mongoexport提供了一种将数据从mongod实例导出到JSON，CSV或TSV的方法。</span><br><span class="line"></span><br><span class="line"><span class="comment">#注意</span></span><br><span class="line">BSON与其他格式之间的转换缺乏完整的类型保真度。因此，您不能将mongoimport和 mongoexport用于往返导入和导出操作。</span><br><span class="line"><span class="comment">#（2）mongodump/mongorestore</span></span><br><span class="line">mongodump提供了一种 从实例创建BSON转储文件的方法mongod，同时 mongorestore还可以还原这些转储。bsondump将BSON转储文件转换为 JSON</span><br></pre></td></tr></table></figure><h3 id="2-应用场景"><a href="#2-应用场景" class="headerlink" title="2.应用场景"></a>2.应用场景</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></pre></td><td class="code"><pre><span class="line">1.异构平台迁移  mysql &lt;---&gt; mongodb</span><br><span class="line">2.同平台，跨大版本：mongodb 2  ----&gt; mongodb 3</span><br><span class="line">mongoexport/mongoimport:json csv</span><br><span class="line"></span><br><span class="line">日常备份恢复时使用</span><br><span class="line">mongodump/mongorestore</span><br></pre></td></tr></table></figure><h3 id="3-导出工具mongoexport"><a href="#3-导出工具mongoexport" class="headerlink" title="3.导出工具mongoexport"></a>3.导出工具mongoexport</h3><p><strong>单表备份</strong></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">mongoexport --port 27017 -d <span class="built_in">test</span> -c inventory -o /data/inventory.json</span><br></pre></td></tr></table></figure><p><strong>单表备份至csv格式</strong></p><figure class="highlight bash"><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">mongoexport --port 27017 -d <span class="built_in">test</span> -c <span class="built_in">test</span> --<span class="built_in">type</span>=csv -f name,age,ad -o /data/test.csv</span><br><span class="line"><span class="comment">#说明：test目标数据库，第二个test目标集合，test.csv要保存的文件，--type指定导出的格式，默认是json，-f后面是需要导出的字段名称，多个字段名用逗号隔开</span></span><br></pre></td></tr></table></figure><h3 id="4-恢复"><a href="#4-恢复" class="headerlink" title="4.恢复"></a>4.恢复</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></pre></td><td class="code"><pre><span class="line">mongoimport --port 27017 -d <span class="built_in">test</span> -c inventory /data/inventory.json</span><br><span class="line"></span><br><span class="line">mongoimport --port 27017 -d <span class="built_in">test</span> -c <span class="built_in">test</span> --<span class="built_in">type</span>=csv --headerline --file  /data/test.csv</span><br><span class="line"><span class="comment"># 说明：test目标数据库，第二个test目标集合，test.csv要导入的文件，--type指定导出的格式，默认是json，--headerline批明不导入第一行</span></span><br></pre></td></tr></table></figure><h3 id="5-mysql数据迁移到mongo"><a href="#5-mysql数据迁移到mongo" class="headerlink" title="5.mysql数据迁移到mongo"></a>5.mysql数据迁移到mongo</h3><figure class="highlight bash"><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">select * from world.city into outfile <span class="string">'/data/city2.csv'</span> fields terminated by <span class="string">','</span>;</span><br><span class="line">mongoimport --port 27017 -d world -c city --<span class="built_in">type</span>=csv --headerline --file  /data/city2.csv</span><br></pre></td></tr></table></figure><h3 id="6-导出与恢复"><a href="#6-导出与恢复" class="headerlink" title="6.导出与恢复"></a>6.导出与恢复</h3><figure class="highlight bash"><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">mongodump  --port 27017 -o /data/backup</span><br><span class="line">mongorestore --port 27017 -d world  /data/backup/world/ --drop</span><br></pre></td></tr></table></figure><h3 id="7-模拟误删除恢复"><a href="#7-模拟误删除恢复" class="headerlink" title="7.模拟误删除恢复"></a>7.模拟误删除恢复</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></pre></td><td class="code"><pre><span class="line">oplog</span><br><span class="line"></span><br><span class="line">db.oplog.rs.find().pretty()</span><br><span class="line">&#123;</span><br><span class="line"><span class="string">"ts"</span> : Timestamp(1572983861, 1),</span><br><span class="line"><span class="string">"t"</span> : NumberLong(13),</span><br><span class="line"><span class="string">"h"</span> : NumberLong(<span class="string">"4118963721380445998"</span>),</span><br><span class="line"><span class="string">"v"</span> : 2,</span><br><span class="line"><span class="string">"op"</span> : <span class="string">"c"</span>,</span><br><span class="line"><span class="string">"ns"</span> : <span class="string">"wo.<span class="variable">$cmd</span>"</span>,</span><br><span class="line"><span class="string">"ui"</span> : UUID(<span class="string">"cb1848ae-8b34-4c76-b832-158324376723"</span>),</span><br><span class="line"><span class="string">"wall"</span> : ISODate(<span class="string">"2019-11-05T19:57:41.679Z"</span>),</span><br><span class="line"><span class="string">"o"</span> : &#123;</span><br><span class="line"><span class="string">"drop"</span> : <span class="string">"ci"</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">mongorestore --port 28017 --oplogReplay --oplogLimit <span class="string">"1572983861:1"</span> --drop  /data/backup/</span><br></pre></td></tr></table></figure><h3 id="8-Mongodump备份数据"><a href="#8-Mongodump备份数据" class="headerlink" title="8.Mongodump备份数据"></a>8.Mongodump备份数据</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></pre></td><td class="code"><pre><span class="line">mongodump -h dbhost -d dbname -o dbdirectory</span><br><span class="line"></span><br><span class="line"><span class="comment">#说明</span></span><br><span class="line">-h：MongDB所在服务器地址，例如：127.0.0.1，当然也可以指定端口号：127.0.0.1:27017</span><br><span class="line">-d：需要备份的数据库实例，例如：<span class="built_in">test</span></span><br><span class="line">-o：备份的数据存放位置，例如：c:\data\dump，当然该目录需要提前建立，在备份完成后，系统自动在dump目录下建立一个<span class="built_in">test</span>目录，这个目录里面存放该数据库实例的备份数据。</span><br></pre></td></tr></table></figure><h3 id="9-Mongorestore恢复数据"><a href="#9-Mongorestore恢复数据" class="headerlink" title="9.Mongorestore恢复数据"></a>9.Mongorestore恢复数据</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></pre></td><td class="code"><pre><span class="line">mongorestore -h dbhost -d dbname -directoryperdb dbdirectory</span><br><span class="line"></span><br><span class="line"><span class="comment">#说明</span></span><br><span class="line">-h：MongoDB所在服务器地址</span><br><span class="line">-d：需要恢复的数据库实例，例如：<span class="built_in">test</span>，当然这个名称也可以和备份时候的不一样，比如test2</span><br><span class="line">-directoryperdb：备份数据所在位置，例如：c:\data\dump\<span class="built_in">test</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="MongoDB" scheme="http://linuxwf.com/tags/MongoDB/"/>
    
  </entry>
  
  <entry>
    <title>Mongodb介绍安装</title>
    <link href="http://linuxwf.com/2020/04/15/Mongodb%E4%BB%8B%E7%BB%8D%E5%AE%89%E8%A3%85/"/>
    <id>http://linuxwf.com/2020/04/15/Mongodb%E4%BB%8B%E7%BB%8D%E5%AE%89%E8%A3%85/</id>
    <published>2020-04-15T02:56:00.000Z</published>
    <updated>2020-04-15T02:58:08.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="Mongodb介绍安装"><a href="#Mongodb介绍安装" class="headerlink" title="Mongodb介绍安装"></a>Mongodb介绍安装</h1><h2 id="第1章-NoSQL-介绍"><a href="#第1章-NoSQL-介绍" class="headerlink" title="第1章 NoSQL 介绍"></a>第1章 NoSQL 介绍</h2><h3 id="1-1-NoSQL-简介"><a href="#1-1-NoSQL-简介" class="headerlink" title="1.1 NoSQL 简介"></a>1.1 NoSQL 简介</h3><p><code>NoSQL(NoSQL = Not Only SQL )</code>，意即”不仅仅是SQL”。<br>在现代的计算系统上每天网络上都会产生庞大的数据量。<br>这些数据有很大一部分是由关系数据库管理系统（RDMBSs）来处理。1970 年E.F.Codd’s 提出的<br>关系模型的论文“A relational model of data for large shared data banks”，这使得数据建模和应用程序<br>编程更加简单。<br>通过应用实践证明，关系模型是非常适合于客户服务器编程，远远超出预期的利益，今天它是结构化<br>数据存储在网络和商务应用的主导技术。<br>NoSQL 是一项全新的数据库革命性运动，早期就有人提出，发展至2009 年趋势越发高涨。NoSQL<br>的拥护者们提倡运用非关系型的数据存储，相对于铺天盖地的关系型数据库运用，这一概念无疑是一<br>种全新的思维的注入。</p><h3 id="1-2-什么是NoSQL"><a href="#1-2-什么是NoSQL" class="headerlink" title="1.2 什么是NoSQL"></a>1.2 什么是NoSQL</h3><p><code>NoSQL</code>，指的是非关系型的数据库。<code>NoSQL</code> 有时也称作Not Only SQL 的缩写，是对不同于传统的关<br>系型数据库的数据库管理系统的统称。<br>对<code>NoSQL</code>最普遍的解释是”非关联型的”，强调Key-Value Stores 和文档数据库的优点，而不是单<br>纯的反对RDBMS。<br>NoSQL 用于超大规模数据的存储。（例如谷歌或Facebook 每天为他们的用户收集万亿比特的数据）。<br>这些类型的数据存储不需要固定的模式，无需多余操作就可以横向扩展。</p><h3 id="1-3-为什么使用NoSQL"><a href="#1-3-为什么使用NoSQL" class="headerlink" title="1.3 为什么使用NoSQL ?"></a>1.3 为什么使用NoSQL ?</h3><p>今天我们可以通过第三方平台（如：Google,Facebook 等）可以很容易的访问和抓取数据。</p><p>用户的个人信息，社交网络，地理位置，用户生成的数据和用户操作日志已经成倍的增加。我们如果</p><p>要对这些用户数据进行挖掘，那SQL 数据库已经不适合这些应用了, NoSQL 数据库的发展也却能很好</p><p>的处理这些大的数据。</p><h2 id="第2章-MongoDB-简介"><a href="#第2章-MongoDB-简介" class="headerlink" title="第2章 MongoDB 简介"></a>第2章 MongoDB 简介</h2><p><code>Mongodb</code> 由C++语言编写的，是一个基于分布式文件存储的开源数据库系统。，是专为可扩展性，<br>高性能和高可用性而设计的数据库， 是非关系型数据库中功能最丰富，最像关系型数据库的，它支<br>持的数据结构非常散，是类似json 的bjson 格式，因此可以存储比较复杂的数据类型。</p><p><code>MongoDB</code> 的（来自于英文单词“了Humongous”，中文含义为“庞大”）是可以应用于各种规模的<br>企业，各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库，MongoDB 的<br>的数据模式可以随着应用程序的发展而灵活地更新。</p><p><code>MongoDB</code> 以一种叫做BSON（二进制JSON）的存储形式将数据作为文档存储。具有相似结构的文<br>档通常被整理成集合。可以把这些集合看成类似于关系数据库中的表： 文档和行相似， 字段和列相<br>似。</p><h3 id="2-1-MongoDB-数据格式"><a href="#2-1-MongoDB-数据格式" class="headerlink" title="2.1 MongoDB 数据格式"></a>2.1 MongoDB 数据格式</h3><h4 id="2-1-1-JSON"><a href="#2-1-1-JSON" class="headerlink" title="2.1.1 JSON"></a>2.1.1 JSON</h4><p><code>JSON(JavaScript Object Notation)</code> 是一种轻量级的数据交换格式。<code>JSON</code> 采用完全独立于语言的文本格<br>式，但是也使用了类似于C 语言家族的习惯（包括C、C++、C#、Java、JavaScript、Perl、Python<br>等）。这些特性使JSON 成为理想的数据交换语言.易于人阅读和编写，同时也易于机器解析和生成(一<br>般用于提升网络传输速率)。JSON 的官方MIME 类型是application/json,文件扩展名是.json。<br>MongoDB 使用JSON（JavaScript ObjectNotation）文档存储记录。<br>JSON 简单说就是JavaScript 中的对象和数组，通过对象和数组可以表示各种复杂的结构。<br>对象：<br>对象在js 中表示为“{}”括起来的内容，数据结构为{key： value,key： value,…}的键值对的<br>结构，在面向对象的语言中， key 为对象的属性， value 为对应的属性值，所以很容易理解，取值方<br>法为对象.key 获取属性值，这个属性值的类型可以是数字、字符串、数组、对象几种。<br>例如： {“FirstName”:”ke”,”LastName”:”me”,”email”:”hikeme@aa”}<br>取值方式和所有语言中一样,使用key 获取,字段值的类型可以是数字、字符串、数组、对象几种。</p><h4 id="2-1-2-BSON"><a href="#2-1-2-BSON" class="headerlink" title="2.1.2 BSON"></a>2.1.2 BSON</h4><p><code>BSON</code> 是一种类JSON 的一种二进制形式的存储格式，简称Binary JSON，它和JSON 一样，支持内<br>嵌的文档对象和数组对象，但是BSON 有JSON 没有的一些数据类型，如Date 和BinData 类型。<br>它的优点是灵活性高，但它的缺点是空间利用率不是很理想。<br><code>BSON</code> 有三个特点：轻量性、可遍历性、高效性。<br>对JSON 来说，数据存储是无类型的，比如你要修改基本一个值，从9 到10，由于从一个字符变成<br>了两个，所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON，你可以指定这个列为<br>数字列，那么无论数字从9 长到10 还是100，我们都只是在存储数字的那一位上进行修改，不会导<br>致数据总长变大。当然，在MongoDB 中，如果数字从整形增大到长整型，还是会导致数据总长变大<br>的。<br>有时BSON 相对JSON 来说也并没有空间上的优势，比如对{“sex”:1}，在JSON 的存储上1 只使用了一个字节，而如果用BSON，那就是至少4 个字节</p><h3 id="2-2-MongoDB-特点"><a href="#2-2-MongoDB-特点" class="headerlink" title="2.2 MongoDB 特点"></a>2.2 MongoDB 特点</h3><h4 id="高性能："><a href="#高性能：" class="headerlink" title="高性能："></a>高性能：</h4><p><code>Mongodb</code> 提供高性能的数据持久性，尤其是支持嵌入式数据模型减少数据库系统上的I/O<br>操作，索引支持能快的查询，并且可以包括来嵌入式文档和数组中的键</p><h4 id="丰富的语言查询："><a href="#丰富的语言查询：" class="headerlink" title="丰富的语言查询："></a>丰富的语言查询：</h4><p><code>Mongodb</code> 支持丰富的查询语言来支持读写操作（CRUD）以及数据汇总，文本搜索和地理空间索引</p><h4 id="高可用性："><a href="#高可用性：" class="headerlink" title="高可用性："></a>高可用性：</h4><p><code>Mongodb</code> 的复制工具，成为副本集，提供自动故障转移和数据冗余，</p><h4 id="水平可扩展性："><a href="#水平可扩展性：" class="headerlink" title="水平可扩展性："></a>水平可扩展性：</h4><p><code>Mongodb</code> 提供了可扩展性，作为其核心功能的一部分，分片是将数据分，在一组计算机上。</p><h4 id="支持多种存储引擎："><a href="#支持多种存储引擎：" class="headerlink" title="支持多种存储引擎："></a>支持多种存储引擎：</h4><p>WiredTiger 存储引擎和、MMAPv1 存储引擎和InMemory 存储引擎</p><h3 id="2-3-MongoDB-包含的程序"><a href="#2-3-MongoDB-包含的程序" class="headerlink" title="2.3 MongoDB 包含的程序"></a>2.3 MongoDB 包含的程序</h3><p><strong>MongoDB Drivers</strong></p><p>官方MongoDB 客户端库提供C， C ++， C＃， Java， Node.JS， Perl， PHP，Python， Ruby 和<br>Scala 驱动程序的参考指南。</p><p><strong>MongoDB Stitch</strong></p><p>为开发人员提供了一个API 到MongoDB 和其他后端服务。保持MongoDB 的全部功能和灵性，同时<br>受益于强大的系统来配置细粒度的数据访问控制。</p><p><strong>MongoDB Atlas</strong></p><p>MongoDB 在云中部署，操作和扩展的最佳方式。适用于AWS，Azure 和Google Cloud Platform。轻<br>松将数据迁移到MongoDB Atlas，零停机</p><p><strong>MongoDB Cloud Manager</strong></p><p>是一个用于管理MongoDB 部署的软件包。Ops Manager 提供Ops Manager 监控和Ops Manager 备份，可帮助用户优化群集并降低操作风险</p><p><strong>MongoDB Charts</strong></p><p>可以最快速最简单的创建Mongodb 可视化图表</p><p><strong>MongoDB Connector for BI</strong></p><p>MongoDB 商业智能连接器（BI）允许用户使用SQL 创建查询，并使用现有的关系商业智能工具（如<br>Tableau， MicroStrategy 和Qlik）对其MongoDB Enterprise 数据进行可视化，图形化和报告。</p><p><strong>MongoDB Compass</strong></p><p>通过从集合中随机抽样一个文档子集，为用户提供其MongoDB 模式的图形视图。采样文件可最大程<br>度地降低对数据库的影响，并能快速产生结果。有关抽样的更多信息</p><p><strong>MongoDB Spark Connector</strong></p><p>使用连接器，您可以访问所有使用MongoDB 数据集的Spark 库：用SQL 进行分析的数据集（受益于<br>自动模式推理），流式传输，机器学习和图形API。您也可以使用连接器与Spark Shell。</p><h2 id="第3章-应用场景"><a href="#第3章-应用场景" class="headerlink" title="第3章 应用场景"></a>第3章 应用场景</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;www.zhihu.com&#x2F;question&#x2F;32071167</span><br></pre></td></tr></table></figure><h2 id="第4章-安装部署"><a href="#第4章-安装部署" class="headerlink" title="第4章 安装部署"></a>第4章 安装部署</h2><h3 id="4-1-官方文档"><a href="#4-1-官方文档" class="headerlink" title="4.1 官方文档"></a>4.1 官方文档</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;docs.mongodb.com&#x2F;manual&#x2F;</span><br></pre></td></tr></table></figure><h3 id="4-2-安装方式"><a href="#4-2-安装方式" class="headerlink" title="4.2 安装方式"></a>4.2 安装方式</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;www.mongodb.com&#x2F;download-center&#x2F;enterprise</span><br></pre></td></tr></table></figure><p>这里选用tar 包的安装方式</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mongodb-linux-x86_64-3.6.13.tgz</span><br></pre></td></tr></table></figure><h3 id="4-3-目录规划"><a href="#4-3-目录规划" class="headerlink" title="4.3 目录规划"></a>4.3 目录规划</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"><span class="comment">#下载并解压</span></span><br><span class="line">yum install libcurl openssl -y</span><br><span class="line"><span class="built_in">cd</span> /opt/</span><br><span class="line">tar xf mongodb-linux-x86_64-3.6.13.tgz</span><br><span class="line">ln -s mongodb-linux-x86_64-3.6.13 mongodb</span><br><span class="line"></span><br><span class="line"><span class="comment">#创建文件目录以及数据目录</span></span><br><span class="line">mkdir /opt/mongo_27017/&#123;conf,logs,pid&#125; -p</span><br><span class="line">mkdir /data/mongo_27017 -p</span><br></pre></td></tr></table></figure><h2 id="第5章-配置文件"><a href="#第5章-配置文件" class="headerlink" title="第5章 配置文件"></a>第5章 配置文件</h2><h3 id="5-1-创建配置文件"><a href="#5-1-创建配置文件" class="headerlink" title="5.1 创建配置文件"></a>5.1 创建配置文件</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></pre></td><td class="code"><pre><span class="line">cat &gt; /opt/mongo_27017/conf/mongodb.conf  &lt;&lt; EOF</span><br><span class="line">systemLog:</span><br><span class="line">  destination: file   </span><br><span class="line">  logAppend: <span class="literal">true</span>  </span><br><span class="line">  path: /opt/mongo_27017/logs/mongodb.log</span><br><span class="line"></span><br><span class="line">storage:</span><br><span class="line">  journal:</span><br><span class="line">    enabled: <span class="literal">true</span></span><br><span class="line">  dbPath: /data/mongo_27017</span><br><span class="line">  directoryPerDB: <span class="literal">true</span></span><br><span class="line">  wiredTiger:</span><br><span class="line">     engineConfig:</span><br><span class="line">        cacheSizeGB: 1</span><br><span class="line">        directoryForIndexes: <span class="literal">true</span></span><br><span class="line">     collectionConfig:</span><br><span class="line">        blockCompressor: zlib</span><br><span class="line">     indexConfig:</span><br><span class="line">        prefixCompression: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">processManagement:</span><br><span class="line">  fork: <span class="literal">true</span></span><br><span class="line">  pidFilePath: /opt/mongo_27017/pid/mongod.pid</span><br><span class="line"></span><br><span class="line">net:</span><br><span class="line">  port: 27017</span><br><span class="line">  bindIp: 127.0.0.1,10.0.1.51</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h3 id="5-2-启动关闭mongo"><a href="#5-2-启动关闭mongo" class="headerlink" title="5.2 启动关闭mongo"></a>5.2 启动关闭mongo</h3><figure class="highlight bash"><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">/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf</span><br><span class="line">/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown</span><br></pre></td></tr></table></figure><h3 id="5-3-检查是否启动"><a href="#5-3-检查是否启动" class="headerlink" title="5.3 检查是否启动"></a>5.3 检查是否启动</h3><figure class="highlight bash"><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">ps -ef|grep mongo</span><br><span class="line">netstat -lntup|grep 27017</span><br></pre></td></tr></table></figure><h2 id="第6章-登录mongo"><a href="#第6章-登录mongo" class="headerlink" title="第6章 登录mongo"></a>第6章 登录mongo</h2><h3 id="6-1-写入环境变量"><a href="#6-1-写入环境变量" class="headerlink" title="6.1 写入环境变量"></a>6.1 写入环境变量</h3><figure class="highlight bash"><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"><span class="built_in">echo</span> <span class="string">'PATH=$PATH:/opt/mongodb/bin'</span> &gt;&gt; /etc/profile</span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h3 id="6-2-创建hosts-解析"><a href="#6-2-创建hosts-解析" class="headerlink" title="6.2 创建hosts 解析"></a>6.2 创建hosts 解析</h3><figure class="highlight bash"><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">[root@db01 ~]<span class="comment"># cat &gt; /etc/hosts &lt;&lt;EOF</span></span><br><span class="line">10.0.1.51 172.16.1.51 db01</span><br></pre></td></tr></table></figure><h3 id="6-3-登录mongo"><a href="#6-3-登录mongo" class="headerlink" title="6.3 登录mongo"></a>6.3 登录mongo</h3><figure class="highlight bash"><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">/opt/mongodb/bin/mongo</span><br><span class="line">mongo db01:27017</span><br></pre></td></tr></table></figure><h3 id="6-4-关闭命令"><a href="#6-4-关闭命令" class="headerlink" title="6.4 关闭命令"></a>6.4 关闭命令</h3><p>2 种关闭方式，建议使用mongo 自带的命令</p><p><strong>方法1:登陆mongo 使用内置shutdown 命令</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></pre></td><td class="code"><pre><span class="line">[root@db01 ~]<span class="comment"># mongo localhost:27017</span></span><br><span class="line"></span><br><span class="line">&gt; use admin</span><br><span class="line">switched to db admin</span><br><span class="line">&gt; db.shutdownServer()</span><br><span class="line">server should be down...</span><br><span class="line">2019-11-05T03:26:54.171+0800 I NETWORK  [thread1] trying reconnect to localhost:27017 (127.0.0.1) failed</span><br><span class="line">2019-11-05T03:26:54.171+0800 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, <span class="keyword">in</span>(checking socket <span class="keyword">for</span> error after poll), reason: Connection refused</span><br><span class="line">2019-11-05T03:26:54.171+0800 I NETWORK  [thread1] reconnect localhost:27017 (127.0.0.1) failed failed</span><br></pre></td></tr></table></figure><p><strong>方法2:启动命令添加–shutdown 命令</strong></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">[mongo@db01 ~]$ mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown</span><br></pre></td></tr></table></figure><h2 id="第7章-警告优化"><a href="#第7章-警告优化" class="headerlink" title="第7章 警告优化"></a>第7章 警告优化</h2><h3 id="7-1-内存不足"><a href="#7-1-内存不足" class="headerlink" title="7.1 内存不足"></a>7.1 内存不足</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#报警内容1：内存不足</span></span><br><span class="line">2019-11-05T00:24:56.345+0800 I STORAGE  [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方法：</span></span><br><span class="line">1.添加内存</span><br><span class="line">2.调整配置文件里的cache大小</span><br><span class="line">[root@db01 ~]<span class="comment"># grep "cacheSizeGB" /opt/mongo_27017/conf/monogdb.conf</span></span><br><span class="line">cacheSizeGB: 1</span><br></pre></td></tr></table></figure><h3 id="7-2-配置访问控制参数"><a href="#7-2-配置访问控制参数" class="headerlink" title="7.2 配置访问控制参数"></a>7.2 配置访问控制参数</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#报警内容2：配置访问控制参数</span></span><br><span class="line">2019-11-05T00:24:56.345+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt</span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled <span class="keyword">for</span> the database.</span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.</span><br></pre></td></tr></table></figure><h3 id="7-3-普通用户启动"><a href="#7-3-普通用户启动" class="headerlink" title="7.3 普通用户启动"></a>7.3 普通用户启动</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#报警内容3：不是以普通用户启动</span></span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, <span class="built_in">which</span> is not recommended.</span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方法：</span></span><br><span class="line">mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown</span><br><span class="line">useradd mongo</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"123456"</span>|passwd --stdin mongo</span><br><span class="line">chown -R mongo:mongo /opt/</span><br><span class="line">chown -R mongo:mongo /data/</span><br><span class="line">su - mongo</span><br><span class="line">mongod -f /opt/mongo_27017/conf/mongodb.conf</span><br><span class="line">mongo db01:27017</span><br></pre></td></tr></table></figure><h3 id="7-4-never"><a href="#7-4-never" class="headerlink" title="7.4 never"></a>7.4 never</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#报警内容4：We suggest setting it to 'never'</span></span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is <span class="string">'always'</span>.</span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] **        We suggest setting it to <span class="string">'never'</span></span><br><span class="line"></span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is <span class="string">'always'</span>.</span><br><span class="line">2019-11-05T00:24:57.129+0800 I CONTROL  [initandlisten] **        We suggest setting it to <span class="string">'never'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#解决方法：</span></span><br><span class="line">1.临时解决</span><br><span class="line"><span class="built_in">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/enabled</span><br><span class="line"><span class="built_in">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/defrag</span><br><span class="line"></span><br><span class="line">2.官方脚本  <span class="comment">##推荐</span></span><br><span class="line">[root@db01 ~]<span class="comment"># cat /etc/init.d/disable-transparent-hugepages</span></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">### BEGIN INIT INFO</span></span><br><span class="line"><span class="comment"># Provides:          disable-transparent-hugepages</span></span><br><span class="line"><span class="comment"># Required-Start:    $local_fs</span></span><br><span class="line"><span class="comment"># Required-Stop:</span></span><br><span class="line"><span class="comment"># X-Start-Before:    mongod mongodb-mms-automation-agent</span></span><br><span class="line"><span class="comment"># Default-Start:     2 3 4 5</span></span><br><span class="line"><span class="comment"># Default-Stop:      0 1 6</span></span><br><span class="line"><span class="comment"># Short-Description: Disable Linux transparent huge pages</span></span><br><span class="line"><span class="comment"># Description:       Disable Linux transparent huge pages, to improve</span></span><br><span class="line"><span class="comment">#                    database performance.</span></span><br><span class="line"><span class="comment">### END INIT INFO</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="variable">$1</span> <span class="keyword">in</span></span><br><span class="line">  start)</span><br><span class="line">    <span class="keyword">if</span> [ -d /sys/kernel/mm/transparent_hugepage ]; <span class="keyword">then</span></span><br><span class="line">      thp_path=/sys/kernel/mm/transparent_hugepage</span><br><span class="line">    <span class="keyword">elif</span> [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; <span class="keyword">then</span></span><br><span class="line">      thp_path=/sys/kernel/mm/redhat_transparent_hugepage</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">      <span class="built_in">return</span> 0</span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">'never'</span> &gt; <span class="variable">$&#123;thp_path&#125;</span>/enabled</span><br><span class="line">    <span class="built_in">echo</span> <span class="string">'never'</span> &gt; <span class="variable">$&#123;thp_path&#125;</span>/defrag</span><br><span class="line"></span><br><span class="line">    re=<span class="string">'^[0-1]+$'</span></span><br><span class="line">    <span class="keyword">if</span> [[ $(cat <span class="variable">$&#123;thp_path&#125;</span>/khugepaged/defrag) =~ <span class="variable">$re</span> ]]</span><br><span class="line">    <span class="keyword">then</span></span><br><span class="line">      <span class="comment"># RHEL 7</span></span><br><span class="line">      <span class="built_in">echo</span> 0  &gt; <span class="variable">$&#123;thp_path&#125;</span>/khugepaged/defrag</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">      <span class="comment"># RHEL 6</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">'no'</span> &gt; <span class="variable">$&#123;thp_path&#125;</span>/khugepaged/defrag</span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">unset</span> re</span><br><span class="line">    <span class="built_in">unset</span> thp_path</span><br><span class="line">    ;;</span><br><span class="line"><span class="keyword">esac</span></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></pre></td><td class="code"><pre><span class="line">chmod 755 /etc/init.d/<span class="built_in">disable</span>-transparent-hugepages</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></pre></td><td class="code"><pre><span class="line">chkconfig --add <span class="built_in">disable</span>-transparent-hugepages</span><br><span class="line">chkconfig --list|grep <span class="built_in">disable</span></span><br></pre></td></tr></table></figure><h3 id="7-5-用户访问控制"><a href="#7-5-用户访问控制" class="headerlink" title="7.5 用户访问控制"></a>7.5 用户访问控制</h3><p>配置文件增加用户认证的配置参数</p><figure class="highlight bash"><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">security:</span><br><span class="line">authorization: enabled</span><br></pre></td></tr></table></figure><h2 id="第8章-mongodb-默认存在的库"><a href="#第8章-mongodb-默认存在的库" class="headerlink" title="第8章 mongodb 默认存在的库"></a>第8章 mongodb 默认存在的库</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></pre></td><td class="code"><pre><span class="line">&gt; show dbs</span><br><span class="line">admin   0.000GB-----&gt;系统预留库,MongoDB 系统管理库</span><br><span class="line">config  0.000GB-----&gt;MongoDB 配置信息库</span><br><span class="line"><span class="built_in">local</span>   0.000GB-----&gt;本地预留库,存储关键日志</span><br></pre></td></tr></table></figure><p>操作命令：</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">show databases/show dbs</span><br><span class="line">show tables/show collections</span><br><span class="line">use admin</span><br><span class="line">db/select database()</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="MongoDB" scheme="http://linuxwf.com/tags/MongoDB/"/>
    
  </entry>
  
  <entry>
    <title>MySQL配置文件参数</title>
    <link href="http://linuxwf.com/2020/04/15/MySQL%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8F%82%E6%95%B0/"/>
    <id>http://linuxwf.com/2020/04/15/MySQL%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8F%82%E6%95%B0/</id>
    <published>2020-04-15T02:50:00.000Z</published>
    <updated>2020-04-15T02:51:27.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>MySQL配置文件参数</p><figure class="highlight plain"><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">[mysqld]</span><br><span class="line">user&#x3D;mysql   # 用户</span><br><span class="line">basedir&#x3D;&#x2F;usr&#x2F;local&#x2F;mysql   # 程序路径</span><br><span class="line">datadir&#x3D;&#x2F;data&#x2F;mysql&#x2F;data   # 数据路径</span><br><span class="line">server_id&#x3D;51               # 服务器编号, 1-65535 </span><br><span class="line">socket&#x3D;&#x2F;tmp&#x2F;mysql.sock     # socket文件位置</span><br><span class="line">secure-file-priv&#x3D;&#x2F;tmp      # into outfile 的安全路径 </span><br><span class="line">innodb_data_file_path&#x3D;ibdata1:12M;ibdata2:512M:autoextend #共享表空间文件设置</span><br><span class="line">autocommit&#x3D;0  #自动提交功能</span><br><span class="line">log_error&#x3D;&#x2F;tmp&#x2F;mysql.err  #错误日志位置</span><br><span class="line">log_bin&#x3D;&#x2F;data&#x2F;binlog&#x2F;mysql-bin  #二进制日志位置</span><br><span class="line">binlog_format&#x3D;row  #二进制日志记录格式</span><br><span class="line">gtid-mode&#x3D;on                                              #gtid开关</span><br><span class="line">enforce-gtid-consistency&#x3D;true                             #强制GTID一致性</span><br><span class="line">slow_query_log&#x3D;1                               ## 慢日志开关</span><br><span class="line">slow_query_log_file&#x3D;&#x2F;data&#x2F;mysql&#x2F;slow.log       ## 日志存放位置</span><br><span class="line">long_query_time&#x3D;0.1                            ## 设定慢查询时间阈值</span><br><span class="line">log_queries_not_using_indexes                  ## 不走索引的进行记录</span><br><span class="line">#transaction_isolation&#x3D;READ-UNCOMMITTED   ## 隔离级别</span><br><span class="line">#transaction_isolation&#x3D;READ-COMMITTED</span><br><span class="line">innodb_flush_method&#x3D;O_DIRECT   ## 控制IO刷写策略</span><br><span class="line">[mysql]</span><br><span class="line">socket&#x3D;&#x2F;tmp&#x2F;mysql.sock</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="http://linuxwf.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>11.分布式架构-MyCAT</title>
    <link href="http://linuxwf.com/2020/04/15/11-%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84-MyCAT/"/>
    <id>http://linuxwf.com/2020/04/15/11-%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84-MyCAT/</id>
    <published>2020-04-15T02:45:00.000Z</published>
    <updated>2020-04-15T02:45:57.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="第11节-分布式架构-MyCAT"><a href="#第11节-分布式架构-MyCAT" class="headerlink" title="第11节 分布式架构-MyCAT"></a>第11节 分布式架构-MyCAT</h1><h2 id="第1章-MyCAT基础架构图"><a href="#第1章-MyCAT基础架构图" class="headerlink" title="第1章 MyCAT基础架构图"></a>第1章 MyCAT基础架构图</h2><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql20.png"  alt=""></p><h2 id="第2章-MyCAT基础架构准备"><a href="#第2章-MyCAT基础架构准备" class="headerlink" title="第2章 MyCAT基础架构准备"></a>第2章 MyCAT基础架构准备</h2><h3 id="2-1-环境准备"><a href="#2-1-环境准备" class="headerlink" title="2.1 环境准备"></a>2.1 环境准备</h3><figure class="highlight bash"><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">两台虚拟机 db01 db02</span><br><span class="line">每台创建四个mysql实例：3307 3308 3309 3310</span><br></pre></td></tr></table></figure><h3 id="2-2-删除历史环境"><a href="#2-2-删除历史环境" class="headerlink" title="2.2 删除历史环境"></a>2.2 删除历史环境</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></pre></td><td class="code"><pre><span class="line">pkill mysqld</span><br><span class="line">rm -rf /data/330* </span><br><span class="line">mv /etc/my.cnf /etc/my.cnf.bak</span><br></pre></td></tr></table></figure><h3 id="2-3-创建相关目录初始化数据"><a href="#2-3-创建相关目录初始化数据" class="headerlink" title="2.3 创建相关目录初始化数据"></a>2.3 创建相关目录初始化数据</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></pre></td><td class="code"><pre><span class="line">mkdir /data/33&#123;07..10&#125;/data -p</span><br><span class="line">mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">mysqld --initialize-insecure  --user=mysql --datadir=/data/3310/data --basedir=/usr/<span class="built_in">local</span>/mysql</span><br></pre></td></tr></table></figure><h3 id="2-4-准备配置文件和启动脚本"><a href="#2-4-准备配置文件和启动脚本" class="headerlink" title="2.4 准备配置文件和启动脚本"></a>2.4 准备配置文件和启动脚本</h3><p><strong>db01节点</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></pre></td><td class="code"><pre><span class="line">========db01==============</span><br><span class="line">cat &gt;/data/3307/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3307/data</span><br><span class="line">socket=/data/3307/mysql.sock</span><br><span class="line">port=3307</span><br><span class="line"><span class="built_in">log</span>-error=/data/3307/mysql.log</span><br><span class="line">log_bin=/data/3307/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=7</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/data/3308/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3308/data</span><br><span class="line">port=3308</span><br><span class="line">socket=/data/3308/mysql.sock</span><br><span class="line"><span class="built_in">log</span>-error=/data/3308/mysql.log</span><br><span class="line">log_bin=/data/3308/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=8</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/data/3309/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3309/data</span><br><span class="line">socket=/data/3309/mysql.sock</span><br><span class="line">port=3309</span><br><span class="line"><span class="built_in">log</span>-error=/data/3309/mysql.log</span><br><span class="line">log_bin=/data/3309/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=9</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line">cat &gt;/data/3310/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3310/data</span><br><span class="line">socket=/data/3310/mysql.sock</span><br><span class="line">port=3310</span><br><span class="line"><span class="built_in">log</span>-error=/data/3310/mysql.log</span><br><span class="line">log_bin=/data/3310/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=10</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3307.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3308.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3309.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3310.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><p><strong>db02节点</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></pre></td><td class="code"><pre><span class="line">========db02===============</span><br><span class="line">cat &gt;/data/3307/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3307/data</span><br><span class="line">socket=/data/3307/mysql.sock</span><br><span class="line">port=3307</span><br><span class="line"><span class="built_in">log</span>-error=/data/3307/mysql.log</span><br><span class="line">log_bin=/data/3307/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=17</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line">cat &gt;/data/3308/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3308/data</span><br><span class="line">port=3308</span><br><span class="line">socket=/data/3308/mysql.sock</span><br><span class="line"><span class="built_in">log</span>-error=/data/3308/mysql.log</span><br><span class="line">log_bin=/data/3308/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=18</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line">cat &gt;/data/3309/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3309/data</span><br><span class="line">socket=/data/3309/mysql.sock</span><br><span class="line">port=3309</span><br><span class="line"><span class="built_in">log</span>-error=/data/3309/mysql.log</span><br><span class="line">log_bin=/data/3309/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=19</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">cat &gt;/data/3310/my.cnf&lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3310/data</span><br><span class="line">socket=/data/3310/mysql.sock</span><br><span class="line">port=3310</span><br><span class="line"><span class="built_in">log</span>-error=/data/3310/mysql.log</span><br><span class="line">log_bin=/data/3310/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">skip-name-resolve</span><br><span class="line">server-id=20</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3307.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3308.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3309.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">cat &gt;/etc/systemd/system/mysqld3310.service&lt;&lt;EOF</span><br><span class="line">[Unit]</span><br><span class="line">Description=MySQL Server</span><br><span class="line">Documentation=man:mysqld(8)</span><br><span class="line">Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html</span><br><span class="line">After=network.target</span><br><span class="line">After=syslog.target</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line">[Service]</span><br><span class="line">User=mysql</span><br><span class="line">Group=mysql</span><br><span class="line">ExecStart=/usr/<span class="built_in">local</span>/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf</span><br><span class="line">LimitNOFILE = 5000</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h3 id="2-5-改权限，启动多实例"><a href="#2-5-改权限，启动多实例" class="headerlink" title="2.5 改权限，启动多实例"></a>2.5 改权限，启动多实例</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></pre></td><td class="code"><pre><span class="line">chown -R mysql.mysql /data/*</span><br><span class="line">systemctl start mysqld3307</span><br><span class="line">systemctl start mysqld3308</span><br><span class="line">systemctl start mysqld3309</span><br><span class="line">systemctl start mysqld3310</span><br><span class="line"></span><br><span class="line">==============检查=============</span><br><span class="line">mysql -S /data/3307/mysql.sock -e <span class="string">"show variables like 'server_id'"</span></span><br><span class="line">mysql -S /data/3308/mysql.sock -e <span class="string">"show variables like 'server_id'"</span></span><br><span class="line">mysql -S /data/3309/mysql.sock -e <span class="string">"show variables like 'server_id'"</span></span><br><span class="line">mysql -S /data/3310/mysql.sock -e <span class="string">"show variables like 'server_id'"</span></span><br></pre></td></tr></table></figure><h3 id="2-6-节点主从规划"><a href="#2-6-节点主从规划" class="headerlink" title="2.6 节点主从规划"></a>2.6 节点主从规划</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></pre></td><td class="code"><pre><span class="line">箭头指向谁是主库</span><br><span class="line">    10.0.1.51:3307    &lt;-----&gt;  10.0.1.52:3307</span><br><span class="line">    10.0.1.51:3309    ------&gt;  10.0.1.51:3307</span><br><span class="line">    10.0.1.52:3309    ------&gt;  10.0.1.52:3307</span><br><span class="line"></span><br><span class="line">    10.0.1.52:3308  &lt;-----&gt;    10.0.1.51:3308</span><br><span class="line">    10.0.1.52:3310  -----&gt;     10.0.1.52:3308</span><br><span class="line">    10.0.1.51:3310  -----&gt;     10.0.1.51:3308</span><br></pre></td></tr></table></figure><h3 id="2-7-分片规划"><a href="#2-7-分片规划" class="headerlink" title="2.7 分片规划"></a>2.7 分片规划</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">shard1：</span><br><span class="line">    Master：10.0.1.51:3307</span><br><span class="line">    slave1：10.0.1.51:3309</span><br><span class="line">    Standby Master：10.0.1.52:3307</span><br><span class="line">    slave2：10.0.1.52:3309</span><br><span class="line">shard2：</span><br><span class="line">    Master：10.0.1.52:3308</span><br><span class="line">    slave1：10.0.1.52:3310</span><br><span class="line">    Standby Master：10.0.1.51:3308</span><br><span class="line">    slave2：10.0.1.51:3310</span><br></pre></td></tr></table></figure><h3 id="2-8-开始配置"><a href="#2-8-开始配置" class="headerlink" title="2.8 开始配置"></a>2.8 开始配置</h3><p><strong>shard1节点</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></pre></td><td class="code"><pre><span class="line"><span class="comment">### shard1</span></span><br><span class="line">10.0.1.51:3307 &lt;-----&gt; 10.0.1.52:3307</span><br><span class="line"><span class="comment">#### db02</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"grant replication slave on *.* to repl@'10.0.1.%' identified by '123';"</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"grant all  on *.* to root@'10.0.1.%' identified by '123'  with grant option;"</span></span><br><span class="line"><span class="comment">#### db01</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.52', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"show slave status\G"</span></span><br><span class="line"><span class="comment">#### db02</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.51', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3307/mysql.sock -e <span class="string">"show slave status\G"</span></span><br><span class="line">10.0.1.51:3309 ------&gt; 10.0.1.51:3307</span><br><span class="line"><span class="comment">#### db01</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock  -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.51', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock  -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock  -e <span class="string">"show slave status\G"</span></span><br><span class="line">10.0.1.52:3309 ------&gt; 10.0.1.52:3307</span><br><span class="line"><span class="comment">#### db02</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.52', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3309/mysql.sock -e <span class="string">"show slave status\G"</span></span><br></pre></td></tr></table></figure><p><strong>shard2节点</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></pre></td><td class="code"><pre><span class="line"><span class="comment">### shard2</span></span><br><span class="line">10.0.1.52:3308 &lt;-----&gt; 10.0.1.51:3308</span><br><span class="line"><span class="comment">#### db01</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"grant replication slave on *.* to repl@'10.0.1.%' identified by '123';"</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"grant all  on *.* to root@'10.0.1.%' identified by '123'  with grant option;"</span></span><br><span class="line"><span class="comment">#### db02</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.51', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"show slave status\G"</span></span><br><span class="line"><span class="comment">#### db01</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.52', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3308/mysql.sock -e <span class="string">"show slave status\G"</span></span><br><span class="line">10.0.1.52:3310 -----&gt; 10.0.1.52:3308</span><br><span class="line"><span class="comment">#### db02</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.52', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"show slave status\G"</span></span><br><span class="line">10.0.1.51:3310 -----&gt; 10.0.1.51:3308</span><br><span class="line"><span class="comment">#### db01</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"CHANGE MASTER TO MASTER_HOST='10.0.1.51', MASTER_PORT=3308, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"start slave;"</span></span><br><span class="line">mysql  -S /data/3310/mysql.sock -e <span class="string">"show slave status\G"</span></span><br></pre></td></tr></table></figure><h3 id="2-9-检测主从状态"><a href="#2-9-检测主从状态" class="headerlink" title="2.9 检测主从状态"></a>2.9 检测主从状态</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></pre></td><td class="code"><pre><span class="line">2.9 检测主从状态</span><br><span class="line">mysql -S /data/3307/mysql.sock -e <span class="string">"show slave status\G"</span>|grep <span class="string">"Running:"</span></span><br><span class="line">mysql -S /data/3308/mysql.sock -e <span class="string">"show slave status\G"</span>|grep <span class="string">"Running:"</span></span><br><span class="line">mysql -S /data/3309/mysql.sock -e <span class="string">"show slave status\G"</span>|grep <span class="string">"Running:"</span></span><br><span class="line">mysql -S /data/3310/mysql.sock -e <span class="string">"show slave status\G"</span>|grep <span class="string">"Running:"</span></span><br><span class="line"></span><br><span class="line">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span><br><span class="line">注：如果中间出现错误，在每个节点进行执行以下命令</span><br><span class="line">mysql -S /data/3307/mysql.sock -e <span class="string">"stop slave; reset slave all;"</span></span><br><span class="line">mysql -S /data/3308/mysql.sock -e <span class="string">"stop slave; reset slave all;"</span></span><br><span class="line">mysql -S /data/3309/mysql.sock -e <span class="string">"stop slave; reset slave all;"</span></span><br><span class="line">mysql -S /data/3310/mysql.sock -e <span class="string">"stop slave; reset slave all;"</span></span><br><span class="line">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span><br></pre></td></tr></table></figure><h3 id="2-10-MySQL分布式架构介绍"><a href="#2-10-MySQL分布式架构介绍" class="headerlink" title="2.10 MySQL分布式架构介绍"></a>2.10 MySQL分布式架构介绍</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql21.png"  alt=""></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></pre></td><td class="code"><pre><span class="line">1. schema拆分及业务分库</span><br><span class="line">2. 垂直拆分-分库分表</span><br><span class="line">3. 水平拆分-分片</span><br></pre></td></tr></table></figure><h3 id="2-11-企业代表产品"><a href="#2-11-企业代表产品" class="headerlink" title="2.11 企业代表产品"></a>2.11 企业代表产品</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">360 Atlas-Sharding</span><br><span class="line">Alibaba  cobar </span><br><span class="line">Mycat</span><br><span class="line">TDDL</span><br><span class="line">Heisenberg</span><br><span class="line">Oceanus</span><br><span class="line">Vitess</span><br><span class="line">OneProxy </span><br><span class="line">DRDS</span><br></pre></td></tr></table></figure><h2 id="第3章-MyCAT安装"><a href="#第3章-MyCAT安装" class="headerlink" title="第3章 MyCAT安装"></a>第3章 MyCAT安装</h2><h3 id="3-1-预先安装Java运行环境"><a href="#3-1-预先安装Java运行环境" class="headerlink" title="3.1 预先安装Java运行环境"></a>3.1 预先安装Java运行环境</h3><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">yum -y install java</span><br></pre></td></tr></table></figure><h3 id="3-2-下载"><a href="#3-2-下载" class="headerlink" title="3.2 下载"></a>3.2 下载</h3><figure class="highlight bash"><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">Mycat-server-xxxxx.linux.tar.gz</span><br><span class="line">http://dl.mycat.io/</span><br></pre></td></tr></table></figure><h3 id="3-3-解压文件"><a href="#3-3-解压文件" class="headerlink" title="3.3 解压文件"></a>3.3 解压文件</h3><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">tar xf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz</span><br></pre></td></tr></table></figure><h3 id="3-4-软件目录结构"><a href="#3-4-软件目录结构" class="headerlink" title="3.4 软件目录结构"></a>3.4 软件目录结构</h3><figure class="highlight bash"><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">[root@db01 /usr/<span class="built_in">local</span>/mycat]<span class="comment"># ls</span></span><br><span class="line">bin  catlet  conf  lib  logs  version.txt</span><br></pre></td></tr></table></figure><h3 id="3-5-启动和连接"><a href="#3-5-启动和连接" class="headerlink" title="3.5 启动和连接"></a>3.5 启动和连接</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"><span class="comment">##配置环境变量</span></span><br><span class="line">vim /etc/profile</span><br><span class="line"><span class="built_in">export</span> PATH=/usr/<span class="built_in">local</span>/mycat/bin:<span class="variable">$PATH</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment">##启动</span></span><br><span class="line">mycat start</span><br><span class="line"></span><br><span class="line"><span class="comment">##连接mycat：</span></span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P8066</span><br></pre></td></tr></table></figure><h3 id="3-6-配置文件介绍"><a href="#3-6-配置文件介绍" class="headerlink" title="3.6 配置文件介绍"></a>3.6 配置文件介绍</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"><span class="comment">##logs目录:</span></span><br><span class="line">wrapper.log       ----&gt;mycat启动日志</span><br><span class="line">mycat.log         ----&gt;mycat详细工作日志</span><br><span class="line"><span class="comment">##conf目录:</span></span><br><span class="line">schema.xml      </span><br><span class="line"><span class="comment">##主配置文件（读写分离、高可用、分布式策略定制、节点控制）</span></span><br><span class="line">server.xml</span><br><span class="line"><span class="comment">##mycat软件本身相关的配置</span></span><br><span class="line">rule.xml </span><br><span class="line"><span class="comment">##分片规则配置文件,记录分片规则列表、使用方法等</span></span><br></pre></td></tr></table></figure><h2 id="第4章-应用前环境准备"><a href="#第4章-应用前环境准备" class="headerlink" title="第4章 应用前环境准备"></a>第4章 应用前环境准备</h2><h3 id="4-1-用户创建及数据库导入"><a href="#4-1-用户创建及数据库导入" class="headerlink" title="4.1 用户创建及数据库导入"></a>4.1 用户创建及数据库导入</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></pre></td><td class="code"><pre><span class="line">db01:</span><br><span class="line">mysql -S /data/3307/mysql.sock </span><br><span class="line">grant all on *.* to root@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123'</span>;</span><br><span class="line"><span class="built_in">source</span> /root/world.sql</span><br><span class="line"></span><br><span class="line">mysql -S /data/3308/mysql.sock </span><br><span class="line">grant all on *.* to root@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123'</span>;</span><br><span class="line"><span class="built_in">source</span> /root/world.sql</span><br></pre></td></tr></table></figure><h3 id="4-2-配置文件处理"><a href="#4-2-配置文件处理" class="headerlink" title="4.2 配置文件处理"></a>4.2 配置文件处理</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">[root@db01 ~]<span class="comment"># cd /usr/local/mycat/conf</span></span><br><span class="line">[root@db01 ~]<span class="comment"># mv schema.xml schema.xml.bak</span></span><br><span class="line">[root@db01 /usr/<span class="built_in">local</span>/mycat/conf]<span class="comment"># vim schema.xml</span></span><br><span class="line">&lt;?xml version=<span class="string">"1.0"</span>?&gt;  </span><br><span class="line">&lt;!DOCTYPE mycat:schema SYSTEM <span class="string">"schema.dtd"</span>&gt;  </span><br><span class="line">&lt;mycat:schema xmlns:mycat=<span class="string">"http://io.mycat/"</span>&gt;</span><br><span class="line">&lt;schema name=<span class="string">"TESTDB"</span> checkSQLschema=<span class="string">"false"</span> sqlMaxLimit=<span class="string">"100"</span> dataNode=<span class="string">"dn1"</span>&gt; </span><br><span class="line">&lt;/schema&gt;  </span><br><span class="line">    &lt;dataNode name=<span class="string">"dn1"</span> dataHost=<span class="string">"localhost1"</span> database= <span class="string">"world"</span> /&gt;  </span><br><span class="line">    &lt;dataHost name=<span class="string">"localhost1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt; </span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;  </span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt; </span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt; </span><br><span class="line">    &lt;/writeHost&gt; </span><br><span class="line">    &lt;/dataHost&gt;  </span><br><span class="line">&lt;/mycat:schema&gt;</span><br></pre></td></tr></table></figure><h2 id="第5章-配置文件简单介绍"><a href="#第5章-配置文件简单介绍" class="headerlink" title="第5章 配置文件简单介绍"></a>第5章 配置文件简单介绍</h2><h3 id="5-1-逻辑库：schema"><a href="#5-1-逻辑库：schema" class="headerlink" title="5.1 逻辑库：schema"></a>5.1 逻辑库：schema</h3><figure class="highlight bash"><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">&lt;schema name=<span class="string">"TESTDB"</span> checkSQLschema=<span class="string">"false"</span> sqlMaxLimit=<span class="string">"100"</span> dataNode=<span class="string">"dn1"</span>&gt; </span><br><span class="line">&lt;/schema&gt;</span><br></pre></td></tr></table></figure><h3 id="5-2-数据节点-datanode"><a href="#5-2-数据节点-datanode" class="headerlink" title="5.2 数据节点:datanode"></a>5.2 数据节点:datanode</h3><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">&lt;dataNode name=<span class="string">"dn1"</span> dataHost=<span class="string">"localhost1"</span> database= <span class="string">"world"</span> /&gt;</span><br></pre></td></tr></table></figure><h3 id="5-3-数据主机：datahost-w和r"><a href="#5-3-数据主机：datahost-w和r" class="headerlink" title="5.3 数据主机：datahost(w和r)"></a>5.3 数据主机：datahost(w和r)</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></pre></td><td class="code"><pre><span class="line">&lt;dataHost name=<span class="string">"localhost1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt; </span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;  </span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt; </span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt; </span><br><span class="line">    &lt;/writeHost&gt; </span><br><span class="line">    &lt;/dataHost&gt;</span><br></pre></td></tr></table></figure><h2 id="第6章-读写分离测试"><a href="#第6章-读写分离测试" class="headerlink" title="第6章 读写分离测试"></a>第6章 读写分离测试</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></pre></td><td class="code"><pre><span class="line"><span class="comment">##重启mycat</span></span><br><span class="line">[root@db01 /usr/<span class="built_in">local</span>/mycat/conf]<span class="comment"># mycat restart</span></span><br><span class="line">Stopping Mycat-server...</span><br><span class="line">Stopped Mycat-server.</span><br><span class="line">Starting Mycat-server...</span><br><span class="line"><span class="comment">##读写分离测试</span></span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P8066</span><br><span class="line">mysql&gt; show databases;</span><br><span class="line">mysql&gt; use TESTDB</span><br><span class="line">mysql&gt; select @@server_id;</span><br><span class="line">+-------------+</span><br><span class="line">| @@server_id |</span><br><span class="line">+-------------+</span><br><span class="line">|           9 |</span><br><span class="line">+-------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.01 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; begin;select @@server_id;commit;</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">+-------------+</span><br><span class="line">| @@server_id |</span><br><span class="line">+-------------+</span><br><span class="line">|           7 |</span><br><span class="line">+-------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br><span class="line"></span><br><span class="line"><span class="comment">##总结： </span></span><br><span class="line">以上案例实现了1主1从的读写分离功能，写操作落到主库，读操作落到从库.如果主库宕机，从库不能在继续提供服务了。</span><br></pre></td></tr></table></figure><h2 id="第7章-配置读写分离及高可用"><a href="#第7章-配置读写分离及高可用" class="headerlink" title="第7章 配置读写分离及高可用"></a>第7章 配置读写分离及高可用</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><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">[root@db01 /usr/<span class="built_in">local</span>/mycat/conf]<span class="comment"># mv schema.xml schema.xml.rw</span></span><br><span class="line">[root@db01 /usr/<span class="built_in">local</span>/mycat/conf]<span class="comment"># vim schema.xml</span></span><br><span class="line"></span><br><span class="line">&lt;?xml version=<span class="string">"1.0"</span>?&gt;</span><br><span class="line">&lt;!DOCTYPE mycat:schema SYSTEM <span class="string">"schema.dtd"</span>&gt;  </span><br><span class="line">&lt;mycat:schema xmlns:mycat=<span class="string">"http://io.mycat/"</span>&gt;</span><br><span class="line">&lt;schema name=<span class="string">"TESTDB"</span> checkSQLschema=<span class="string">"false"</span> sqlMaxLimit=<span class="string">"100"</span> dataNode=<span class="string">"sh1"</span>&gt; </span><br><span class="line">&lt;/schema&gt;  </span><br><span class="line">    &lt;dataNode name=<span class="string">"sh1"</span> dataHost=<span class="string">"wufei1"</span> database= <span class="string">"world"</span> /&gt;  </span><br><span class="line">    &lt;dataHost name=<span class="string">"wufei1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt; </span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;  </span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt; </span><br><span class="line">    &lt;/writeHost&gt; </span><br><span class="line">    &lt;writeHost host=<span class="string">"db3"</span> url=<span class="string">"10.0.1.52:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt; </span><br><span class="line">            &lt;readHost host=<span class="string">"db4"</span> url=<span class="string">"10.0.1.52:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;        </span><br><span class="line">    &lt;/dataHost&gt;  </span><br><span class="line">&lt;/mycat:schema&gt;</span><br><span class="line"></span><br><span class="line">[root@db01 /usr/<span class="built_in">local</span>/mycat/conf]<span class="comment"># mycat restart</span></span><br><span class="line">Stopping Mycat-server...</span><br><span class="line">Stopped Mycat-server.</span><br><span class="line">Starting Mycat-server...</span><br><span class="line"></span><br><span class="line">真正的 writehost：负责写操作的writehost  </span><br><span class="line">standby  writeHost  ：和readhost一样，只提供读服务</span><br><span class="line"></span><br><span class="line"><span class="comment">##当写节点宕机后，后面跟的readhost也不提供服务，这时候standby的writehost就提供写服务，后面跟的readhost提供读服务</span></span><br><span class="line"></span><br><span class="line"><span class="comment">##测试：</span></span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P 8066</span><br><span class="line">show variables like <span class="string">'server_id'</span>;</span><br><span class="line"><span class="comment">##读写分离测试</span></span><br><span class="line"> mysql -uroot -p -h 127.0.0.1 -P8066</span><br><span class="line"> use TESTDB</span><br><span class="line"> select @@server_id;    -----&gt; 9  17  19</span><br><span class="line"> begin;select @@server_id;commit;   -----&gt; 7</span><br><span class="line"> <span class="comment">##对db01 3307节点进行关闭和启动,测试读写操作</span></span><br><span class="line">systemctl stop mysqld3307</span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P8066</span><br><span class="line">mysql&gt; select @@server_id;  ----&gt; 19</span><br><span class="line">mysql&gt;  begin;select @@server_id;commit;  ----&gt; 17</span><br><span class="line"></span><br><span class="line">systemctl start mysqld3307</span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P8066</span><br><span class="line">mysql&gt; select @@server_id;  ----&gt; 7 9 19</span><br><span class="line">mysql&gt;  begin;select @@server_id;commit;  ----&gt; 17</span><br></pre></td></tr></table></figure><h2 id="第8章-配置中的属性介绍"><a href="#第8章-配置中的属性介绍" class="headerlink" title="第8章 配置中的属性介绍"></a>第8章 配置中的属性介绍</h2><h3 id="balance"><a href="#balance" class="headerlink" title="balance"></a>balance</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></pre></td><td class="code"><pre><span class="line"><span class="comment">## balance属性</span></span><br><span class="line">负载均衡类型，目前的取值有3种： </span><br><span class="line"> balance=<span class="string">"0"</span>, 不开启读写分离机制，所有读操作都发送到当前可用的writeHost上。 </span><br><span class="line"> balance=<span class="string">"1"</span>，全部的readHost与standby writeHost参与select语句的负载均衡，简单的说，</span><br><span class="line"> 当双主双从模式(M1-&gt;S1，M2-&gt;S2，并且M1与 M2互为主备)，正常情况下，M2,S1,S2都参与select语句的负载均衡。 </span><br><span class="line"> balance=<span class="string">"2"</span>，所有读操作都随机的在writeHost、readhost上分发。</span><br></pre></td></tr></table></figure><h3 id="writeType"><a href="#writeType" class="headerlink" title="writeType"></a>writeType</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></pre></td><td class="code"><pre><span class="line"><span class="comment">## writeType属性</span></span><br><span class="line">负载均衡类型，目前的取值有2种： </span><br><span class="line">1. writeType=<span class="string">"0"</span>, 所有写操作发送到配置的第一个writeHost，</span><br><span class="line">第一个挂了切到还生存的第二个writeHost，重新启动后已切换后的为主，切换记录在配置文件中:dnindex.properties . </span><br><span class="line">2. writeType=“1”，所有写操作都随机的发送到配置的writeHost，但不推荐使用</span><br></pre></td></tr></table></figure><h3 id="switchType"><a href="#switchType" class="headerlink" title="switchType"></a>switchType</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></pre></td><td class="code"><pre><span class="line"><span class="comment">## switchType属性</span></span><br><span class="line">-1 表示不自动切换 </span><br><span class="line">1 默认值，自动切换 </span><br><span class="line">2 基于MySQL主从同步的状态决定是否切换 ，心跳语句为 show slave status</span><br></pre></td></tr></table></figure><h3 id="datahost其他配置"><a href="#datahost其他配置" class="headerlink" title="datahost其他配置"></a>datahost其他配置</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"><span class="comment">## datahost其他配置</span></span><br><span class="line">&lt;dataHost name=<span class="string">"localhost1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt; </span><br><span class="line"></span><br><span class="line">maxCon=<span class="string">"1000"</span>：最大的并发连接数</span><br><span class="line">minCon=<span class="string">"10"</span> ：mycat在启动之后，会在后端节点上自动开启的连接线程</span><br><span class="line"></span><br><span class="line">tempReadHostAvailable=<span class="string">"1"</span></span><br><span class="line">这个一主一从时（1个writehost，1个readhost时），可以开启这个参数，如果2个writehost，2个readhost时</span><br><span class="line">&lt;heartbeat&gt;select user()&lt;/heartbeat&gt;  监测心跳</span><br></pre></td></tr></table></figure><h2 id="第9章-垂直分表"><a href="#第9章-垂直分表" class="headerlink" title="第9章 垂直分表"></a>第9章 垂直分表</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><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">mv schema.xml schema.xml.ha </span><br><span class="line">vim schema.xml</span><br><span class="line"></span><br><span class="line">&lt;?xml version=<span class="string">"1.0"</span>?&gt;</span><br><span class="line">&lt;!DOCTYPE mycat:schema SYSTEM <span class="string">"schema.dtd"</span>&gt;</span><br><span class="line">&lt;mycat:schema xmlns:mycat=<span class="string">"http://io.mycat/"</span>&gt;</span><br><span class="line">&lt;schema name=<span class="string">"TESTDB"</span> checkSQLschema=<span class="string">"false"</span> sqlMaxLimit=<span class="string">"100"</span> dataNode=<span class="string">"sh1"</span>&gt;</span><br><span class="line">        &lt;table name=<span class="string">"user"</span> dataNode=<span class="string">"sh1"</span>/&gt;</span><br><span class="line">        &lt;table name=<span class="string">"order_t"</span> dataNode=<span class="string">"sh2"</span>/&gt;</span><br><span class="line">&lt;/schema&gt;</span><br><span class="line">    &lt;dataNode name=<span class="string">"sh1"</span> dataHost=<span class="string">"wufei1"</span> database= <span class="string">"taobao"</span> /&gt;</span><br><span class="line">    &lt;dataNode name=<span class="string">"sh2"</span> dataHost=<span class="string">"wufei2"</span> database= <span class="string">"taobao"</span> /&gt;</span><br><span class="line">    &lt;dataHost name=<span class="string">"wufei1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt;</span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db3"</span> url=<span class="string">"10.0.1.52:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db4"</span> url=<span class="string">"10.0.1.52:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;/dataHost&gt;</span><br><span class="line">    &lt;dataHost name=<span class="string">"wufei2"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt;</span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3308"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3310"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db3"</span> url=<span class="string">"10.0.1.52:3308"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db4"</span> url=<span class="string">"10.0.1.52:3310"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;/dataHost&gt;</span><br><span class="line">&lt;/mycat:schema&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">##创建测试库和表:</span></span><br><span class="line"> mysql -S /data/3307/mysql.sock -e <span class="string">"create database taobao charset utf8;"</span></span><br><span class="line"> mysql -S /data/3308/mysql.sock -e <span class="string">"create database taobao charset utf8;"</span></span><br><span class="line"> mysql -S /data/3307/mysql.sock -e <span class="string">"use taobao;create table user(id int,name varchar(20))"</span>;</span><br><span class="line"> mysql -S /data/3308/mysql.sock -e <span class="string">"use taobao;create table order_t(id int,name varchar(20))"</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">##重启mycat测试</span></span><br><span class="line">mycat restart</span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P8066</span><br><span class="line">mysql&gt; use TESTDB</span><br><span class="line">mysql&gt; insert into order_t values(1,<span class="string">'zs'</span>);</span><br><span class="line">mysql&gt; insert into order_t values(2,<span class="string">'ls'</span>);</span><br><span class="line">mysql&gt; insert into user values(1,<span class="string">'zs'</span>);</span><br><span class="line">mysql&gt; insert into user values(2,<span class="string">'ls'</span>);</span><br><span class="line">mysql&gt;  select * from user;</span><br><span class="line">mysql&gt;  select * from order_t;</span><br></pre></td></tr></table></figure><h2 id="第10章-MyCAT核心特性——分片（水平拆分）"><a href="#第10章-MyCAT核心特性——分片（水平拆分）" class="headerlink" title="第10章 MyCAT核心特性——分片（水平拆分）"></a>第10章 MyCAT核心特性——分片（水平拆分）</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="string">"bigtable"</span>，比如说t3表</span><br><span class="line"></span><br><span class="line">(1)行数非常多，800w</span><br><span class="line">(2)访问非常频繁</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"></span><br><span class="line">分片策略：</span><br><span class="line">范围 range  800w  1-400w 400w01-800w</span><br><span class="line">取模 mod    取余数</span><br><span class="line">枚举 </span><br><span class="line">哈希 <span class="built_in">hash</span> </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">ER分片</span><br></pre></td></tr></table></figure><h2 id="第11章-范围分片"><a href="#第11章-范围分片" class="headerlink" title="第11章 范围分片"></a>第11章 范围分片</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></pre></td><td class="code"><pre><span class="line">比如说t3表</span><br><span class="line">(1)行数非常多，2000w（1-1000w:sh1   1000w01-2000w:sh2）</span><br><span class="line">(2)访问非常频繁，用户访问较离散</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><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">##(1)准备配置文件 </span></span><br><span class="line">mv schema.xml schema.xml.1  </span><br><span class="line">vim schema.xml</span><br><span class="line">&lt;?xml version=<span class="string">"1.0"</span>?&gt;</span><br><span class="line">&lt;!DOCTYPE mycat:schema SYSTEM <span class="string">"schema.dtd"</span>&gt;</span><br><span class="line">&lt;mycat:schema xmlns:mycat=<span class="string">"http://io.mycat/"</span>&gt;</span><br><span class="line">&lt;schema name=<span class="string">"TESTDB"</span> checkSQLschema=<span class="string">"false"</span> sqlMaxLimit=<span class="string">"100"</span> dataNode=<span class="string">"sh1"</span>&gt;</span><br><span class="line">&lt;table name=<span class="string">"t3"</span> dataNode=<span class="string">"sh1,sh2"</span> rule=<span class="string">"auto-sharding-long"</span> /&gt;</span><br><span class="line">&lt;/schema&gt;</span><br><span class="line">    &lt;dataNode name=<span class="string">"sh1"</span> dataHost=<span class="string">"wufei1"</span> database= <span class="string">"taobao"</span> /&gt;</span><br><span class="line">    &lt;dataNode name=<span class="string">"sh2"</span> dataHost=<span class="string">"wufei2"</span> database= <span class="string">"taobao"</span> /&gt;</span><br><span class="line">    &lt;dataHost name=<span class="string">"wufei1"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt;</span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db3"</span> url=<span class="string">"10.0.1.52:3307"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db4"</span> url=<span class="string">"10.0.1.52:3309"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;/dataHost&gt;</span><br><span class="line">    &lt;dataHost name=<span class="string">"wufei2"</span> maxCon=<span class="string">"1000"</span> minCon=<span class="string">"10"</span> balance=<span class="string">"1"</span>  writeType=<span class="string">"0"</span> dbType=<span class="string">"mysql"</span>  dbDriver=<span class="string">"native"</span> switchType=<span class="string">"1"</span>&gt;</span><br><span class="line">        &lt;heartbeat&gt;select user()&lt;/heartbeat&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db1"</span> url=<span class="string">"10.0.1.51:3308"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db2"</span> url=<span class="string">"10.0.1.51:3310"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;writeHost host=<span class="string">"db3"</span> url=<span class="string">"10.0.1.52:3308"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span>&gt;</span><br><span class="line">            &lt;readHost host=<span class="string">"db4"</span> url=<span class="string">"10.0.1.52:3310"</span> user=<span class="string">"root"</span> password=<span class="string">"123"</span> /&gt;</span><br><span class="line">    &lt;/writeHost&gt;</span><br><span class="line">    &lt;/dataHost&gt;</span><br><span class="line">&lt;/mycat:schema&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">##(2)查看分片策略的使用方法:</span></span><br><span class="line">vim rule.xml</span><br><span class="line"></span><br><span class="line">&lt;tableRule name=<span class="string">"auto-sharding-long"</span>&gt;</span><br><span class="line">                &lt;rule&gt;</span><br><span class="line">                        &lt;columns&gt;id&lt;/columns&gt;</span><br><span class="line">                        &lt;algorithm&gt;rang-long&lt;/algorithm&gt;</span><br><span class="line">                &lt;/rule&gt;    </span><br><span class="line"><span class="comment">##(3) 函数使用方法</span></span><br><span class="line">&lt;<span class="keyword">function</span> name=<span class="string">"rang-long"</span></span><br><span class="line">    class=<span class="string">"io.mycat.route.function.AutoPartitionByLong"</span>&gt;</span><br><span class="line">    &lt;property name=<span class="string">"mapFile"</span>&gt;autopartition-long.txt&lt;/property&gt;</span><br><span class="line">&lt;/<span class="keyword">function</span>&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">##(4) 函数传参   </span></span><br><span class="line">vim autopartition-long.txt</span><br><span class="line">0-10=0</span><br><span class="line">10-20=1  </span><br><span class="line"></span><br><span class="line"><span class="comment">##创建测试表：</span></span><br><span class="line">mysql -S /data/3307/mysql.sock -e <span class="string">"use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);"</span></span><br><span class="line"></span><br><span class="line">mysql -S /data/3308/mysql.sock  -e <span class="string">"use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">##重启mycat测试</span></span><br><span class="line">mycat restart</span><br><span class="line">mysql -uroot -p123456 -h 127.0.0.1 -P 8066</span><br><span class="line">insert into t3(id,name) values(1,<span class="string">'a'</span>);</span><br><span class="line">insert into t3(id,name) values(2,<span class="string">'b'</span>);</span><br><span class="line">insert into t3(id,name) values(3,<span class="string">'c'</span>);</span><br><span class="line">insert into t3(id,name) values(4,<span class="string">'d'</span>);</span><br><span class="line">insert into t3(id,name) values(11,<span class="string">'aa'</span>);</span><br><span class="line">insert into t3(id,name) values(12,<span class="string">'bb'</span>);</span><br><span class="line">insert into t3(id,name) values(13,<span class="string">'cc'</span>);</span><br><span class="line">insert into t3(id,name) values(14,<span class="string">'dd'</span>);</span><br></pre></td></tr></table></figure><h2 id="第12章-取模分片（mod-long"><a href="#第12章-取模分片（mod-long" class="headerlink" title="第12章 取模分片（mod-long"></a>第12章 取模分片（mod-long</h2>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="http://linuxwf.com/tags/mysql/"/>
    
      <category term="mycat" scheme="http://linuxwf.com/tags/mycat/"/>
    
  </entry>
  
  <entry>
    <title>10.读写分离架构-Atlas</title>
    <link href="http://linuxwf.com/2020/04/15/10-%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%9E%B6%E6%9E%84-Atlas/"/>
    <id>http://linuxwf.com/2020/04/15/10-%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%9E%B6%E6%9E%84-Atlas/</id>
    <published>2020-04-15T02:41:00.000Z</published>
    <updated>2020-04-15T02:42:34.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="第10节-读写分离架构-Atlas"><a href="#第10节-读写分离架构-Atlas" class="headerlink" title="第10节 读写分离架构-Atlas"></a>第10节 读写分离架构-Atlas</h1><h2 id="第1章-Atlas介绍"><a href="#第1章-Atlas介绍" class="headerlink" title="第1章 Atlas介绍"></a>第1章 Atlas介绍</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"><span class="comment">#Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。</span></span><br><span class="line">它是在mysql-proxy 0.8.2版本的基础上，对其进行了优化，增加了一些新的功能特性。</span><br><span class="line">360内部使用Atlas运行的mysql业务，每天承载的读写请求数达几十亿条。</span><br><span class="line"><span class="comment">#下载地址</span></span><br><span class="line">https://github.com/Qihoo360/Atlas/releases</span><br><span class="line"><span class="comment">#注意：</span></span><br><span class="line">1、Atlas只能安装运行在64位的系统上</span><br><span class="line">2、Centos 5.X安装 Atlas-XX.el5.x86_64.rpm，Centos 6.X安装Atlas-XX.el6.x86_64.rpm。</span><br><span class="line">3、后端mysql版本应大于5.1，建议使用Mysql 5.6以上</span><br></pre></td></tr></table></figure><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql18.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql19.png"  alt=""></p><h2 id="第2章-安装配置"><a href="#第2章-安装配置" class="headerlink" title="第2章 安装配置"></a>第2章 安装配置</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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># yum -y install Atlas-2.2.1.el6.x86_64.rpm</span></span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/mysql-proxy/conf</span><br><span class="line">mv test.cnf test.cnf.bak</span><br><span class="line">cat &gt; test.cnf &lt;&lt;EOF</span><br><span class="line">[mysql-proxy]</span><br><span class="line">admin-username = user</span><br><span class="line">admin-password = <span class="built_in">pwd</span></span><br><span class="line">proxy-backend-addresses = 10.0.1.55:3306</span><br><span class="line">proxy-read-only-backend-addresses = 10.0.1.51:3306,10.0.1.53:3306</span><br><span class="line">pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=</span><br><span class="line">daemon = <span class="literal">true</span></span><br><span class="line">keepalive = <span class="literal">true</span></span><br><span class="line">event-threads = 8</span><br><span class="line"><span class="built_in">log</span>-level = message</span><br><span class="line"><span class="built_in">log</span>-path = /usr/<span class="built_in">local</span>/mysql-proxy/<span class="built_in">log</span></span><br><span class="line">sql-log=ON</span><br><span class="line">proxy-address = 0.0.0.0:33060</span><br><span class="line">admin-address = 0.0.0.0:2345</span><br><span class="line">charset=utf8</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"><span class="comment">#启动atlas</span></span><br><span class="line">[root@db03 ~]<span class="comment"># /usr/local/mysql-proxy/bin/mysql-proxyd test start</span></span><br><span class="line">OK: MySQL-Proxy of <span class="built_in">test</span> is started</span><br><span class="line">[root@db03 ~]<span class="comment"># netstat -lnp|grep mysql</span></span><br><span class="line">tcp        0      0 0.0.0.0:33060           0.0.0.0:*               LISTEN      1470/mysql-proxy    </span><br><span class="line">tcp        0      0 0.0.0.0:2345            0.0.0.0:*               LISTEN      1470/mysql-proxy    </span><br><span class="line">tcp6       0      0 :::3306                 :::*                    LISTEN      1214/mysqld         </span><br><span class="line">unix  2      [ ACC ]     STREAM     LISTENING     20238    1214/mysqld          /tmp/mysql.sock</span><br></pre></td></tr></table></figure><h2 id="第3章-Atlas功能测试"><a href="#第3章-Atlas功能测试" class="headerlink" title="第3章 Atlas功能测试"></a>第3章 Atlas功能测试</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#测试读操作：</span></span><br><span class="line">mysql -umha -pmha  -h 10.0.1.53 -P 33060 </span><br><span class="line">db03 [(none)]&gt;select @@server_id;</span><br><span class="line">+-------------+</span><br><span class="line">| @@server_id |</span><br><span class="line">+-------------+</span><br><span class="line">|          53 |</span><br><span class="line">+-------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">db03 [(none)]&gt;select @@server_id;</span><br><span class="line">+-------------+</span><br><span class="line">| @@server_id |</span><br><span class="line">+-------------+</span><br><span class="line">|          51 |</span><br><span class="line">+-------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"><span class="comment">#测试写操作：</span></span><br><span class="line">db03 [(none)]&gt;begin;select @@server_id;commit;</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">+-------------+</span><br><span class="line">| @@server_id |</span><br><span class="line">+-------------+</span><br><span class="line">|          52 |</span><br><span class="line">+-------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br></pre></td></tr></table></figure><h2 id="第4章-生产用户要求"><a href="#第4章-生产用户要求" class="headerlink" title="第4章 生产用户要求"></a>第4章 生产用户要求</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#开发人员申请一个应用用户 app(  select  update  insert)  密码123456,要通过10网段登录</span></span><br><span class="line">1. 在主库中,创建用户</span><br><span class="line">grant select,update,insert on *.* to app@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123456'</span>;</span><br><span class="line">2. 在atlas中添加生产用户</span><br><span class="line">[root@db03 ~]<span class="comment"># /usr/local/mysql-proxy/bin/encrypt 123456  ----&gt; 制作加密密码</span></span><br><span class="line">/iZxz+0GRoA=</span><br><span class="line">[root@db03 /usr/<span class="built_in">local</span>/mysql-proxy/conf]<span class="comment"># vim test.cnf</span></span><br><span class="line">pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,app:/iZxz+0GRoA=</span><br><span class="line">/usr/<span class="built_in">local</span>/mysql-proxy/bin/mysql-proxyd <span class="built_in">test</span> restart</span><br><span class="line">[root@db03 conf]<span class="comment"># mysql -uapp -p123456  -h 10.0.1.53 -P 33060</span></span><br></pre></td></tr></table></figure><h2 id="第5章-Atlas基本管理"><a href="#第5章-Atlas基本管理" class="headerlink" title="第5章  Atlas基本管理"></a>第5章  Atlas基本管理</h2><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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># mysql -uuser -ppwd -h127.0.0.1 -P2345</span></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></pre></td><td class="code"><pre><span class="line">db03 [(none)]&gt;select * from <span class="built_in">help</span>;</span><br><span class="line">+----------------------------+---------------------------------------------------------+</span><br><span class="line">| <span class="built_in">command</span>                    | description                                             |</span><br><span class="line">+----------------------------+---------------------------------------------------------+</span><br><span class="line">| SELECT * FROM <span class="built_in">help</span>         | shows this <span class="built_in">help</span>                                         |</span><br><span class="line">| SELECT * FROM backends     | lists the backends and their state                      |</span><br><span class="line">| SET OFFLINE <span class="variable">$backend_id</span>    | offline backend server, <span class="variable">$backend_id</span> is backend_ndx<span class="string">'s id |</span></span><br><span class="line"><span class="string">| SET ONLINE $backend_id     | online backend server, ...                              |</span></span><br><span class="line"><span class="string">| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |</span></span><br><span class="line"><span class="string">| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |</span></span><br><span class="line"><span class="string">| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |</span></span><br><span class="line"><span class="string">| SELECT * FROM clients      | lists the clients                                       |</span></span><br><span class="line"><span class="string">| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |</span></span><br><span class="line"><span class="string">| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |</span></span><br><span class="line"><span class="string">| SELECT * FROM pwds         | lists the pwds                                          |</span></span><br><span class="line"><span class="string">| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |</span></span><br><span class="line"><span class="string">| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |</span></span><br><span class="line"><span class="string">| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |</span></span><br><span class="line"><span class="string">| SAVE CONFIG                | save the backends to config file                        |</span></span><br><span class="line"><span class="string">| SELECT VERSION             | display the version of Atlas                            |</span></span><br><span class="line"><span class="string">+----------------------------+---------------------------------------------------------+</span></span><br><span class="line"><span class="string">16 rows in set (0.00 sec)</span></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></pre></td><td class="code"><pre><span class="line">db03 [(none)]&gt; SELECT * FROM backends;</span><br><span class="line">+-------------+----------------+-------+------+</span><br><span class="line">| backend_ndx | address        | state | <span class="built_in">type</span> |</span><br><span class="line">+-------------+----------------+-------+------+</span><br><span class="line">|           1 | 10.0.1.55:3306 | up    | rw   |</span><br><span class="line">|           2 | 10.0.1.51:3306 | up    | ro   |</span><br><span class="line">|           3 | 10.0.1.53:3306 | up    | ro   |</span><br><span class="line">+-------------+----------------+-------+------+</span><br><span class="line">3 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</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></pre></td><td class="code"><pre><span class="line">REMOVE BACKEND 3;               <span class="comment">#动态删除节点</span></span><br><span class="line">ADD SLAVE 10.0.1.53:3306;       <span class="comment">#动态添加节点</span></span><br><span class="line">SAVE CONFIG;<span class="comment">#保存配置</span></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></pre></td><td class="code"><pre><span class="line">SELECT * FROM backends; -----&gt;查了所有节点</span><br><span class="line">SET OFFLINE <span class="variable">$backend_id</span>/SET ONLINE <span class="variable">$backend_id</span>   ---&gt;下线、上线</span><br><span class="line">REMOVE BACKEND <span class="variable">$backend_id</span> /ADD SLAVE <span class="variable">$backend</span>   ---&gt;删除、添加节点</span><br><span class="line">SELECT * FROM pwds  / REMOVE PWD <span class="variable">$pwd</span>/ ADD PWD <span class="variable">$pwd</span> ---&gt;查看用户、密码，在线添加删除</span><br><span class="line">save config;   ---&gt;保存配置</span><br></pre></td></tr></table></figure><h2 id="第6章-自动分表"><a href="#第6章-自动分表" class="headerlink" title="第6章 自动分表"></a>第6章 自动分表</h2><h3 id="6-1-介绍"><a href="#6-1-介绍" class="headerlink" title="6.1 介绍"></a>6.1 介绍</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></pre></td><td class="code"><pre><span class="line">使用Atlas的分表功能时，首先需要在配置文件test.cnf设置tables参数。</span><br><span class="line">tables参数设置格式：数据库名.表名.分表字段.子表数量，</span><br><span class="line">比如：</span><br><span class="line">你的数据库名叫school，表名叫stu，分表字段叫id，总共分为2张表，那么就写为school.stu.id.2，如果还有其他的分表，以逗号分隔即可。</span><br></pre></td></tr></table></figure><h2 id="第7章-读写分离建议"><a href="#第7章-读写分离建议" class="headerlink" title="第7章 读写分离建议"></a>第7章 读写分离建议</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></pre></td><td class="code"><pre><span class="line">MySQL-Router    ---&gt; MySQL官方</span><br><span class="line">ProxySQL         ---&gt;Percona</span><br><span class="line">Maxscale         ---&gt; MariaDB</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="http://linuxwf.com/tags/mysql/"/>
    
      <category term="Atlas" scheme="http://linuxwf.com/tags/Atlas/"/>
    
  </entry>
  
  <entry>
    <title>9.MHA高可用</title>
    <link href="http://linuxwf.com/2020/04/15/9-MHA%E9%AB%98%E5%8F%AF%E7%94%A8/"/>
    <id>http://linuxwf.com/2020/04/15/9-MHA%E9%AB%98%E5%8F%AF%E7%94%A8/</id>
    <published>2020-04-15T02:26:00.000Z</published>
    <updated>2020-04-15T02:27:17.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="MHA高可用"><a href="#MHA高可用" class="headerlink" title="MHA高可用"></a>MHA高可用</h1><h2 id="第1章-主从复制架构演变介绍"><a href="#第1章-主从复制架构演变介绍" class="headerlink" title="第1章 主从复制架构演变介绍"></a>第1章 主从复制架构演变介绍</h2><h3 id="1-1-基本结构"><a href="#1-1-基本结构" class="headerlink" title="1.1 基本结构"></a>1.1 基本结构</h3><figure class="highlight plain"><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">（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></tr></table></figure><h3 id="1-2-高级应用架构演变"><a href="#1-2-高级应用架构演变" class="headerlink" title="1.2 高级应用架构演变"></a>1.2 高级应用架构演变</h3><h4 id="1-2-1-高性能架构"><a href="#1-2-1-高性能架构" class="headerlink" title="1.2.1 高性能架构"></a>1.2.1 高性能架构</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><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">读写分离架构(读性能较高)</span><br><span class="line">代码级别</span><br><span class="line">MySQL proxy (Atlas,mysql router,proxySQL(percona),maxscale)、</span><br><span class="line">amoeba(taobao)</span><br><span class="line">xx-dbproxy等。</span><br><span class="line">分布式架构(读写性能都提高):</span><br><span class="line">分库分表——cobar---&gt;TDDL(头都大了),DRDS</span><br><span class="line">Mycat---&gt;DBLE自主研发等。</span><br><span class="line">NewSQL--&gt;TiDB</span><br></pre></td></tr></table></figure><h4 id="1-2-2-高可用架构"><a href="#1-2-2-高可用架构" class="headerlink" title="1.2.2 高可用架构"></a>1.2.2 高可用架构</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">（1）单活:MMM架构——mysql-mmm（google）</span><br><span class="line">（2）单活:MHA架构——mysql-master-ha（日本DeNa）,T-MHA</span><br><span class="line">（3）多活:MGR ——5.7 新特性 MySQL Group replication(5.7.17) ---&gt;Innodb Cluster  </span><br><span class="line">（4）多活:MariaDB Galera Cluster架构,(PXC)Percona XtraDB Cluster、</span><br><span class="line">MySQL Cluster(Oracle rac)架构</span><br></pre></td></tr></table></figure><h2 id="第2章-高可用MHA"><a href="#第2章-高可用MHA" class="headerlink" title="第2章 高可用MHA"></a>第2章 高可用MHA</h2><h3 id="2-1-工作原理"><a href="#2-1-工作原理" class="headerlink" title="2.1 工作原理"></a>2.1 工作原理</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></pre></td><td class="code"><pre><span class="line">主库宕机处理过程</span><br><span class="line">1. 监控节点 (通过配置文件获取所有节点信息)</span><br><span class="line">   系统,网络,SSH连接性</span><br><span class="line">   主从状态,重点是主库</span><br><span class="line"></span><br><span class="line">2. 选主</span><br><span class="line">(1) 如果判断从库(position或者GTID),数据有差异,最接近于Master的slave,成为备选主</span><br><span class="line">(2) 如果判断从库(position或者GTID),数据一致,按照配置文件顺序,选主.</span><br><span class="line">(3) 如果设定有权重(candidate_master=1),按照权重强制指定备选主.</span><br><span class="line">    1. 默认情况下如果一个slave落后master 100M的relay logs的话，即使有权重,也会失效.</span><br><span class="line">    2. 如果check_repl_delay=0的化,即使落后很多日志,也强制选择其为备选主</span><br><span class="line">3. 数据补偿</span><br><span class="line">(1) 当SSH能连接,从库对比主库GTID 或者position号,立即将二进制日志保存至各个从节点并且应用(save_binary_logs )</span><br><span class="line">(2) 当SSH不能连接, 对比从库之间的relaylog的差异(apply_diff_relay_logs) </span><br><span class="line">4. Failover</span><br><span class="line">将备选主进行身份切换,对外提供服务</span><br><span class="line">其余从库和新主库确认新的主从关系</span><br><span class="line">5. 应用透明(VIP)</span><br><span class="line">6. 故障切换通知(send_reprt)</span><br><span class="line">7. 二次数据补偿(binlog_server)</span><br><span class="line">8. 自愈自治(待开发...)</span><br></pre></td></tr></table></figure><h3 id="2-2-架构介绍"><a href="#2-2-架构介绍" class="headerlink" title="2.2 架构介绍"></a>2.2 架构介绍</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></pre></td><td class="code"><pre><span class="line">1主2从，master：db01   slave：db02   db03 ）：</span><br><span class="line">MHA 高可用方案软件构成</span><br><span class="line">Manager软件：选择一个从节点安装</span><br><span class="line">Node软件：所有节点都要安装</span><br></pre></td></tr></table></figure><h3 id="2-3-MHA软件构成"><a href="#2-3-MHA软件构成" class="headerlink" title="2.3 MHA软件构成"></a>2.3 MHA软件构成</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></pre></td><td class="code"><pre><span class="line">Manager工具包主要包括以下几个工具：</span><br><span class="line">masterha_manger             启动MHA </span><br><span class="line">masterha_check_ssh      检查MHA的SSH配置状况 </span><br><span class="line">masterha_check_repl         检查MySQL复制状况 </span><br><span class="line">masterha_master_monitor     检测master是否宕机 </span><br><span class="line">masterha_check_status       检测当前MHA运行状态 </span><br><span class="line">masterha_master_switch  控制故障转移（自动或者手动）</span><br><span class="line">masterha_conf_host      添加或删除配置的server信息</span><br><span class="line"></span><br><span class="line">Node工具包主要包括以下几个工具：</span><br><span class="line">这些工具通常由MHA Manager的脚本触发，无需人为操作</span><br><span class="line">save_binary_logs            保存和复制master的二进制日志 </span><br><span class="line">apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的</span><br><span class="line">purge_relay_logs            清除中继日志（不会阻塞SQL线程）</span><br></pre></td></tr></table></figure><h3 id="2-4-MHA环境搭建"><a href="#2-4-MHA环境搭建" class="headerlink" title="2.4 MHA环境搭建"></a>2.4 MHA环境搭建</h3><h4 id="2-4-1-规划"><a href="#2-4-1-规划" class="headerlink" title="2.4.1 规划"></a>2.4.1 规划</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></pre></td><td class="code"><pre><span class="line">主库: 51    node </span><br><span class="line">从库: 52    node</span><br><span class="line">53    node    manager</span><br></pre></td></tr></table></figure><h4 id="2-4-2-准备环境-1主2从GTID"><a href="#2-4-2-准备环境-1主2从GTID" class="headerlink" title="2.4.2 准备环境(1主2从GTID)"></a>2.4.2 准备环境(1主2从GTID)</h4><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></pre></td><td class="code"><pre><span class="line">pkill mysqld</span><br><span class="line">rm -rf /data/mysql/data/*</span><br><span class="line">rm -rf /data/binlog/*</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></pre></td><td class="code"><pre><span class="line">主库db01：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql/</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=51</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db01 [\\d]&gt;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">slave1(db02)：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/data/mysql</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=52</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db02 [\\d]&gt;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">slave2(db03)：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/data/mysql</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=53</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db03 [\\d]&gt;</span><br><span class="line">EOF</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></pre></td><td class="code"><pre><span class="line">mysqld --initialize-insecure --user=mysql --basedir=/usr/<span class="built_in">local</span>/mysql  --datadir=/data/mysql/data</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></pre></td><td class="code"><pre><span class="line">/etc/init.d/mysqld start</span><br><span class="line">systemctl start mysqld</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></pre></td><td class="code"><pre><span class="line">master:51slave:52,53</span><br><span class="line"></span><br><span class="line"><span class="comment">#51</span></span><br><span class="line">grant replication slave  on *.* to repl@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">#52、53</span></span><br><span class="line">change master to </span><br><span class="line">master_host=<span class="string">'10.0.1.51'</span>,</span><br><span class="line">master_user=<span class="string">'repl'</span>,</span><br><span class="line">master_password=<span class="string">'123'</span> ,</span><br><span class="line">MASTER_AUTO_POSITION=1;</span><br><span class="line"></span><br><span class="line">start slave;</span><br></pre></td></tr></table></figure><h4 id="2-4-3-配置关键程序软连接"><a href="#2-4-3-配置关键程序软连接" class="headerlink" title="2.4.3 配置关键程序软连接"></a>2.4.3 配置关键程序软连接</h4><figure class="highlight bash"><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">ln -s /data/mysql/bin/mysqlbinlog    /usr/bin/mysqlbinlog</span><br><span class="line">ln -s /data/mysql/bin/mysql          /usr/bin/mysql</span><br></pre></td></tr></table></figure><h4 id="2-4-4-配置各节点互信"><a href="#2-4-4-配置各节点互信" class="headerlink" title="2.4.4 配置各节点互信"></a>2.4.4 配置各节点互信</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><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></pre></td><td class="code"><pre><span class="line">db01：</span><br><span class="line">rm -rf /root/.ssh </span><br><span class="line">ssh-keygen</span><br><span class="line"><span class="built_in">cd</span> /root/.ssh </span><br><span class="line">mv id_rsa.pub authorized_keys</span><br><span class="line">scp -r /root/.ssh 10.0.1.52:/root/</span><br><span class="line">scp -r /root/.ssh 10.0.1.53:/root/</span><br><span class="line">各节点验证</span><br><span class="line">db01:</span><br><span class="line">ssh 10.0.1.51 date</span><br><span class="line">ssh 10.0.1.52 date</span><br><span class="line">ssh 10.0.1.53 date</span><br><span class="line">db02:</span><br><span class="line">ssh 10.0.1.51 date</span><br><span class="line">ssh 10.0.1.52 date</span><br><span class="line">ssh 10.0.1.53 date</span><br><span class="line">db03:</span><br><span class="line">ssh 10.0.1.51 date</span><br><span class="line">ssh 10.0.1.52 date</span><br><span class="line">ssh 10.0.1.53 date</span><br></pre></td></tr></table></figure><h4 id="2-4-5-安装软件"><a href="#2-4-5-安装软件" class="headerlink" title="2.4.5 安装软件"></a>2.4.5 安装软件</h4><p><strong>下载MHA软件</strong></p><figure class="highlight bash"><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">mha官网：https://code.google.com/archive/p/mysql-master-ha/</span><br><span class="line">github下载地址：https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads</span><br></pre></td></tr></table></figure><p><strong>所有节点安装Node软件依赖包</strong></p><figure class="highlight bash"><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">yum -y install perl-DBD-MySQL</span><br><span class="line">rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm</span><br></pre></td></tr></table></figure><p><strong>在db01主库中创建mha需要的用户</strong></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">grant all privileges on *.* to mha@<span class="string">'10.0.1.%'</span> identified by <span class="string">'mha'</span>;</span><br></pre></td></tr></table></figure><p><strong>Manager软件安装（db03）</strong></p><figure class="highlight bash"><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"><span class="comment"># yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes</span></span><br><span class="line"><span class="comment"># rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm</span></span><br></pre></td></tr></table></figure><p><strong>2.4.6 配置文件准备(db03)</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></pre></td><td class="code"><pre><span class="line"><span class="comment">#创建配置文件目录</span></span><br><span class="line"> mkdir -p /etc/mha</span><br><span class="line"><span class="comment">#创建日志目录</span></span><br><span class="line"> mkdir -p /var/<span class="built_in">log</span>/mha/app1</span><br><span class="line"><span class="comment">#编辑mha配置文件</span></span><br><span class="line">vim /etc/mha/app1.cnf</span><br><span class="line">[server default]</span><br><span class="line">manager_log=/var/<span class="built_in">log</span>/mha/app1/manager        </span><br><span class="line">manager_workdir=/var/<span class="built_in">log</span>/mha/app1            </span><br><span class="line">master_binlog_dir=/data/binlog       </span><br><span class="line">user=mha                                   </span><br><span class="line">password=mha                               </span><br><span class="line">ping_interval=2</span><br><span class="line">repl_password=123</span><br><span class="line">repl_user=repl</span><br><span class="line">ssh_user=root                               </span><br><span class="line">[server1]                                   </span><br><span class="line">hostname=10.0.1.51</span><br><span class="line">port=3306                                  </span><br><span class="line">[server2]            </span><br><span class="line">hostname=10.0.1.52</span><br><span class="line">port=3306</span><br><span class="line">[server3]</span><br><span class="line">hostname=10.0.1.53</span><br><span class="line">port=3306</span><br></pre></td></tr></table></figure><h4 id="2-4-7-状态检查"><a href="#2-4-7-状态检查" class="headerlink" title="2.4.7 状态检查"></a>2.4.7 状态检查</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><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">#互信检查</span></span><br><span class="line">[root@db03 ~]<span class="comment"># masterha_check_ssh  --conf=/etc/mha/app1.cnf </span></span><br><span class="line">Fri Oct 25 04:29:50 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [info] Reading application default configuration from /etc/mha/app1.cnf..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [info] Reading server configuration from /etc/mha/app1.cnf..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [info] Starting SSH connection tests..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug] </span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]  Connecting via SSH from root@10.0.1.51(10.0.1.51:22) to root@10.0.1.52(10.0.1.52:22)..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]  Connecting via SSH from root@10.0.1.51(10.0.1.51:22) to root@10.0.1.53(10.0.1.53:22)..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug] </span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]  Connecting via SSH from root@10.0.1.52(10.0.1.52:22) to root@10.0.1.51(10.0.1.51:22)..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]  Connecting via SSH from root@10.0.1.52(10.0.1.52:22) to root@10.0.1.53(10.0.1.53:22)..</span><br><span class="line">Fri Oct 25 04:29:50 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug] </span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug]  Connecting via SSH from root@10.0.1.53(10.0.1.53:22) to root@10.0.1.51(10.0.1.51:22)..</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug]  Connecting via SSH from root@10.0.1.53(10.0.1.53:22) to root@10.0.1.52(10.0.1.52:22)..</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [debug]   ok.</span><br><span class="line">Fri Oct 25 04:29:51 2019 - [info] All SSH connection tests passed successfully.</span><br><span class="line"></span><br><span class="line"><span class="comment">#主从状态检查</span></span><br><span class="line">[root@db03 ~]<span class="comment"># masterha_check_repl  --conf=/etc/mha/app1.cnf</span></span><br><span class="line">Fri Oct 25 04:51:22 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Fri Oct 25 04:51:22 2019 - [info] Reading application default configuration from /etc/mha/app1.cnf..</span><br><span class="line">Fri Oct 25 04:51:22 2019 - [info] Reading server configuration from /etc/mha/app1.cnf..</span><br><span class="line">Fri Oct 25 04:51:22 2019 - [info] MHA::MasterMonitor version 0.56.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] GTID failover mode = 1</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Dead Servers:</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Alive Servers:</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]   10.0.1.51(10.0.1.51:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]   10.0.1.52(10.0.1.52:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]   10.0.1.53(10.0.1.53:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Alive Slaves:</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]   10.0.1.52(10.0.1.52:3306)  Version=5.7.26-log (oldest major version between slaves) <span class="built_in">log</span>-bin:enabled</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]     GTID ON</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]     Replicating from 10.0.1.51(10.0.1.51:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]   10.0.1.53(10.0.1.53:3306)  Version=5.7.26-log (oldest major version between slaves) <span class="built_in">log</span>-bin:enabled</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]     GTID ON</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]     Replicating from 10.0.1.51(10.0.1.51:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Current Alive Master: 10.0.1.51(10.0.1.51:3306)</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Checking slave configurations..</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  read_only=1 is not <span class="built_in">set</span> on slave 10.0.1.52(10.0.1.52:3306).</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  read_only=1 is not <span class="built_in">set</span> on slave 10.0.1.53(10.0.1.53:3306).</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Checking replication filtering settings..</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  binlog_do_db= , binlog_ignore_db= </span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  Replication filtering check ok.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Checking SSH publickey authentication settings on the current master..</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] HealthCheck: SSH to 10.0.1.51 is reachable.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] </span><br><span class="line">10.0.1.51(10.0.1.51:3306) (current master)</span><br><span class="line"> +--10.0.1.52(10.0.1.52:3306)</span><br><span class="line"> +--10.0.1.53(10.0.1.53:3306)</span><br><span class="line"></span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Checking replication health on 10.0.1.52..</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  ok.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Checking replication health on 10.0.1.53..</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info]  ok.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [warning] master_ip_failover_script is not defined.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [warning] shutdown_script is not defined.</span><br><span class="line">Fri Oct 25 04:51:23 2019 - [info] Got <span class="built_in">exit</span> code 0 (Not master dead).</span><br><span class="line"></span><br><span class="line">MySQL Replication Health is OK.</span><br></pre></td></tr></table></figure><h4 id="2-4-8-开启MHA-db03-："><a href="#2-4-8-开启MHA-db03-：" class="headerlink" title="2.4.8 开启MHA(db03)："></a>2.4.8 开启MHA(db03)：</h4><figure class="highlight bash"><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">[root@db03 ~]<span class="comment"># nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  &lt; /dev/null&gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;</span></span><br><span class="line">[1] 1755</span><br></pre></td></tr></table></figure><h4 id="2-4-9-查看MHA状态"><a href="#2-4-9-查看MHA状态" class="headerlink" title="2.4.9 查看MHA状态"></a>2.4.9 查看MHA状态</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><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">[root@db03 ~]<span class="comment"># masterha_check_status --conf=/etc/mha/app1.cnf</span></span><br><span class="line">app1 (pid:1755) is running(0:PING_OK), master:10.0.1.51</span><br><span class="line"></span><br><span class="line">[root@db03 ~]<span class="comment"># mysql -umha -pmha -h 10.0.1.51 -e "show variables like 'server_id'"</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">+---------------+-------+</span><br><span class="line">| Variable_name | Value |</span><br><span class="line">+---------------+-------+</span><br><span class="line">| server_id     | 51    |</span><br><span class="line">+---------------+-------+</span><br><span class="line">[root@db03 ~]<span class="comment"># mysql -umha -pmha -h 10.0.1.52 -e "show variables like 'server_id'"</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">+---------------+-------+</span><br><span class="line">| Variable_name | Value |</span><br><span class="line">+---------------+-------+</span><br><span class="line">| server_id     | 52    |</span><br><span class="line">+---------------+-------+</span><br><span class="line">[root@db03 ~]<span class="comment"># mysql -umha -pmha -h 10.0.1.53 -e "show variables like 'server_id'"</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">+---------------+-------+</span><br><span class="line">| Variable_name | Value |</span><br><span class="line">+---------------+-------+</span><br><span class="line">| server_id     | 53    |</span><br><span class="line">+---------------+-------+</span><br></pre></td></tr></table></figure><h4 id="2-4-10-故障模拟及处理"><a href="#2-4-10-故障模拟及处理" class="headerlink" title="2.4.10 故障模拟及处理"></a>2.4.10 故障模拟及处理</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">### 停主库db01:    </span></span><br><span class="line">[root@db01 ~]<span class="comment"># systemctl stop mysqld</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#观察manager  日志 tail -f /var/log/mha/app1/manager 末尾必须显示successfully，才算正常切换成功。 </span></span><br><span class="line">[root@db03 ~]<span class="comment"># tail -f /var/log/mha/app1/manager</span></span><br><span class="line">Master 10.0.1.51(10.0.1.51:3306) is down!</span><br><span class="line"></span><br><span class="line">Check MHA Manager logs at db03:/var/<span class="built_in">log</span>/mha/app1/manager <span class="keyword">for</span> details.</span><br><span class="line"></span><br><span class="line">Started automated(non-interactive) failover.</span><br><span class="line">Selected 10.0.1.52(10.0.1.52:3306) as a new master.</span><br><span class="line">10.0.1.52(10.0.1.52:3306): OK: Applying all logs succeeded.</span><br><span class="line">10.0.1.53(10.0.1.53:3306): OK: Slave started, replicating from 10.0.1.52(10.0.1.52:3306)</span><br><span class="line">10.0.1.52(10.0.1.52:3306): Resetting slave info succeeded.</span><br><span class="line">Master failover to 10.0.1.52(10.0.1.52:3306) completed successfully.</span><br></pre></td></tr></table></figure><p><strong>查看db02变成主库</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></pre></td><td class="code"><pre><span class="line">db02 [(none)]&gt;show master status;</span><br><span class="line">+------------------+----------+--------------+------------------+------------------------------------------+</span><br><span class="line">| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |</span><br><span class="line">+------------------+----------+--------------+------------------+------------------------------------------+</span><br><span class="line">| mysql-bin.000003 |      194 |              |                  | 39b29c3b-f69b-11e9-a428-000c29cfb981:1-4 |</span><br><span class="line">+------------------+----------+--------------+------------------+------------------------------------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">db03 [(none)]&gt;show slave status \G</span><br><span class="line">*************************** 1. row ***************************</span><br><span class="line">               Slave_IO_State: Waiting <span class="keyword">for</span> master to send event</span><br><span class="line">                  Master_Host: 10.0.1.52</span><br><span class="line">                  Master_User: repl</span><br><span class="line">                  Master_Port: 3306</span><br><span class="line">                Connect_Retry: 60</span><br><span class="line">              Master_Log_File: mysql-bin.000003</span><br><span class="line">          Read_Master_Log_Pos: 194</span><br><span class="line">               Relay_Log_File: db03-relay-bin.000002</span><br><span class="line">                Relay_Log_Pos: 367</span><br><span class="line">        Relay_Master_Log_File: mysql-bin.000003</span><br><span class="line">             Slave_IO_Running: Yes</span><br><span class="line">            Slave_SQL_Running: Yes</span><br></pre></td></tr></table></figure><p><strong>启动db01</strong></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">[root@db01 ~]<span class="comment"># systemctl start mysqld</span></span><br></pre></td></tr></table></figure><p><strong>恢复主从结构，db02变成主库</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">db01 [(none)]&gt;CHANGE MASTER TO </span><br><span class="line">    -&gt; MASTER_HOST=<span class="string">'10.0.1.52'</span>,</span><br><span class="line">    -&gt; MASTER_PORT=3306, </span><br><span class="line">    -&gt; MASTER_AUTO_POSITION=1, </span><br><span class="line">    -&gt; MASTER_USER=<span class="string">'repl'</span>, </span><br><span class="line">    -&gt; MASTER_PASSWORD=<span class="string">'123'</span>;</span><br><span class="line"></span><br><span class="line">db01 [(none)]&gt;show slave status \G</span><br><span class="line">*************************** 1. row ***************************</span><br><span class="line">               Slave_IO_State: Waiting <span class="keyword">for</span> master to send event</span><br><span class="line">                  Master_Host: 10.0.1.52</span><br><span class="line">                  Master_User: repl</span><br><span class="line">                  Master_Port: 3306</span><br><span class="line">                Connect_Retry: 60</span><br><span class="line">              Master_Log_File: mysql-bin.000003</span><br><span class="line">          Read_Master_Log_Pos: 194</span><br><span class="line">               Relay_Log_File: db01-relay-bin.000002</span><br><span class="line">                Relay_Log_Pos: 367</span><br><span class="line">        Relay_Master_Log_File: mysql-bin.000003</span><br><span class="line">             Slave_IO_Running: Yes</span><br><span class="line">            Slave_SQL_Running: Yes</span><br></pre></td></tr></table></figure><p><strong>修改db03 MHA配置文件</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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># vim /etc/mha/app1.cnf</span></span><br><span class="line">[server1]</span><br><span class="line">hostname=10.0.1.51</span><br><span class="line">port=3306</span><br></pre></td></tr></table></figure><p><strong>启动MHA</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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  &lt; /dev/null&gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;</span></span><br><span class="line">[1] 1959</span><br><span class="line">[root@db03 ~]<span class="comment"># masterha_check_status --conf=/etc/mha/app1.cnf</span></span><br><span class="line">app1 (pid:1959) is running(0:PING_OK), master:10.0.1.52</span><br></pre></td></tr></table></figure><h4 id="2-4-11-Manager额外参数介绍"><a href="#2-4-11-Manager额外参数介绍" class="headerlink" title="2.4.11 Manager额外参数介绍"></a>2.4.11 Manager额外参数介绍</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><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><br><span class="line">主库宕机谁来接管？</span><br><span class="line">1. 所有从节点日志都是一致的，默认会以配置文件的顺序去选择一个新主。</span><br><span class="line">2. 从节点日志不一致，自动选择最接近于主库的从库</span><br><span class="line">3. 如果对于某节点设定了权重（candidate_master=1），权重节点会优先选择。</span><br><span class="line">但是此节点日志量落后主库100M日志的话，也不会被选择。可以配合check_repl_delay=0，关闭日志量的检查，强制选择候选节点。</span><br><span class="line"></span><br><span class="line">(1)  ping_interval=1</span><br><span class="line"><span class="comment">#设置监控主库，发送ping包的时间间隔，尝试三次没有回应的时候自动进行failover</span></span><br><span class="line">(2) candidate_master=1</span><br><span class="line"><span class="comment">#设置为候选master，如果设置该参数以后，发生主从切换以后将会将此从库提升为主库，即使这个主库不是集群中事件最新的slave</span></span><br><span class="line">(3)check_repl_delay=0</span><br><span class="line"><span class="comment">#默认情况下如果一个slave落后master 100M的relay logs的话，</span></span><br><span class="line">MHA将不会选择该slave作为一个新的master，因为对于这个slave的恢复需要花费很长时间，通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时，这个参数对于设置了candidate_master=1的主机非常有用，因为这个候选主在切换的过程中一定是新的master</span><br></pre></td></tr></table></figure><h4 id="2-4-12-MHA-的vip功能"><a href="#2-4-12-MHA-的vip功能" class="headerlink" title="2.4.12 MHA 的vip功能"></a>2.4.12 MHA 的vip功能</h4><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></pre></td><td class="code"><pre><span class="line">vim /etc/mha/app1.cnf</span><br><span class="line">master_ip_failover_script=/usr/<span class="built_in">local</span>/bin/master_ip_failover</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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># cp master_ip_failover.txt /usr/local/bin/master_ip_failover</span></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">[root@db03 ~]<span class="comment"># vim  /usr/local/bin/master_ip_failover</span></span><br><span class="line">修改为:</span><br><span class="line">my <span class="variable">$vip</span> = <span class="string">'10.0.1.55/24'</span>;</span><br><span class="line">my <span class="variable">$key</span> = <span class="string">'1'</span>;</span><br><span class="line">my <span class="variable">$ssh_start_vip</span> = <span class="string">"/sbin/ifconfig eth0:<span class="variable">$key</span> <span class="variable">$vip</span>"</span>;</span><br><span class="line">my <span class="variable">$ssh_stop_vip</span> = <span class="string">"/sbin/ifconfig eth0:<span class="variable">$key</span> down"</span>;</span><br><span class="line"></span><br><span class="line">[root@db03 ~]<span class="comment"># yum -y install dos2unix</span></span><br><span class="line">[root@db03 ~]<span class="comment"># dos2unix /usr/local/bin/master_ip_failover </span></span><br><span class="line">dos2unix: converting file /usr/<span class="built_in">local</span>/bin/master_ip_failover to Unix format ...</span><br><span class="line">[root@db03 ~]<span class="comment"># chmod +x /usr/local/bin/master_ip_failover</span></span><br></pre></td></tr></table></figure><p><strong>主库上，手工生成第一个vip地址</strong></p><figure class="highlight bash"><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">手工在主库上绑定vip，注意一定要和配置文件中的ethN一致，我的是eth0:1(1是key指定的值)</span><br><span class="line">ifconfig eth0:1 10.0.1.55/24</span><br></pre></td></tr></table></figure><p><strong>重启mha</strong></p><figure class="highlight bash"><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">[root@db03 ~]<span class="comment"># nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover  &lt; /dev/null&gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;</span></span><br><span class="line">[root@db03 ~]<span class="comment"># masterha_check_status --conf=/etc/mha/app1.cnf</span></span><br></pre></td></tr></table></figure><h4 id="2-4-13-邮件提醒"><a href="#2-4-13-邮件提醒" class="headerlink" title="2.4.13 邮件提醒"></a>2.4.13 邮件提醒</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><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></pre></td><td class="code"><pre><span class="line">1. 参数：</span><br><span class="line">report_script=/usr/<span class="built_in">local</span>/bin/send</span><br><span class="line">2. 准备邮件脚本</span><br><span class="line">send_report</span><br><span class="line">(1)准备发邮件的脚本(上传 email_2019-最新.zip中的脚本，到/usr/<span class="built_in">local</span>/bin/中)</span><br><span class="line">(2)将准备好的脚本添加到mha配置文件中,让其调用</span><br><span class="line">[root@db03 /usr/<span class="built_in">local</span>/bin]<span class="comment"># chmod +x send</span></span><br><span class="line">[root@db03 /usr/<span class="built_in">local</span>/bin]<span class="comment"># chmod +x sendEmail </span></span><br><span class="line">[root@db03 /usr/<span class="built_in">local</span>/bin]<span class="comment"># chmod +x testpl</span></span><br><span class="line"></span><br><span class="line">3. 修改manager配置文件，调用邮件脚本</span><br><span class="line">vi /etc/mha/app1.cnf</span><br><span class="line">report_script=/usr/<span class="built_in">local</span>/bin/send</span><br><span class="line"></span><br><span class="line">（3）停止MHA</span><br><span class="line">masterha_stop --conf=/etc/mha/app1.cnf</span><br><span class="line">（4）开启MHA    </span><br><span class="line">nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover &lt; /dev/null &gt; /var/<span class="built_in">log</span>/mha/app1/manager.log 2&gt;&amp;1 &amp;</span><br><span class="line">        </span><br><span class="line">(5) 关闭主库,看警告邮件  </span><br><span class="line">故障修复：</span><br><span class="line">1. 恢复故障节点</span><br><span class="line">（1）实例宕掉</span><br><span class="line">/etc/init.d/mysqld start </span><br><span class="line">（2）主机损坏，有可能数据也损坏了</span><br><span class="line">备份并恢复故障节点。</span><br><span class="line">2.恢复主从环境</span><br><span class="line">看日志文件：</span><br><span class="line">CHANGE MASTER TO MASTER_HOST=<span class="string">'10.0.1.52'</span>, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=<span class="string">'repl'</span>, MASTER_PASSWORD=<span class="string">'123'</span>;</span><br><span class="line">start slave ;</span><br><span class="line">3.恢复manager</span><br><span class="line">3.1 修好的故障节点配置信息，加入到配置文件</span><br><span class="line">[server1]</span><br><span class="line">hostname=10.0.1.51</span><br><span class="line">port=3306</span><br><span class="line">3.2 启动manager   </span><br><span class="line">nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover &lt; /dev/null &gt; /var/<span class="built_in">log</span>/mha/app1/manager.log 2&gt;&amp;1 &amp;</span><br></pre></td></tr></table></figure><h4 id="2-4-14-binlog-server（db03）"><a href="#2-4-14-binlog-server（db03）" class="headerlink" title="2.4.14 binlog server（db03）"></a>2.4.14 binlog server（db03）</h4><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></pre></td><td class="code"><pre><span class="line">binlogserver配置：</span><br><span class="line">找一台额外的机器，必须要有5.6以上的版本，支持gtid并开启，我们直接用的第二个slave（db03）</span><br><span class="line">vim /etc/mha/app1.cnf </span><br><span class="line">[binlog1]</span><br><span class="line">no_master=1</span><br><span class="line">hostname=10.0.1.53</span><br><span class="line">master_binlog_dir=/data/mysql/binlog</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></pre></td><td class="code"><pre><span class="line">mkdir -p /data/mysql/binlog</span><br><span class="line">chown -R mysql.mysql /data/*</span><br><span class="line">修改完成后，将主库binlog拉过来（从000001开始拉，之后的binlog会自动按顺序过来）</span><br></pre></td></tr></table></figure><p><strong>拉取主库binlog日志</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></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /data/mysql/binlog     -----》必须进入到自己创建好的目录</span><br><span class="line">mysqlbinlog  -R --host=10.0.1.52 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &amp;</span><br><span class="line">注意：</span><br><span class="line">拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点</span><br><span class="line">[root@db03 /data/mysql/binlog]<span class="comment"># ll</span></span><br><span class="line">total 12</span><br><span class="line">-rw-r----- 1 root root  177 Oct 25 05:38 mysql-bin.000001</span><br><span class="line">-rw-r----- 1 root root 1199 Oct 25 05:38 mysql-bin.000002</span><br><span class="line">-rw-r----- 1 root root  194 Oct 25 05:38 mysql-bin.000003</span><br></pre></td></tr></table></figure><p><strong>重启MHA</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></pre></td><td class="code"><pre><span class="line">[root@db03 ~]<span class="comment"># masterha_stop --conf=/etc/mha/app1.cnf</span></span><br><span class="line">[root@db03 ~]<span class="comment"># nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover &lt; /dev/null &gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;</span></span><br><span class="line">[root@db03 ~]<span class="comment"># masterha_check_status --conf=/etc/mha/app1.cnf</span></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></pre></td><td class="code"><pre><span class="line">主库宕机，binlogserver 自动停掉，manager 也会自动停止。</span><br><span class="line">处理思路：</span><br><span class="line">1、重新获取新主库的binlog到binlogserver中</span><br><span class="line">2、重新配置文件binlog server信息</span><br><span class="line">3、最后再启动MHA</span><br></pre></td></tr></table></figure><h2 id="第3章-管理员在高可用架构维护的职责"><a href="#第3章-管理员在高可用架构维护的职责" class="headerlink" title="第3章 管理员在高可用架构维护的职责"></a>第3章 管理员在高可用架构维护的职责</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></pre></td><td class="code"><pre><span class="line">1. 搭建：MHA+VIP+SendReport+BinlogServer</span><br><span class="line">2. 监控及故障处理</span><br><span class="line">3. 高可用架构的优化</span><br><span class="line"> 核心是：尽可能降低主从的延时，让MHA花在数据补偿上的时间尽量减少。</span><br><span class="line">5.7 版本，开启GTID模式，开启从库SQL并发复制。</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="http://linuxwf.com/tags/mysql/"/>
    
      <category term="MHA高可用" scheme="http://linuxwf.com/tags/MHA%E9%AB%98%E5%8F%AF%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>8.MySQL主从复制</title>
    <link href="http://linuxwf.com/2020/04/15/8-MySQL%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/"/>
    <id>http://linuxwf.com/2020/04/15/8-MySQL%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/</id>
    <published>2020-04-15T02:21:00.000Z</published>
    <updated>2020-04-15T02:21:59.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="第8课-MySQL主从复制"><a href="#第8课-MySQL主从复制" class="headerlink" title="第8课 MySQL主从复制"></a>第8课 MySQL主从复制</h1><h2 id="第1章-企业高可用性标准"><a href="#第1章-企业高可用性标准" class="headerlink" title="第1章 企业高可用性标准"></a>第1章 企业高可用性标准</h2><h3 id="1-1-全年无故障率-非计划内故障停机"><a href="#1-1-全年无故障率-非计划内故障停机" class="headerlink" title="1.1 全年无故障率(非计划内故障停机)"></a>1.1 全年无故障率(非计划内故障停机)</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></pre></td><td class="code"><pre><span class="line">99.9%                 ----&gt; 0.001*365*24*60=525.6  min</span><br><span class="line">99.99%                ----&gt; 0.0001*365*24*60=52.56 min</span><br><span class="line">99.999%               ----&gt; 0.0001*365*24*60=5.256 min</span><br></pre></td></tr></table></figure><h3 id="1-2-高可用架构方案"><a href="#1-2-高可用架构方案" class="headerlink" title="1.2 高可用架构方案"></a>1.2 高可用架构方案</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></pre></td><td class="code"><pre><span class="line">负载均衡:有一定的高可用性 </span><br><span class="line">LVS  Nginx</span><br><span class="line">主备系统:有高可用性,但是需要切换,是单活的架构</span><br><span class="line">KA ,   MHA, MMM</span><br><span class="line">真正高可用(多活系统): </span><br><span class="line">NDB Cluster  Oracle RAC  Sysbase cluster   , InnoDB Cluster（MGR）,PXC , MGC</span><br></pre></td></tr></table></figure><h2 id="第2章-主从复制"><a href="#第2章-主从复制" class="headerlink" title="第2章 主从复制"></a>第2章 主从复制</h2><h3 id="2-1-简介"><a href="#2-1-简介" class="headerlink" title="2.1 简介"></a>2.1 简介</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></pre></td><td class="code"><pre><span class="line">1.1. 基于二进制日志复制的</span><br><span class="line">1.2. 主库的修改操作会记录二进制日志</span><br><span class="line">1.3. 从库会请求新的二进制日志并回放,最终达到主从数据同步</span><br><span class="line">1.4. 主从复制核心功能:</span><br><span class="line">辅助备份,处理物理损坏                   </span><br><span class="line">扩展新型的架构:高可用,高性能,分布式架构等</span><br></pre></td></tr></table></figure><h3 id="2-2-主从复制前提-搭建主从的过程"><a href="#2-2-主从复制前提-搭建主从的过程" class="headerlink" title="2.2 主从复制前提(搭建主从的过程)"></a>2.2 主从复制前提(搭建主从的过程)</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></pre></td><td class="code"><pre><span class="line"><span class="comment">## 2.1 两台以上mysql实例 ,server_id,server_uuid不同</span></span><br><span class="line"><span class="comment">## 2.2 主库开启二进制日志</span></span><br><span class="line"><span class="comment">## 2.3 专用的复制用户</span></span><br><span class="line"><span class="comment">## 2.4 保证主从开启之前的某个时间点,从库数据是和主库一致(补课)</span></span><br><span class="line"><span class="comment">## 2.5 告知从库,复制user,passwd,IP port,以及复制起点(change master to)</span></span><br><span class="line"><span class="comment">## 2.6 线程(三个):Dump thread  IO thread  SQL thread 开启(start slave)</span></span><br></pre></td></tr></table></figure><h2 id="第3章-主从复制搭建"><a href="#第3章-主从复制搭建" class="headerlink" title="第3章 主从复制搭建"></a>第3章 主从复制搭建</h2><h3 id="3-1-准备两个数据库实例-3307-主-3308-从"><a href="#3-1-准备两个数据库实例-3307-主-3308-从" class="headerlink" title="3.1 准备两个数据库实例(3307(主),3308(从))"></a>3.1 准备两个数据库实例(3307(主),3308(从))</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">略</span><br></pre></td></tr></table></figure><h3 id="3-2-修改主库my-cnf-开启二进制日志功能"><a href="#3-2-修改主库my-cnf-开启二进制日志功能" class="headerlink" title="3.2 修改主库my.cnf 开启二进制日志功能"></a>3.2 修改主库my.cnf 开启二进制日志功能</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">[root@db01 ~]<span class="comment"># vim /data/3307/my.cnf </span></span><br><span class="line">[mysqld]</span><br><span class="line">user=mysql</span><br><span class="line">basedir=/usr/<span class="built_in">local</span>/mysql</span><br><span class="line">datadir=/data/3307/data</span><br><span class="line">server_id=7</span><br><span class="line">socket=/data/3307/mysql.sock</span><br><span class="line">port=3307</span><br><span class="line">log_bin=/data/3307/mysql-bin</span><br></pre></td></tr></table></figure><h3 id="3-3-启动所有节点"><a href="#3-3-启动所有节点" class="headerlink" title="3.3 启动所有节点"></a>3.3 启动所有节点</h3><figure class="highlight bash"><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">systemctl start mysqld3307</span><br><span class="line">systemctl start mysqld3308</span><br></pre></td></tr></table></figure><h3 id="3-4-主库创建复制用户-3307-主库"><a href="#3-4-主库创建复制用户-3307-主库" class="headerlink" title="3.4 主库创建复制用户(3307 主库)"></a>3.4 主库创建复制用户(3307 主库)</h3><figure class="highlight bash"><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"><span class="comment"># mysql -S /data/3307/mysql.sock </span></span><br><span class="line">mysql&gt; grant replication slave on *.* to repl@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123456'</span>;</span><br></pre></td></tr></table></figure><h3 id="3-5-备份主库数据恢复到从库"><a href="#3-5-备份主库数据恢复到从库" class="headerlink" title="3.5 备份主库数据恢复到从库"></a>3.5 备份主库数据恢复到从库</h3><figure class="highlight bash"><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">[root@db01 ~]<span class="comment"># mysqldump -uroot -S /data/3307/mysql.sock -A --master-data=2 --single-transaction -R -E --triggers &gt;/tmp/full.sql</span></span><br><span class="line">[root@db01 ~]<span class="comment"># mysql -S /data/3308/mysql.sock &lt;/tmp/full.sql</span></span><br></pre></td></tr></table></figure><h3 id="3-6-配置从库"><a href="#3-6-配置从库" class="headerlink" title="3.6 配置从库"></a>3.6 配置从库</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">[root@db01 ~]<span class="comment"># mysql -S /data/3308/mysql.sock </span></span><br><span class="line">CHANGE MASTER TO</span><br><span class="line">  MASTER_HOST=<span class="string">'10.0.1.51'</span>,</span><br><span class="line">  MASTER_USER=<span class="string">'repl'</span>,</span><br><span class="line">  MASTER_PASSWORD=<span class="string">'123456'</span>,</span><br><span class="line">  MASTER_PORT=3307,</span><br><span class="line">  MASTER_LOG_FILE=<span class="string">'mysql-bin.000001'</span>,</span><br><span class="line">  MASTER_LOG_POS=154,</span><br><span class="line">  MASTER_CONNECT_RETRY=10;</span><br></pre></td></tr></table></figure><h3 id="3-7-开启主从专用线程"><a href="#3-7-开启主从专用线程" class="headerlink" title="3.7 开启主从专用线程"></a>3.7 开启主从专用线程</h3><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">start slave ;</span><br></pre></td></tr></table></figure><h3 id="3-8-检查状态"><a href="#3-8-检查状态" class="headerlink" title="3.8 检查状态"></a>3.8 检查状态</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></pre></td><td class="code"><pre><span class="line">mysql&gt; show slave status \G</span><br><span class="line">Slave_IO_Running: Yes</span><br><span class="line">Slave_SQL_Running: Yes</span><br><span class="line"></span><br><span class="line">[root@db01 ~]<span class="comment"># mysql  -S /data/3308/mysql.sock -e "show slave status \G"|grep "Running:";</span></span><br><span class="line">             Slave_IO_Running: Yes</span><br><span class="line">            Slave_SQL_Running: Yes</span><br></pre></td></tr></table></figure><h3 id="3-9-如果搭建报错-解决方法"><a href="#3-9-如果搭建报错-解决方法" class="headerlink" title="3.9 如果搭建报错,解决方法"></a>3.9 如果搭建报错,解决方法</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></pre></td><td class="code"><pre><span class="line">stop slave ;</span><br><span class="line">reset slave all;</span><br><span class="line">change master to ...</span><br><span class="line">start slave;</span><br></pre></td></tr></table></figure><h2 id="第4章-主从复制的原理"><a href="#第4章-主从复制的原理" class="headerlink" title="第4章 主从复制的原理"></a>第4章 主从复制的原理</h2><h3 id="4-1-主从中设置到的文件和线程"><a href="#4-1-主从中设置到的文件和线程" class="headerlink" title="4.1 主从中设置到的文件和线程"></a>4.1 主从中设置到的文件和线程</h3><h4 id="4-1-1-线程"><a href="#4-1-1-线程" class="headerlink" title="4.1.1 线程"></a>4.1.1 线程</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">主:</span><br><span class="line">DUMP THREAD</span><br><span class="line">从:</span><br><span class="line">IO  THREAD</span><br><span class="line">SQL THREAD</span><br></pre></td></tr></table></figure><h4 id="4-1-2-文件"><a href="#4-1-2-文件" class="headerlink" title="4.1.2 文件"></a>4.1.2 文件</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">主:</span><br><span class="line">mysql-bin.000001</span><br><span class="line">从: </span><br><span class="line">db01-relay.000001     ===&gt;中继日志</span><br><span class="line">master.info                 ===》主库信息记录日志</span><br><span class="line">relay-log.info              ===&gt; 记录中继应用情况信息</span><br></pre></td></tr></table></figure><h3 id="4-2-主从复制原理"><a href="#4-2-主从复制原理" class="headerlink" title="4.2 主从复制原理"></a>4.2 主从复制原理</h3><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql16.png"  alt=""></p><p><img src="/" class="lazyload" data-src="http://cdn.linuxwf.com/img/mysql/mysql17.png"  alt=""></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></pre></td><td class="code"><pre><span class="line">(1) 从库 执行change master to语句 ,将以下信息保存至master.info文件中</span><br><span class="line">(2) 从库 start slave , 从库IO_T和SQL_T生成</span><br><span class="line">(3)Io_T ,读取master.info中主库连接信息(ip , port, user,password)</span><br><span class="line">   连接主库,主库专门开启Dump_T,和从库IO_T进行交互</span><br><span class="line">(5) IO_T,读取 master.info ,复制的起点信息,找主库DUMP要最新的binlog</span><br><span class="line">MASTER_LOG_FILE=<span class="string">'mysql-bin.000001'</span>,MASTER_LOG_POS=154</span><br><span class="line">(6)主库dump_T,截取最新的binlog,发送给从库IO_T</span><br><span class="line">(7)扩展: 基于TCP/IP网络工作模式,IO_T将日志存储到TCP/Ip缓存中,并返回ACK给主库.</span><br><span class="line">(8) IO_T最终会将缓存中数据,写入到relay_log文件中保存.更新master.info为新位置点.</span><br><span class="line">(9) SQL_T,读取relay-log.info信息,获取上次SQL_T回放的位置点.</span><br><span class="line">(10)SQL_T,根据位置点,向下回放最新的relaylog.并且再次更新relay-log.info文件为最新点.</span><br><span class="line">补充:</span><br><span class="line">(11) 主库dump_T 会持续的监控binlog的变化,一旦有新的日志生成,给从库发一些信号.</span><br><span class="line">(12) 从库 relay_log_purge线程会定期自动清理回放过的relay日志.</span><br><span class="line">细节：</span><br><span class="line">1.主库一旦有新的日志生成，会发送“信号”给binlog dump ，IO线程再请求</span><br></pre></td></tr></table></figure><h2 id="第5章-主从故障监控-分析-处理"><a href="#第5章-主从故障监控-分析-处理" class="headerlink" title="第5章 主从故障监控\分析\处理"></a>第5章 主从故障监控\分析\处理</h2><h3 id="5-1-线程相关监控"><a href="#5-1-线程相关监控" class="headerlink" title="5.1 线程相关监控"></a>5.1 线程相关监控</h3><h4 id="5-1-1-主库信息监控-master-info"><a href="#5-1-1-主库信息监控-master-info" class="headerlink" title="5.1.1 主库信息监控(master.info)"></a>5.1.1 主库信息监控(master.info)</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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; show slave status \G</span><br><span class="line">(1) 主库信息监控(master.info)</span><br><span class="line">Master_Host: 10.0.1.51</span><br><span class="line">Master_User: repl</span><br><span class="line">Master_Port: 3307</span><br><span class="line">Connect_Retry: 10</span><br><span class="line">Master_Log_File: mysql-bin.000003</span><br><span class="line">Read_Master_Log_Pos: 154</span><br></pre></td></tr></table></figure><h4 id="5-1-2-从库relay-log的应用信息-relay-log-info"><a href="#5-1-2-从库relay-log的应用信息-relay-log-info" class="headerlink" title="5.1.2 从库relay-log的应用信息(relay-log.info)"></a>5.1.2 从库relay-log的应用信息(relay-log.info)</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></pre></td><td class="code"><pre><span class="line">(2) 从库relay-log的应用信息(relay-log.info)</span><br><span class="line">Relay_Log_File: db01-relay-bin.000008</span><br><span class="line">Relay_Log_Pos: 367</span><br><span class="line">Relay_Master_Log_File: mysql-bin.000003</span><br></pre></td></tr></table></figure><h4 id="5-1-3-从库线程工作状态"><a href="#5-1-3-从库线程工作状态" class="headerlink" title="5.1.3 从库线程工作状态"></a>5.1.3 从库线程工作状态</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">(3) 从库线程工作状态</span><br><span class="line">Slave_IO_Running: Yes</span><br><span class="line">Slave_SQL_Running: Yes</span><br><span class="line">Last_IO_Errno: 0</span><br><span class="line">Last_IO_Error: </span><br><span class="line">Last_SQL_Errno: 0</span><br><span class="line">Last_SQL_Error:</span><br></pre></td></tr></table></figure><h4 id="5-1-4-过滤复制有关信息"><a href="#5-1-4-过滤复制有关信息" class="headerlink" title="5.1.4 过滤复制有关信息"></a>5.1.4 过滤复制有关信息</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Replicate_Do_DB: </span><br><span class="line">Replicate_Ignore_DB: </span><br><span class="line">Replicate_Do_Table: </span><br><span class="line">Replicate_Ignore_Table: </span><br><span class="line">Replicate_Wild_Do_Table: </span><br><span class="line">Replicate_Wild_Ignore_Table:</span><br></pre></td></tr></table></figure><h4 id="5-1-5-主从延时时间"><a href="#5-1-5-主从延时时间" class="headerlink" title="5.1.5 主从延时时间"></a>5.1.5 主从延时时间</h4><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">Seconds_Behind_Master: 0</span><br></pre></td></tr></table></figure><h4 id="5-1-6-延时从库的状态"><a href="#5-1-6-延时从库的状态" class="headerlink" title="5.1.6 延时从库的状态"></a>5.1.6 延时从库的状态</h4><figure class="highlight bash"><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">SQL_Delay: 0</span><br><span class="line">SQL_Remaining_Delay: NULL</span><br></pre></td></tr></table></figure><h4 id="5-1-7-GTID复制有关"><a href="#5-1-7-GTID复制有关" class="headerlink" title="5.1.7 GTID复制有关"></a>5.1.7 GTID复制有关</h4><figure class="highlight bash"><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">Retrieved_Gtid_Set: </span><br><span class="line">Executed_Gtid_Set:</span><br></pre></td></tr></table></figure><h3 id="5-2-主从复制故障分析"><a href="#5-2-主从复制故障分析" class="headerlink" title="5.2 主从复制故障分析"></a>5.2 主从复制故障分析</h3><h4 id="5-2-1-IO线程故障"><a href="#5-2-1-IO线程故障" class="headerlink" title="5.2.1 IO线程故障"></a>5.2.1 IO线程故障</h4><p>(1) 连接主库 </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></pre></td><td class="code"><pre><span class="line">(1) 连接主库 </span><br><span class="line">网络不通,防火墙</span><br><span class="line">连接信息错误(ip,port,user,password)</span><br><span class="line"></span><br><span class="line">[root@db01 data]<span class="comment"># mysql -urepl1 -p123 -h10.0.1.51 -P3307</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">ERROR 1045 (28000): Access denied <span class="keyword">for</span> user <span class="string">'repl1'</span>@<span class="string">'db01'</span> (using password: YES)</span><br><span class="line">[root@db01 data]<span class="comment"># mysql -urepl -p12311 -h10.0.1.51 -P3307</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">ERROR 1045 (28000): Access denied <span class="keyword">for</span> user <span class="string">'repl'</span>@<span class="string">'db01'</span> (using password: YES)</span><br><span class="line">[root@db01 data]<span class="comment"># mysql -urepl -p123 -h10.0.1.55 -P3307</span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">ERROR 2003 (HY000): Can<span class="string">'t connect to MySQL server on '</span>10.0.1.55<span class="string">' (113)</span></span><br><span class="line"><span class="string">[root@db01 data]# mysql -urepl -p123 -h10.0.1.51 -P33011</span></span><br><span class="line"><span class="string">mysql: [Warning] Using a password on the command line interface can be insecure.</span></span><br><span class="line"><span class="string">ERROR 2003 (HY000): Can'</span>t connect to MySQL server on <span class="string">'10.0.1.51'</span> (111)</span><br><span class="line"></span><br><span class="line">解决方法: </span><br><span class="line">stop slave;</span><br><span class="line">reset slave all; </span><br><span class="line">重新change master to </span><br><span class="line">start slave;</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></pre></td><td class="code"><pre><span class="line">show slave  staus \G </span><br><span class="line">Last_IO_Errno: 1040</span><br><span class="line">Last_IO_Error: error reconnecting to master <span class="string">'repl@10.0.0.51:3307'</span> - retry-time: 10  retries: 7</span><br><span class="line">处理思路:</span><br><span class="line">拿复制用户,手工连接一下</span><br><span class="line"></span><br><span class="line">[root@db01 ~]<span class="comment"># mysql -urepl -p123 -h 10.0.0.51 -P 3307 </span></span><br><span class="line">mysql: [Warning] Using a password on the <span class="built_in">command</span> line interface can be insecure.</span><br><span class="line">ERROR 1040 (HY000): Too many connections</span><br><span class="line">处理方法:</span><br><span class="line">db01 [(none)]&gt;<span class="built_in">set</span> global max_connections=300;</span><br><span class="line"></span><br><span class="line">(3) 防火墙,网络不通</span><br></pre></td></tr></table></figure><p>(2) 请求二进制日志 (最常见报错)</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">(2) 请求日志 (最常见报错)</span><br><span class="line">主库日志损坏 ,丢失,不连续</span><br><span class="line"></span><br><span class="line"><span class="comment">#说明: </span></span><br><span class="line">在主从复制环境中,严令禁止主库中reset master; 可以选择expire 进行定期清理主库二进制日志</span><br><span class="line"><span class="comment">#解决方案:</span></span><br><span class="line">最好的办法是重新构建主库.</span><br></pre></td></tr></table></figure><h4 id="5-2-2-SQL-线程故障"><a href="#5-2-2-SQL-线程故障" class="headerlink" title="5.2.2 SQL 线程故障"></a>5.2.2 SQL 线程故障</h4><p>SQL线程功能：</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></pre></td><td class="code"><pre><span class="line">(1)读写relay-log.info </span><br><span class="line">(2)relay-log损坏,断节,找不到</span><br><span class="line">(3)接收到的SQL无法执行</span><br></pre></td></tr></table></figure><p>导致SQL线程故障原因分析：</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">回放日志 (为什么SQL语句执行失败?)</span><br><span class="line">1. 版本差异，参数设定不同，比如：数据类型的差异，SQL_MODE影响</span><br><span class="line">2.要创建的数据库对象,已经存在</span><br><span class="line">3.要删除或修改的对象不存在  </span><br><span class="line">4.DML语句不符合表定义及约束时.  </span><br><span class="line">归根揭底的原因都是由于从库发生了写入操作.</span><br><span class="line">Last_SQL_Error: Error <span class="string">'Can'</span>t create database <span class="string">'db'</span>; database exists<span class="string">' on query. Default database: '</span>db<span class="string">'. Query: '</span>create database db<span class="string">'</span></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></pre></td><td class="code"><pre><span class="line">方法一：</span><br><span class="line">stop slave; </span><br><span class="line"><span class="built_in">set</span> global sql_slave_skip_counter = 1;</span><br><span class="line"><span class="comment">#将同步指针向下移动一个，如果多次不同步，可以重复操作。</span></span><br><span class="line">start slave;</span><br><span class="line">方法二：</span><br><span class="line">/etc/my.cnf</span><br><span class="line">slave-skip-errors = 1032,1062,1007</span><br><span class="line">常见错误代码:</span><br><span class="line">1007:对象已存在</span><br><span class="line">1032:无法执行DML</span><br><span class="line">1062:主键冲突,或约束冲突</span><br><span class="line"></span><br><span class="line">但是，以上操作有时是有风险的，最安全的做法就是重新构建主从。把握一个原则,一切以主库为主.</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><br><span class="line">1. 一切以主库为准.最彻底方法重新构建主从。</span><br><span class="line">2. 将从库设置为只读库,采用读写分离的中间件,防止从库写入</span><br><span class="line">mysql&gt; show variables like <span class="string">'%read_only%'</span>;</span><br><span class="line">read_only=ON</span><br><span class="line">super_read_only=ON</span><br><span class="line"></span><br><span class="line">了解:</span><br><span class="line">可以借助工具,校验和同步</span><br><span class="line">pt-checksum </span><br><span class="line">pt-sync</span><br></pre></td></tr></table></figure><h2 id="第6章-主从延时"><a href="#第6章-主从延时" class="headerlink" title="第6章  主从延时"></a>第6章  主从延时</h2><h3 id="6-1-监控"><a href="#6-1-监控" class="headerlink" title="6.1 监控"></a>6.1 监控</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">(1) 有没有延时 </span><br><span class="line">show slave status \G </span><br><span class="line">Seconds_Behind_Master: 0</span><br><span class="line">(2) 延时了多少日志量?</span><br><span class="line"> 1) 从库回放了多少日志?</span><br><span class="line">relay-log.info   -----&gt; 从库回放到了哪个点.</span><br><span class="line"> 2) 以上位置点对应着主库binlog的位置点.</span><br><span class="line">./db01-relay-bin.000002</span><br><span class="line">501</span><br><span class="line">mysql-bin.000001</span><br><span class="line">335</span><br><span class="line">(3) 看主库的位置点</span><br><span class="line">show master status;</span><br><span class="line">(5) 找到哪一个事件</span><br><span class="line">mysql-bin.000001</span><br><span class="line">335</span><br></pre></td></tr></table></figure><h3 id="6-2-主从延时原因分析"><a href="#6-2-主从延时原因分析" class="headerlink" title="6.2 主从延时原因分析"></a>6.2 主从延时原因分析</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">主库做了修改操作,从库比较长时间才能追上.</span><br></pre></td></tr></table></figure><h4 id="6-2-1-外在因素"><a href="#6-2-1-外在因素" class="headerlink" title="6.2.1 外在因素"></a>6.2.1 外在因素</h4><figure class="highlight plain"><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><br><span class="line">主从硬件差异较大</span><br><span class="line">版本差异</span><br><span class="line">参数因素</span><br><span class="line">从库较多</span><br></pre></td></tr></table></figure><h4 id="6-2-2-主库"><a href="#6-2-2-主库" class="headerlink" title="6.2.2 主库"></a>6.2.2 主库</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><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) 二进制日志写入不及时</span><br><span class="line">[rep]&gt;select @@sync_binlog;</span><br><span class="line">(2) CR的主从复制中,binlog_dump线程,事件为单元,串行传送二进制日志(5.6 5.5)</span><br><span class="line"></span><br><span class="line">1. 主库并发事务量大,主库可以并行,传送时是串行</span><br><span class="line">2. 主库发生了大事务,由于是串行传送,会产生阻塞后续的事务.</span><br><span class="line"></span><br><span class="line">解决方案:</span><br><span class="line">1. 5.6 开始,开启GTID,实现了GC(group commit)机制,可以并行传输日志给从库IO</span><br><span class="line">2. 5.7 开始,不开启GTID,会自动维护匿名的GTID,也能实现GC,我们建议还是认为开启GTID</span><br><span class="line">3. 大事务拆成多个小事务,可以有效的减少主从延时.</span><br></pre></td></tr></table></figure><h4 id="6-2-3-从库"><a href="#6-2-3-从库" class="headerlink" title="6.2.3 从库"></a>6.2.3 从库</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><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">SQL线程导致的主从延时</span><br><span class="line">在CR复制情况下: 从库默认情况下只有一个SQL,只能串行回放事务SQL</span><br><span class="line">1. 主库如果并发事务量较大,从库只能串行回放</span><br><span class="line">2. 主库发生了大事务,会阻塞后续的所有的事务的运行</span><br><span class="line"></span><br><span class="line">解决方案:</span><br><span class="line">1. 5.6 版本开启GTID之后,加入了SQL多线程的特性,但是只能针对不同库(database)下的事务进行并发回放.</span><br><span class="line">2. 5.7 版本开始GTID之后,在SQL方面,提供了基于逻辑时钟(logical_clock),binlog加入了seq_no机制,</span><br><span class="line">真正实现了基于事务级别的并发回放,这种技术我们把它称之为MTS(enhanced multi-threaded slave).</span><br><span class="line">3. 大事务拆成多个小事务,可以有效的减少主从延时.</span><br><span class="line">[https://dev.mysql.com/worklog/task/?id=6314]</span><br></pre></td></tr></table></figure><h2 id="第7章-过滤复制"><a href="#第7章-过滤复制" class="headerlink" title="第7章 过滤复制"></a>第7章 过滤复制</h2><h3 id="7-1-主库-了解"><a href="#7-1-主库-了解" class="headerlink" title="7.1 主库  (了解)"></a>7.1 主库  (了解)</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></pre></td><td class="code"><pre><span class="line">mysql&gt; show master status;</span><br><span class="line">binlog_do_db    白名单 </span><br><span class="line">binlog_ignore_db        黑名单</span><br></pre></td></tr></table></figure><h3 id="7-2-从库"><a href="#7-2-从库" class="headerlink" title="7.2 从库"></a>7.2 从库</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">在SQL_T回放日志,选择部分日志回放</span><br><span class="line">replicate_do_db=world</span><br><span class="line">replicate_do_db=oldguo</span><br><span class="line">replicate_ignore_db </span><br><span class="line"></span><br><span class="line">replicate_do_table=world.t1</span><br><span class="line">replicate_ignore_table</span><br><span class="line"></span><br><span class="line">replicate_wild_do_table=world.t*</span><br><span class="line">replicate_wild_ignore_table</span><br></pre></td></tr></table></figure><h3 id="7-3-案例"><a href="#7-3-案例" class="headerlink" title="7.3 案例"></a>7.3 案例</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></pre></td><td class="code"><pre><span class="line">从库: </span><br><span class="line">vim /data/3308/my.cnf</span><br><span class="line">replicate_do_db=world</span><br><span class="line"></span><br><span class="line">[root@db01 data]<span class="comment"># systemctl restart mysqld3308</span></span><br></pre></td></tr></table></figure><h2 id="第8章-延时从库"><a href="#第8章-延时从库" class="headerlink" title="第8章 延时从库"></a>第8章 延时从库</h2><h3 id="8-1-介绍"><a href="#8-1-介绍" class="headerlink" title="8.1 介绍"></a>8.1 介绍</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">是我们认为配置的一种特殊从库.人为配置从库和主库延时N小时.</span><br></pre></td></tr></table></figure><h3 id="8-2-为什么要有延时从"><a href="#8-2-为什么要有延时从" class="headerlink" title="8.2 为什么要有延时从"></a>8.2 为什么要有延时从</h3><figure class="highlight plain"><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><br><span class="line">物理损坏</span><br><span class="line">主从复制非常擅长解决物理损坏.</span><br><span class="line">逻辑损坏</span><br><span class="line">普通主从复制没办法解决逻辑损坏</span><br></pre></td></tr></table></figure><h3 id="8-3-配置延时从库"><a href="#8-3-配置延时从库" class="headerlink" title="8.3 配置延时从库"></a>8.3 配置延时从库</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></pre></td><td class="code"><pre><span class="line">mysql&gt;  STOP SLAVE;   -- 先停止同步</span><br><span class="line">mysql&gt; CHANGE MASTER TO MASTER_DELAY = 300;  -- 设置延迟300s，一般设置3-6个小时，单位是s</span><br><span class="line">mysql&gt; START SLAVE; -- 启动同步</span><br><span class="line">mysql&gt; SHOW SLAVE STATUS \G;  -- 查看状态</span><br><span class="line">SQL_Delay: 300</span><br><span class="line">SQL_Remaining_Delay: NULL</span><br></pre></td></tr></table></figure><h3 id="8-4-模拟故障及恢复"><a href="#8-4-模拟故障及恢复" class="headerlink" title="8.4 模拟故障及恢复"></a>8.4 模拟故障及恢复</h3><p>(1) 模拟数据(3307)</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></pre></td><td class="code"><pre><span class="line">create database oss charset utf8mb4; </span><br><span class="line">use oss;</span><br><span class="line">create table t1(id int);</span><br><span class="line">insert into t1 values(1),(2),(3);</span><br><span class="line">commit;</span><br><span class="line">insert into t1 values(11),(22),(33);</span><br><span class="line"></span><br><span class="line">drop database oss;</span><br></pre></td></tr></table></figure><p>(2) 停线程(3308)</p><figure class="highlight bash"><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">mysql&gt; STOP SLAVE;  -- 都停了</span><br><span class="line">mysql&gt; stop slave sql_thread;  --停止SQL线程方法</span><br></pre></td></tr></table></figure><p>(3) 截取relaylog </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></pre></td><td class="code"><pre><span class="line"><span class="comment">#起点:</span></span><br><span class="line">show slave status \G</span><br><span class="line">Relay_Log_File: db01-relay-bin.000002</span><br><span class="line">Relay_Log_Pos: 320</span><br><span class="line"></span><br><span class="line"><span class="comment">#终点:</span></span><br><span class="line">mysql&gt; show relaylog events <span class="keyword">in</span> <span class="string">'db01-relay-bin.000002'</span>;</span><br><span class="line">| db01-relay-bin.000005 | 1401 | Query          |         7 |        1826 | drop database oss    </span><br><span class="line"> db01-relay-bin.000005  1401</span><br></pre></td></tr></table></figure><p>(4)截取日志</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">[root@db01 data]<span class="comment"># mysqlbinlog --start-position=320 --stop-position=1401 db01-relay-bin.000002 &gt;/tmp/relay.sql</span></span><br></pre></td></tr></table></figure><p>(5)恢复</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></pre></td><td class="code"><pre><span class="line">mysql&gt; <span class="built_in">set</span> sql_log_bin=0;</span><br><span class="line">mysql&gt; <span class="built_in">source</span> /tmp/relay.sql</span><br><span class="line">mysql&gt; <span class="built_in">set</span> sql_log_bin=1;</span><br><span class="line">mysql&gt; show slave status \G</span><br><span class="line"> Slave_IO_Running: Yes</span><br><span class="line"> Slave_SQL_Running: Yes</span><br></pre></td></tr></table></figure><p>(6)从库身份解除</p><figure class="highlight bash"><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">&gt;stop slave;</span><br><span class="line">&gt;reset slave all;</span><br></pre></td></tr></table></figure><h2 id="第9章-半同步"><a href="#第9章-半同步" class="headerlink" title="第9章 半同步"></a>第9章 半同步</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">解决主从数据一致性问题</span><br></pre></td></tr></table></figure><h3 id="9-1-半同步复制工作原理的变化"><a href="#9-1-半同步复制工作原理的变化" class="headerlink" title="9.1 半同步复制工作原理的变化"></a>9.1 半同步复制工作原理的变化</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></pre></td><td class="code"><pre><span class="line">1. 主库执行新的事务,commit时,更新 show master status\G ,触发一个信号给 </span><br><span class="line">2. binlog dump 接收到主库的 show master status\G信息,通知从库日志更新了 </span><br><span class="line">3. 从库IO线程请求新的二进制日志事件 </span><br><span class="line">4. 主库会通过dump线程传送新的日志事件,给从库IO线程 </span><br><span class="line">5. 从库IO线程接收到binlog日志,当日志写入到磁盘上的relaylog文件时,给主库ACK_receiver线程 6. ACK_receiver线程触发一个事件,告诉主库commit可以成功了 </span><br><span class="line">7. 如果ACK达到了我们预设值的超时时间,半同步复制会切换为原始的异步复制.</span><br></pre></td></tr></table></figure><h3 id="9-2-配置半同步复制"><a href="#9-2-配置半同步复制" class="headerlink" title="9.2 配置半同步复制"></a>9.2 配置半同步复制</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></pre></td><td class="code"><pre><span class="line">加载插件</span><br><span class="line">主:</span><br><span class="line">INSTALL PLUGIN rpl_semi_sync_master SONAME <span class="string">'semisync_master.so'</span>;</span><br><span class="line">从:</span><br><span class="line">INSTALL PLUGIN rpl_semi_sync_slave SONAME <span class="string">'semisync_slave.so'</span>;</span><br><span class="line">查看是否加载成功:</span><br><span class="line">show plugins;</span><br><span class="line">启动:</span><br><span class="line">主:</span><br><span class="line">SET GLOBAL rpl_semi_sync_master_enabled = 1;</span><br><span class="line">从:</span><br><span class="line">SET GLOBAL rpl_semi_sync_slave_enabled = 1;</span><br><span class="line">重启从库上的IO线程</span><br><span class="line">STOP SLAVE IO_THREAD;</span><br><span class="line">START SLAVE IO_THREAD;</span><br><span class="line">查看是否在运行</span><br><span class="line">主:</span><br><span class="line">show status like <span class="string">'Rpl_semi_sync_master_status'</span>;</span><br><span class="line">从:</span><br><span class="line">show status like <span class="string">'Rpl_semi_sync_slave_status'</span>;</span><br></pre></td></tr></table></figure><h2 id="第10章-GTID复制"><a href="#第10章-GTID复制" class="headerlink" title="第10章 GTID复制"></a>第10章 GTID复制</h2><h3 id="10-1-GTID介绍"><a href="#10-1-GTID介绍" class="headerlink" title="10.1 GTID介绍"></a>10.1 GTID介绍</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></pre></td><td class="code"><pre><span class="line">GTID(Global Transaction ID)是对于一个已提交事务的唯一编号，并且是一个全局(主从复制)唯一的编号。</span><br><span class="line">它的官方定义如下：</span><br><span class="line">GTID = source_id ：transaction_id</span><br><span class="line">7E11FA47-31CA-19E1-9E56-C43AA21293967:29</span><br><span class="line">什么是sever_uuid，和Server-id 区别？</span><br><span class="line">核心特性: 全局唯一,具备幂等性</span><br></pre></td></tr></table></figure><h3 id="10-2-GTID核心参数"><a href="#10-2-GTID核心参数" class="headerlink" title="10.2 GTID核心参数"></a>10.2 GTID核心参数</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></pre></td><td class="code"><pre><span class="line">gtid-mode=on </span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span> </span><br><span class="line"><span class="built_in">log</span>-slave-updates=1 </span><br><span class="line"></span><br><span class="line">gtid-mode=on --启用gtid类型，否则就是普通的复制架构 </span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span> --强制GTID的一致性 </span><br><span class="line"><span class="built_in">log</span>-slave-updates=1 --slave更新是否记入日志</span><br></pre></td></tr></table></figure><h3 id="10-3-GTID复制配置过程"><a href="#10-3-GTID复制配置过程" class="headerlink" title="10.3 GTID复制配置过程"></a>10.3 GTID复制配置过程</h3><h4 id="10-3-1-清理环境"><a href="#10-3-1-清理环境" class="headerlink" title="10.3.1 清理环境"></a>10.3.1 清理环境</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></pre></td><td class="code"><pre><span class="line">pkill mysqld</span><br><span class="line"> \rm -rf /data/mysql/data/*</span><br><span class="line"> \rm -rf /data/binlog/*</span><br></pre></td></tr></table></figure><h4 id="10-3-2-准备配置文件"><a href="#10-3-2-准备配置文件" class="headerlink" title="10.3.2 准备配置文件"></a>10.3.2 准备配置文件</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><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></pre></td><td class="code"><pre><span class="line">主库db01：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/data/mysql/</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=51</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db01 [\\d]&gt;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">slave1(db02)：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/data/mysql</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=52</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db02 [\\d]&gt;</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">slave2(db03)：</span><br><span class="line">cat &gt; /etc/my.cnf &lt;&lt;EOF</span><br><span class="line">[mysqld]</span><br><span class="line">basedir=/data/mysql</span><br><span class="line">datadir=/data/mysql/data</span><br><span class="line">socket=/tmp/mysql.sock</span><br><span class="line">server_id=53</span><br><span class="line">port=3306</span><br><span class="line">secure-file-priv=/tmp</span><br><span class="line">autocommit=0</span><br><span class="line">log_bin=/data/binlog/mysql-bin</span><br><span class="line">binlog_format=row</span><br><span class="line">gtid-mode=on</span><br><span class="line">enforce-gtid-consistency=<span class="literal">true</span></span><br><span class="line"><span class="built_in">log</span>-slave-updates=1</span><br><span class="line">[mysql]</span><br><span class="line">prompt=db03 [\\d]&gt;</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h4 id="10-3-3-初始化数据"><a href="#10-3-3-初始化数据" class="headerlink" title="10.3.3 初始化数据"></a>10.3.3 初始化数据</h4><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">mysqld --initialize-insecure --user=mysql --basedir=/data/mysql  --datadir=/data/mysql/data</span><br></pre></td></tr></table></figure><h4 id="10-3-4-启动数据库"><a href="#10-3-4-启动数据库" class="headerlink" title="10.3.4 启动数据库"></a>10.3.4 启动数据库</h4><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">systemctl start mysqld</span><br></pre></td></tr></table></figure><h4 id="10-3-5-构建主从"><a href="#10-3-5-构建主从" class="headerlink" title="10.3.5 构建主从"></a>10.3.5 构建主从</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><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">master:51</span><br><span class="line">slave:52,53</span><br><span class="line"></span><br><span class="line">51:</span><br><span class="line">grant replication slave  on *.* to repl@<span class="string">'10.0.1.%'</span> identified by <span class="string">'123'</span>;</span><br><span class="line"></span><br><span class="line">52\53:</span><br><span class="line">change master to </span><br><span class="line">master_host=<span class="string">'10.0.0.51'</span>,</span><br><span class="line">master_user=<span class="string">'repl'</span>,</span><br><span class="line">master_password=<span class="string">'123'</span> ,</span><br><span class="line">MASTER_AUTO_POSITION=1;</span><br><span class="line"></span><br><span class="line">start slave;</span><br></pre></td></tr></table></figure><h4 id="10-3-6-GTID-从库误写入操作处理"><a href="#10-3-6-GTID-从库误写入操作处理" class="headerlink" title="10.3.6 GTID 从库误写入操作处理"></a>10.3.6 GTID 从库误写入操作处理</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><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></pre></td><td class="code"><pre><span class="line">查看监控信息: </span><br><span class="line">Last_SQL_Error: Error <span class="string">'Can'</span>t create database <span class="string">'oldboy'</span>; database exists<span class="string">' on query. Default database: '</span>oldboy<span class="string">'. Query: '</span>create database oldboy<span class="string">'</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3 </span></span><br><span class="line"><span class="string">Executed_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2, </span></span><br><span class="line"><span class="string">7ca4a2b7-4aae-11e9-859d-000c298720f6:1</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">stop slave; </span></span><br><span class="line"><span class="string">set gtid_next='</span>99279e1e-61b7-11e9-a9fc-000c2928f5dd:3<span class="string">'; </span></span><br><span class="line"><span class="string">begin;commit; </span></span><br><span class="line"><span class="string">set gtid_next='</span>AUTOMATIC<span class="string">'; </span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">这里的xxxxx:N 也就是你的slave sql thread报错的GTID，或者说是你想要跳过的GTID。 </span></span><br><span class="line"><span class="string">最好的解决方案：重新构建主从环境</span></span><br></pre></td></tr></table></figure><h4 id="10-3-7-GTID-复制和普通复制的区别"><a href="#10-3-7-GTID-复制和普通复制的区别" class="headerlink" title="10.3.7 GTID 复制和普通复制的区别"></a>10.3.7 GTID 复制和普通复制的区别</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><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">CHANGE MASTER TO</span><br><span class="line">MASTER_HOST=<span class="string">'10.0.1.51'</span>,</span><br><span class="line">MASTER_USER=<span class="string">'repl'</span>,</span><br><span class="line">MASTER_PASSWORD=<span class="string">'123'</span>,</span><br><span class="line">MASTER_PORT=3307,</span><br><span class="line">MASTER_LOG_FILE=<span class="string">'mysql-bin.000001'</span>,</span><br><span class="line">MASTER_LOG_POS=444,</span><br><span class="line">MASTER_CONNECT_RETRY=10;</span><br><span class="line"></span><br><span class="line">change master to </span><br><span class="line">master_host=<span class="string">'10.0.1.51'</span>,</span><br><span class="line">master_user=<span class="string">'repl'</span>,</span><br><span class="line">master_password=<span class="string">'123'</span> ,</span><br><span class="line">MASTER_AUTO_POSITION=1;</span><br><span class="line">start slave;</span><br><span class="line"></span><br><span class="line">（0）在主从复制环境中，主库发生过的事务，在全局都是由唯一GTID记录的，更方便Failover</span><br><span class="line">（1）额外功能参数（3个）</span><br><span class="line">（2）change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;</span><br><span class="line">（3）在复制过程中，从库不再依赖master.info文件，而是直接读取最后一个relaylog的 GTID号</span><br><span class="line">（4） mysqldump备份时，默认会将备份中包含的事务操作，以以下方式</span><br><span class="line">    SET @@GLOBAL.GTID_PURGED=<span class="string">'8c49d7ec-7e78-11e8-9638-000c29ca725d:1'</span>;</span><br><span class="line">    告诉从库，我的备份中已经有以上事务，你就不用运行了，直接从下一个GTID开始请求binlog就行。</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;/assets/css/APlayer.min.css&quot;&gt;&lt;script src=&quot;/assets/js/APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="数据库" scheme="http://linuxwf.com/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="http://linuxwf.com/tags/mysql/"/>
    
      <category term="mysql主从复制" scheme="http://linuxwf.com/tags/mysql%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/"/>
    
  </entry>
  
</feed>
