<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Lucissfer&#39;s</title>
  
  <subtitle>回首向来萧瑟处，也无风雨也无晴</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.lucissfer.com/"/>
  <updated>2018-07-20T09:57:19.370Z</updated>
  <id>https://www.lucissfer.com/</id>
  
  <author>
    <name>Lucissfer</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>大数据平台CDH安装部署</title>
    <link href="https://www.lucissfer.com/2018/07/09/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%B9%B3%E5%8F%B0CDH%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
    <id>https://www.lucissfer.com/2018/07/09/大数据平台CDH安装部署/</id>
    <published>2018-07-08T16:00:00.000Z</published>
    <updated>2018-07-20T09:57:19.370Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>因为业务需要了解大数据平台CDH的部署，找了三台虚拟机简单的安装部署一下，踩了一遍坑，留个文档记录一下。</p></blockquote><h1 id="1-服务器规划"><a href="#1-服务器规划" class="headerlink" title="1. 服务器规划"></a><strong>1. 服务器规划</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">集群规划三台服务器，一台namenode，两台datanode，规划如下：</span><br><span class="line">namenode</span><br><span class="line">192.168.3.131</span><br><span class="line">node-01</span><br><span class="line">192.168.3.132</span><br><span class="line">node-02</span><br><span class="line">192.168.3.133</span><br><span class="line"></span><br><span class="line">服务器操作系统均为Centos 7 x86_64</span><br></pre></td></tr></table></figure><h1 id="2-安装前预配置"><a href="#2-安装前预配置" class="headerlink" title="2. 安装前预配置"></a><strong>2. 安装前预配置</strong></h1><h2 id="2-1-关闭防火墙、SELINUX"><a href="#2-1-关闭防火墙、SELINUX" class="headerlink" title="2.1 关闭防火墙、SELINUX"></a>2.1 关闭防火墙、SELINUX</h2><p>关闭防火墙</p><figure class="highlight shell"><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="meta">#</span><span class="bash"> systemctl stop firewalld</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> systemctl <span class="built_in">disable</span> firewalld</span></span><br></pre></td></tr></table></figure><p>关闭SELINUX</p><figure class="highlight shell"><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">SELINUX建议一定要关掉，配置太麻烦了，而且容易踩坑，官方也建议关掉</span><br><span class="line"><span class="meta">#</span><span class="bash"> setenforce 0</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sed -i <span class="string">'s/SELINUX=enforcing/#SELINUX=enforcing\nSELINUX=disabled/g'</span> /etc/selinux/config</span></span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="2-2-配置CM源"><a href="#2-2-配置CM源" class="headerlink" title="2.2 配置CM源"></a>2.2 配置CM源</h2><figure class="highlight shell"><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="meta">#</span><span class="bash"> wget -O /etc/yum.repos.d/cloudera-manager.repo http://archive.cloudera.com/cm5/redhat/7/x86_64/cm/cloudera-manager.repo</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> wget -O /etc/yum.repos.d/cloudera-cdh5.repo https://archive.cloudera.com/cdh5/redhat/7/x86_64/cdh/cloudera-cdh5.repo</span></span><br></pre></td></tr></table></figure><h2 id="2-3-安装JDK"><a href="#2-3-安装JDK" class="headerlink" title="2.3 安装JDK"></a>2.3 安装JDK</h2><figure class="highlight shell"><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">CDH对JDK版本有要求，建议1.8以上</span><br><span class="line"><span class="meta">#</span><span class="bash"> rpm -ivh jdk-8u171-linux-x64.rpm</span></span><br></pre></td></tr></table></figure><h2 id="2-4-修改hosts文件"><a href="#2-4-修改hosts文件" class="headerlink" title="2.4 修改hosts文件"></a>2.4 修改hosts文件</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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="meta">#</span><span class="bash"> vim /etc/hosts</span></span><br><span class="line">127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br><span class="line">::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br><span class="line">192.168.3.131 namenode</span><br><span class="line">192.168.3.132 node-01</span><br><span class="line">192.168.3.133 node-02</span><br></pre></td></tr></table></figure><h2 id="2-5-配置集群时钟同步"><a href="#2-5-配置集群时钟同步" class="headerlink" title="2.5 配置集群时钟同步"></a>2.5 配置集群时钟同步</h2><p><strong>CDH服务集群一定要配置时间同步，否则集群会持续报警时钟偏移，此处我用的是chrony</strong><br>以namenode做服务器，node节点做客户端<br>服务端</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><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="meta">#</span><span class="bash"> yum install -y chrony</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim /etc/chrony.conf</span></span><br><span class="line">server 192.168.3.131 iburst</span><br><span class="line">服务端配置与自己同步</span><br></pre></td></tr></table></figure><p>客户端</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><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="meta">#</span><span class="bash"> yum install -y chrony</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim /etc/chrony.conf</span></span><br><span class="line">server 192.168.3.131 iburst</span><br><span class="line">客户端配置与服务端同步</span><br></pre></td></tr></table></figure><p>重启所有服务器chrony服务</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> systemctl restart chronyd</span></span><br></pre></td></tr></table></figure><p>验证同步</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> chronyc -n sources</span></span><br></pre></td></tr></table></figure><h2 id="2-6-安装配置MariaDB服务"><a href="#2-6-安装配置MariaDB服务" class="headerlink" title="2.6 安装配置MariaDB服务"></a>2.6 安装配置MariaDB服务</h2><p>CDH集群部署需要数据库服务支持，目前支持Oracle/MySQL(MariaDB)/PostgreSQL，这里我用的MariaDB，只需要在主节点(namenode)上安装即可</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y mariadb-server mariadb</span></span><br></pre></td></tr></table></figure><p>启动mariadb</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> systemctl start mariadb</span></span><br></pre></td></tr></table></figure><p>初始化mariadb</p><figure class="highlight shell"><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">#</span><span class="bash"> /usr/bin/mysql_secure_installation</span></span><br><span class="line">root</span><br><span class="line">123456</span><br></pre></td></tr></table></figure><p>创建各个服务需要的库</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database monitor DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database am DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database cm DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line">create database rm DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br><span class="line"></span><br><span class="line">这里创建的库名最好与你后面要安装的服务保持一致</span><br></pre></td></tr></table></figure><h2 id="2-7-安装jdbc驱动"><a href="#2-7-安装jdbc驱动" class="headerlink" title="2.7 安装jdbc驱动"></a>2.7 安装jdbc驱动</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y mysql-connector-java</span></span><br></pre></td></tr></table></figure><h1 id="3-安装Cloudera-Manager服务"><a href="#3-安装Cloudera-Manager服务" class="headerlink" title="3. 安装Cloudera Manager服务"></a><strong>3. 安装Cloudera Manager服务</strong></h1><p>主节点服务器</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y cloudera-manager-server</span></span><br></pre></td></tr></table></figure><p>从节点服务器</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y cloudera-manager-agent</span></span><br></pre></td></tr></table></figure><p>安装oracle-j2sdk1.7</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y oracle-j2sdk1.7</span></span><br></pre></td></tr></table></figure><p>初始化数据库</p><figure class="highlight shell"><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">#</span><span class="bash"> /usr/share/cmf/schema/scm_prepare_database.sh mysql cm root 123456</span></span><br><span class="line">上面初始化数据库命令各参数如下：</span><br><span class="line"><span class="meta">#</span><span class="bash"> /usr/share/cmf/schema/scm_prepare_database.sh [postgresql|mysql|oracle] [database] [username] [password]</span></span><br></pre></td></tr></table></figure><p>启动ClouderaManager Server</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> systemctl start cloudera-scm-server</span></span><br></pre></td></tr></table></figure><p>访问CM，验证安装</p><figure class="highlight shell"><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">http://192.168.3.131:7180</span><br><span class="line">初始用户名密码admin:admin</span><br></pre></td></tr></table></figure><h1 id="4-安装配置CDH"><a href="#4-安装配置CDH" class="headerlink" title="4. 安装配置CDH"></a><strong>4. 安装配置CDH</strong></h1><p>安装前各服务器配置</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">#</span><span class="bash"> <span class="built_in">echo</span> <span class="string">"vm.swappiness = 10"</span> &gt;&gt; /etc/sysctl.conf</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sysctl -p</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/defrag</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/enabled</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> -e <span class="string">'echo never &gt; /sys/kernel/mm/transparent_hugepage/defrag\necho never &gt; /sys/kernel/mm/transparent_hugepage/enabled'</span> &gt;&gt; /etc/rc.local</span></span><br><span class="line"></span><br><span class="line">如上，修改内核参数，否则安装过程中会报警。</span><br></pre></td></tr></table></figure><p><strong>登录web页面<a href="http://192.168.3.131:7180按需安装CDH服务，安装过程不详述，按步骤来即可。" target="_blank" rel="noopener">http://192.168.3.131:7180按需安装CDH服务，安装过程不详述，按步骤来即可。</a></strong></p><h1 id="5-踩过的坑"><a href="#5-踩过的坑" class="headerlink" title="5. 踩过的坑"></a><strong>5. 踩过的坑</strong></h1><p>首次安装完成，启动kafka是会报错OOM，原因是Java Heap Size配置小了，回到CDH主页面，点击kafka，进入配置页面，修改 Java Heap Size of Broker为1G，然后保存，重启KAFKA，OK</p><p>这里就是个坑，安装的时候也没有提示哪里设置Java Heap Size。</p><h1 id="6-CM服务重启顺序"><a href="#6-CM服务重启顺序" class="headerlink" title="6. CM服务重启顺序"></a><strong>6. CM服务重启顺序</strong></h1><figure class="highlight shell"><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="meta">#</span><span class="bash"> systemctl restart cloudera-scm-server</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> systemctl restart cloudera-scm-agent（每个节点的agent都需要重启一下）</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;因为业务需要了解大数据平台CDH的部署，找了三台虚拟机简单的安装部署一下，踩了一遍坑，留个文档记录一下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;1-服务器规划&quot;&gt;&lt;a href=&quot;#1-服务器规划&quot; class=&quot;headerlink&quot; title=&quot;1. 服务器规划&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 服务器规划&lt;/strong&gt;&lt;/h1&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;集群规划三台服务器，一台namenode，两台datanode，规划如下：&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;namenode&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;192.168.3.131&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;node-01&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;192.168.3.132&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;node-02&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;192.168.3.133&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;服务器操作系统均为Centos 7 x86_64&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&quot;2-安装前预配置&quot;&gt;&lt;a href=&quot;#2-安装前预配置&quot; class=&quot;headerlink&quot; title=&quot;2. 安装前预配置&quot;&gt;&lt;/a&gt;&lt;strong&gt;2. 安装前预配置&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;2-1-关闭防火墙、SELINUX&quot;&gt;&lt;a href=&quot;#2-1-关闭防火墙、SELINUX&quot; class=&quot;headerlink&quot; title=&quot;2.1 关闭防火墙、SELINUX&quot;&gt;&lt;/a&gt;2.1 关闭防火墙、SELINUX&lt;/h2&gt;&lt;p&gt;关闭防火墙&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;因为是测试环境，为方便起见，直接关闭防火墙，生产环境中最好还是开启防火墙，开放相应端口就行了，或者直接在防火墙中配置集群内服务器白名单&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; systemctl stop firewalld&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; systemctl &lt;span class=&quot;built_in&quot;&gt;disable&lt;/span&gt; firewalld&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;关闭SELINUX&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;SELINUX建议一定要关掉，配置太麻烦了，而且容易踩坑，官方也建议关掉&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; setenforce 0&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; sed -i &lt;span class=&quot;string&quot;&gt;&#39;s/SELINUX=enforcing/#SELINUX=enforcing\nSELINUX=disabled/g&#39;&lt;/span&gt; /etc/selinux/config&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Centos" scheme="https://www.lucissfer.com/categories/Linux/Centos/"/>
    
      <category term="大数据" scheme="https://www.lucissfer.com/categories/Linux/Centos/%E5%A4%A7%E6%95%B0%E6%8D%AE/"/>
    
    
      <category term="大数据" scheme="https://www.lucissfer.com/tags/%E5%A4%A7%E6%95%B0%E6%8D%AE/"/>
    
      <category term="CDH" scheme="https://www.lucissfer.com/tags/CDH/"/>
    
      <category term="Hadoop" scheme="https://www.lucissfer.com/tags/Hadoop/"/>
    
  </entry>
  
  <entry>
    <title>ESXI虚拟机磁盘在线扩容</title>
    <link href="https://www.lucissfer.com/2018/06/12/ESXI%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%A3%81%E7%9B%98%E5%9C%A8%E7%BA%BF%E6%89%A9%E5%AE%B9/"/>
    <id>https://www.lucissfer.com/2018/06/12/ESXI虚拟机磁盘在线扩容/</id>
    <published>2018-06-11T16:00:00.000Z</published>
    <updated>2018-06-12T05:53:31.978Z</updated>
    
    <content type="html"><![CDATA[<p>内网有一台ESXI上的虚拟机，用来做构建服务的，因为构建项目逐渐增加，磁盘空间渐渐不足，严重影响使用。<br>为解决问题，当务之急是将磁盘分区进行扩容，因为磁盘分区做的LVM，可以很方便的动态扩容，在物理机上可以通过加硬盘的方式来解决问题，而ESXI的虚拟机就更方便了，直接将虚拟机关机修改磁盘大小即可，但是修改完的硬盘空间并不会自动扩展到磁盘分区中，还需要我们做一些操作才可以使用，具体操作如下：</p><h1 id="1-创建新分区"><a href="#1-创建新分区" class="headerlink" title="1. 创建新分区"></a><strong>1. 创建新分区</strong></h1><p>ESXI修改完磁盘大小后，增加的磁盘空间表现为当前磁盘剩余未分配空间，需要使用剩余未分配空间新建分区</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">#</span> fdisk /dev/sda</span><br><span class="line">n       （新建分区）</span><br><span class="line">p       （选择分区类型主分区或扩展分区）</span><br><span class="line">3       （选择分区编号）</span><br><span class="line">回车</span><br><span class="line">回车</span><br><span class="line">t（修改分区类型）</span><br><span class="line">3（选择分区）</span><br><span class="line">8e（Changed type of partition 'Linux' to 'Linux LVM'，修改成LVM类型）</span><br><span class="line">w（写分区表退出）</span><br></pre></td></tr></table></figure><a id="more"></a><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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"><span class="meta">#</span> partprobe</span><br><span class="line">Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.</span><br><span class="line"></span><br><span class="line">Centos6系统上使用</span><br><span class="line"><span class="meta">#</span> partx</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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">xfs文件系统</span><br><span class="line"><span class="meta">#</span> mkfs.xfs /dev/sda3       （此处分区格式要与已有的LVM卷中分区格式一致）</span><br><span class="line">EXT4文件系统</span><br><span class="line"><span class="meta">#</span> mkfs.ext4 /dev/sda3</span><br></pre></td></tr></table></figure><h1 id="2-添加新LVM分区到已有的LVM组，实现扩容"><a href="#2-添加新LVM分区到已有的LVM组，实现扩容" class="headerlink" title="2. 添加新LVM分区到已有的LVM组，实现扩容"></a><strong>2. 添加新LVM分区到已有的LVM组，实现扩容</strong></h1><p>进入LVM管理</p><figure class="highlight shell"><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="meta">#</span> lvm</span><br><span class="line"><span class="meta">lvm&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight shell"><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 class="meta">lvm&gt;</span> pvcreate /dev/sda3</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><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><br><span class="line"><span class="meta">lvm&gt;</span> vgdisplay </span><br><span class="line">  --- Volume group ---</span><br><span class="line">  VG Name               test_build</span><br></pre></td></tr></table></figure><figure class="highlight shell"><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="meta">lvm&gt;</span> vgextend test_build /dev/sda3</span><br><span class="line">  Volume group "test_build" successfully extended</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><br><span class="line"><span class="meta">lvm&gt;</span> vgdisplay </span><br><span class="line">  --- Volume group ---</span><br><span class="line">  VG Name               test_build</span><br><span class="line">  System ID             </span><br><span class="line">  Format                lvm2</span><br><span class="line">  Metadata Areas        2</span><br><span class="line">  Metadata Sequence No  4</span><br><span class="line">  VG Access             read/write</span><br><span class="line">  VG Status             resizable</span><br><span class="line">  MAX LV                0</span><br><span class="line">  Cur LV                2</span><br><span class="line">  Open LV               2</span><br><span class="line">  Max PV                0</span><br><span class="line">  Cur PV                2</span><br><span class="line">  Act PV                2</span><br><span class="line">  VG Size               &lt;399.53 GiB</span><br><span class="line">  PE Size               4.00 MiB</span><br><span class="line">  Total PE              102279</span><br><span class="line">  Alloc PE / Size       51080 / 199.53 GiB</span><br><span class="line">  Free  PE / Size       51199 / &lt;200.00 GiB</span><br><span class="line">  VG UUID               wVZavM-oLX7-iWf1-fKiO-TGVM-Oa0r-2mcTsD</span><br><span class="line"></span><br><span class="line"><span class="meta">lvm&gt;</span> lvextend -l +51199 /dev/mapper/test_build-data</span><br><span class="line">  Size of logical volume test_build/data changed from 152.96 GiB (39159 extents) to 352.96 GiB (90358 extents).</span><br><span class="line">  Logical volume test_build/data successfully resized.</span><br><span class="line">上述参数中，</span><br><span class="line">-l,指定逻辑卷的大小，单位为PE数;</span><br><span class="line">51199为通过vgdisplay命令查询到的卷中空闲空间，目录参数为df命令查询到的需要扩展的挂载点位置。</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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"><span class="meta">lvm&gt;</span> pvdisplay</span><br><span class="line">  --- Physical volume ---</span><br><span class="line">  PV Name               /dev/sda2</span><br><span class="line">  VG Name               test_build</span><br><span class="line">  PV Size               199.53 GiB / not usable 3.00 MiB</span><br><span class="line">  Allocatable           yes (but full)</span><br><span class="line">  PE Size               4.00 MiB</span><br><span class="line">  Total PE              51080</span><br><span class="line">  Free PE               0</span><br><span class="line">  Allocated PE          51080</span><br><span class="line">  PV UUID               2gmX3A-Bpz4-hCQ0-5fjr-CiCM-peYZ-BMDi9W</span><br><span class="line">   </span><br><span class="line">  --- Physical volume ---</span><br><span class="line">  PV Name               /dev/sda3</span><br><span class="line">  VG Name               test_build</span><br><span class="line">  PV Size               200.00 GiB / not usable 4.00 MiB</span><br><span class="line">  Allocatable           yes (but full)</span><br><span class="line">  PE Size               4.00 MiB</span><br><span class="line">  Total PE              51199</span><br><span class="line">  Free PE               0</span><br><span class="line">  Allocated PE          51199</span><br><span class="line">  PV UUID               wJe39M-0326-n2Ge-6m2d-IlTR-Gubg-UXRhie</span><br><span class="line"></span><br><span class="line"><span class="meta">lvm&gt;</span> quit</span><br></pre></td></tr></table></figure><h1 id="3-文件系统扩容"><a href="#3-文件系统扩容" class="headerlink" title="3. 文件系统扩容"></a><strong>3. 文件系统扩容</strong></h1><p>卷扩容完成后，系统并不能直接使用扩容空间，还需要将文件系统扩容</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">xfs文件系统</span><br><span class="line"><span class="meta">#</span> xfs_growfs /dev/mapper/test_build-data</span><br><span class="line">meta-data=/dev/mapper/test_build-data isize=512    agcount=4, agsize=10024704 blks</span><br><span class="line">         =                       sectsz=512   attr=2, projid32bit=1</span><br><span class="line">         =                       crc=1        finobt=0 spinodes=0</span><br><span class="line">data     =                       bsize=4096   blocks=40098816, imaxpct=25</span><br><span class="line">         =                       sunit=0      swidth=0 blks</span><br><span class="line">naming   =version 2              bsize=4096   ascii-ci=0 ftype=1</span><br><span class="line">log      =internal               bsize=4096   blocks=19579, version=2</span><br><span class="line">         =                       sectsz=512   sunit=0 blks, lazy-count=1</span><br><span class="line">realtime =none                   extsz=4096   blocks=0, rtextents=0</span><br><span class="line">data blocks changed from 40098816 to 92526592</span><br><span class="line"></span><br><span class="line">EXT4文件系统</span><br><span class="line"><span class="meta">#</span> resize2fs /dev/mapper/test_build-data</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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"><span class="meta">#</span> df -hl</span><br><span class="line">Filesystem                   Size  Used Avail Use% Mounted on</span><br><span class="line">/dev/mapper/test_build-root   47G  2.3G   45G   5% /</span><br><span class="line">devtmpfs                     908M     0  908M   0% /dev</span><br><span class="line">tmpfs                        920M     0  920M   0% /dev/shm</span><br><span class="line">tmpfs                        920M  8.8M  911M   1% /run</span><br><span class="line">tmpfs                        920M     0  920M   0% /sys/fs/cgroup</span><br><span class="line">/dev/mapper/test_build-data  353G  456M  353G   1% /data</span><br><span class="line">/dev/sda1                    473M  169M  305M  36% /boot</span><br><span class="line">tmpfs                        184M     0  184M   0% /run/user/0</span><br></pre></td></tr></table></figure><p>扩容成功</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;内网有一台ESXI上的虚拟机，用来做构建服务的，因为构建项目逐渐增加，磁盘空间渐渐不足，严重影响使用。&lt;br&gt;为解决问题，当务之急是将磁盘分区进行扩容，因为磁盘分区做的LVM，可以很方便的动态扩容，在物理机上可以通过加硬盘的方式来解决问题，而ESXI的虚拟机就更方便了，直接将虚拟机关机修改磁盘大小即可，但是修改完的硬盘空间并不会自动扩展到磁盘分区中，还需要我们做一些操作才可以使用，具体操作如下：&lt;/p&gt;
&lt;h1 id=&quot;1-创建新分区&quot;&gt;&lt;a href=&quot;#1-创建新分区&quot; class=&quot;headerlink&quot; title=&quot;1. 创建新分区&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 创建新分区&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;ESXI修改完磁盘大小后，增加的磁盘空间表现为当前磁盘剩余未分配空间，需要使用剩余未分配空间新建分区&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; fdisk /dev/sda&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;n       （新建分区）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;p       （选择分区类型主分区或扩展分区）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3       （选择分区编号）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;回车&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;回车&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;t	（修改分区类型）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3	（选择分区）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8e	（Changed type of partition &#39;Linux&#39; to &#39;Linux LVM&#39;，修改成LVM类型）&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;w	（写分区表退出）&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="ESXI" scheme="https://www.lucissfer.com/categories/Linux/ESXI/"/>
    
    
      <category term="esxi" scheme="https://www.lucissfer.com/tags/esxi/"/>
    
      <category term="磁盘在线扩容" scheme="https://www.lucissfer.com/tags/%E7%A3%81%E7%9B%98%E5%9C%A8%E7%BA%BF%E6%89%A9%E5%AE%B9/"/>
    
  </entry>
  
  <entry>
    <title>配置rsync+inotify实现文件实时同步</title>
    <link href="https://www.lucissfer.com/2018/06/04/%E9%85%8D%E7%BD%AErsync+inotify%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5/"/>
    <id>https://www.lucissfer.com/2018/06/04/配置rsync+inotify实现文件实时同步/</id>
    <published>2018-06-03T16:00:00.000Z</published>
    <updated>2018-06-04T10:31:34.184Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-项目背景"><a href="#1-项目背景" class="headerlink" title="1. 项目背景"></a><strong>1. 项目背景</strong></h1><blockquote><p>因为工作需要，需部署一套nginx负载均衡群集，群集须保证所有nginx节点配置文件完全一致；要解决不同服务器之间数据一致，一般采用NFS共享文件、DRBD镜像复制或rsync文件同步来实现，相对于rsync，前两者配置稍麻烦，此处我选择rsync文件同步来保证配置文件一致性。</p></blockquote><blockquote><p>rsync是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。但是rsync仅仅是同步工具，并不能做到监控文件变化并实时同步，因此还需要配合inotify来实现文件实时同步。</p></blockquote><blockquote><p>inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起，加入了inotify支持，通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件，利用这个内核接口，第三方软件就可以监控文件系统下文件的各种变化情况，而inotify-tools正是实施监控的软件。</p></blockquote><blockquote><p>在这里，我们使用inotify监控文件变化，同时通过脚本来触发rsync将发生变化的文件同步到目标服务器。</p></blockquote><blockquote><p><strong>术语定义：</strong><br>客户端–&gt;源服务器（SRC）<br>服务端–&gt;目标服务器（DEST）</p></blockquote><a id="more"></a><h1 id="2-安装配置rsync"><a href="#2-安装配置rsync" class="headerlink" title="2. 安装配置rsync"></a><strong>2. 安装配置rsync</strong></h1><h2 id="2-1-安装rsync服务"><a href="#2-1-安装rsync服务" class="headerlink" title="2.1 安装rsync服务"></a>2.1 安装rsync服务</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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="meta">#</span><span class="bash"> yum install -y gcc gcc-c++</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y rsync</span></span><br><span class="line">关闭SELINUX（服务端SELINUX一定要关掉，不然rsync同步的时候会报错）</span><br><span class="line"><span class="meta">#</span><span class="bash"> setenforce 0</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim /etc/selinux/config</span></span><br><span class="line">SELINUX=disabled</span><br></pre></td></tr></table></figure><h2 id="2-2-编辑rsync配置文件"><a href="#2-2-编辑rsync配置文件" class="headerlink" title="2.2 编辑rsync配置文件"></a>2.2 编辑rsync配置文件</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span><span class="bash"> vim /etc/rsyncd.conf</span></span><br><span class="line"></span><br><span class="line">uid = root     # 此处的用户及用户组必须要拥有操作待同步文件的权限</span><br><span class="line">gid = root</span><br><span class="line">port = 873     # rsync默认监听端口873，也可以自定义</span><br><span class="line">use chroot = no  </span><br><span class="line">max connections = 5</span><br><span class="line">pid file = /var/run/rsyncd.pid</span><br><span class="line">exclude = lost+found/   # 排除同步文件</span><br><span class="line">transfer logging = yes</span><br><span class="line">timeout = 900</span><br><span class="line">ignore nonreadable = yes</span><br><span class="line">dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2</span><br><span class="line"></span><br><span class="line">[nginx_conf]</span><br><span class="line">path = /data/program/nginx/conf/    # rsync服务端数据目录路径，即同步到目标目录后的存放路径，按需配置</span><br><span class="line">comment = nginx_conf  # 此处定义模块名称，这个模块名称在rsync同步命令中需要调用</span><br><span class="line">ignore errors</span><br><span class="line">read only = no</span><br><span class="line">list = yes</span><br><span class="line">auth users = rsync    # 设置执行rsync同步的用户名，此用户名可自定义，不需与系统用户一致，需要与secrets file中设置的用户名匹配</span><br><span class="line">secrets file = /data/program/rsync/rsync_server.passwd  # 用户认证配置文件，保存同步时使用的用户名密码，可设置多个用户名密码</span><br><span class="line">hosts allow = 192.168.2.182  #允许进行同步的客户端地址，可设置多个，用英文逗号分隔</span><br></pre></td></tr></table></figure><h2 id="2-3-编辑rsync用户认证配置文件"><a href="#2-3-编辑rsync用户认证配置文件" class="headerlink" title="2.3 编辑rsync用户认证配置文件"></a>2.3 编辑rsync用户认证配置文件</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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 class="meta">#</span><span class="bash"> vim /data/program/rsync/rsync_server.passwd</span></span><br><span class="line">rsync:rsync</span><br><span class="line"></span><br><span class="line">客户端</span><br><span class="line"><span class="meta">#</span><span class="bash"> vim /data/program/rsync/rsync_client.passwd</span></span><br><span class="line">rsync</span><br><span class="line"></span><br><span class="line">双向同步的时候，两台服务器上都需要配置这两个文件。</span><br></pre></td></tr></table></figure><h2 id="2-4-修改配置文件权限"><a href="#2-4-修改配置文件权限" class="headerlink" title="2.4 修改配置文件权限"></a>2.4 修改配置文件权限</h2><figure class="highlight shell"><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">#</span><span class="bash"> chmod 600 /data/program/rsync/rsync_server.passwd</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> chmod 600 /data/program/rsync/rsync_client.passwd</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> chmod 600 /etc/rsyncd.conf</span></span><br></pre></td></tr></table></figure><h2 id="2-5-启动rsync服务"><a href="#2-5-启动rsync服务" class="headerlink" title="2.5 启动rsync服务"></a>2.5 启动rsync服务</h2><figure class="highlight shell"><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="meta">#</span><span class="bash"> systemctl <span class="built_in">enable</span> rsyncd</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> systemctl start rsyncd</span></span><br></pre></td></tr></table></figure><h2 id="2-6-双向同步配置"><a href="#2-6-双向同步配置" class="headerlink" title="2.6 双向同步配置"></a>2.6 双向同步配置</h2><p>单向同步</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">如果仅需单向同步，只需要在服务端启动rsyncd服务，客户端无需启动服务，可直接执行rsync命令。</span><br></pre></td></tr></table></figure><p>双向同步</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">如需双向同步，则需要在两台服务器启动rsyncd服务，两台服务器互为C--&gt;S。</span><br></pre></td></tr></table></figure><p>此处我选择双向同步，则需在两台服务器上同时配置服务。</p><h1 id="3-安装配置inotify-tools"><a href="#3-安装配置inotify-tools" class="headerlink" title="3. 安装配置inotify-tools"></a><strong>3. 安装配置inotify-tools</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> yum install -y inotify-tools</span></span><br></pre></td></tr></table></figure><h1 id="4-配置inotify-rsync同步脚本"><a href="#4-配置inotify-rsync同步脚本" class="headerlink" title="4. 配置inotify_rsync同步脚本"></a><strong>4. 配置inotify_rsync同步脚本</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">cd</span> /data/program/rsync/</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim inotify_rsync.sh</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">source /etc/profile</span><br><span class="line"></span><br><span class="line">src=/data/program/nginx/conf              # 需要同步的源路径</span><br><span class="line">des=nginx_conf                            # 目标服务器上rsyncd.conf中定义的名称(comment)</span><br><span class="line">rsync_passwd_file=/data/program/rsync/rsync_client.passwd            # rsync验证的密码文件</span><br><span class="line">ip=192.168.2.182                          # 目标服务器</span><br><span class="line">user=rsync                                # rsyncd.conf中定义的验证用户名(auth users)</span><br><span class="line">include_list=/data/program/rsync/include  #指定同步文件写入列表文件，列表文件路径必须用绝对路径，列表文件中内容用相对路径</span><br><span class="line">log_path=/data/program/rsync/logs/$(date +%Y-%m-%d).log    #同步日志输出到日志文件</span><br><span class="line"></span><br><span class="line">cd $&#123;src&#125;</span><br><span class="line">inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file</span><br><span class="line">do</span><br><span class="line">        INO_EVENT=$(echo $file | awk '&#123;print $1&#125;')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT</span><br><span class="line">        INO_FILE=$(echo $file | awk '&#123;print $2&#125;')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE</span><br><span class="line">        echo "-------------------------------$(date)------------------------------------"  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">        echo $file  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">        #增加、修改、写入完成、移动进事件</span><br><span class="line">        #增、改放在同一个判断，因为他们都是针对文件的操作，即使是新建目录，要同步的也只是一个空目录，不会影响速度。</span><br><span class="line">        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型</span><br><span class="line">        then</span><br><span class="line">                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">                rsync -avrtzopgcRP --include-from=$&#123;include_list&#125; --exclude=/* --password-file=$&#123;rsync_passwd_file&#125; $(dirname $&#123;INO_FILE&#125;) $&#123;user&#125;@$&#123;ip&#125;::$&#123;des&#125;  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">        fi</span><br><span class="line">        #删除、移动出事件</span><br><span class="line">        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]</span><br><span class="line">        then</span><br><span class="line">                echo 'DELETE or MOVED_FROM'  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">                rsync -avrtzopgcRP --delete --include-from=$&#123;include_list&#125; --exclude=/* --password-file=$&#123;rsync_passwd_file&#125; $(dirname $&#123;INO_FILE&#125;) $&#123;user&#125;@$&#123;ip&#125;::$&#123;des&#125;  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">        fi</span><br><span class="line">        #修改属性事件 指 touch chgrp chmod chown等操作</span><br><span class="line">        if [[ $INO_EVENT =~ 'ATTRIB' ]]</span><br><span class="line">        then</span><br><span class="line">                echo 'ATTRIB'  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">                if [ ! -d "$INO_FILE" ]</span><br><span class="line">                # 如果修改属性的是目录 则不同步，因为同步目录会发生递归扫描，等此目录下的文件发生同步时，rsync会顺带更新此目录。</span><br><span class="line">                then</span><br><span class="line">                        rsync -avrtzopgcRP --include-from=$&#123;include_list&#125; --exclude=/* --password-file=$&#123;rsync_passwd_file&#125; $(dirname $&#123;INO_FILE&#125;) $&#123;user&#125;@$&#123;ip&#125;::$&#123;des&#125;  &gt;&gt; $&#123;log_path&#125;</span><br><span class="line">                fi</span><br><span class="line">        fi</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p>编辑指定同步文件列表</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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="meta">#</span><span class="bash"> vim /data/program/rsync/include</span></span><br><span class="line">nginx.conf</span><br><span class="line">nginx_conf/</span><br><span class="line">conf.d/</span><br><span class="line"></span><br><span class="line">将指定同步的文件写到该列表文件中，需使用相对路径</span><br></pre></td></tr></table></figure><p>给同步脚本添加执行权限</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> chmod +x inotify_rsync.sh</span></span><br></pre></td></tr></table></figure><h1 id="5-将同步脚本放到后台启动"><a href="#5-将同步脚本放到后台启动" class="headerlink" title="5. 将同步脚本放到后台启动"></a><strong>5. 将同步脚本放到后台启动</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> nohup /data/program/rsync/inotify_rsync.sh &gt;/data/program/rsync/nohup.out 2&gt;&amp;1 &amp;</span></span><br></pre></td></tr></table></figure><h1 id="6-将同步脚本加到开机启动"><a href="#6-将同步脚本加到开机启动" class="headerlink" title="6. 将同步脚本加到开机启动"></a><strong>6. 将同步脚本加到开机启动</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> <span class="string">"nohup /data/program/rsync/inotify_rsync.sh &gt;/data/program/rsync/nohup.out 2&gt;&amp;1 &amp;"</span> &gt;&gt; /etc/rc.local</span></span><br></pre></td></tr></table></figure><h1 id="7-rsync-inotifywait部分参数说明"><a href="#7-rsync-inotifywait部分参数说明" class="headerlink" title="7. rsync+inotifywait部分参数说明"></a><strong>7. rsync+inotifywait部分参数说明</strong></h1><h2 id="7-1-rsync参数说明"><a href="#7-1-rsync参数说明" class="headerlink" title="7.1 rsync参数说明"></a>7.1 rsync参数说明</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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></pre></td><td class="code"><pre><span class="line">-v, --verbose 详细模式输出</span><br><span class="line">-q, --quiet 精简输出模式</span><br><span class="line">-c, --checksum 打开校验开关，强制对文件传输进行校验</span><br><span class="line">-a, --archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD</span><br><span class="line">-r, --recursive 对子目录以递归模式处理</span><br><span class="line">-R, --relative 使用相对路径信息</span><br><span class="line">-b, --backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。</span><br><span class="line">--backup-dir 将备份文件(如~filename)存放在在目录下。</span><br><span class="line">-suffix=SUFFIX 定义备份文件前缀</span><br><span class="line">-u, --update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件)</span><br><span class="line">-l, --links 保留软链结</span><br><span class="line">-L, --copy-links 想对待常规文件一样处理软链结</span><br><span class="line">--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结</span><br><span class="line">--safe-links 忽略指向SRC路径目录树以外的链结</span><br><span class="line">-H, --hard-links 保留硬链结</span><br><span class="line">-p, --perms 保持文件权限</span><br><span class="line">-o, --owner 保持文件属主信息</span><br><span class="line">-g, --group 保持文件属组信息</span><br><span class="line">-D, --devices 保持设备文件信息</span><br><span class="line">-t, --times 保持文件时间信息</span><br><span class="line">-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间</span><br><span class="line">-n, --dry-run现实哪些文件将被传输</span><br><span class="line">-W, --whole-file 拷贝文件，不进行增量检测</span><br><span class="line">-x, --one-file-system 不要跨越文件系统边界</span><br><span class="line">-B, --block-size=SIZE 检验算法使用的块尺寸，默认是700字节</span><br><span class="line">-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步</span><br><span class="line">--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息</span><br><span class="line">-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件</span><br><span class="line">--existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件</span><br><span class="line">--delete 删除那些DST中SRC没有的文件</span><br><span class="line">--delete-excluded 同样删除接收端那些被该选项指定排除的文件</span><br><span class="line">--delete-after 传输结束以后再删除</span><br><span class="line">--ignore-errors 及时出现IO错误也进行删除</span><br><span class="line">--max-delete=NUM 最多删除NUM个文件</span><br><span class="line">--partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输</span><br><span class="line">--force 强制删除目录，即使不为空</span><br><span class="line">--numeric-ids 不将数字的用户和组ID匹配为用户名和组名</span><br><span class="line">--timeout=TIME IP超时时间，单位为秒</span><br><span class="line">-I, --ignore-times 不跳过那些有同样的时间和长度的文件</span><br><span class="line">--size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间</span><br><span class="line">--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0</span><br><span class="line">-T --temp-dir=DIR 在DIR中创建临时文件</span><br><span class="line">--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份</span><br><span class="line">-P 等同于 --partial</span><br><span class="line">--progress 显示备份过程</span><br><span class="line">-z, --compress 对备份的文件在传输时进行压缩处理</span><br><span class="line">--exclude=PATTERN 指定排除不需要传输的文件模式</span><br><span class="line">--include=PATTERN 指定不排除而需要传输的文件模式</span><br><span class="line">--exclude-from=FILE 排除FILE中指定模式的文件</span><br><span class="line">--include-from=FILE 不排除FILE指定模式匹配的文件</span><br><span class="line">--version 打印版本信息</span><br><span class="line">--address 绑定到特定的地址</span><br><span class="line">--config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件</span><br><span class="line">--port=PORT 指定其他的rsync服务端口</span><br><span class="line">--blocking-io 对远程shell使用阻塞IO</span><br><span class="line">-stats 给出某些文件的传输状态</span><br><span class="line">--progress 在传输时现实传输过程</span><br><span class="line">--log-format=formAT 指定日志文件格式</span><br><span class="line">--password-file=FILE 从FILE中得到密码</span><br><span class="line">--bwlimit=KBPS 限制I/O带宽，KBytes per second</span><br><span class="line">-h, --help 显示帮助信息</span><br></pre></td></tr></table></figure><h2 id="7-2-inotifywait参数说明"><a href="#7-2-inotifywait参数说明" class="headerlink" title="7.2 inotifywait参数说明"></a>7.2 inotifywait参数说明</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">-h,–help 输出帮助信息</span><br><span class="line">-m,–monitor始终保持事件监听状态，接收到一个事件而不退出，无限期地执行。默认的行为是接收到一个事件后立即退出</span><br><span class="line">-r,–recursive 递归查询目录</span><br><span class="line">-q,–quiet只打印监控事件的信息</span><br><span class="line">–exclude正则匹配需要排除的文件，区分大小写</span><br><span class="line">–excludei正则匹配需要排除的文件，不区分大小写</span><br><span class="line">-t,–timeout超时时间，如果为0，则无限期地执行下去</span><br><span class="line">–timefmt指定时间输出格式，用于–format选项中的%T格式</span><br><span class="line">–format指定输出格式</span><br><span class="line"><span class="meta">%</span><span class="bash">w 表示发生事件的目录</span></span><br><span class="line"><span class="meta">%</span><span class="bash">f 表示发生事件的文件</span></span><br><span class="line"><span class="meta">%</span><span class="bash">e 表示发生的事件</span></span><br><span class="line"><span class="meta">%</span><span class="bash">Xe 事件以“X”分隔</span></span><br><span class="line"><span class="meta">%</span><span class="bash">T 使用由–timefmt定义的时间格式</span></span><br><span class="line">-e,–event 指定监视的事件</span><br><span class="line">–fromfile 从文件读取需要监视的文件或排除的文件，一个文件一行，排除的文件以@开头</span><br><span class="line">-d, –daemon 跟–monitor一样，除了是在后台运行，需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。</span><br><span class="line">-o, –outfile  输出事情到一个文件而不是标准输出。</span><br><span class="line">-s, –syslog 输出错误信息到系统日志</span><br><span class="line">-c, –csv 输出csv格式</span><br></pre></td></tr></table></figure><h2 id="7-3-inotifywait-events事件说明"><a href="#7-3-inotifywait-events事件说明" class="headerlink" title="7.3 inotifywait events事件说明"></a>7.3 inotifywait events事件说明</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">access读取文件或目录内容</span><br><span class="line">modify修改文件或目录内容</span><br><span class="line">attrib文件或目录属性更改，如权限，时间戳等</span><br><span class="line">close_write以可写模式打开的文件被关闭，不代表此文件一定已经写入数据</span><br><span class="line">close_nowrite以只读模式打开的文件被关闭</span><br><span class="line">close文件被关闭，不管它是如何打开的</span><br><span class="line">open文件打开</span><br><span class="line">moved_to一个文件或目录移动到监听的目录，即使是在同一目录内移动，此事件也触发</span><br><span class="line">moved_from一个文件或目录移出监听的目录，即使是在同一目录内移动，此事件也触发</span><br><span class="line">move包括moved_to和 moved_from</span><br><span class="line">move_self文件或目录被移除，之后不再监听此文件或目录</span><br><span class="line">create文件或目录创建</span><br><span class="line">delete文件或目录删除</span><br><span class="line">delete_self文件或目录移除，之后不再监听此文件或目录</span><br><span class="line">unmount文件系统取消挂载，之后不再监听此文件系统</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-项目背景&quot;&gt;&lt;a href=&quot;#1-项目背景&quot; class=&quot;headerlink&quot; title=&quot;1. 项目背景&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 项目背景&lt;/strong&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;因为工作需要，需部署一套nginx负载均衡群集，群集须保证所有nginx节点配置文件完全一致；要解决不同服务器之间数据一致，一般采用NFS共享文件、DRBD镜像复制或rsync文件同步来实现，相对于rsync，前两者配置稍麻烦，此处我选择rsync文件同步来保证配置文件一致性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;rsync是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。但是rsync仅仅是同步工具，并不能做到监控文件变化并实时同步，因此还需要配合inotify来实现文件实时同步。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起，加入了inotify支持，通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件，利用这个内核接口，第三方软件就可以监控文件系统下文件的各种变化情况，而inotify-tools正是实施监控的软件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;在这里，我们使用inotify监控文件变化，同时通过脚本来触发rsync将发生变化的文件同步到目标服务器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;术语定义：&lt;/strong&gt;&lt;br&gt;客户端–&amp;gt;源服务器（SRC）&lt;br&gt;服务端–&amp;gt;目标服务器（DEST）&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Centos" scheme="https://www.lucissfer.com/categories/Linux/Centos/"/>
    
      <category term="rsync" scheme="https://www.lucissfer.com/categories/Linux/Centos/rsync/"/>
    
    
      <category term="rsync" scheme="https://www.lucissfer.com/tags/rsync/"/>
    
      <category term="inotify" scheme="https://www.lucissfer.com/tags/inotify/"/>
    
      <category term="文件同步" scheme="https://www.lucissfer.com/tags/%E6%96%87%E4%BB%B6%E5%90%8C%E6%AD%A5/"/>
    
  </entry>
  
  <entry>
    <title>pyenv安装配置</title>
    <link href="https://www.lucissfer.com/2018/05/29/pyenv%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.lucissfer.com/2018/05/29/pyenv安装配置/</id>
    <published>2018-05-28T16:00:00.000Z</published>
    <updated>2018-06-04T12:45:12.550Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>pyenv是一个Python多版本管理工具，它可以改变全局的Python版本，安装多个版本的Python，设置目录级别的Python版本，还能创建和管理virtual python environments 。所有的设置都是用户级别的操作，不需要sudo 命令。<br>pyenv通过系统修改环境变量来实现Python不同版本的切换，它在PATH的最前面插入了一个垫片路径（shims）：~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获，从而使后方的系统路径失效。</p></blockquote><h1 id="1-安装pyenv"><a href="#1-安装pyenv" class="headerlink" title="1. 安装pyenv"></a><strong>1. 安装pyenv</strong></h1><h2 id="1-1-git拉取pyenv代码"><a href="#1-1-git拉取pyenv代码" class="headerlink" title="1.1 git拉取pyenv代码"></a><strong>1.1 git拉取pyenv代码</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> git <span class="built_in">clone</span> https://github.com/pyenv/pyenv.git ~/.pyenv</span></span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="1-2-修改配置文件"><a href="#1-2-修改配置文件" class="headerlink" title="1.2 修改配置文件"></a><strong>1.2 修改配置文件</strong></h2><figure class="highlight shell"><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">#</span><span class="bash"> <span class="built_in">echo</span> <span class="string">'export PYENV_ROOT="$HOME/.pyenv"'</span> &gt;&gt; ~/.bash_profile</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> <span class="string">'export PATH="$PYENV_ROOT/bin:$PATH"'</span> &gt;&gt; ~/.bash_profile</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> -e <span class="string">'if command -v pyenv 1&gt;/dev/null 2&gt;&amp;1; then\n  eval "$(pyenv init -)"\nfi'</span> &gt;&gt; ~/.bash_profile</span></span><br></pre></td></tr></table></figure><h2 id="1-3-重新载入变量配置"><a href="#1-3-重新载入变量配置" class="headerlink" title="1.3 重新载入变量配置"></a><strong>1.3 重新载入变量配置</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">source</span> ~/.bashrc</span></span><br></pre></td></tr></table></figure><h2 id="1-4-验证安装"><a href="#1-4-验证安装" class="headerlink" title="1.4 验证安装"></a><strong>1.4 验证安装</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> pyenv versions</span></span><br></pre></td></tr></table></figure><h1 id="2-使用pyenv安装多版本Python"><a href="#2-使用pyenv安装多版本Python" class="headerlink" title="2. 使用pyenv安装多版本Python"></a><strong>2. 使用pyenv安装多版本Python</strong></h1><h2 id="2-1-安装依赖包"><a href="#2-1-安装依赖包" class="headerlink" title="2.1 安装依赖包"></a><strong>2.1 安装依赖包</strong></h2><p>在使用pyenv安装Python之前，需要安装相应的依赖包，否则在安装过程中会报错。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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="meta">#</span><span class="bash"> yum install -y gcc*</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y readline readline-devel readline-static</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y zlib-devel</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y bzip2-devel bzip2-libs</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y openssl openssl-devel openssl-static</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> yum install -y sqlite-devel</span></span><br></pre></td></tr></table></figure><h2 id="2-2-pyenv常用命令"><a href="#2-2-pyenv常用命令" class="headerlink" title="2.2 pyenv常用命令"></a><strong>2.2 pyenv常用命令</strong></h2><p>查看本机安装 Python 版本</p><figure class="highlight shell"><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="meta">#</span><span class="bash"> pyenv versions</span></span><br><span class="line">* 表示当前正在使用的 Python 版本</span><br></pre></td></tr></table></figure><p>查看可安装Python版本</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> pyenv install -l</span></span><br></pre></td></tr></table></figure><p>python安装与卸载</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><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="meta">#</span><span class="bash"> pyenv install 2.7.15   </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 安装python</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> pyenv uninstall 2.7.15 </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 卸载python</span></span><br></pre></td></tr></table></figure><p>python切换</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span><span class="bash"> pyenv global 2.7.15  </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 设置全局的 Python 版本，通过将版本号写入 ~/.pyenv/version 文件的方式。</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> pyenv <span class="built_in">local</span> 2.7.15 </span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 设置 Python 本地版本，通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。</span></span><br><span class="line"></span><br><span class="line">python优先级</span><br><span class="line">shell &gt; local &gt; global</span><br><span class="line">pyenv 会从当前目录开始向上逐级查找 .python-version 文件，直到根目录为止。若找不到，就用 global 版本。</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> pyenv shell 2.7.15 <span class="comment"># 设置面向 shell 的 Python 版本，通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。</span></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> pyenv shell --<span class="built_in">unset</span></span></span><br><span class="line"><span class="meta">#</span><span class="bash"> pyenv <span class="built_in">rehash</span>  <span class="comment"># 创建垫片路径（为所有已安装的可执行文件创建 shims，如：~/.pyenv/versions/*/bin/*，因此，每当你增删了 Python 版本或带有可执行文件的包（如 pip）以后，都应该执行一次本命令）</span></span></span><br></pre></td></tr></table></figure><p>查看所有pyenv支持命令</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> pyenv commands</span></span><br></pre></td></tr></table></figure><h2 id="2-3-安装过程中遇到的相关问题解决"><a href="#2-3-安装过程中遇到的相关问题解决" class="headerlink" title="2.3 安装过程中遇到的相关问题解决"></a><strong>2.3 安装过程中遇到的相关问题解决</strong></h2><h3 id="2-3-1-安装Python过程慢"><a href="#2-3-1-安装Python过程慢" class="headerlink" title="2.3.1 安装Python过程慢"></a><strong>2.3.1 安装Python过程慢</strong></h3><p>pyenv安装Python过程</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pyenv默认会从官网下载相应Python压缩包，放到/tmp目录下，然后在/tmp目录编译安装，安装在~/.pyenv/versions/下面。</span><br></pre></td></tr></table></figure><p>解决下载安装慢的问题</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">因为pyenv默认会从Python官网下载压缩包，因为众所周知的原因，国内访问Python官网不稳定，因此在下载过程中会非常慢，解决该问题有两个办法：</span><br><span class="line">1. 手动将Python压缩包下载到~/.pyenv/cache/目录下，pyenv会校验md5值和完整性，确认无误的话就不会重新下载直接从这里安装；这里有个需要注意的地方，需要把下载的Python压缩包后缀名由.tgz修改为.tar.gz（切记不能采用把.tgz解压之后再压缩成.tar.gz 的方式，因为这样的话会导致源文件的md5值发生变化而校验失败重新下载。）</span><br><span class="line">2. 直接修改pyenv配置文件，将Python下载地址修改为国内Python镜像源地址，在此，推荐第二种方法，我这里使用的是sohu的镜像源；修改~/.pyenv/plugins/python-build/share/python-build/目录下对应版本号文件，你需要安装哪个版本就修改哪个版本号，替换下载地址为sohu镜像源地址：</span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">cd</span> ~/.pyenv/plugins/python-build/share/python-build/</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim 3.6.5</span></span><br><span class="line"><span class="meta">  #</span><span class="bash">install_package <span class="string">"Python-3.6.5"</span> <span class="string">"https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz#f434053ba1b5c8a5cc597e966ead3c5143012af827fd3f0697d21450bb8d87a6</span></span></span><br><span class="line">  install_package "Python-3.6.5" "http://mirrors.sohu.com/python/3.6.5/Python-3.6.5.tar.xz#f434053ba1b5c8a5cc597e966ead3c5143012af827fd3f0697d21450bb8d87a6</span><br></pre></td></tr></table></figure><h3 id="2-3-2-pip安装库timeout"><a href="#2-3-2-pip安装库timeout" class="headerlink" title="2.3.2 pip安装库timeout"></a><strong>2.3.2 pip安装库timeout</strong></h3><p>pip安装库的时候，也会经常出现现在速度很慢或者timeout的状况，更换成国内镜像源即可解决问题</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">创建一个pip.conf文件</span><br><span class="line"><span class="meta">#</span><span class="bash"> mkdir ~/.pip</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> vim ~/.pip/pip.conf</span></span><br><span class="line">[global]</span><br><span class="line">index-url = http://mirrors.aliyun.com/pypi/simple/</span><br><span class="line"></span><br><span class="line">[install]</span><br><span class="line">trusted-host=mirrors.aliyun.com</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;pyenv是一个Python多版本管理工具，它可以改变全局的Python版本，安装多个版本的Python，设置目录级别的Python版本，还能创建和管理virtual python environments 。所有的设置都是用户级别的操作，不需要sudo 命令。&lt;br&gt;pyenv通过系统修改环境变量来实现Python不同版本的切换，它在PATH的最前面插入了一个垫片路径（shims）：~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获，从而使后方的系统路径失效。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;1-安装pyenv&quot;&gt;&lt;a href=&quot;#1-安装pyenv&quot; class=&quot;headerlink&quot; title=&quot;1. 安装pyenv&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 安装pyenv&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;1-1-git拉取pyenv代码&quot;&gt;&lt;a href=&quot;#1-1-git拉取pyenv代码&quot; class=&quot;headerlink&quot; title=&quot;1.1 git拉取pyenv代码&quot;&gt;&lt;/a&gt;&lt;strong&gt;1.1 git拉取pyenv代码&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; git &lt;span class=&quot;built_in&quot;&gt;clone&lt;/span&gt; https://github.com/pyenv/pyenv.git ~/.pyenv&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Python" scheme="https://www.lucissfer.com/categories/Linux/Python/"/>
    
    
      <category term="Python" scheme="https://www.lucissfer.com/tags/Python/"/>
    
      <category term="pyenv" scheme="https://www.lucissfer.com/tags/pyenv/"/>
    
  </entry>
  
  <entry>
    <title>Centos7安装配置RabbitMQ</title>
    <link href="https://www.lucissfer.com/2018/05/07/Centos7%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AERabbitMQ/"/>
    <id>https://www.lucissfer.com/2018/05/07/Centos7安装配置RabbitMQ/</id>
    <published>2018-05-06T16:00:00.000Z</published>
    <updated>2018-05-07T12:17:08.936Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-RabbitMQ介绍"><a href="#1-RabbitMQ介绍" class="headerlink" title="1. RabbitMQ介绍"></a><strong>1. RabbitMQ介绍</strong></h1><blockquote><p>RabbitMQ是实现AMQP（高级消息队列协议）的消息中间件的一种，最初起源于金融系统，用于在分布式系统中存储转发消息，在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时，消费者无法快速消费，那么需要一个中间层。保存这个数据。</p></blockquote><blockquote><p>AMQP，即Advanced Message Queuing Protocol，高级消息队列协议，是应用层协议的一个开放标准，为面向消息的中间件设计。消息中间件主要用于组件之间的解耦，消息的发送者无需知道消息使用者的存在，反之亦然。AMQP的主要特征是面向消息、队列、路由（包括点对点和发布/订阅）、可靠性、安全。</p></blockquote><blockquote><p>RabbitMQ是一个开源的AMQP实现，服务器端用Erlang语言编写，支持多种客户端，如：Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等，支持AJAX。用于在分布式系统中存储转发消息，在易用性、扩展性、高可用性等方面表现不俗。</p></blockquote><blockquote><pre><code>---以上内容我抄的</code></pre></blockquote><a id="more"></a><h1 id="2-准备所需软件包"><a href="#2-准备所需软件包" class="headerlink" title="2. 准备所需软件包"></a><strong>2. 准备所需软件包</strong></h1><figure class="highlight shell"><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="meta">#</span> ls /data/src/</span><br><span class="line">jdk-8u171-linux-x64.rpm  otp_src_18.3.tar.gz  rabbitmq-server-generic-unix-3.6.6.tar   wxWidgets-3.0.4.tar</span><br></pre></td></tr></table></figure><h1 id="3-编译安装Erlang"><a href="#3-编译安装Erlang" class="headerlink" title="3. 编译安装Erlang "></a><strong>3. 编译安装Erlang</strong> </h1><p>因为RabbitMQ是用Erlang语言编写的，所以在编译安装RabbitMQ之前必须要先编译安装Erlang，Erlang的安装可以使用yum安装，也可以使用源码包编译安装；Centos7上yum安装的Erlang版本太低，因此，此处我们采用源码包编译安装。</p><h2 id="3-1-安装依赖环境"><a href="#3-1-安装依赖环境" class="headerlink" title="3.1 安装依赖环境"></a><strong>3.1 安装依赖环境</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">#</span> yum install -y gcc*</span><br><span class="line"><span class="meta">#</span> yum install -y ncurses-devel</span><br><span class="line"><span class="meta">#</span> yum install -y unixODBC unixODBC-devel</span><br><span class="line"><span class="meta">#</span> yum install -y openssl-devel</span><br><span class="line"><span class="meta">#</span> yum install -y mesa* freeglut*</span><br><span class="line"><span class="meta">#</span> yum install -y fop</span><br><span class="line"><span class="meta">#</span> yum install -y libxslt-devel</span><br></pre></td></tr></table></figure><h2 id="3-2-编译安装wxWidgets"><a href="#3-2-编译安装wxWidgets" class="headerlink" title="3.2 编译安装wxWidgets"></a><strong>3.2 编译安装wxWidgets</strong></h2><p>wxWidgets是一个开源的跨平台的C++构架库（framework），它可以提供GUI（图形用户界面）和其它工具。wxWidgets支持在Erlang的编译安装过程中是非必需的，但Erlang的新GUI工具是基于wxWidgets开发的，因此要使用这些工具必须安装wxWidgets。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span> wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.4/wxWidgets-3.0.4.tar.bz2</span><br><span class="line"><span class="meta">#</span> bzip2 -d wxWidgets-3.0.4.tar.bz2</span><br><span class="line"><span class="meta">#</span> tar xf wxWidgets-3.0.4.tar</span><br><span class="line"><span class="meta">#</span> cd wxWidgets-3.0.4/</span><br><span class="line"><span class="meta">#</span> yum install -y gtk+-devel</span><br><span class="line"><span class="meta">#</span> yum install -y gtk2-devel binutils-devel</span><br><span class="line"><span class="meta">#</span> ./configure --with-opengl --enable-debug --enable-unicode</span><br><span class="line"><span class="meta">#</span> make &amp;&amp; make install</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意：</strong><br>此处需注意的是，gtk+-devel、gtk2-devel、binutils-devel是必需的依赖环境，否则wxWidgets的make过程会报错。</p></blockquote><h2 id="3-3-编译安装Erlang"><a href="#3-3-编译安装Erlang" class="headerlink" title="3.3 编译安装Erlang"></a><strong>3.3 编译安装Erlang</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><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="meta">#</span> tar zxf otp_src_18.3.tar.gz</span><br><span class="line"><span class="meta">#</span> cd otp_src_18.3</span><br><span class="line"><span class="meta">#</span> ./configure</span><br><span class="line"><span class="meta">#</span> make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p>测试Erlang是否安装成功</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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">#</span> erl</span><br><span class="line">Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]</span><br><span class="line"></span><br><span class="line">Eshell V7.3  (abort with ^G)</span><br><span class="line"><span class="meta">1&gt;</span> halt().</span><br></pre></td></tr></table></figure><h1 id="4-安装配置RabbitMQ"><a href="#4-安装配置RabbitMQ" class="headerlink" title="4. 安装配置RabbitMQ"></a><strong>4. 安装配置RabbitMQ</strong></h1><p>RabbitMQ提供了yum安装、rpm安装、编译安装、二进制包等多种方式，此处采用的是二进制包直接解压使用。</p><h2 id="4-1-解压RabbitMQ二进制包并移动到指定目录"><a href="#4-1-解压RabbitMQ二进制包并移动到指定目录" class="headerlink" title="4.1 解压RabbitMQ二进制包并移动到指定目录"></a><strong>4.1 解压RabbitMQ二进制包并移动到指定目录</strong></h2><figure class="highlight shell"><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="meta">#</span> tar xf rabbitmq-server-generic-unix-3.6.6.tar</span><br><span class="line"><span class="meta">#</span> mv rabbitmq_server-3.6.6 /data/program/rabbitmq</span><br></pre></td></tr></table></figure><p>配置环境变量</p><figure class="highlight shell"><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">#</span> vim /etc/profile.d/rabbitmq.sh</span><br><span class="line">export PATH=/data/program/rabbitmq/sbin:$PATH</span><br><span class="line"><span class="meta">#</span> source /etc/profile</span><br></pre></td></tr></table></figure><h2 id="4-2-启动RabbitMQ服务"><a href="#4-2-启动RabbitMQ服务" class="headerlink" title="4.2 启动RabbitMQ服务"></a><strong>4.2 启动RabbitMQ服务</strong></h2><figure class="highlight shell"><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="meta">#</span> rabbitmq-server -detached</span><br><span class="line"><span class="meta">#</span> rabbitmqctl status</span><br></pre></td></tr></table></figure><h2 id="4-3-开启web管理接口"><a href="#4-3-开启web管理接口" class="headerlink" title="4.3 开启web管理接口"></a><strong>4.3 开启web管理接口</strong></h2><p>RabbitMQ默认情况下近允许通过命令行来管理，在日常工作中多有不便，还好RabbitMQ自带了web管理界面，只需要启动插件便可以使用。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> rabbitmq-plugins enable rabbitmq_management</span><br></pre></td></tr></table></figure><p>使用浏览器访问</p><blockquote><p>http://[IP]:15672</p></blockquote><p>输入用户名和密码就可以访问web管理界面了。</p><h2 id="4-4-配置RabbitMQ用户"><a href="#4-4-配置RabbitMQ用户" class="headerlink" title="4.4 配置RabbitMQ用户"></a><strong>4.4 配置RabbitMQ用户</strong></h2><p>默认情况下，RabbitMQ的默认的guest用户只允许本机访问，如果需要远程访问，可以新增一个用户并配置远程；同时，由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户。</p><p><strong>新增远程管理用户rabbitmq</strong></p><figure class="highlight shell"><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">#</span> rabbitmqctl add_user rabbitmq password</span><br><span class="line"><span class="meta">#</span> rabbitmqctl set_permissions -p "/" rabbitmq ".*" ".*" ".*"</span><br><span class="line"><span class="meta">#</span> rabbitmqctl set_user_tags rabbitmq administrator</span><br></pre></td></tr></table></figure><p><strong>删除默认用户guest</strong></p><figure class="highlight shell"><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="meta">#</span> rabbitmqctl delete_user guest</span><br><span class="line">Deleting user "guest" ...</span><br></pre></td></tr></table></figure><h2 id="4-5-RabbitMQ常用命令"><a href="#4-5-RabbitMQ常用命令" class="headerlink" title="4.5 RabbitMQ常用命令"></a><strong>4.5 RabbitMQ常用命令</strong></h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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><br><span class="line"><span class="meta">#</span> rabbitmqctl list_users</span><br><span class="line">Listing users ...</span><br><span class="line">rabbitmq[administrator]</span><br><span class="line"></span><br><span class="line">查看默认guest用户的权限</span><br><span class="line"><span class="meta">#</span> rabbitmqctl list_user_permissions guest</span><br><span class="line"></span><br><span class="line">添加新用户</span><br><span class="line"><span class="meta">#</span> rabbitmqctl add_user username password</span><br><span class="line"></span><br><span class="line">设置用户tag</span><br><span class="line"><span class="meta">#</span> rabbitmqctl set_user_tags username administrator</span><br><span class="line"></span><br><span class="line">赋予用户默认vhost的全部操作权限</span><br><span class="line"><span class="meta">#</span> rabbitmqctl set_permissions -p / username ".*" ".*" ".*"</span><br><span class="line"></span><br><span class="line">查看用户的权限</span><br><span class="line"><span class="meta">#</span> rabbitmqctl list_user_permissions username</span><br></pre></td></tr></table></figure><h2 id="4-6-RabbitMQ用户角色"><a href="#4-6-RabbitMQ用户角色" class="headerlink" title="4.6 RabbitMQ用户角色"></a><strong>4.6 RabbitMQ用户角色</strong></h2><p><strong>RabbitMQ的用户角色分类：</strong></p><blockquote><p>none、management、policymaker、monitoring、administrator</p></blockquote><p><strong>RabbitMQ各类角色描述：</strong></p><blockquote><p><strong>none</strong><br>不能访问 management plugin</p></blockquote><blockquote><p><strong>management</strong><br>用户可以通过AMQP做的任何事外加：<br>列出自己可以通过AMQP登入的virtual hosts<br>查看自己的virtual hosts中的queues, exchanges 和 bindings<br>查看和关闭自己的channels 和 connections<br>查看有关自己的virtual hosts的“全局”的统计信息，包含其他用户在这些virtual hosts中的活动。</p></blockquote><blockquote><p><strong>policymaker</strong><br>management可以做的任何事外加：<br>查看、创建和删除自己的virtual hosts所属的policies和parameters</p></blockquote><blockquote><p><strong>monitoring</strong><br>management可以做的任何事外加：<br>列出所有virtual hosts，包括他们不能登录的virtual hosts<br>查看其他用户的connections和channels<br>查看节点级别的数据如clustering和memory使用情况<br>查看真正的关于所有virtual hosts的全局的统计信息</p></blockquote><blockquote><p><strong>administrator</strong><br>policymaker和monitoring可以做的任何事外加:<br>创建和删除virtual hosts<br>查看、创建和删除users<br>查看创建和删除permissions<br>关闭其他用户的connections</p></blockquote><h1 id="5-一些踩到的坑"><a href="#5-一些踩到的坑" class="headerlink" title="5. 一些踩到的坑"></a><strong>5. 一些踩到的坑</strong></h1><h2 id="5-1-关于编译环境"><a href="#5-1-关于编译环境" class="headerlink" title="5.1 关于编译环境"></a><strong>5.1 关于编译环境</strong></h2><p>编译安装Erlang的时候会出现报错：</p><blockquote><p>jinterface : No Java compiler found</p></blockquote><p>可以通过安装jdk来解决，如果有gcc环境，无需安装jdk，可以在configure时增加 –disable-javac来跳过警告。</p><h2 id="5-2-重启服务器后，RabbitMQ用户丢失问题"><a href="#5-2-重启服务器后，RabbitMQ用户丢失问题" class="headerlink" title="5.2 重启服务器后，RabbitMQ用户丢失问题"></a><strong>5.2 重启服务器后，RabbitMQ用户丢失问题</strong></h2><p>在部署配置完成后，重启了一次服务器，服务器启动后重新启动RabbitMQ服务，结果神奇的发现RabbitMQ用户丢失了。<br>原因如下：</p><figure class="highlight shell"><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">RabbitMQ数据是根据当前hostname作为node节点作为数据名保存</span><br><span class="line"><span class="meta">#</span> ls /data/program/rabbitmq/var/lib/rabbitmq/mnesia/</span><br><span class="line">rabbit@Centos7-01  rabbit@Centos7-01.pid  rabbit@Centos7-01-plugins-expand</span><br></pre></td></tr></table></figure><p>重启服务器之前我修改了hostname，所以重启之后，RabbitMQ服务使用新的hostname来保存数据。</p><p>可以通过添加RabbitMQ固定节点名字，保证数据文件不变。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> echo 'NODENAME=rabbit@info' | tee -a etc/rabbitmq/rabbitmq-env.conf</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-RabbitMQ介绍&quot;&gt;&lt;a href=&quot;#1-RabbitMQ介绍&quot; class=&quot;headerlink&quot; title=&quot;1. RabbitMQ介绍&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. RabbitMQ介绍&lt;/strong&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;RabbitMQ是实现AMQP（高级消息队列协议）的消息中间件的一种，最初起源于金融系统，用于在分布式系统中存储转发消息，在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时，消费者无法快速消费，那么需要一个中间层。保存这个数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;AMQP，即Advanced Message Queuing Protocol，高级消息队列协议，是应用层协议的一个开放标准，为面向消息的中间件设计。消息中间件主要用于组件之间的解耦，消息的发送者无需知道消息使用者的存在，反之亦然。AMQP的主要特征是面向消息、队列、路由（包括点对点和发布/订阅）、可靠性、安全。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;RabbitMQ是一个开源的AMQP实现，服务器端用Erlang语言编写，支持多种客户端，如：Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等，支持AJAX。用于在分布式系统中存储转发消息，在易用性、扩展性、高可用性等方面表现不俗。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;---以上内容我抄的&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Centos" scheme="https://www.lucissfer.com/categories/Linux/Centos/"/>
    
      <category term="RabbitMQ" scheme="https://www.lucissfer.com/categories/Linux/Centos/RabbitMQ/"/>
    
    
      <category term="Centos" scheme="https://www.lucissfer.com/tags/Centos/"/>
    
      <category term="RabbitMQ" scheme="https://www.lucissfer.com/tags/RabbitMQ/"/>
    
  </entry>
  
  <entry>
    <title>配置docker使用国内镜像源及镜像加速器</title>
    <link href="https://www.lucissfer.com/2018/04/26/%E9%85%8D%E7%BD%AEdocker%E4%BD%BF%E7%94%A8%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90%E5%8F%8A%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F%E5%99%A8/"/>
    <id>https://www.lucissfer.com/2018/04/26/配置docker使用国内镜像源及镜像加速器/</id>
    <published>2018-04-25T16:00:00.000Z</published>
    <updated>2018-04-26T11:37:42.661Z</updated>
    
    <content type="html"><![CDATA[<p>因为众所周知的原因，在国内访问docker官方yum源经常会出现不可知状态，为了正常使用docker，我们需要将docker yum源修改为国内yum源来解决访问慢或者无法访问的问题。<br>目前国内大多数开放镜像站都提供了docker yum源，如：阿里云、USTC等，此处以阿里云为例。</p><h2 id="1-修改docker-ce-repo文件，配置国内镜像站地址"><a href="#1-修改docker-ce-repo文件，配置国内镜像站地址" class="headerlink" title="1. 修改docker-ce.repo文件，配置国内镜像站地址"></a><strong>1. 修改docker-ce.repo文件，配置国内镜像站地址</strong></h2><p>docker-ce.repo文件可从阿里云或USTC镜像站下载，阿里云下载地址：<a href="https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo" target="_blank" rel="noopener">https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</a></p><blockquote><p>不知为何，阿里云与USTC镜像站上默认的docker-ce.repo文件内部地址均是指向docker官方站<a href="https://download-stage.docker.com" target="_blank" rel="noopener">https://download-stage.docker.com</a> 这样导致直接下载下来的repo文件无法正常使用，需要将baseurl修改为国内镜像站的地址。</p></blockquote><figure class="highlight shell"><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">#</span><span class="bash"> vim /etc/yum.repos.d/docker-ce.repo</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sed -i <span class="string">'s@https://download-stage.docker.com/linux/centos/7/@https://mirrors.aliyun.com/docker-ce/linux/centos/7/@g'</span> /etc/yum.repos.d/docker-ce.repo</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sed -i <span class="string">'s@https://download-stage.docker.com/linux/centos/gpg@https://mirrors.aliyun.com/docker-ce/linux/centos/gpg@g'</span> /etc/yum.repos.d/docker-ce.repo</span></span><br></pre></td></tr></table></figure><p>修改完成后，yum安装docker就可以直接使用国内yum源了。</p><a id="more"></a><h2 id="2-修改-etc-docker-daemon-json文件，配置docker镜像加速器"><a href="#2-修改-etc-docker-daemon-json文件，配置docker镜像加速器" class="headerlink" title="2. 修改/etc/docker/daemon.json文件，配置docker镜像加速器"></a><strong>2. 修改/etc/docker/daemon.json文件，配置docker镜像加速器</strong></h2><p>配置完docker的国内yum源仅仅解决了yum安装docker时的访问问题，但在docker实际使用中还面临另外一个问题；<br>docker默认镜像仓库Docker Hub服务器位于国外，因此在国内访问的时候依然会出现各种故障，为此docker提供了一个镜像加速器的设置，<br>可以通过配置位于国内的<strong>镜像加速器</strong>来加速docker镜像的拉取。<br>Docker 官方和国内很多云服务商都提供了国内加速器服务，例如：</p><blockquote><p><a href="https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror" target="_blank" rel="noopener">Docker 官方提供的中国 registry mirror</a><br><a href="https://cr.console.aliyun.com/#/accelerator" target="_blank" rel="noopener">阿里云加速器</a><br><a href="https://www.daocloud.io/mirror#accelerator-doc" target="_blank" rel="noopener">DaoCloud 加速器</a><br>后两者需要注册相关账号才可以使用。</p></blockquote><p>修改/etc/docker/daemon.json文件，添加以下内容，如此文件不存在则创建之；</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><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="meta">#</span><span class="bash"> vim /etc/docker/daemon.json</span></span><br><span class="line">&#123;</span><br><span class="line">"registry-mirrors": [</span><br><span class="line">"https://registry.docker-cn.com"</span><br><span class="line">]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>修改完成后，需重启服务生效；</p><figure class="highlight shell"><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="meta">#</span><span class="bash"> systemctl daemon-reload</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> systemctl restart docker</span></span><br></pre></td></tr></table></figure><p>到此为止，可以愉快的使用docker了。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;因为众所周知的原因，在国内访问docker官方yum源经常会出现不可知状态，为了正常使用docker，我们需要将docker yum源修改为国内yum源来解决访问慢或者无法访问的问题。&lt;br&gt;目前国内大多数开放镜像站都提供了docker yum源，如：阿里云、USTC等，此处以阿里云为例。&lt;/p&gt;
&lt;h2 id=&quot;1-修改docker-ce-repo文件，配置国内镜像站地址&quot;&gt;&lt;a href=&quot;#1-修改docker-ce-repo文件，配置国内镜像站地址&quot; class=&quot;headerlink&quot; title=&quot;1. 修改docker-ce.repo文件，配置国内镜像站地址&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 修改docker-ce.repo文件，配置国内镜像站地址&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;docker-ce.repo文件可从阿里云或USTC镜像站下载，阿里云下载地址：&lt;a href=&quot;https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不知为何，阿里云与USTC镜像站上默认的docker-ce.repo文件内部地址均是指向docker官方站&lt;a href=&quot;https://download-stage.docker.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://download-stage.docker.com&lt;/a&gt; 这样导致直接下载下来的repo文件无法正常使用，需要将baseurl修改为国内镜像站的地址。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; vim /etc/yum.repos.d/docker-ce.repo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; sed -i &lt;span class=&quot;string&quot;&gt;&#39;s@https://download-stage.docker.com/linux/centos/7/@https://mirrors.aliyun.com/docker-ce/linux/centos/7/@g&#39;&lt;/span&gt; /etc/yum.repos.d/docker-ce.repo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;bash&quot;&gt; sed -i &lt;span class=&quot;string&quot;&gt;&#39;s@https://download-stage.docker.com/linux/centos/gpg@https://mirrors.aliyun.com/docker-ce/linux/centos/gpg@g&#39;&lt;/span&gt; /etc/yum.repos.d/docker-ce.repo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;修改完成后，yum安装docker就可以直接使用国内yum源了。&lt;/p&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Docker" scheme="https://www.lucissfer.com/categories/Linux/Docker/"/>
    
    
      <category term="docker" scheme="https://www.lucissfer.com/tags/docker/"/>
    
      <category term="镜像源" scheme="https://www.lucissfer.com/tags/%E9%95%9C%E5%83%8F%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>使用Nginx来配置服务端兼容APP接口多版本</title>
    <link href="https://www.lucissfer.com/2018/03/20/Nginx+APP%E6%8E%A5%E5%8F%A3%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%BC%E5%AE%B9/"/>
    <id>https://www.lucissfer.com/2018/03/20/Nginx+APP接口多版本兼容/</id>
    <published>2018-03-19T16:00:00.000Z</published>
    <updated>2018-03-20T17:18:20.225Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>移动互联网时代，讲究的是快速迭代，为了完善产品功能，一款APP需要不断的更新版本发布功能；而为了不影响用户体验，很多时候我们无法做到每个版本都强制用户更新；这样一来势必要保证APP多版本共存，作为APP与服务端交互的交互的api接口也将存在多个接口共存的情况，所以，我们必须考虑到如何实现APP接口多版本共存。</p></blockquote><h1 id="1-APP接口多版本共存的几种实现方式"><a href="#1-APP接口多版本共存的几种实现方式" class="headerlink" title="1. APP接口多版本共存的几种实现方式"></a><strong>1. APP接口多版本共存的几种实现方式</strong></h1><h2 id="1-1-URL请求中加入版本信息"><a href="#1-1-URL请求中加入版本信息" class="headerlink" title="1.1 URL请求中加入版本信息"></a><strong>1.1 URL请求中加入版本信息</strong></h2><blockquote><p>例如：<br><a href="http://www.xxx.com/api.xxx?version=v1" target="_blank" rel="noopener">www.xxx.com/api.xxx?version=v1</a><br><a href="http://www.xxx.com/api.xxx?version=v2" target="_blank" rel="noopener">www.xxx.com/api.xxx?version=v2</a></p></blockquote><h2 id="1-2-使用不同子域名来区分不同版本的api接口"><a href="#1-2-使用不同子域名来区分不同版本的api接口" class="headerlink" title="1.2 使用不同子域名来区分不同版本的api接口"></a><strong>1.2 使用不同子域名来区分不同版本的api接口</strong></h2><blockquote><p>例如：<br>api1.xxx.com<br>api2.xxx.com</p></blockquote><h2 id="1-3-URL中加入不同版本路径来区分不同版本的api接口"><a href="#1-3-URL中加入不同版本路径来区分不同版本的api接口" class="headerlink" title="1.3 URL中加入不同版本路径来区分不同版本的api接口"></a><strong>1.3 URL中加入不同版本路径来区分不同版本的api接口</strong></h2><blockquote><p>例如：<br><a href="http://www.xxx.com/v1/api" target="_blank" rel="noopener">www.xxx.com/v1/api</a><br><a href="http://www.xxx.com/v2/api" target="_blank" rel="noopener">www.xxx.com/v2/api</a></p></blockquote><h2 id="1-4-在URL提交header中加入版本信息"><a href="#1-4-在URL提交header中加入版本信息" class="headerlink" title="1.4 在URL提交header中加入版本信息"></a><strong>1.4 在URL提交header中加入版本信息</strong></h2><blockquote><p>例如：<br>header信息中直接添加一个字段：http_AppVersion = 1</p></blockquote><a id="more"></a><h1 id="2-我们选择的方案"><a href="#2-我们选择的方案" class="headerlink" title="2. 我们选择的方案"></a><strong>2. 我们选择的方案</strong></h1><p>在我们的技术选型过程中，不远将版本信息暴露在URL中，因此我们选择将版本信息放在header中，通过服务端来判断app版本信息并将请求分发到不同的接口服务上。<br>因此，我们选择在接口服务前面加一个Nginx来反代请求并分发，而Nginx原生支持用户自定义header，所以我们只需要在提交的header信息中定义一个http_AppVersion字段，APP端请求到Nginx服务器，Nginx服务器根据请求过来的header信息中的http_AppVersion字段值将不同版本的APP请求转发的不同的api接口服务上。</p><h1 id="3-Nginx的具体配置"><a href="#3-Nginx的具体配置" class="headerlink" title="3. Nginx的具体配置"></a><strong>3. Nginx的具体配置</strong></h1><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">location / &#123;</span><br><span class="line">if ($http_AppVersion = "1_0_1") &#123;</span><br><span class="line">proxy_pass https://api1.xxx.com/1_0_1$request_uri;</span><br><span class="line">break;</span><br><span class="line">&#125;</span><br><span class="line">if ($http_AppVersion = "1.0.2") &#123;</span><br><span class="line">proxy_pass https://api1.xxx.com/1_0_2$request_uri;</span><br><span class="line">break;</span><br><span class="line">&#125;</span><br><span class="line">if ($http_AppVersion = "1.0.3") &#123;</span><br><span class="line">proxy_pass https://api1.xxx.com/1_0_3$request_uri;</span><br><span class="line">break;</span><br><span class="line">&#125;</span><br><span class="line">if ($http_AppVersion = "1.0.4") &#123;</span><br><span class="line">proxy_pass https://api1.xxx.com/1_0_4$request_uri;</span><br><span class="line">break;</span><br><span class="line">&#125;</span><br><span class="line">if ($http_AppVersion = "") &#123;</span><br><span class="line">proxy_pass https://api1.xxx.com/1_0_1$request_uri;</span><br><span class="line">break;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;移动互联网时代，讲究的是快速迭代，为了完善产品功能，一款APP需要不断的更新版本发布功能；而为了不影响用户体验，很多时候我们无法做到每个版本都强制用户更新；这样一来势必要保证APP多版本共存，作为APP与服务端交互的交互的api接口也将存在多个接口共存的情况，所以，我们必须考虑到如何实现APP接口多版本共存。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;1-APP接口多版本共存的几种实现方式&quot;&gt;&lt;a href=&quot;#1-APP接口多版本共存的几种实现方式&quot; class=&quot;headerlink&quot; title=&quot;1. APP接口多版本共存的几种实现方式&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. APP接口多版本共存的几种实现方式&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;1-1-URL请求中加入版本信息&quot;&gt;&lt;a href=&quot;#1-1-URL请求中加入版本信息&quot; class=&quot;headerlink&quot; title=&quot;1.1 URL请求中加入版本信息&quot;&gt;&lt;/a&gt;&lt;strong&gt;1.1 URL请求中加入版本信息&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;例如：&lt;br&gt;&lt;a href=&quot;http://www.xxx.com/api.xxx?version=v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.xxx.com/api.xxx?version=v1&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.xxx.com/api.xxx?version=v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.xxx.com/api.xxx?version=v2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-2-使用不同子域名来区分不同版本的api接口&quot;&gt;&lt;a href=&quot;#1-2-使用不同子域名来区分不同版本的api接口&quot; class=&quot;headerlink&quot; title=&quot;1.2 使用不同子域名来区分不同版本的api接口&quot;&gt;&lt;/a&gt;&lt;strong&gt;1.2 使用不同子域名来区分不同版本的api接口&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;例如：&lt;br&gt;api1.xxx.com&lt;br&gt;api2.xxx.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-3-URL中加入不同版本路径来区分不同版本的api接口&quot;&gt;&lt;a href=&quot;#1-3-URL中加入不同版本路径来区分不同版本的api接口&quot; class=&quot;headerlink&quot; title=&quot;1.3 URL中加入不同版本路径来区分不同版本的api接口&quot;&gt;&lt;/a&gt;&lt;strong&gt;1.3 URL中加入不同版本路径来区分不同版本的api接口&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;例如：&lt;br&gt;&lt;a href=&quot;http://www.xxx.com/v1/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.xxx.com/v1/api&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.xxx.com/v2/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.xxx.com/v2/api&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-4-在URL提交header中加入版本信息&quot;&gt;&lt;a href=&quot;#1-4-在URL提交header中加入版本信息&quot; class=&quot;headerlink&quot; title=&quot;1.4 在URL提交header中加入版本信息&quot;&gt;&lt;/a&gt;&lt;strong&gt;1.4 在URL提交header中加入版本信息&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;例如：&lt;br&gt;header信息中直接添加一个字段：http_AppVersion = 1&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Nginx/OpenResty" scheme="https://www.lucissfer.com/categories/Linux/Nginx-OpenResty/"/>
    
    
      <category term="openResty" scheme="https://www.lucissfer.com/tags/openResty/"/>
    
      <category term="app" scheme="https://www.lucissfer.com/tags/app/"/>
    
      <category term="多版本" scheme="https://www.lucissfer.com/tags/%E5%A4%9A%E7%89%88%E6%9C%AC/"/>
    
  </entry>
  
  <entry>
    <title>MongoDB副本集分片集群配置</title>
    <link href="https://www.lucissfer.com/2017/02/03/MongoDB+%E5%89%AF%E6%9C%AC%E9%9B%86%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.lucissfer.com/2017/02/03/MongoDB+副本集分片集群配置/</id>
    <published>2017-02-02T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.157Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-配置前准备工作"><a href="#1-配置前准备工作" class="headerlink" title="1. 配置前准备工作"></a><strong>1. 配置前准备工作</strong></h1><h2 id="准备MongoDB程序文件"><a href="#准备MongoDB程序文件" class="headerlink" title="准备MongoDB程序文件"></a><strong>准备MongoDB程序文件</strong></h2><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></pre></td><td class="code"><pre><span class="line"># wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.1.tgz</span><br><span class="line"># tar zxf mongodb-linux-x86_64-rhel62-3.4.1.tgz</span><br><span class="line"># cp -r mongodb-linux-x86_64-rhel62-3.4.1 /usr/local/</span><br><span class="line"># ln -s /usr/local/mongodb-linux-x86_64-rhel62-3.4.1 /usr/local/mongodb</span><br><span class="line"># ls /usr/local/mongodb</span><br><span class="line">bin  GNU-AGPL-3.0  MPL-2  README  THIRD-PARTY-NOTICES</span><br></pre></td></tr></table></figure><h2 id="为MongoDB配置环境变量"><a href="#为MongoDB配置环境变量" class="headerlink" title="为MongoDB配置环境变量"></a><strong>为MongoDB配置环境变量</strong></h2><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></pre></td><td class="code"><pre><span class="line"># vim /etc/profile.d/mongodb.sh</span><br><span class="line">export PATH=/usr/local/mongodb/bin:$PATH</span><br><span class="line"># source /etc/profile.d/mongodb.sh</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="为MongoDB创建相关目录"><a href="#为MongoDB创建相关目录" class="headerlink" title="为MongoDB创建相关目录"></a><strong>为MongoDB创建相关目录</strong></h2><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><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"># mkdir -pv /home/mongodb/shard&#123;1,2,3&#125;/data/</span><br><span class="line">mkdir: created directory `/home/mongodb/shard1&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard1/data/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard2&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard2/data/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard3&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard3/data/&apos;</span><br><span class="line"># mkdir -pv /home/mongodb/shard&#123;1,2,3&#125;/config/</span><br><span class="line">mkdir: created directory `/home/mongodb/shard1/config/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard2/config/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard3/config/&apos;</span><br><span class="line"># mkdir -pv /home/mongodb/shard&#123;1,2,3&#125;/log/</span><br><span class="line">mkdir: created directory `/home/mongodb/shard1/log/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard2/log/&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/shard3/log/&apos;</span><br><span class="line"></span><br><span class="line"># tree /home/mongodb</span><br><span class="line">/home/mongodb</span><br><span class="line">├── shard1</span><br><span class="line">│   ├── config</span><br><span class="line">│   ├── data</span><br><span class="line">│   └── log</span><br><span class="line">├── shard2</span><br><span class="line">│   ├── config</span><br><span class="line">│   ├── data</span><br><span class="line">│   └── log</span><br><span class="line">└── shard3</span><br><span class="line">    ├── config</span><br><span class="line">    ├── data</span><br><span class="line">    └── log</span><br><span class="line"></span><br><span class="line">12 directories, 0 files</span><br></pre></td></tr></table></figure><h1 id="2-配置副本集"><a href="#2-配置副本集" class="headerlink" title="2. 配置副本集"></a><strong>2. 配置副本集</strong></h1><h2 id="启动MongoDB实例"><a href="#启动MongoDB实例" class="headerlink" title="启动MongoDB实例"></a><strong>启动MongoDB实例</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"># mongod --shardsvr --replSet sharding1 --port 27101 --dbpath /home/mongodb/shard1/data/ --pidfilepath /home/mongodb/shard1/log/sharding1_1.pid --logpath /home/mongodb/shard1/log/sharding1_1.log --logappend --fork</span><br><span class="line">在生产环境中更推荐使用指定配置文件的方式来启动</span><br><span class="line"># cd /home/mongodb</span><br><span class="line"># vim shard1/config/shard1.conf</span><br><span class="line">shardsvr = true</span><br><span class="line">replSet = sharding1</span><br><span class="line">port = 27101</span><br><span class="line">quiet = true</span><br><span class="line">dbpath = /home/mongodb/shard1/data/</span><br><span class="line">pidfilepath = /home/mongodb/shard1/log/sharding1_1.pid</span><br><span class="line">logpath = /home/mongodb/shard1/log/sharding1_1.log</span><br><span class="line">oplogSize = 2048</span><br><span class="line">directoryperdb=true</span><br><span class="line">logappend = true</span><br><span class="line">rest = true</span><br><span class="line">fork = true</span><br><span class="line">journal = true</span><br><span class="line">noprealloc=true</span><br><span class="line"></span><br><span class="line">指定配置文件启动MongoDB</span><br><span class="line"># mongod --config /home/mongodb/shard1/config/shard1.conf</span><br><span class="line"></span><br><span class="line">添加iptables规则</span><br><span class="line"># iptables -I INPUT -s 192.168.1.0/24 -p tcp -j ACCEPT</span><br><span class="line"># service iptables save</span><br></pre></td></tr></table></figure><h2 id="初始化副本集（Replica-Set）"><a href="#初始化副本集（Replica-Set）" class="headerlink" title="初始化副本集（Replica Set）"></a><strong>初始化副本集（Replica Set）</strong></h2><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"># mongo --port 27101</span><br><span class="line">&gt; use admin</span><br><span class="line">switched to db admin</span><br><span class="line">&gt; db.runCommand(&#123;&quot;replSetInitiate&quot; :&#123;</span><br><span class="line">... &quot;_id&quot;:&quot;sharding1&quot;,</span><br><span class="line">... &quot;members&quot;:[</span><br><span class="line">... &#123;&quot;_id&quot;:1,&quot;host&quot;:&quot;10.1.1.148:27101&quot;&#125;,</span><br><span class="line">... &#123;&quot;_id&quot;:2,&quot;host&quot;:&quot;10.1.1.149:27101&quot;&#125;,</span><br><span class="line">... &#123;&quot;_id&quot;:3,&quot;host&quot;:&quot;10.1.1.150:27101&quot;&#125;,</span><br><span class="line">... ]&#125;&#125;)</span><br></pre></td></tr></table></figure><h2 id="验证副本集（Replica-Sets）状态"><a href="#验证副本集（Replica-Sets）状态" class="headerlink" title="验证副本集（Replica Sets）状态"></a><strong>验证副本集（Replica Sets）状态</strong></h2><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><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></pre></td><td class="code"><pre><span class="line">sharding1:PRIMARY&gt; rs.status()</span><br><span class="line">&#123;</span><br><span class="line">&quot;set&quot; : &quot;sharding1&quot;,</span><br><span class="line">&quot;date&quot; : ISODate(&quot;2017-01-13T07:01:09.676Z&quot;),</span><br><span class="line">&quot;myState&quot; : 1,</span><br><span class="line">&quot;term&quot; : NumberLong(1),</span><br><span class="line">&quot;heartbeatIntervalMillis&quot; : NumberLong(2000),</span><br><span class="line">&quot;optimes&quot; : &#123;</span><br><span class="line">&quot;lastCommittedOpTime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;appliedOpTime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;durableOpTime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;</span><br><span class="line">&#125;,</span><br><span class="line">&quot;members&quot; : [</span><br><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : 1,</span><br><span class="line">&quot;name&quot; : &quot;10.1.1.148:27101&quot;,</span><br><span class="line">&quot;health&quot; : 1,</span><br><span class="line">&quot;state&quot; : 1,</span><br><span class="line">&quot;stateStr&quot; : &quot;PRIMARY&quot;,</span><br><span class="line">&quot;uptime&quot; : 1169,</span><br><span class="line">&quot;optime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;optimeDate&quot; : ISODate(&quot;2017-01-13T07:01:04Z&quot;),</span><br><span class="line">&quot;electionTime&quot; : Timestamp(1484290383, 1),</span><br><span class="line">&quot;electionDate&quot; : ISODate(&quot;2017-01-13T06:53:03Z&quot;),</span><br><span class="line">&quot;configVersion&quot; : 1,</span><br><span class="line">&quot;self&quot; : true</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : 2,</span><br><span class="line">&quot;name&quot; : &quot;10.1.1.149:27101&quot;,</span><br><span class="line">&quot;health&quot; : 1,</span><br><span class="line">&quot;state&quot; : 2,</span><br><span class="line">&quot;stateStr&quot; : &quot;SECONDARY&quot;,</span><br><span class="line">&quot;uptime&quot; : 497,</span><br><span class="line">&quot;optime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;optimeDurable&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;optimeDate&quot; : ISODate(&quot;2017-01-13T07:01:04Z&quot;),</span><br><span class="line">&quot;optimeDurableDate&quot; : ISODate(&quot;2017-01-13T07:01:04Z&quot;),</span><br><span class="line">&quot;lastHeartbeat&quot; : ISODate(&quot;2017-01-13T07:01:09.543Z&quot;),</span><br><span class="line">&quot;lastHeartbeatRecv&quot; : ISODate(&quot;2017-01-13T07:01:09.460Z&quot;),</span><br><span class="line">&quot;pingMs&quot; : NumberLong(0),</span><br><span class="line">&quot;syncingTo&quot; : &quot;10.1.1.148:27101&quot;,</span><br><span class="line">&quot;configVersion&quot; : 1</span><br><span class="line">&#125;,</span><br><span class="line">&#123;</span><br><span class="line">&quot;_id&quot; : 3,</span><br><span class="line">&quot;name&quot; : &quot;10.1.1.150:27101&quot;,</span><br><span class="line">&quot;health&quot; : 1,</span><br><span class="line">&quot;state&quot; : 2,</span><br><span class="line">&quot;stateStr&quot; : &quot;SECONDARY&quot;,</span><br><span class="line">&quot;uptime&quot; : 497,</span><br><span class="line">&quot;optime&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;optimeDurable&quot; : &#123;</span><br><span class="line">&quot;ts&quot; : Timestamp(1484290864, 1),</span><br><span class="line">&quot;t&quot; : NumberLong(1)</span><br><span class="line">&#125;,</span><br><span class="line">&quot;optimeDate&quot; : ISODate(&quot;2017-01-13T07:01:04Z&quot;),</span><br><span class="line">&quot;optimeDurableDate&quot; : ISODate(&quot;2017-01-13T07:01:04Z&quot;),</span><br><span class="line">&quot;lastHeartbeat&quot; : ISODate(&quot;2017-01-13T07:01:09.543Z&quot;),</span><br><span class="line">&quot;lastHeartbeatRecv&quot; : ISODate(&quot;2017-01-13T07:01:09.456Z&quot;),</span><br><span class="line">&quot;pingMs&quot; : NumberLong(0),</span><br><span class="line">&quot;syncingTo&quot; : &quot;10.1.1.148:27101&quot;,</span><br><span class="line">&quot;configVersion&quot; : 1</span><br><span class="line">&#125;</span><br><span class="line">],</span><br><span class="line">&quot;ok&quot; : 1</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>三台主机操作一致。</strong><br><strong>其余两个副本集的设置同上。</strong></p><h1 id="3-配置分片集群"><a href="#3-配置分片集群" class="headerlink" title="3. 配置分片集群"></a><strong>3. 配置分片集群</strong></h1><h2 id="为config-server创建相关目录"><a href="#为config-server创建相关目录" class="headerlink" title="为config server创建相关目录"></a><strong>为config server创建相关目录</strong></h2><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"># mkdir -pv /home/mongodb/configsvr/&#123;data,config,log&#125;</span><br><span class="line">mkdir: created directory `/home/mongodb/configsvr&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/configsvr/data&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/configsvr/config&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/configsvr/log&apos;</span><br><span class="line"># tree /home/mongodb</span><br><span class="line">/home/mongodb</span><br><span class="line">├── configsvr</span><br><span class="line">│   ├── config</span><br><span class="line">│   ├── data</span><br><span class="line">│   └── log</span><br></pre></td></tr></table></figure><h2 id="启动config-server实例"><a href="#启动config-server实例" class="headerlink" title="启动config server实例"></a><strong>启动config server实例</strong></h2><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></pre></td><td class="code"><pre><span class="line"># vim /home/mongodb/configsvr/config/configsvr.conf</span><br><span class="line">configsvr = true</span><br><span class="line">replSet = configdb</span><br><span class="line">dbpath = /home/mongodb/configsvr/data/</span><br><span class="line">port = 27301</span><br><span class="line">logpath = /home/mongodb/configsvr/log/dbconfig.log</span><br><span class="line">pidfilepath = /home/mongodb/configsvr/log/configdb.pid</span><br><span class="line">rest = true</span><br><span class="line">journal = true</span><br><span class="line">logappend = true</span><br><span class="line">fork = true</span><br><span class="line"></span><br><span class="line"># mongod --config /home/mongodb/configsvr/config/configsvr.conf</span><br></pre></td></tr></table></figure><h2 id="为config-server-配置副本集"><a href="#为config-server-配置副本集" class="headerlink" title="为config server 配置副本集"></a><strong>为config server 配置副本集</strong></h2><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></pre></td><td class="code"><pre><span class="line">因为mongodb 3.2版本以后要求配置服务器必须也是副本集，所以我们要给config server也建立一个副本集</span><br><span class="line"># mongo --port 27301</span><br><span class="line">&gt; use admin</span><br><span class="line">switched to db admin</span><br><span class="line">&gt; db.runCommand(&#123;&quot;replSetInitiate&quot; :&#123;</span><br><span class="line">... &quot;_id&quot;:&quot;configdb&quot;,</span><br><span class="line">... &quot;members&quot;:[</span><br><span class="line">... &#123;&quot;_id&quot;:1,&quot;host&quot;:&quot;10.1.1.148:27301&quot;&#125;,</span><br><span class="line">... &#123;&quot;_id&quot;:2,&quot;host&quot;:&quot;10.1.1.149:27301&quot;&#125;,</span><br><span class="line">... &#123;&quot;_id&quot;:3,&quot;host&quot;:&quot;10.1.1.150:27301&quot;&#125;,</span><br><span class="line">... ]&#125;&#125;)</span><br><span class="line">&#123; &quot;ok&quot; : 1 &#125;</span><br></pre></td></tr></table></figure><h2 id="为mongos创建相关目录"><a href="#为mongos创建相关目录" class="headerlink" title="为mongos创建相关目录"></a><strong>为mongos创建相关目录</strong></h2><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"># mkdir -pv /home/mongodb/mongos/&#123;data,config,log&#125;</span><br><span class="line">mkdir: created directory `/home/mongodb/mongos&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/mongos/data&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/mongos/config&apos;</span><br><span class="line">mkdir: created directory `/home/mongodb/mongos/log&apos;</span><br><span class="line"># tree /home/mongodb</span><br><span class="line">/home/mongodb</span><br><span class="line">├── mongos</span><br><span class="line">│   ├── config</span><br><span class="line">│   ├── data</span><br><span class="line">│   └── log</span><br></pre></td></tr></table></figure><h2 id="启动mongos实例"><a href="#启动mongos实例" class="headerlink" title="启动mongos实例"></a><strong>启动mongos实例</strong></h2><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></pre></td><td class="code"><pre><span class="line"># vim /home/mongodb/mongos/config/mongos.conf</span><br><span class="line">configdb = configdb/10.1.1.148:27301,10.1.1.149:27301,10.1.1.150:27301</span><br><span class="line">port = 28885</span><br><span class="line">logpath = /home/mongodb/mongos/log/mongos.log</span><br><span class="line">pidfilepath = /home/mongodb/mongos/log/mongos.pid</span><br><span class="line">logappend = true</span><br><span class="line">fork = true</span><br><span class="line"></span><br><span class="line"># mongos --config /home/mongodb/mongos/config/mongos.conf</span><br></pre></td></tr></table></figure><h2 id="登录mongos进程，配置Shard-Cluster"><a href="#登录mongos进程，配置Shard-Cluster" class="headerlink" title="登录mongos进程，配置Shard Cluster"></a><strong>登录mongos进程，配置Shard Cluster</strong></h2><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></pre></td><td class="code"><pre><span class="line"># mongo --port 28885 admin</span><br><span class="line">mongos&gt; db.runCommand(&#123;addshard:&quot;sharding1/10.1.1.148:27101,10.1.1.149:27101,10.1.1.150:27101&quot;&#125;);</span><br><span class="line">&#123; &quot;shardAdded&quot; : &quot;sharding1&quot;, &quot;ok&quot; : 1 &#125;</span><br><span class="line">mongos&gt; db.runCommand(&#123;addshard:&quot;sharding2/10.1.1.148:27102,10.1.1.149:27102,10.1.1.150:27102&quot;&#125;);</span><br><span class="line">&#123; &quot;shardAdded&quot; : &quot;sharding2&quot;, &quot;ok&quot; : 1 &#125;</span><br><span class="line">mongos&gt; db.runCommand(&#123;addshard:&quot;sharding3/10.1.1.148:27103,10.1.1.149:27103,10.1.1.150:27103&quot;&#125;);</span><br><span class="line">&#123; &quot;shardAdded&quot; : &quot;sharding3&quot;, &quot;ok&quot; : 1 &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-配置前准备工作&quot;&gt;&lt;a href=&quot;#1-配置前准备工作&quot; class=&quot;headerlink&quot; title=&quot;1. 配置前准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 配置前准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;准备MongoDB程序文件&quot;&gt;&lt;a href=&quot;#准备MongoDB程序文件&quot; class=&quot;headerlink&quot; title=&quot;准备MongoDB程序文件&quot;&gt;&lt;/a&gt;&lt;strong&gt;准备MongoDB程序文件&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.1.tgz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# tar zxf mongodb-linux-x86_64-rhel62-3.4.1.tgz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# cp -r mongodb-linux-x86_64-rhel62-3.4.1 /usr/local/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ln -s /usr/local/mongodb-linux-x86_64-rhel62-3.4.1 /usr/local/mongodb&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ls /usr/local/mongodb&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;bin  GNU-AGPL-3.0  MPL-2  README  THIRD-PARTY-NOTICES&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&quot;为MongoDB配置环境变量&quot;&gt;&lt;a href=&quot;#为MongoDB配置环境变量&quot; class=&quot;headerlink&quot; title=&quot;为MongoDB配置环境变量&quot;&gt;&lt;/a&gt;&lt;strong&gt;为MongoDB配置环境变量&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# vim /etc/profile.d/mongodb.sh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export PATH=/usr/local/mongodb/bin:$PATH&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# source /etc/profile.d/mongodb.sh&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="MongoDB" scheme="https://www.lucissfer.com/categories/Linux/MongoDB/"/>
    
    
      <category term="MongoDB" scheme="https://www.lucissfer.com/tags/MongoDB/"/>
    
      <category term="副本集" scheme="https://www.lucissfer.com/tags/%E5%89%AF%E6%9C%AC%E9%9B%86/"/>
    
      <category term="分片集群" scheme="https://www.lucissfer.com/tags/%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4/"/>
    
  </entry>
  
  <entry>
    <title>Redis Cluster部署配置</title>
    <link href="https://www.lucissfer.com/2017/02/02/Redis-Cluster+%E9%83%A8%E7%BD%B2%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.lucissfer.com/2017/02/02/Redis-Cluster+部署配置/</id>
    <published>2017-02-01T16:00:00.000Z</published>
    <updated>2018-06-04T02:29:48.690Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-配置前准备工作"><a href="#1-配置前准备工作" class="headerlink" title="1. 配置前准备工作"></a><strong>1. 配置前准备工作</strong></h1><h2 id="部署规划"><a href="#部署规划" class="headerlink" title="部署规划"></a><strong>部署规划</strong></h2><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">集群使用三台服务器，每服务器上分别部署两个实例（端口监听6379、7379），一共6个实例来组建集群。</span><br><span class="line">redis安装路径</span><br><span class="line">/usr/local/redis3</span><br><span class="line">链接至</span><br><span class="line">/usr/local/redis</span><br><span class="line">redis数据存放位置</span><br><span class="line">/home/redis/&#123;6379,7379&#125;/data</span><br><span class="line">redis日志文件、pid文件位置</span><br><span class="line">/home/redis/&#123;6379,7379&#125;/log</span><br><span class="line">redis配置文件位置</span><br><span class="line">/home/redis/&#123;6379,7379&#125;/config</span><br></pre></td></tr></table></figure><h2 id="准备redis安装程序"><a href="#准备redis安装程序" class="headerlink" title="准备redis安装程序"></a><strong>准备redis安装程序</strong></h2><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"># wget http://download.redis.io/releases/redis-3.2.6.tar.gz</span><br><span class="line"># tar zxf redis-3.2.6.tar.gz</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="为redis创建相关目录"><a href="#为redis创建相关目录" class="headerlink" title="为redis创建相关目录"></a><strong>为redis创建相关目录</strong></h2><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></pre></td><td class="code"><pre><span class="line">redis安装目录</span><br><span class="line"># mkdir -pv /usr/local/redis3</span><br><span class="line">redis数据目录</span><br><span class="line">redis日志文件、PID文件、配置文件目录</span><br><span class="line"># mkdir -pv /home/redis/&#123;6379,7379&#125;/&#123;data,config,log&#125;</span><br><span class="line">mkdir: created directory `/home/redis&apos;</span><br><span class="line">mkdir: created directory `/home/redis/6379&apos;</span><br><span class="line">mkdir: created directory `/home/redis/6379/data&apos;</span><br><span class="line">mkdir: created directory `/home/redis/6379/config&apos;</span><br><span class="line">mkdir: created directory `/home/redis/6379/log&apos;</span><br><span class="line">mkdir: created directory `/home/redis/7379&apos;</span><br><span class="line">mkdir: created directory `/home/redis/7379/data&apos;</span><br><span class="line">mkdir: created directory `/home/redis/7379/config&apos;</span><br><span class="line">mkdir: created directory `/home/redis/7379/log&apos;</span><br></pre></td></tr></table></figure><p><strong>配置相应iptables规则</strong></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"># iptables -I INPUT -s 10.1.1.0/24 -p tcp -j ACCEPT</span><br><span class="line"># service iptables save</span><br></pre></td></tr></table></figure><h1 id="2-安装redis并配置实例"><a href="#2-安装redis并配置实例" class="headerlink" title="2. 安装redis并配置实例"></a><strong>2. 安装redis并配置实例</strong></h1><h2 id="安装redis"><a href="#安装redis" class="headerlink" title="安装redis"></a><strong>安装redis</strong></h2><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><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"># yum install -y gcc*</span><br><span class="line"># cd redis-3.2.6</span><br><span class="line"># make</span><br><span class="line"># make test</span><br><span class="line">cd src &amp;&amp; make test</span><br><span class="line">make[1]: Entering directory `/home/soft/redis/redis-3.2.6/src&apos;</span><br><span class="line">You need tcl 8.5 or newer in order to run the Redis test</span><br><span class="line">make[1]: *** [test] Error 1</span><br><span class="line">make[1]: Leaving directory `/home/soft/redis/redis-3.2.6/src&apos;</span><br><span class="line">make: *** [test] Error 2</span><br><span class="line">报错，提示需要tcl 8.5或以上版本支持。</span><br><span class="line"># yum install -y tcl</span><br><span class="line">继续make test，通过。</span><br><span class="line"></span><br><span class="line">如果继续报错：</span><br><span class="line">*** [err]: Test replication partial resync: ok psync (diskless: yes, reconnect: 1) in tests/integration/replication-psync.tcl</span><br><span class="line">只需要以单核运行make test就行了</span><br><span class="line"># taskset -c 1 sudo make test</span><br><span class="line"></span><br><span class="line">指定目录安装</span><br><span class="line"># make PREFIX=/usr/local/redis3 install</span><br><span class="line"># ln -s /usr/local/redis3 /usr/local/redis</span><br><span class="line"># ls /usr/local/redis</span><br><span class="line">bin</span><br></pre></td></tr></table></figure><h2 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a><strong>配置环境变量</strong></h2><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></pre></td><td class="code"><pre><span class="line"># vim /etc/profile.d/redis.sh</span><br><span class="line">export PATH=/usr/local/redis/bin:$PATH</span><br><span class="line"># source /etc/profile.d/redis.sh</span><br></pre></td></tr></table></figure><h2 id="准备redis配置文件"><a href="#准备redis配置文件" class="headerlink" title="准备redis配置文件"></a><strong>准备redis配置文件</strong></h2><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><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"># vim /home/redis/6379/config/redis-6379.conf</span><br><span class="line">bind 10.1.1.148</span><br><span class="line">protected-mode no</span><br><span class="line">port 6379</span><br><span class="line">tcp-backlog 511</span><br><span class="line">timeout 0</span><br><span class="line">tcp-keepalive 0</span><br><span class="line">daemonize yes</span><br><span class="line">supervised no</span><br><span class="line">pidfile /home/redis/6379/log/redis_6379.pid</span><br><span class="line">loglevel notice</span><br><span class="line">logfile &quot;/home/redis/6379/log/redis-6379.log&quot;</span><br><span class="line">databases 16</span><br><span class="line">save 900 1</span><br><span class="line">save 300 10</span><br><span class="line">save 60 10000</span><br><span class="line">stop-writes-on-bgsave-error yes</span><br><span class="line">rdbcompression yes</span><br><span class="line">rdbchecksum yes</span><br><span class="line">dbfilename dump.rdb</span><br><span class="line">dir /home/redis/6379/data/</span><br><span class="line">slave-serve-stale-data yes</span><br><span class="line">slave-read-only yes</span><br><span class="line">repl-diskless-sync no</span><br><span class="line">repl-diskless-sync-delay 5</span><br><span class="line">repl-disable-tcp-nodelay no</span><br><span class="line">slave-priority 100</span><br><span class="line">maxclients 10000</span><br><span class="line">appendonly yes</span><br><span class="line">appendfilename &quot;appendonly.aof&quot;</span><br><span class="line">appendfsync everysec</span><br><span class="line">no-appendfsync-on-rewrite no</span><br><span class="line">auto-aof-rewrite-percentage 100</span><br><span class="line">auto-aof-rewrite-min-size 64mb</span><br><span class="line">aof-load-truncated yes</span><br><span class="line">lua-time-limit 5000</span><br><span class="line">cluster-enabled yes #（开启集群）</span><br><span class="line">cluster-config-file /home/redis/6379/config/nodes-6379.conf #（此配置文件在首次启动时自动生成）</span><br><span class="line">cluster-node-timeout 15000</span><br><span class="line">cluster-slave-validity-factor 10</span><br><span class="line">cluster-migration-barrier 1</span><br><span class="line">cluster-require-full-coverage yes</span><br><span class="line">slowlog-log-slower-than 10000</span><br><span class="line">slowlog-max-len 128</span><br><span class="line">latency-monitor-threshold 0</span><br><span class="line">notify-keyspace-events &quot;&quot;</span><br><span class="line">hash-max-ziplist-entries 512</span><br><span class="line">hash-max-ziplist-value 64</span><br><span class="line">list-max-ziplist-size -2</span><br><span class="line">list-compress-depth 0</span><br><span class="line">set-max-intset-entries 512</span><br><span class="line">zset-max-ziplist-entries 128</span><br><span class="line">zset-max-ziplist-value 64</span><br><span class="line">hll-sparse-max-bytes 3000</span><br><span class="line">activerehashing yes</span><br><span class="line">client-output-buffer-limit normal 0 0 0</span><br><span class="line">client-output-buffer-limit slave 256mb 64mb 60</span><br><span class="line">client-output-buffer-limit pubsub 32mb 8mb 60</span><br><span class="line">hz 10</span><br><span class="line">aof-rewrite-incremental-fsync yes</span><br><span class="line"></span><br><span class="line"># cp /home/redis/6379/config/redis-6379.conf /home/redis/7379/config/redis-7379.conf</span><br><span class="line">将6379的配置文件复制到7379中，并修改相应的路径及端口号。</span><br><span class="line"># sed -i &apos;s/6379/7379/g&apos; /home/redis/7379/config/redis-7379.conf</span><br><span class="line"></span><br><span class="line">在其余几台服务器上同样操作，记住务必要修改相应端口号及绑定IP。</span><br></pre></td></tr></table></figure><h2 id="启动redis实例"><a href="#启动redis实例" class="headerlink" title="启动redis实例"></a><strong>启动redis实例</strong></h2><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"># redis-server /home/redis/6379/config/redis-6379.conf</span><br><span class="line"># redis-server /home/redis/7379/config/redis-7379.conf</span><br></pre></td></tr></table></figure><h1 id="3-创建redis-cluster集群"><a href="#3-创建redis-cluster集群" class="headerlink" title="3. 创建redis-cluster集群"></a><strong>3. 创建redis-cluster集群</strong></h1><p><strong>使用redis-trib.rb来创建cluster集群</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">redis官方提供了一个工具/home/soft/redis/redis-3.2.6/src/redis-trib.rb用来创建集群。</span><br><span class="line"># /home/soft/redis/redis-3.2.6/src/redis-trib.rb create --replicas 1 10.1.1.148:6379 10.1.1.149:6379 10.1.1.150:6379 10.1.1.148:7379 10.1.1.149:7379 10.1.1.150:7379</span><br><span class="line">/usr/bin/env: ruby: No such file or directory</span><br><span class="line">有报错，因为这是一个ruby程序，必须安装ruby才可以执行</span><br></pre></td></tr></table></figure><p><strong>安装ruby及相关支持</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"># yum -y install ruby ruby-devel rubygems rpm-build</span><br><span class="line"># gem install redis</span><br><span class="line">此处可指定安装对应版本，如</span><br><span class="line"># gem install redis --version 3.2.2</span><br></pre></td></tr></table></figure><p><strong>创建redis-cluster集群</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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br></pre></td><td class="code"><pre><span class="line"># /home/soft/redis/redis-3.2.6/src/redis-trib.rb create --replicas 1 10.1.1.148:6379 10.1.1.149:6379 10.1.1.150:6379 10.1.1.148:7379 10.1.1.149:7379 10.1.1.150:7379</span><br><span class="line">&gt;&gt;&gt; Creating cluster</span><br><span class="line">&gt;&gt;&gt; Performing hash slots allocation on 6 nodes...</span><br><span class="line">Using 3 masters:</span><br><span class="line">10.1.1.150:6379</span><br><span class="line">10.1.1.149:6379</span><br><span class="line">10.1.1.148:6379</span><br><span class="line">Adding replica 10.1.1.149:7379 to 10.1.1.150:6379</span><br><span class="line">Adding replica 10.1.1.150:7379 to 10.1.1.149:6379</span><br><span class="line">Adding replica 10.1.1.148:7379 to 10.1.1.148:6379</span><br><span class="line">M: 4b37935462a37c9817f9c90877b07a8984c8c5d4 10.1.1.148:6379</span><br><span class="line">   slots:10923-16383 (5461 slots) master</span><br><span class="line">M: a96f7c1a1b9fa6c128549cbef80e7b021c8c2e57 10.1.1.149:6379</span><br><span class="line">   slots:5461-10922 (5462 slots) master</span><br><span class="line">M: cffe855dfc88781443af94d65a8b25b6bbf381fd 10.1.1.150:6379</span><br><span class="line">   slots:0-5460 (5461 slots) master</span><br><span class="line">S: 96ac7786eb3317048f82be33024c954794a75230 10.1.1.148:7379</span><br><span class="line">   replicates 4b37935462a37c9817f9c90877b07a8984c8c5d4</span><br><span class="line">S: 03bd2483ab51191208bfdbc6781e8910018980f1 10.1.1.149:7379</span><br><span class="line">   replicates cffe855dfc88781443af94d65a8b25b6bbf381fd</span><br><span class="line">S: 0ba60ec12c581896898fe0504009cdb494f61bc6 10.1.1.150:7379</span><br><span class="line">   replicates a96f7c1a1b9fa6c128549cbef80e7b021c8c2e57</span><br><span class="line">Can I set the above configuration? (type &apos;yes&apos; to accept): yes</span><br><span class="line">/usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:111:in `_write_to_socket&apos;: Connection timed out (Redis::TimeoutError)</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:131:in `write&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:130:in `loop&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:130:in `write&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:374:in `write&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:271:in `write&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:250:in `io&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:269:in `write&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:228:in `process&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:222:in `each&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:222:in `process&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:367:in `ensure_connected&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:221:in `process&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:306:in `logging&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:220:in `process&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/client.rb:120:in `call&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis.rb:2705:in `method_missing&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis.rb:58:in `synchronize&apos;</span><br><span class="line">from /usr/lib/ruby/1.8/monitor.rb:242:in `mon_synchronize&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis.rb:58:in `synchronize&apos;</span><br><span class="line">from /usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis.rb:2704:in `method_missing&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:212:in `flush_node_config&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:776:in `flush_nodes_config&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:775:in `each&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:775:in `flush_nodes_config&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:1296:in `create_cluster_cmd&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:1701:in `send&apos;</span><br><span class="line">from /home/soft/redis/redis-3.2.6/src/redis-trib.rb:1701</span><br><span class="line"></span><br><span class="line">出现报错：/usr/lib/ruby/gems/1.8/gems/redis-3.3.2/lib/redis/connection/ruby.rb:111:in `_write_to_socket&apos;: Connection timed out (Redis::TimeoutError)</span><br><span class="line">搜索了一下，发现是gem安装的redis库版本太高。</span><br><span class="line"># gem list</span><br><span class="line">*** LOCAL GEMS ***</span><br><span class="line">redis (3.3.2)</span><br><span class="line"></span><br><span class="line">卸载并使用3.0的gem就OK了。</span><br><span class="line"># gem uninstall redis --version 3.3.2</span><br><span class="line">Successfully uninstalled redis-3.3.2</span><br><span class="line"># gem install redis --version 3.0.0</span><br><span class="line">Successfully installed redis-3.0.0</span><br><span class="line">1 gem installed</span><br><span class="line">Installing ri documentation for redis-3.0.0...</span><br><span class="line">Installing RDoc documentation for redis-3.0.0...</span><br><span class="line"># gem list</span><br><span class="line">*** LOCAL GEMS ***</span><br><span class="line">redis (3.0.0)</span><br><span class="line"></span><br><span class="line">重新执行命令创建集群</span><br><span class="line">继续报错：/usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call&apos;: ERR Slot 11291 is already busy (Redis::CommandError)</span><br><span class="line">这是因为之前创建集群没有成功,需要将nodes.conf和dir里面的文件全部删除</span><br><span class="line"># rm -rf 6379/config/nodes-6379.conf</span><br><span class="line"># rm -rf 6379/data/*</span><br><span class="line"># rm -rf 7379/config/nodes-7379.conf</span><br><span class="line"># rm -rf 7379/data/*</span><br><span class="line"># redis-cli -p 6379 shutdown</span><br><span class="line"># redis-cli -p 7379 shutdown</span><br><span class="line"># redis-server /home/redis/6379/config/redis-6379.conf</span><br><span class="line"># redis-server /home/redis/7379/config/redis-7379.conf</span><br><span class="line"></span><br><span class="line">报错：一直卡在Waiting for the cluster to join.....................................</span><br><span class="line">问题原因不明，但是按照网上的解决办法是，在redis配置文件中bind一行只绑定一个内网IP地址即可，不要绑定本地回环地址127.0.0.1</span><br><span class="line"># vim /home/redis/6379/config/redis-6379.conf</span><br><span class="line">bind 10.1.1.148</span><br><span class="line"></span><br><span class="line">创建集群成功</span><br><span class="line"># /home/soft/redis/redis-3.2.6/src/redis-trib.rb create --replicas 1 10.1.1.148:6379 10.1.1.149:6379 10.1.1.150:6379 10.1.1.148:7379 10.1.1.149:7379 10.1.1.150:7379</span><br><span class="line">&gt;&gt;&gt; Creating cluster</span><br><span class="line">&gt;&gt;&gt; Performing hash slots allocation on 6 nodes...</span><br><span class="line">Using 3 masters:</span><br><span class="line">10.1.1.149:6379</span><br><span class="line">10.1.1.148:6379</span><br><span class="line">10.1.1.150:6379</span><br><span class="line">Adding replica 10.1.1.148:7379 to 10.1.1.149:6379</span><br><span class="line">Adding replica 10.1.1.149:7379 to 10.1.1.148:6379</span><br><span class="line">Adding replica 10.1.1.150:7379 to 10.1.1.150:6379</span><br><span class="line">M: ce3a2498a81f450b3d648bc1ede7c82fcac87cf2 10.1.1.148:6379</span><br><span class="line">   slots:5461-10922 (5462 slots) master</span><br><span class="line">M: 74719e18073c6ac08da0a5608e7986d057e51ee4 10.1.1.149:6379</span><br><span class="line">   slots:0-5460 (5461 slots) master</span><br><span class="line">M: 3c2b327b2b56ddf07fc4040061f95dd6458b5154 10.1.1.150:6379</span><br><span class="line">   slots:10923-16383 (5461 slots) master</span><br><span class="line">S: 0d43b62b9ce2241147376574280e339b1fc3a97b 10.1.1.148:7379</span><br><span class="line">   replicates 74719e18073c6ac08da0a5608e7986d057e51ee4</span><br><span class="line">S: 40a7736a56fe9671a79eb4e392a3669a4797c4d3 10.1.1.149:7379</span><br><span class="line">   replicates ce3a2498a81f450b3d648bc1ede7c82fcac87cf2</span><br><span class="line">S: b6e2e6c8093bfa92d49c6f3771316ca1c5304c01 10.1.1.150:7379</span><br><span class="line">   replicates 3c2b327b2b56ddf07fc4040061f95dd6458b5154</span><br><span class="line">Can I set the above configuration? (type &apos;yes&apos; to accept): yes</span><br><span class="line">&gt;&gt;&gt; Nodes configuration updated</span><br><span class="line">&gt;&gt;&gt; Assign a different config epoch to each node</span><br><span class="line">&gt;&gt;&gt; Sending CLUSTER MEET messages to join the cluster</span><br><span class="line">Waiting for the cluster to join..</span><br><span class="line">&gt;&gt;&gt; Performing Cluster Check (using node 10.1.1.148:6379)</span><br><span class="line">M: ce3a2498a81f450b3d648bc1ede7c82fcac87cf2 10.1.1.148:6379</span><br><span class="line">   slots:5461-10922 (5462 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">S: 40a7736a56fe9671a79eb4e392a3669a4797c4d3 10.1.1.149:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates ce3a2498a81f450b3d648bc1ede7c82fcac87cf2</span><br><span class="line">S: b6e2e6c8093bfa92d49c6f3771316ca1c5304c01 10.1.1.150:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates 3c2b327b2b56ddf07fc4040061f95dd6458b5154</span><br><span class="line">M: 74719e18073c6ac08da0a5608e7986d057e51ee4 10.1.1.149:6379</span><br><span class="line">   slots:0-5460 (5461 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">M: 3c2b327b2b56ddf07fc4040061f95dd6458b5154 10.1.1.150:6379</span><br><span class="line">   slots:10923-16383 (5461 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">S: 0d43b62b9ce2241147376574280e339b1fc3a97b 10.1.1.148:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates 74719e18073c6ac08da0a5608e7986d057e51ee4</span><br><span class="line">[OK] All nodes agree about slots configuration.</span><br><span class="line">&gt;&gt;&gt; Check for open slots...</span><br><span class="line">&gt;&gt;&gt; Check slots coverage...</span><br><span class="line">[OK] All 16384 slots covered.</span><br></pre></td></tr></table></figure><p><strong>检查集群状态</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><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"># /home/soft/redis/redis-3.2.6/src/redis-trib.rb check 10.1.1.148:6379</span><br><span class="line">&gt;&gt;&gt; Performing Cluster Check (using node 10.1.1.148:6379)</span><br><span class="line">M: ce3a2498a81f450b3d648bc1ede7c82fcac87cf2 10.1.1.148:6379</span><br><span class="line">   slots:5461-10922 (5462 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">S: 40a7736a56fe9671a79eb4e392a3669a4797c4d3 10.1.1.149:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates ce3a2498a81f450b3d648bc1ede7c82fcac87cf2</span><br><span class="line">S: b6e2e6c8093bfa92d49c6f3771316ca1c5304c01 10.1.1.150:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates 3c2b327b2b56ddf07fc4040061f95dd6458b5154</span><br><span class="line">M: 74719e18073c6ac08da0a5608e7986d057e51ee4 10.1.1.149:6379</span><br><span class="line">   slots:0-5460 (5461 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">M: 3c2b327b2b56ddf07fc4040061f95dd6458b5154 10.1.1.150:6379</span><br><span class="line">   slots:10923-16383 (5461 slots) master</span><br><span class="line">   1 additional replica(s)</span><br><span class="line">S: 0d43b62b9ce2241147376574280e339b1fc3a97b 10.1.1.148:7379</span><br><span class="line">   slots: (0 slots) slave</span><br><span class="line">   replicates 74719e18073c6ac08da0a5608e7986d057e51ee4</span><br><span class="line">[OK] All nodes agree about slots configuration.</span><br><span class="line">&gt;&gt;&gt; Check for open slots...</span><br><span class="line">&gt;&gt;&gt; Check slots coverage...</span><br><span class="line">[OK] All 16384 slots covered.</span><br><span class="line"></span><br><span class="line">redis-trib.rb工具可以拷贝到任意目录下使用，建议拷贝到redis的bin目录下；如果集群开启了密码认证，需要在client.rb文件中设置密码参数。</span><br></pre></td></tr></table></figure><p><strong>测试redis集群</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><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"># redis-cli -h 10.1.1.148 -p 6379</span><br><span class="line">10.1.1.148:6379&gt; set test test01</span><br><span class="line">OK</span><br><span class="line">10.1.1.148:6379&gt; get test</span><br><span class="line">&quot;test01&quot;</span><br><span class="line"># redis-cli -h 10.1.1.149 -p 7379</span><br><span class="line">10.1.1.149:7379&gt; get test</span><br><span class="line">(error) MOVED 6918 10.1.1.148:6379</span><br><span class="line">发现在另一节点上无法get，因为Redis集群的数据是根据插槽值来设置进具体的节点中的.但是如果这个key的插槽值不是在当前redis实例的话,他就需要进行重定向.</span><br><span class="line">所以redis-cli提供可一个-c参数用来连接集群，指定了这个参数之后,redis-cli会根据插槽值做一个重定向,连接到指定的redis实例上面。</span><br><span class="line"># redis-cli -c -h 10.1.1.149 -p 7379</span><br><span class="line">10.1.1.149:7379&gt; get test</span><br><span class="line">-&gt; Redirected to slot [6918] located at 10.1.1.148:6379</span><br><span class="line">&quot;test01&quot;</span><br></pre></td></tr></table></figure><p><strong>为redis集群开启密码认证</strong><br>redis-cluster集群开启密码认证有两种方式：</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></pre></td><td class="code"><pre><span class="line">1. 在使用redis-trib.rb工具创建cluster集群前，在每个节点上开启密码认证，然后在ruby-gem配置文件中指定密码（各节点密码必须一致）</span><br><span class="line"># vim /usr/local/rvm/gems/ruby-2.4.1/gems/redis-4.0.1/lib/redis/client.rb</span><br><span class="line">:password =&gt; &apos;PASSWORD&apos;     #在此处填写密码</span><br><span class="line">此处因为我的gem redis库是通过rvm安装的，所以client.rb文件路径在/usr/local/rvm/下，如果你的不是使用rvm安装，可以直接使用find搜索client.rb文件并修改。</span><br><span class="line"></span><br><span class="line">上述方法配置集群密码验证比较复杂不建议使用；</span><br><span class="line"></span><br><span class="line">但是配置client.rb中的password参数有一个好处：当集群开启认证，配置了client.rb中的password参数后，可以直接使用源码包中提供的redis-trib.rb工具来查看集群信息，具体的使用参数可以--help（redis-trib.rb工具可以拷贝到任意目录下使用）。</span><br></pre></td></tr></table></figure><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">2. 在创建cluster集群前不设置密码认证，创建集群完成后，登录到每一个集群节点创建密码，命令如下：</span><br><span class="line"># redis-cli -c -h 10.1.1.148 -p 6379   # 此处注意是集群所有节点，包括所有主从节点</span><br><span class="line">10.1.1.148:6379&gt; config set masterauth 123456</span><br><span class="line">10.1.1.148:6379&gt; config set requirepass 123456</span><br><span class="line">上述命令执行完成后，需退出redis重新使用密码认证登录，否则后续命令将无权执行。</span><br><span class="line"># redis-cli -c -h 10.1.1.148 -p 6379 -a &apos;123456&apos;</span><br><span class="line">10.1.1.148:6379&gt; config rewrite</span><br><span class="line">执行完成config rewrite命令后，redis密码会自动保存到redis的config配置文件中。</span><br><span class="line"></span><br><span class="line">上述配置一定要注意，必须在集群所有节点一一执行，建议集群各节点密码一致（节点密码不一致的情况我也没有试过，有兴趣的可以试试）。</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-配置前准备工作&quot;&gt;&lt;a href=&quot;#1-配置前准备工作&quot; class=&quot;headerlink&quot; title=&quot;1. 配置前准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 配置前准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;部署规划&quot;&gt;&lt;a href=&quot;#部署规划&quot; class=&quot;headerlink&quot; title=&quot;部署规划&quot;&gt;&lt;/a&gt;&lt;strong&gt;部署规划&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;集群使用三台服务器，每服务器上分别部署两个实例（端口监听6379、7379），一共6个实例来组建集群。&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;redis安装路径&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/local/redis3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;链接至&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/local/redis&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;redis数据存放位置&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/home/redis/&amp;#123;6379,7379&amp;#125;/data&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;redis日志文件、pid文件位置&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/home/redis/&amp;#123;6379,7379&amp;#125;/log&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;redis配置文件位置&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/home/redis/&amp;#123;6379,7379&amp;#125;/config&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&quot;准备redis安装程序&quot;&gt;&lt;a href=&quot;#准备redis安装程序&quot; class=&quot;headerlink&quot; title=&quot;准备redis安装程序&quot;&gt;&lt;/a&gt;&lt;strong&gt;准备redis安装程序&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# wget http://download.redis.io/releases/redis-3.2.6.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# tar zxf redis-3.2.6.tar.gz&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Redis" scheme="https://www.lucissfer.com/categories/Linux/Redis/"/>
    
    
      <category term="redis" scheme="https://www.lucissfer.com/tags/redis/"/>
    
      <category term="redis-cluster" scheme="https://www.lucissfer.com/tags/redis-cluster/"/>
    
  </entry>
  
  <entry>
    <title>zookeeper+dubbo部署分布式服务集群</title>
    <link href="https://www.lucissfer.com/2017/02/01/zookeeper+dubbo+%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%8D%E5%8A%A1%E9%9B%86%E7%BE%A4/"/>
    <id>https://www.lucissfer.com/2017/02/01/zookeeper+dubbo+分布式服务集群/</id>
    <published>2017-01-31T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.161Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-配置前准备工作"><a href="#1-配置前准备工作" class="headerlink" title="1. 配置前准备工作"></a><strong>1. 配置前准备工作</strong></h1><h2 id="部署规划"><a href="#部署规划" class="headerlink" title="部署规划"></a><strong>部署规划</strong></h2><blockquote><p>集群使用三台服务器，分别部署zookeeper、dubbo-admin服务，其中zookeeper分别部署在三台服务器上，dubbo-admin部署于三台服务器其中一台上，三台zookeeper构成集群，而dubbo-admin是否正常对于dubbo服务正常运行并不会造成任何影响，因此dubbo采用单点部署。<br>zookeeper安装路径：<br>/usr/local/zookeeper-3.4.6/<br>链接至<br>/usr/local/zookeeper/<br>zookeeper数据存放路径<br>/home/zookeeper/data/<br>zookeeper日志存放路径<br>/usr/local/zookeeper/log/<br>clientPort:2181<br>zookeeper数据交换端口:2888<br>zookeeper选举端口:3888</p></blockquote><h2 id="准备安装程序"><a href="#准备安装程序" class="headerlink" title="准备安装程序"></a><strong>准备安装程序</strong></h2><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"># ls /home/soft/</span><br><span class="line">dubbo-admin-tomcat.tar.gz  dubbo-monitor-simple-2.8.4-assembly.tar.gz  jdk-8u111-linux-x64.rpm  zookeeper-3.4.6.tar.gz</span><br><span class="line"># tar zxf zookeeper-3.4.6.tar.gz</span><br><span class="line"># mv /home/soft/zookeeper-3.4.6 /usr/local/</span><br><span class="line"># ln -s /usr/local/zookeeper-3.4.6 /usr/local/zookeeper</span><br></pre></td></tr></table></figure><h2 id="创建相关安装目录"><a href="#创建相关安装目录" class="headerlink" title="创建相关安装目录"></a><strong>创建相关安装目录</strong></h2><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"># mkdir -pv /home/zookeeper/data/</span><br><span class="line">mkdir: created directory `/home/zookeeper&apos;</span><br><span class="line">mkdir: created directory `/home/zookeeper/data/&apos;</span><br><span class="line"># mkdir /usr/local/zookeeper/log/</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="配置相应的iptables规则"><a href="#配置相应的iptables规则" class="headerlink" title="配置相应的iptables规则"></a><strong>配置相应的iptables规则</strong></h2><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"># iptables -I INPUT -s 10.1.1.0/24 -p tcp -j ACCEPT</span><br><span class="line"># service iptables save</span><br></pre></td></tr></table></figure><h1 id="2-安装并配置JDK"><a href="#2-安装并配置JDK" class="headerlink" title="2. 安装并配置JDK"></a><strong>2. 安装并配置JDK</strong></h1><p><strong>因为zookeeper是Java语言开发的项目，所以要先安装JDK。</strong></p><h2 id="安装JDK"><a href="#安装JDK" class="headerlink" title="安装JDK"></a><strong>安装JDK</strong></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"># rpm -ivh jdk-8u111-linux-x64.rpm</span><br></pre></td></tr></table></figure><h2 id="配置JAVA环境变量"><a href="#配置JAVA环境变量" class="headerlink" title="配置JAVA环境变量"></a><strong>配置JAVA环境变量</strong></h2><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></pre></td><td class="code"><pre><span class="line"># vim /etc/profile.d/java.sh</span><br><span class="line">export JAVA_HOME=/usr/java/latest</span><br><span class="line">export PATH=$JAVA_HOME/bin:$PATH</span><br></pre></td></tr></table></figure><h2 id="导出环境变量"><a href="#导出环境变量" class="headerlink" title="导出环境变量"></a><strong>导出环境变量</strong></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"># source /etc/profile.d/java.sh</span><br></pre></td></tr></table></figure><h2 id="查看Java版本"><a href="#查看Java版本" class="headerlink" title="查看Java版本"></a><strong>查看Java版本</strong></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"># java -version</span><br></pre></td></tr></table></figure><h1 id="3-安装并配置zookeeper"><a href="#3-安装并配置zookeeper" class="headerlink" title="3. 安装并配置zookeeper"></a><strong>3. 安装并配置zookeeper</strong></h1><h2 id="准备zookeeper配置文件"><a href="#准备zookeeper配置文件" class="headerlink" title="准备zookeeper配置文件"></a><strong>准备zookeeper配置文件</strong></h2><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></pre></td><td class="code"><pre><span class="line"># cd /usr/local/zookeeper</span><br><span class="line"># pwd</span><br><span class="line">/usr/local/zookeeper</span><br><span class="line"># cd conf/</span><br><span class="line"># pwd</span><br><span class="line">/usr/local/zookeeper/conf</span><br><span class="line"># cp zoo_sample.cfg zoo.cfg</span><br><span class="line"># vim zoo.cfg</span><br><span class="line">tickTime=2000</span><br><span class="line">initLimit=10</span><br><span class="line">syncLimit=5</span><br><span class="line">dataDir=/home/zookeeper/data</span><br><span class="line">dataLogDir=/usr/local/zookeeper/log</span><br><span class="line">clientPort=2181</span><br><span class="line">server.1=10.1.1.148:2888:3888</span><br><span class="line">server.2=10.1.1.149:2888:3888</span><br><span class="line">server.3=10.1.1.150:2888:3888</span><br><span class="line"></span><br><span class="line">这里的地址用IP或主机名都可以。</span><br></pre></td></tr></table></figure><h2 id="在data目录下创建myid文件"><a href="#在data目录下创建myid文件" class="headerlink" title="在data目录下创建myid文件"></a><strong>在data目录下创建myid文件</strong></h2><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></pre></td><td class="code"><pre><span class="line">分别在三台服务器上创建myid文件，myid文件中的只要与配置文件中对应，依次为：</span><br><span class="line">10.1.1.148</span><br><span class="line">echo &quot;1&quot; &gt; /home/zookeeper/data/myid</span><br><span class="line">10.1.1.149</span><br><span class="line">echo &quot;2&quot; &gt; /home/zookeeper/data/myid</span><br><span class="line">10.1.1.150</span><br><span class="line">echo &quot;3&quot; &gt; /home/zookeeper/data/myid</span><br></pre></td></tr></table></figure><h2 id="启动并测试zookeeper"><a href="#启动并测试zookeeper" class="headerlink" title="启动并测试zookeeper"></a><strong>启动并测试zookeeper</strong></h2><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"># /usr/local/zookeeper/bin/zkServer.sh start</span><br><span class="line"># jps -l</span><br><span class="line">16691 org.apache.zookeeper.server.quorum.QuorumPeerMain</span><br><span class="line">16758 sun.tools.jps.Jps</span><br></pre></td></tr></table></figure><h1 id="4-安装dubbo-admin并配置"><a href="#4-安装dubbo-admin并配置" class="headerlink" title="4. 安装dubbo-admin并配置"></a><strong>4. 安装dubbo-admin并配置</strong></h1><h2 id="安装dubbo-admin"><a href="#安装dubbo-admin" class="headerlink" title="安装dubbo-admin"></a><strong>安装dubbo-admin</strong></h2><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></pre></td><td class="code"><pre><span class="line">dubbo-admin是否正常对于dubbo服务正常运行并不会造成任何影响，因此dubbo采用单点部署，此次部署在10.1.1.148上。</span><br><span class="line"># pwd</span><br><span class="line">/home/soft</span><br><span class="line"># tar zxf dubbo-admin-tomcat.tar.gz</span><br><span class="line"># mv /home/soft/dubbo-admin-tomcat /usr/local/</span><br><span class="line"># cd /usr/local/dubbo-admin-tomcat/</span><br><span class="line"># ls</span><br><span class="line">bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work</span><br></pre></td></tr></table></figure><h2 id="配置dubbo-properties"><a href="#配置dubbo-properties" class="headerlink" title="配置dubbo.properties"></a><strong>配置dubbo.properties</strong></h2><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></pre></td><td class="code"><pre><span class="line"># pwd</span><br><span class="line">/usr/local/dubbo-admin-tomcat</span><br><span class="line"># cd webapps/ROOT/WEB-INF/</span><br><span class="line"># ls</span><br><span class="line">classes  common  dubbo.properties  forms  i18n  lib  log4j.xml  templates  webx-governance.xml  webx-home.xml  web.xml  webx-personal.xml  webx-sysinfo.xml  webx-sysmanage.xml  webx.xml</span><br><span class="line"># vim dubbo.properties</span><br><span class="line">dubbo.registry.address=zookeeper://10.1.1.148:2181?backup=10.1.1.149:2181,10.1.1.150:2181</span><br><span class="line">dubbo.admin.root.password=root</span><br><span class="line">dubbo.admin.guest.password=guest</span><br></pre></td></tr></table></figure><h2 id="启动dubbo-admin"><a href="#启动dubbo-admin" class="headerlink" title="启动dubbo-admin"></a><strong>启动dubbo-admin</strong></h2><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></pre></td><td class="code"><pre><span class="line"># /usr/local/dubbo-admin-tomcat/bin/catalina.sh start</span><br><span class="line">Using CATALINA_BASE:   /usr/local/dubbo-admin-tomcat</span><br><span class="line">Using CATALINA_HOME:   /usr/local/dubbo-admin-tomcat</span><br><span class="line">Using CATALINA_TMPDIR: /usr/local/dubbo-admin-tomcat/temp</span><br><span class="line">Using JRE_HOME:        /usr/java/latest</span><br><span class="line">Using CLASSPATH:       /usr/local/dubbo-admin-tomcat/bin/bootstrap.jar:/usr/local/dubbo-admin-tomcat/bin/tomcat-juli.jar</span><br><span class="line">Tomcat started.</span><br><span class="line"># netstat -nultp</span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   </span><br><span class="line">tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1005/master         </span><br><span class="line">tcp        0      0 0.0.0.0:11580               0.0.0.0:*                   LISTEN      1366/sshd           </span><br><span class="line">tcp        0      0 ::ffff:10.1.1.148:3888      :::*                        LISTEN      5132/java           </span><br><span class="line">tcp        0      0 :::56656                    :::*                        LISTEN      5132/java           </span><br><span class="line">tcp        0      0 :::8082                     :::*                        LISTEN      5241/java           </span><br><span class="line">tcp        0      0 ::1:25                      :::*                        LISTEN      1005/master         </span><br><span class="line">tcp        0      0 :::11580                    :::*                        LISTEN      1366/sshd           </span><br><span class="line">tcp        0      0 :::2181                     :::*                        LISTEN      5132/java           </span><br><span class="line">tcp        0      0 :::8010                     :::*                        LISTEN      5241/java</span><br></pre></td></tr></table></figure><h2 id="访问dubbo-admin-web页面测试"><a href="#访问dubbo-admin-web页面测试" class="headerlink" title="访问dubbo-admin web页面测试"></a><strong>访问dubbo-admin web页面测试</strong></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">http://10.1.1.148:8082</span><br></pre></td></tr></table></figure><h1 id="5-安装dubbo-monitor并配置"><a href="#5-安装dubbo-monitor并配置" class="headerlink" title="5. 安装dubbo-monitor并配置"></a><strong>5. 安装dubbo-monitor并配置</strong></h1><h2 id="安装dubbo-monitor"><a href="#安装dubbo-monitor" class="headerlink" title="安装dubbo-monitor"></a><strong>安装dubbo-monitor</strong></h2><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></pre></td><td class="code"><pre><span class="line">dubbo-monitor也只需单点部署即可</span><br><span class="line"># pwd</span><br><span class="line">/home/soft</span><br><span class="line"># tar zxf dubbo-monitor-simple-2.8.4-assembly.tar.gz</span><br><span class="line"># mv /home/soft/dubbo-monitor-simple-2.8.4 /usr/local/dubbo-monitor</span><br><span class="line"># cd /usr/local/dubbo-monitor/</span><br><span class="line"># ls</span><br><span class="line">bin  conf  lib</span><br></pre></td></tr></table></figure><h2 id="配置dubbo-properties-1"><a href="#配置dubbo-properties-1" class="headerlink" title="配置dubbo.properties"></a><strong>配置dubbo.properties</strong></h2><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></pre></td><td class="code"><pre><span class="line"># pwd</span><br><span class="line">/usr/local/dubbo-monitor/conf</span><br><span class="line"># vim dubbo.properties</span><br><span class="line">dubbo.container=log4j,spring,registry,jetty</span><br><span class="line">dubbo.application.name=simple-monitor</span><br><span class="line">dubbo.application.owner=kp-java</span><br><span class="line">dubbo.registry.address=zookeeper://10.1.1.148:2181?backup=10.1.1.149:2181,10.1.1.150:2181</span><br><span class="line">dubbo.protocol.port=7070</span><br><span class="line">dubbo.jetty.port=8080</span><br><span class="line">dubbo.jetty.directory=$&#123;user.home&#125;/monitor</span><br><span class="line">dubbo.charts.directory=$&#123;dubbo.jetty.directory&#125;/charts</span><br><span class="line">dubbo.statistics.directory=$&#123;user.home&#125;/monitor/statistics</span><br><span class="line">dubbo.log4j.file=logs/dubbo-monitor-simple.log</span><br><span class="line">dubbo.log4j.level=WARN</span><br></pre></td></tr></table></figure><h2 id="启动dubbo-monitor"><a href="#启动dubbo-monitor" class="headerlink" title="启动dubbo-monitor"></a><strong>启动dubbo-monitor</strong></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"># /usr/local/dubbo-monitor/bin/server.sh start</span><br></pre></td></tr></table></figure><h2 id="访问dubbo-monitor-web页面测试"><a href="#访问dubbo-monitor-web页面测试" class="headerlink" title="访问dubbo-monitor web页面测试"></a><strong>访问dubbo-monitor web页面测试</strong></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">http://10.1.1.149:8080</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-配置前准备工作&quot;&gt;&lt;a href=&quot;#1-配置前准备工作&quot; class=&quot;headerlink&quot; title=&quot;1. 配置前准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 配置前准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;部署规划&quot;&gt;&lt;a href=&quot;#部署规划&quot; class=&quot;headerlink&quot; title=&quot;部署规划&quot;&gt;&lt;/a&gt;&lt;strong&gt;部署规划&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;集群使用三台服务器，分别部署zookeeper、dubbo-admin服务，其中zookeeper分别部署在三台服务器上，dubbo-admin部署于三台服务器其中一台上，三台zookeeper构成集群，而dubbo-admin是否正常对于dubbo服务正常运行并不会造成任何影响，因此dubbo采用单点部署。&lt;br&gt;zookeeper安装路径：&lt;br&gt;/usr/local/zookeeper-3.4.6/&lt;br&gt;链接至&lt;br&gt;/usr/local/zookeeper/&lt;br&gt;zookeeper数据存放路径&lt;br&gt;/home/zookeeper/data/&lt;br&gt;zookeeper日志存放路径&lt;br&gt;/usr/local/zookeeper/log/&lt;br&gt;clientPort:2181&lt;br&gt;zookeeper数据交换端口:2888&lt;br&gt;zookeeper选举端口:3888&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;准备安装程序&quot;&gt;&lt;a href=&quot;#准备安装程序&quot; class=&quot;headerlink&quot; title=&quot;准备安装程序&quot;&gt;&lt;/a&gt;&lt;strong&gt;准备安装程序&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# ls /home/soft/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;dubbo-admin-tomcat.tar.gz  dubbo-monitor-simple-2.8.4-assembly.tar.gz  jdk-8u111-linux-x64.rpm  zookeeper-3.4.6.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# tar zxf zookeeper-3.4.6.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# mv /home/soft/zookeeper-3.4.6 /usr/local/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ln -s /usr/local/zookeeper-3.4.6 /usr/local/zookeeper&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&quot;创建相关安装目录&quot;&gt;&lt;a href=&quot;#创建相关安装目录&quot; class=&quot;headerlink&quot; title=&quot;创建相关安装目录&quot;&gt;&lt;/a&gt;&lt;strong&gt;创建相关安装目录&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# mkdir -pv /home/zookeeper/data/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;mkdir: created directory `/home/zookeeper&amp;apos;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;mkdir: created directory `/home/zookeeper/data/&amp;apos;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# mkdir /usr/local/zookeeper/log/&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Zookeeper" scheme="https://www.lucissfer.com/categories/Linux/Zookeeper/"/>
    
      <category term="Dubbo" scheme="https://www.lucissfer.com/categories/Linux/Zookeeper/Dubbo/"/>
    
    
      <category term="zookeeper" scheme="https://www.lucissfer.com/tags/zookeeper/"/>
    
      <category term="dubbo" scheme="https://www.lucissfer.com/tags/dubbo/"/>
    
      <category term="分布式服务" scheme="https://www.lucissfer.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%8D%E5%8A%A1/"/>
    
  </entry>
  
  <entry>
    <title>disconf分布式配置管理平台部署</title>
    <link href="https://www.lucissfer.com/2017/01/26/disconf+%E5%88%86%E5%B8%83%E5%BC%8F%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0%E9%83%A8%E7%BD%B2/"/>
    <id>https://www.lucissfer.com/2017/01/26/disconf+分布式配置管理平台部署/</id>
    <published>2017-01-25T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.159Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-前言"><a href="#1-前言" class="headerlink" title="1. 前言"></a><strong>1. 前言</strong></h1><blockquote><p>Disconf是由百度开源的一套分布式配置管理平台（Distributed Configuration Management Platform），专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」。<br>首先，实现了同构系统的配置发布统一化，提供了配置服务server，该服务可以对配置进行持久化管理并对外提供restful接口，在此基础上，基于zookeeper实现对配置更改的实时推送，并且，提供了稳定有效的容灾方案，以及用户体验良好的编程模型和WEB用户管理界面。其次，实现了异构系统的配置包管理，提出基于zookeeper的全局分布式一致性锁来实现主备统一部署、系统异常时的主备自主切换。</p></blockquote><h1 id="2-配置前准备工作"><a href="#2-配置前准备工作" class="headerlink" title="2. 配置前准备工作"></a><strong>2. 配置前准备工作</strong></h1><h2 id="部署规划"><a href="#部署规划" class="headerlink" title="部署规划"></a><strong>部署规划</strong></h2><blockquote><p>Disconf分为web端与client端，web端统一管理各个环境的配置，在此我们只需要部署web端即可。<br>Disconf的部署非常简单，它是java语言开发的程序，部署时只需将war包部署到相应位置即可运行，因此只需要在JDK+Tomcat环境中将disconf的war包部署即可。<br>为保证高可用，我们将disconf分别部署到三台服务器上，并在前端采用nginx实现动静分离+负载均衡。<br>disconf依赖tomcat环境部署路径：<br>/usr/local/disconf-tomcat/<br>disconf部署路径：<br>/home/disconf/war<br>disconf打包前配置文件存放路径：<br>/home/disconf/conf/<br>disconf日志文件存放路径：<br>/home/disconf/log/<br>disconf前端静态文件存放路径：<br>/home/disconf/war/html/<br>disconf-web监听端口：8085<br>disconf前端nginx监听端口：8888</p></blockquote><a id="more"></a><h2 id="准备安装程序"><a href="#准备安装程序" class="headerlink" title="准备安装程序"></a><strong>准备安装程序</strong></h2><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></pre></td><td class="code"><pre><span class="line"># ls /home/soft/disconf/</span><br><span class="line">apache-maven-3.3.9-bin.tar.gz  apache-tomcat-8.0.39.tar.gz</span><br><span class="line"># tar zxf apache-maven-3.3.9-bin.tar.gz</span><br><span class="line"># tar zxf apache-tomcat-8.0.39.tar.gz</span><br><span class="line"># ls</span><br><span class="line">apache-maven-3.3.9  apache-maven-3.3.9-bin.tar.gz  apache-tomcat-8.0.39  apache-tomcat-8.0.39.tar.gz</span><br></pre></td></tr></table></figure><h2 id="创建相关安装目录"><a href="#创建相关安装目录" class="headerlink" title="创建相关安装目录"></a><strong>创建相关安装目录</strong></h2><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"># mkdir -pv /home/disconf/&#123;conf,war,log&#125;</span><br><span class="line">mkdir: created directory `/home/disconf&apos;</span><br><span class="line">mkdir: created directory `/home/disconf/conf&apos;</span><br><span class="line">mkdir: created directory `/home/disconf/war&apos;</span><br><span class="line">mkdir: created directory `/home/disconf/log&apos;</span><br></pre></td></tr></table></figure><h1 id="3-部署配置Disconf"><a href="#3-部署配置Disconf" class="headerlink" title="3. 部署配置Disconf"></a><strong>3. 部署配置Disconf</strong></h1><h2 id="3-1-安装配置JDK环境"><a href="#3-1-安装配置JDK环境" class="headerlink" title="3.1 安装配置JDK环境"></a><strong>3.1 安装配置JDK环境</strong></h2><p>disconf是采用JAVA语言开发的程序，所以需要先安装配置JDK环境，本次因为我们部署disconf的服务器已配置过JDK环境，故在此略过配置详细步骤。</p><h2 id="3-2-部署配置MAVEN"><a href="#3-2-部署配置MAVEN" class="headerlink" title="3.2. 部署配置MAVEN"></a><strong>3.2. 部署配置MAVEN</strong></h2><p>因为最新版本的disconf仅提供源码，因此需要我们将源码下载到服务器，然后通过maven来打包，所以我们要先部署maven环境，只需在其中一台服务器上部署maven即可。</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></pre></td><td class="code"><pre><span class="line"># mv apache-maven-3.3.9 /usr/local/maven</span><br><span class="line"># vim /etc/profile.d/maven.sh</span><br><span class="line">export MAVEN_HOME=/usr/local/maven</span><br><span class="line">export PATH=$MAVEN_HOME/bin:$PATH</span><br><span class="line"></span><br><span class="line"># source /etc/profile.d/maven.sh </span><br><span class="line"># mvn -v</span><br><span class="line">Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)</span><br><span class="line">Maven home: /usr/local/maven</span><br><span class="line">Java version: 1.8.0_111, vendor: Oracle Corporation</span><br><span class="line">Java home: /usr/java/jdk1.8.0_111/jre</span><br><span class="line">Default locale: en_US, platform encoding: UTF-8</span><br><span class="line">OS name: &quot;linux&quot;, version: &quot;2.6.32-642.4.2.el6.x86_64&quot;, arch: &quot;amd64&quot;, family: &quot;unix&quot;</span><br></pre></td></tr></table></figure><p>maven默认中央仓库为apache官方，在国内使用速度是相当之慢，因此，建议将中央仓库修改为阿里云仓库。</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"># vim /usr/local/maven/conf/settings.xml</span><br><span class="line">添加如下配置：</span><br><span class="line">  &lt;mirrors&gt;</span><br><span class="line">    &lt;mirror&gt;</span><br><span class="line">      &lt;id&gt;alimaven&lt;/id&gt;</span><br><span class="line">      &lt;name&gt;aliyun maven&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;mirrorOf&gt;central&lt;/mirrorOf&gt;        </span><br><span class="line">    &lt;/mirror&gt;</span><br><span class="line">  &lt;/mirrors&gt;</span><br></pre></td></tr></table></figure><p>maven配置成功。</p><h2 id="3-3-为Disconf准备MySQL数据库环境"><a href="#3-3-为Disconf准备MySQL数据库环境" class="headerlink" title="3.3 为Disconf准备MySQL数据库环境"></a><strong>3.3 为Disconf准备MySQL数据库环境</strong></h2><p>在MySQL服务器上创建数据库disconf并设置相应的用户。</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></pre></td><td class="code"><pre><span class="line">mysql&gt; create database disconf;</span><br><span class="line">Query OK, 1 row affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; grant all privileges on disconf.* to &apos;disconf&apos;@&apos;192.168.1.%&apos; identified by &apos;bh7F3d0djPhkTcp9D&apos;;</span><br><span class="line">Query OK, 0 rows affected, 1 warning (0.00 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; flush privileges;</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br></pre></td></tr></table></figure><p>将disconf源码目录下的sql文件上传到MySQL服务器上，并按照readme.md文件中的说明，依此导入sql文件。</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><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"># pwd</span><br><span class="line">/home/soft/disconf/disconf-master/disconf-web/sql</span><br><span class="line"># ls</span><br><span class="line">0-init_table.sql  1-init_data.sql  201512  20160701  deprecated  readme.md</span><br><span class="line"># more readme.md </span><br><span class="line">为了方便大家开发，统一了所有SQL，请先后执行：</span><br><span class="line"></span><br><span class="line">- 0-init_table.sql        create db,tables</span><br><span class="line">- 1-init_data.sql         create data</span><br><span class="line">- 201512/20151225.sql     patch</span><br><span class="line">- 20160701/20160701.sql   patch</span><br><span class="line"></span><br><span class="line">mysql&gt; source /home/soft/sql/0-init_table.sql</span><br><span class="line">Query OK, 1 row affected, 1 warning (0.00 sec)</span><br><span class="line"></span><br><span class="line">Database changed</span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; source /home/soft/sql/1-init_data.sql</span><br><span class="line">Query OK, 1 row affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 16 rows affected (0.00 sec)</span><br><span class="line">Records: 16  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">Query OK, 4 rows affected (0.00 sec)</span><br><span class="line">Records: 4  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">Query OK, 3 rows affected (0.00 sec)</span><br><span class="line">Records: 3  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">Query OK, 72 rows affected (0.00 sec)</span><br><span class="line">Records: 72  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">Query OK, 8 rows affected (0.00 sec)</span><br><span class="line">Records: 8  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">mysql&gt; source /home/soft/sql/201512/20151225.sql</span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">Query OK, 0 rows affected (0.03 sec)</span><br><span class="line">Records: 0  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">mysql&gt; source /home/soft/sql/20160701/20160701.sql</span><br><span class="line">Query OK, 0 rows affected (0.02 sec)</span><br><span class="line">Records: 0  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">Query OK, 3 rows affected (0.00 sec)</span><br><span class="line">Records: 3  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">mysql&gt; show tables;</span><br><span class="line">+-------------------+</span><br><span class="line">| Tables_in_disconf |</span><br><span class="line">+-------------------+</span><br><span class="line">| app               |</span><br><span class="line">| config            |</span><br><span class="line">| config_history    |</span><br><span class="line">| env               |</span><br><span class="line">| role              |</span><br><span class="line">| role_resource     |</span><br><span class="line">| user              |</span><br><span class="line">+-------------------+</span><br><span class="line">7 rows in set (0.00 sec)</span><br><span class="line">出现上面7个表，就说明数据库初始化成功。</span><br></pre></td></tr></table></figure><h2 id="3-4-下载并打包disconf-web"><a href="#3-4-下载并打包disconf-web" class="headerlink" title="3.4 下载并打包disconf-web"></a><strong>3.4 下载并打包disconf-web</strong></h2><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></pre></td><td class="code"><pre><span class="line"># ls /home/soft/disconf/</span><br><span class="line">disconf-master.zip</span><br><span class="line"># unzip disconf-master.zip</span><br><span class="line"># ls</span><br><span class="line">disconf-master  disconf-master.zip</span><br><span class="line"># pwd</span><br><span class="line">/home/soft/disconf/disconf-master</span><br></pre></td></tr></table></figure><p>将mvn编译打包需要的文件拷贝到/home/disconf/conf目录下。</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></pre></td><td class="code"><pre><span class="line"># cp disconf-web/profile/rd/* /home/disconf/conf/</span><br><span class="line"># cd /home/disconf/conf/</span><br><span class="line"># ls</span><br><span class="line">application-demo.properties  jdbc-mysql.properties  log4j.properties  logback.xml  redis-config.properties  zoo.properties</span><br><span class="line"># mv application-demo.properties application.properties </span><br><span class="line"># ls</span><br><span class="line">application.properties  jdbc-mysql.properties  log4j.properties  logback.xml  redis-config.properties  zoo.properties</span><br><span class="line">切记，一定要将配置文件application-demo.properties修改为application.properties</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><span class="line">3</span><br><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></pre></td><td class="code"><pre><span class="line"># vim jdbc-mysql.properties</span><br><span class="line">jdbc.driverClassName=com.mysql.jdbc.Driver</span><br><span class="line"></span><br><span class="line">jdbc.db_0.url=jdbc:mysql://192.168.1.110:3306/disconf?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;rewriteBatchedStatements=false</span><br><span class="line">jdbc.db_0.username=disconf</span><br><span class="line">jdbc.db_0.password=bh7F3d0djPhkTcp9D</span><br><span class="line"></span><br><span class="line">jdbc.maxPoolSize=20</span><br><span class="line">jdbc.minPoolSize=10</span><br><span class="line">jdbc.initialPoolSize=10</span><br><span class="line">jdbc.idleConnectionTestPeriod=1200</span><br><span class="line">jdbc.maxIdleTime=3600</span><br><span class="line"></span><br><span class="line"># vim log4j.properties</span><br><span class="line">log4j.rootLogger=INFO,dailyRolling,CONSOLE</span><br><span class="line"></span><br><span class="line">log4j.logger.org.apache.zookeeper=WARN</span><br><span class="line">log4j.logger.org.springframework=INFO</span><br><span class="line">log4j.logger.org.springframework.aop.framework.Cglib2AopProxy = INFO</span><br><span class="line"></span><br><span class="line">log4j.appender.dailyRolling=org.apache.log4j.DailyRollingFileAppender</span><br><span class="line">log4j.appender.dailyRolling.File=/home/disconf/log/disconf-log4j.log</span><br><span class="line">log4j.appender.dailyRolling.layout=org.apache.log4j.PatternLayout</span><br><span class="line">log4j.appender.dailyRolling.layout.ConversionPattern=%d [%t] %-5p %-17c&#123;2&#125; (%13F:%L) %3x - %m%n</span><br><span class="line"></span><br><span class="line">log4j.appender.Threshold=WARN</span><br><span class="line">log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender</span><br><span class="line">log4j.appender.CONSOLE.Target=System.out</span><br><span class="line">log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout</span><br><span class="line">log4j.appender.CONSOLE.layout.ConversionPattern=%d [%t] %-5p %-17c&#123;2&#125; (%13F:%L) %3x - %m%n</span><br><span class="line"></span><br><span class="line"># vim redis-config.properties</span><br><span class="line">redis.group1.retry.times=2</span><br><span class="line"></span><br><span class="line">redis.group1.client1.name=BeidouRedis1</span><br><span class="line">redis.group1.client1.host=192.168.1.5</span><br><span class="line">redis.group1.client1.port=6379</span><br><span class="line">redis.group1.client1.timeout=5000</span><br><span class="line">redis.group1.client1.password=foobared</span><br><span class="line"></span><br><span class="line">redis.group1.client2.name=BeidouRedis2</span><br><span class="line">redis.group1.client2.host=192.168.1.6</span><br><span class="line">redis.group1.client2.port=6379</span><br><span class="line">redis.group1.client2.timeout=5000</span><br><span class="line">redis.group1.client2.password=foobared</span><br><span class="line"></span><br><span class="line">redis.group1.client3.name=BeidouRedis3</span><br><span class="line">redis.group1.client3.host=192.168.1.7</span><br><span class="line">redis.group1.client3.port=6379</span><br><span class="line">redis.group1.client3.timeout=5000</span><br><span class="line">redis.group1.client3.password=foobared</span><br><span class="line"></span><br><span class="line">redis.evictor.delayCheckSeconds=300</span><br><span class="line">redis.evictor.checkPeriodSeconds=30</span><br><span class="line">redis.evictor.failedTimesToBeTickOut=6</span><br><span class="line"></span><br><span class="line"># vim zoo.properties</span><br><span class="line">hosts=192.168.1.104:2181,192.168.1.105:2181,192.168.1.106:2181</span><br><span class="line"></span><br><span class="line"># zookeeper\u7684\u524D\u7F00\u8DEF\u5F84\u540D</span><br><span class="line">zookeeper_url_prefix=/disconf</span><br></pre></td></tr></table></figure><p>编译disconf源文件，生成war包</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></pre></td><td class="code"><pre><span class="line"># pwd</span><br><span class="line">/home/soft/disconf/disconf-master</span><br><span class="line"># mvn clean install</span><br><span class="line">这一步如果报错，可以忽略。</span><br><span class="line"></span><br><span class="line">设置环境变量</span><br><span class="line"># vim /etc/profile.d/war.sh</span><br><span class="line">export ONLINE_CONFIG_PATH=/home/disconf/conf</span><br><span class="line">export WAR_ROOT_PATH=/home/disconf/war</span><br><span class="line"># source /etc/profile.d/war.sh</span><br><span class="line"></span><br><span class="line">执行编译脚本</span><br><span class="line"># cd disconf-web/</span><br><span class="line"># pwd</span><br><span class="line">/home/soft/disconf/disconf-master/disconf-web</span><br><span class="line"># sh deploy/deploy.sh</span><br><span class="line"></span><br><span class="line">编译结束后，会在$WAR_ROOT_PATH位置下生成如下文件：</span><br><span class="line"># ls /home/disconf/war/</span><br><span class="line">application.properties  disconf-web.war  html  jdbc-mysql.properties  jpaas_control  log4j.properties  logback.xml  META-INF  redis-config.properties  Release  WEB-INF  zoo.properties</span><br></pre></td></tr></table></figure><h2 id="3-5-部署配置nginx-tomcat"><a href="#3-5-部署配置nginx-tomcat" class="headerlink" title="3.5 部署配置nginx+tomcat"></a><strong>3.5 部署配置nginx+tomcat</strong></h2><p>nginx与tomcat的部署，在之前的文档有过详细说明，在此不赘述。</p><p>修改tomcat配置文件</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></pre></td><td class="code"><pre><span class="line"># vim /usr/local/disconf-tomcat/conf/server.xml</span><br><span class="line">    &lt;Connector port=&quot;8085&quot; protocol=&quot;HTTP/1.1&quot;</span><br><span class="line">               connectionTimeout=&quot;20000&quot;</span><br><span class="line">               redirectPort=&quot;8443&quot; /&gt;</span><br><span class="line"></span><br><span class="line">      &lt;Host name=&quot;localhost&quot;  appBase=&quot;webapps&quot;</span><br><span class="line">            unpackWARs=&quot;true&quot; autoDeploy=&quot;true&quot;&gt;</span><br><span class="line"></span><br><span class="line">        &lt;Context path=&quot;&quot; docBase=&quot;/home/disconf/war&quot;&gt;&lt;/Context&gt;</span><br></pre></td></tr></table></figure><p>修改nginx配置文件</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><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></pre></td><td class="code"><pre><span class="line"># vim /usr/local/openresty/nginx/conf/nginx.conf</span><br><span class="line">    upstream disconf &#123;</span><br><span class="line">    server 192.168.1.104:8085 weight=10 max_fails=2 fail_timeout=30s;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    server &#123;</span><br><span class="line">        listen       8888;</span><br><span class="line">        server_name  localhost;</span><br><span class="line"></span><br><span class="line">        #charset koi8-r;</span><br><span class="line">        charset utf-8;</span><br><span class="line"></span><br><span class="line">        #access_log  logs/host.access.log  main;</span><br><span class="line">        access_log  logs/disconf.access.log  main;</span><br><span class="line">        error_log   logs/disconf.error.log;</span><br><span class="line"></span><br><span class="line">        #location / &#123;</span><br><span class="line">        #    root   html;</span><br><span class="line">        #    index  index.html index.htm;</span><br><span class="line">        #&#125;</span><br><span class="line"></span><br><span class="line">        location / &#123;</span><br><span class="line">            root /home/disconf/war/html;</span><br><span class="line">            if ($query_string) &#123;</span><br><span class="line">                expires max;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        location ~ ^/(api|export) &#123;</span><br><span class="line">            proxy_pass_header Server;</span><br><span class="line">            proxy_set_header Host $http_host;</span><br><span class="line">            proxy_redirect off;</span><br><span class="line">            proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">            proxy_set_header X-Scheme $scheme;</span><br><span class="line">            proxy_pass http://disconf;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p>分别启动nginx、tomcat服务。</p><h2 id="3-6-访问Disconf-Web页面测试"><a href="#3-6-访问Disconf-Web页面测试" class="headerlink" title="3.6 访问Disconf Web页面测试"></a><strong>3.6 访问Disconf Web页面测试</strong></h2><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></pre></td><td class="code"><pre><span class="line">http://192.168.1.104:8888/</span><br><span class="line"></span><br><span class="line">使用用户名密码admin/admin正常登陆，disconf配置完成。</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-前言&quot;&gt;&lt;a href=&quot;#1-前言&quot; class=&quot;headerlink&quot; title=&quot;1. 前言&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 前言&lt;/strong&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;Disconf是由百度开源的一套分布式配置管理平台（Distributed Configuration Management Platform），专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」。&lt;br&gt;首先，实现了同构系统的配置发布统一化，提供了配置服务server，该服务可以对配置进行持久化管理并对外提供restful接口，在此基础上，基于zookeeper实现对配置更改的实时推送，并且，提供了稳定有效的容灾方案，以及用户体验良好的编程模型和WEB用户管理界面。其次，实现了异构系统的配置包管理，提出基于zookeeper的全局分布式一致性锁来实现主备统一部署、系统异常时的主备自主切换。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;2-配置前准备工作&quot;&gt;&lt;a href=&quot;#2-配置前准备工作&quot; class=&quot;headerlink&quot; title=&quot;2. 配置前准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;2. 配置前准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;部署规划&quot;&gt;&lt;a href=&quot;#部署规划&quot; class=&quot;headerlink&quot; title=&quot;部署规划&quot;&gt;&lt;/a&gt;&lt;strong&gt;部署规划&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Disconf分为web端与client端，web端统一管理各个环境的配置，在此我们只需要部署web端即可。&lt;br&gt;Disconf的部署非常简单，它是java语言开发的程序，部署时只需将war包部署到相应位置即可运行，因此只需要在JDK+Tomcat环境中将disconf的war包部署即可。&lt;br&gt;为保证高可用，我们将disconf分别部署到三台服务器上，并在前端采用nginx实现动静分离+负载均衡。&lt;br&gt;disconf依赖tomcat环境部署路径：&lt;br&gt;/usr/local/disconf-tomcat/&lt;br&gt;disconf部署路径：&lt;br&gt;/home/disconf/war&lt;br&gt;disconf打包前配置文件存放路径：&lt;br&gt;/home/disconf/conf/&lt;br&gt;disconf日志文件存放路径：&lt;br&gt;/home/disconf/log/&lt;br&gt;disconf前端静态文件存放路径：&lt;br&gt;/home/disconf/war/html/&lt;br&gt;disconf-web监听端口：8085&lt;br&gt;disconf前端nginx监听端口：8888&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Disconf" scheme="https://www.lucissfer.com/categories/Linux/Disconf/"/>
    
    
      <category term="disconf" scheme="https://www.lucissfer.com/tags/disconf/"/>
    
      <category term="分布式" scheme="https://www.lucissfer.com/tags/%E5%88%86%E5%B8%83%E5%BC%8F/"/>
    
      <category term="配置管理" scheme="https://www.lucissfer.com/tags/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>FastDFS部署配置</title>
    <link href="https://www.lucissfer.com/2017/01/24/FastDFS%E9%83%A8%E7%BD%B2%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.lucissfer.com/2017/01/24/FastDFS部署配置/</id>
    <published>2017-01-23T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.157Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-安装FastDFS服务"><a href="#1-安装FastDFS服务" class="headerlink" title="1. 安装FastDFS服务"></a><strong>1. 安装FastDFS服务</strong></h1><h2 id="所需软件包"><a href="#所需软件包" class="headerlink" title="所需软件包"></a><strong>所需软件包</strong></h2><blockquote><p>fastdfs-nginx-module_v1.16.tar.gz<br>FastDFS_v5.05.tar.gz<br>libfastcommon<br>ngx_cache_purge-2.3.tar.gz</p></blockquote><h2 id="安装软件依赖环境"><a href="#安装软件依赖环境" class="headerlink" title="安装软件依赖环境"></a><strong>安装软件依赖环境</strong></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"># yum install -y libevent gcc* git</span><br></pre></td></tr></table></figure><h2 id="安装-libfastcommon"><a href="#安装-libfastcommon" class="headerlink" title="安装 libfastcommon"></a><strong>安装 libfastcommon</strong></h2><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></pre></td><td class="code"><pre><span class="line">从github下载最新的libfastcommon</span><br><span class="line"># git clone https://github.com/happyfish100/libfastcommon.git</span><br><span class="line"># cd libfastcommon</span><br><span class="line">编译</span><br><span class="line"># ./make.sh</span><br><span class="line">安装</span><br><span class="line"># ./make.sh install</span><br><span class="line">指定库文件加载位置</span><br><span class="line"># vim /etc/ld.so.conf.d/libfastcommon.conf</span><br><span class="line">/usr/local/lib</span><br><span class="line">/usr/local/lib64</span><br><span class="line">/usr/lib64</span><br><span class="line">/usr/lib</span><br><span class="line">然后执行ldconfig更新/etc/ld.so.cache文件</span><br><span class="line"># ldconfig</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="安装FastDFS"><a href="#安装FastDFS" class="headerlink" title="安装FastDFS"></a><strong>安装FastDFS</strong></h2><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"># tar zxf FastDFS_v5.05.tar.gz</span><br><span class="line"># cd FastDFS/</span><br><span class="line"># ./make.sh</span><br><span class="line"># ./make.sh install</span><br><span class="line">确认make没有错误后，执行安装，默认会安装到/usr/bin中，并在/etc/fdfs中添加三个配置文件。</span><br></pre></td></tr></table></figure><h2 id="创建文件存放路径"><a href="#创建文件存放路径" class="headerlink" title="创建文件存放路径"></a><strong>创建文件存放路径</strong></h2><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"># mkdir -p /home/fastdfs/tracker   #创建tracker文件存放路径</span><br><span class="line"># mkdir -p /home/fastdfs/storage    #创建storage 文件存放路径</span><br><span class="line"># mkdir -p /home/fastdfs/client    #创建client 文件存放路径</span><br><span class="line"></span><br><span class="line"># mkdir -pv /home/fastdfs/&#123;tracker,storage,client&#125;</span><br></pre></td></tr></table></figure><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a><strong>修改配置文件</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br></pre></td><td class="code"><pre><span class="line"># cd /etc/fdfs/</span><br><span class="line"># ls</span><br><span class="line">client.conf.sample  storage.conf.sample  tracker.conf.sample</span><br><span class="line"># cp client.conf.sample client.conf</span><br><span class="line"># cp storage.conf.sample storage.conf</span><br><span class="line"># cp tracker.conf.sample tracker.conf</span><br><span class="line"></span><br><span class="line"># vim tracker.conf</span><br><span class="line">disabled=false</span><br><span class="line">bind_addr=</span><br><span class="line">port=22122</span><br><span class="line">connect_timeout=30</span><br><span class="line">network_timeout=60</span><br><span class="line">base_path=/home/fastdfs/tracker</span><br><span class="line">max_connections=256</span><br><span class="line">accept_threads=1</span><br><span class="line">work_threads=4</span><br><span class="line">store_lookup=2</span><br><span class="line">store_group=group2</span><br><span class="line">store_server=0</span><br><span class="line">store_path=0</span><br><span class="line">download_server=0</span><br><span class="line">reserved_storage_space = 10%</span><br><span class="line">log_level=info</span><br><span class="line">run_by_group=</span><br><span class="line">run_by_user=</span><br><span class="line">allow_hosts=*</span><br><span class="line">sync_log_buff_interval = 10</span><br><span class="line">check_active_interval = 120</span><br><span class="line">thread_stack_size = 64KB</span><br><span class="line">storage_ip_changed_auto_adjust = true</span><br><span class="line">storage_sync_file_max_delay = 86400</span><br><span class="line">storage_sync_file_max_time = 300</span><br><span class="line">use_trunk_file = false </span><br><span class="line">slot_min_size = 256</span><br><span class="line">slot_max_size = 16MB</span><br><span class="line">trunk_file_size = 64MB</span><br><span class="line">trunk_create_file_advance = false</span><br><span class="line">trunk_create_file_time_base = 02:00</span><br><span class="line">trunk_create_file_interval = 86400</span><br><span class="line">trunk_create_file_space_threshold = 20G</span><br><span class="line">trunk_init_check_occupying = false</span><br><span class="line">trunk_init_reload_from_binlog = false</span><br><span class="line">trunk_compress_binlog_min_interval = 0</span><br><span class="line">use_storage_id = false</span><br><span class="line">storage_ids_filename = storage_ids.conf</span><br><span class="line">id_type_in_filename = ip</span><br><span class="line">store_slave_file_use_link = false</span><br><span class="line">rotate_error_log = false</span><br><span class="line">error_log_rotate_time=00:00</span><br><span class="line">rotate_error_log_size = 0</span><br><span class="line">log_file_keep_days = 0</span><br><span class="line">use_connection_pool = false</span><br><span class="line">connection_pool_max_idle_time = 3600</span><br><span class="line">http.server_port=8080</span><br><span class="line">http.check_alive_interval=30</span><br><span class="line">http.check_alive_type=tcp</span><br><span class="line">http.check_alive_uri=/status.html</span><br><span class="line"></span><br><span class="line"># vim storage.conf</span><br><span class="line">disabled=false</span><br><span class="line">group_name=group1</span><br><span class="line">bind_addr=</span><br><span class="line">client_bind=true</span><br><span class="line">port=23000</span><br><span class="line">connect_timeout=30</span><br><span class="line">network_timeout=60</span><br><span class="line">heart_beat_interval=30</span><br><span class="line">stat_report_interval=60</span><br><span class="line">base_path=/home/fastdfs/storage</span><br><span class="line">max_connections=256</span><br><span class="line">buff_size = 256KB</span><br><span class="line">accept_threads=1</span><br><span class="line">work_threads=4</span><br><span class="line">disk_rw_separated = true</span><br><span class="line">disk_reader_threads = 1</span><br><span class="line">disk_writer_threads = 1</span><br><span class="line">sync_wait_msec=50</span><br><span class="line">sync_interval=0</span><br><span class="line">sync_start_time=00:00</span><br><span class="line">sync_end_time=23:59</span><br><span class="line">write_mark_file_freq=500</span><br><span class="line">store_path_count=1</span><br><span class="line">store_path0=/home/fastdfs/storage</span><br><span class="line">subdir_count_per_path=256</span><br><span class="line">tracker_server=10.1.1.150:22122</span><br><span class="line">log_level=info</span><br><span class="line">run_by_group=</span><br><span class="line">run_by_user=</span><br><span class="line">allow_hosts=*</span><br><span class="line">file_distribute_path_mode=0</span><br><span class="line">file_distribute_rotate_count=100</span><br><span class="line">fsync_after_written_bytes=0</span><br><span class="line">sync_log_buff_interval=10</span><br><span class="line">sync_binlog_buff_interval=10</span><br><span class="line">sync_stat_file_interval=300</span><br><span class="line">thread_stack_size=512KB</span><br><span class="line">upload_priority=10</span><br><span class="line">if_alias_prefix=</span><br><span class="line">check_file_duplicate=0</span><br><span class="line">file_signature_method=hash</span><br><span class="line">key_namespace=FastDFS</span><br><span class="line">keep_alive=0</span><br><span class="line">use_access_log = false</span><br><span class="line">rotate_access_log = false</span><br><span class="line">access_log_rotate_time=00:00</span><br><span class="line">rotate_error_log = false</span><br><span class="line">error_log_rotate_time=00:00</span><br><span class="line">rotate_access_log_size = 0</span><br><span class="line">rotate_error_log_size = 0</span><br><span class="line">log_file_keep_days = 0</span><br><span class="line">file_sync_skip_invalid_record=false</span><br><span class="line">use_connection_pool = false</span><br><span class="line">connection_pool_max_idle_time = 3600</span><br><span class="line">http.domain_name=</span><br><span class="line">http.server_port=8888</span><br><span class="line"></span><br><span class="line"># vim client.conf</span><br><span class="line">connect_timeout=30</span><br><span class="line">network_timeout=60</span><br><span class="line">base_path=/home/fastdfs/client</span><br><span class="line">tracker_server=10.1.1.150:22122</span><br><span class="line">log_level=info</span><br><span class="line">use_connection_pool = false</span><br><span class="line">connection_pool_max_idle_time = 3600</span><br><span class="line">load_fdfs_parameters_from_tracker=false</span><br><span class="line">use_storage_id = false</span><br><span class="line">storage_ids_filename = storage_ids.conf</span><br><span class="line">http.tracker_server_port=80</span><br></pre></td></tr></table></figure><h2 id="启动tracker和storage服务"><a href="#启动tracker和storage服务" class="headerlink" title="启动tracker和storage服务"></a><strong>启动tracker和storage服务</strong></h2><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></pre></td><td class="code"><pre><span class="line"># /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf</span><br><span class="line"># /usr/bin/fdfs_storaged /etc/fdfs/storage.conf</span><br><span class="line">storage首次启动会很慢，因为它在创建预设存储文件的目录，默认创建256个数据存放目录。</span><br><span class="line"></span><br><span class="line">检查服务是否启动正常</span><br><span class="line"># netstat -nultp | grep fdfs</span><br><span class="line">tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      14633/fdfs_trackerd </span><br><span class="line">tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      14643/fdfs_storaged</span><br></pre></td></tr></table></figure><h2 id="使用自带的工具fdfs-test测试上传、删除文件"><a href="#使用自带的工具fdfs-test测试上传、删除文件" class="headerlink" title="使用自带的工具fdfs_test测试上传、删除文件"></a><strong>使用自带的工具fdfs_test测试上传、删除文件</strong></h2><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><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">上传文件</span><br><span class="line"># fdfs_test /etc/fdfs/client.conf upload install.log</span><br><span class="line">This is FastDFS client test program v5.05</span><br><span class="line"></span><br><span class="line">Copyright (C) 2008, Happy Fish / YuQing</span><br><span class="line"></span><br><span class="line">FastDFS may be copied only under the terms of the GNU General</span><br><span class="line">Public License V3, which may be found in the FastDFS source kit.</span><br><span class="line">Please visit the FastDFS Home Page http://www.csource.org/ </span><br><span class="line">for more detail.</span><br><span class="line"></span><br><span class="line">[2016-12-29 23:46:46] DEBUG - base_path=/home/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0</span><br><span class="line"></span><br><span class="line">tracker_query_storage_store_list_without_group: </span><br><span class="line">server 1. group_name=, ip_addr=10.1.1.150, port=23000</span><br><span class="line"></span><br><span class="line">group_name=group1, ip_addr=10.1.1.150, port=23000</span><br><span class="line">storage_upload_by_filename</span><br><span class="line">group_name=group1, remote_filename=M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128.log</span><br><span class="line">source ip address: 10.1.1.150</span><br><span class="line">file timestamp=2016-12-29 23:46:46</span><br><span class="line">file size=8835</span><br><span class="line">file crc32=14818261</span><br><span class="line">example file url: http://10.1.1.150/group1/M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128.log</span><br><span class="line">storage_upload_slave_by_filename</span><br><span class="line">group_name=group1, remote_filename=M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128_big.log</span><br><span class="line">source ip address: 10.1.1.150</span><br><span class="line">file timestamp=2016-12-29 23:46:46</span><br><span class="line">file size=8835</span><br><span class="line">file crc32=14818261</span><br><span class="line">example file url: http://10.1.1.150/group1/M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128_big.log</span><br><span class="line">上面这个example file url现在还不能在浏览器中直接访问，因为必须要配合nginx使用才行。</span><br><span class="line"></span><br><span class="line">我们看一下文件实际的物理存储位置。</span><br><span class="line"># ls /home/fastdfs/storage/data/00/00/  </span><br><span class="line">CgEBllhlL-aAJf9YAAAigwDiG9U128_big.log  CgEBllhlL-aAJf9YAAAigwDiG9U128_big.log-m  CgEBllhlL-aAJf9YAAAigwDiG9U128.log  CgEBllhlL-aAJf9YAAAigwDiG9U128.log-m</span><br><span class="line"></span><br><span class="line">删除文件</span><br><span class="line"># fdfs_test /etc/fdfs/client.conf delete install.log</span><br><span class="line">This is FastDFS client test program v5.05</span><br><span class="line"></span><br><span class="line">Copyright (C) 2008, Happy Fish / YuQing</span><br><span class="line"></span><br><span class="line">FastDFS may be copied only under the terms of the GNU General</span><br><span class="line">Public License V3, which may be found in the FastDFS source kit.</span><br><span class="line">Please visit the FastDFS Home Page http://www.csource.org/ </span><br><span class="line">for more detail.</span><br><span class="line"></span><br><span class="line">[2016-12-29 23:52:47] DEBUG - base_path=/home/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0</span><br><span class="line"></span><br><span class="line">Usage: fdfs_test &lt;config_file&gt; delete &lt;group_name&gt; &lt;remote_filename&gt;</span><br><span class="line">删除的时候我们会发现报错了，因为删除文件必须要完整的group_name和remote_filename才可以。</span><br><span class="line">从上面的上传信息中我们可以得知group_name=group1,remote_filename=M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128_big.log，所以正确的删除命令应该是：</span><br><span class="line"># fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/CgEBllhlL-aAJf9YAAAigwDiG9U128.log</span><br><span class="line"></span><br><span class="line">This is FastDFS client test program v5.05</span><br><span class="line">Copyright (C) 2008, Happy Fish / YuQing</span><br><span class="line"></span><br><span class="line">FastDFS may be copied only under the terms of the GNU General</span><br><span class="line">Public License V3, which may be found in the FastDFS source kit.</span><br><span class="line">Please visit the FastDFS Home Page http://www.csource.org/ </span><br><span class="line">for more detail.</span><br><span class="line"></span><br><span class="line">[2016-12-29 23:59:32] DEBUG - base_path=/home/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0</span><br><span class="line"></span><br><span class="line">storage=10.1.1.150:23000</span><br><span class="line">delete file success</span><br><span class="line">删除成功。</span><br><span class="line">再来检查物理存储位置</span><br><span class="line"># ls /home/fastdfs/storage/data/00/00/ </span><br><span class="line">目录下为空</span><br><span class="line"></span><br><span class="line">实际在上传时会在上传文件外另外生成一个文件名后加_big的文件，所以删除文件时应一并删除这两个文件。</span><br></pre></td></tr></table></figure><h1 id="2-安装nginx和nginx-fastdfs模块并配置"><a href="#2-安装nginx和nginx-fastdfs模块并配置" class="headerlink" title="2. 安装nginx和nginx-fastdfs模块并配置"></a><strong>2. 安装nginx和nginx-fastdfs模块并配置</strong></h1><h2 id="解压配置nginx-fastdfs"><a href="#解压配置nginx-fastdfs" class="headerlink" title="解压配置nginx-fastdfs"></a><strong>解压配置nginx-fastdfs</strong></h2><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></pre></td><td class="code"><pre><span class="line"># tar zxf fastdfs-nginx-module_v1.16.tar.gz</span><br><span class="line"># cd fastdfs-nginx-module/</span><br><span class="line">编辑nginx模块的配置文件</span><br><span class="line"># vim src/config</span><br><span class="line">修改</span><br><span class="line">CORE_INCS=&quot;$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/&quot;</span><br><span class="line">修改为</span><br><span class="line">CORE_INCS=&quot;$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/&quot;</span><br><span class="line">因为实际上fastdfs的头文件在/usr/include/fastdfs与/usr/include/fastcommon/目录下</span><br><span class="line"></span><br><span class="line">复制配置文件</span><br><span class="line"># cp /root/soft/fastdfs/FastDFS/conf/http.conf /root/soft/fastdfs/FastDFS/conf/mime.types /etc/fdfs/</span><br></pre></td></tr></table></figure><h2 id="安装nginx及nginx-fastdfs模块"><a href="#安装nginx及nginx-fastdfs模块" class="headerlink" title="安装nginx及nginx-fastdfs模块"></a><strong>安装nginx及nginx-fastdfs模块</strong></h2><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></pre></td><td class="code"><pre><span class="line">解决依赖关系</span><br><span class="line"># yum install -y gcc* pcre-devel zlib-devel openssl-devel</span><br><span class="line">安装nginx</span><br><span class="line"># tar zxf openresty-1.11.2.1.tar.gz</span><br><span class="line"># cd openresty-1.11.2.1/</span><br><span class="line"># ./configure  --with-http_gzip_static_module --add-module=/root/soft/fastdfs/fastdfs-nginx-module/src/</span><br><span class="line"># gmake &amp;&amp; gmake install</span><br></pre></td></tr></table></figure><h2 id="编辑nginx-fastdfs模块配置文件"><a href="#编辑nginx-fastdfs模块配置文件" class="headerlink" title="编辑nginx-fastdfs模块配置文件"></a><strong>编辑nginx-fastdfs模块配置文件</strong></h2><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></pre></td><td class="code"><pre><span class="line"># cp /root/soft/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/</span><br><span class="line"># vim /etc/fdfs/mod_fastdfs.conf</span><br><span class="line">connect_timeout=2</span><br><span class="line">network_timeout=30</span><br><span class="line">base_path=/tmp</span><br><span class="line">load_fdfs_parameters_from_tracker=true</span><br><span class="line">storage_sync_file_max_delay = 86400</span><br><span class="line">use_storage_id = false</span><br><span class="line">storage_ids_filename = storage_ids.conf</span><br><span class="line">tracker_server=10.1.1.150:22122</span><br><span class="line">storage_server_port=23000</span><br><span class="line">group_name=group1</span><br><span class="line">url_have_group_name = true</span><br><span class="line">store_path_count=1</span><br><span class="line">store_path0=/home/fastdfs/storage</span><br><span class="line">log_level=info</span><br><span class="line">log_filename=</span><br><span class="line">response_mode=proxy</span><br><span class="line">if_alias_prefix=</span><br><span class="line">flv_support = true</span><br><span class="line">flv_extension = flv</span><br><span class="line">group_count = 0</span><br></pre></td></tr></table></figure><h2 id="编辑nginx配置文件"><a href="#编辑nginx配置文件" class="headerlink" title="编辑nginx配置文件"></a><strong>编辑nginx配置文件</strong></h2><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><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"># vim /usr/local/openresty/nginx/conf/nginx.conf</span><br><span class="line">user  root;</span><br><span class="line">worker_processes  1;</span><br><span class="line">events &#123;</span><br><span class="line">    worker_connections  1024;</span><br><span class="line">&#125;</span><br><span class="line">http &#123;</span><br><span class="line">    include       mime.types;</span><br><span class="line">    default_type  application/octet-stream;</span><br><span class="line">    log_format  main  &apos;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &apos;</span><br><span class="line">                      &apos;$status $body_bytes_sent &quot;$http_referer&quot; &apos;</span><br><span class="line">                      &apos;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&apos;;</span><br><span class="line">    access_log  logs/access.log  main;</span><br><span class="line">    sendfile        on;</span><br><span class="line">    keepalive_timeout  60;</span><br><span class="line">    gzip  on;</span><br><span class="line">    server &#123;</span><br><span class="line">        listen       80;</span><br><span class="line">        server_name  localhost;</span><br><span class="line">        location ~/group([0-9])/M00 &#123;</span><br><span class="line">            ngx_fastdfs_module;</span><br><span class="line">        &#125;</span><br><span class="line">        error_page   500 502 503 504  /50x.html;</span><br><span class="line">        location = /50x.html &#123;</span><br><span class="line">            root   html;</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><h2 id="启动nginx服务"><a href="#启动nginx服务" class="headerlink" title="启动nginx服务"></a><strong>启动nginx服务</strong></h2><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"># /usr/local/openresty/nginx/sbin/nginx -t</span><br><span class="line"># /usr/local/openresty/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><h2 id="上传文件并测试是否能正常访问"><a href="#上传文件并测试是否能正常访问" class="headerlink" title="上传文件并测试是否能正常访问"></a><strong>上传文件并测试是否能正常访问</strong></h2><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></pre></td><td class="code"><pre><span class="line"># fdfs_test /etc/fdfs/client.conf upload test.html</span><br><span class="line"># curl -I http://10.1.1.150/group1/M00/00/00/CgEBlVhyVPSAM6m1AAAAhl47IRo71_big.html</span><br><span class="line">HTTP/1.1 200 OK</span><br></pre></td></tr></table></figure><h2 id="报错解决办法"><a href="#报错解决办法" class="headerlink" title="报错解决办法"></a><strong>报错解决办法</strong></h2><p>如果访问时报400错误，查看错误日志：</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">[2017-01-09 22:57:06] ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename &quot;group1/M00/00/00/wKgBylhzpI2AW8AFAAAAE-vP9Cw582_big.txt&quot; is invalid</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><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"># vim /etc/fdfs/mod_fastdfs.conf</span><br><span class="line">将url_have_group_name = false</span><br><span class="line">修改为</span><br><span class="line">url_have_group_name = true</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-安装FastDFS服务&quot;&gt;&lt;a href=&quot;#1-安装FastDFS服务&quot; class=&quot;headerlink&quot; title=&quot;1. 安装FastDFS服务&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 安装FastDFS服务&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;所需软件包&quot;&gt;&lt;a href=&quot;#所需软件包&quot; class=&quot;headerlink&quot; title=&quot;所需软件包&quot;&gt;&lt;/a&gt;&lt;strong&gt;所需软件包&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;fastdfs-nginx-module_v1.16.tar.gz&lt;br&gt;FastDFS_v5.05.tar.gz&lt;br&gt;libfastcommon&lt;br&gt;ngx_cache_purge-2.3.tar.gz&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;安装软件依赖环境&quot;&gt;&lt;a href=&quot;#安装软件依赖环境&quot; class=&quot;headerlink&quot; title=&quot;安装软件依赖环境&quot;&gt;&lt;/a&gt;&lt;strong&gt;安装软件依赖环境&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# yum install -y libevent gcc* git&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&quot;安装-libfastcommon&quot;&gt;&lt;a href=&quot;#安装-libfastcommon&quot; class=&quot;headerlink&quot; title=&quot;安装 libfastcommon&quot;&gt;&lt;/a&gt;&lt;strong&gt;安装 libfastcommon&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;从github下载最新的libfastcommon&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# git clone https://github.com/happyfish100/libfastcommon.git&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# cd libfastcommon&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;编译&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ./make.sh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;安装&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ./make.sh install&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;指定库文件加载位置&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# vim /etc/ld.so.conf.d/libfastcommon.conf&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/local/lib&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/local/lib64&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/lib64&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;/usr/lib&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;然后执行ldconfig更新/etc/ld.so.cache文件&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ldconfig&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="FastDFS" scheme="https://www.lucissfer.com/categories/Linux/FastDFS/"/>
    
    
      <category term="FastDFS" scheme="https://www.lucissfer.com/tags/FastDFS/"/>
    
  </entry>
  
  <entry>
    <title>MySQL+MHA安装部署</title>
    <link href="https://www.lucissfer.com/2017/01/15/MySQL+MHA%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/"/>
    <id>https://www.lucissfer.com/2017/01/15/MySQL+MHA安装部署/</id>
    <published>2017-01-14T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.158Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1. 准备工作"></a><strong>1. 准备工作</strong></h1><h2 id="软件包版本"><a href="#软件包版本" class="headerlink" title="软件包版本"></a><strong>软件包版本</strong></h2><blockquote><p>mysql-5.7.17.tar.gz<br>cmake-3.6.2.tar.gz<br>mha4mysql-manager-0.57.tar.gz<br>mha4mysql-node-0.57.tar.gz</p></blockquote><h2 id="服务器明细"><a href="#服务器明细" class="headerlink" title="服务器明细"></a><strong>服务器明细</strong></h2><blockquote><p>kp-bt-101 Master<br>kp-bt-102   Candidate Master<br>kp-bt-103   Slave<br>kp-bt-13    MHA-manager</p></blockquote><h1 id="2-安装MySQL服务"><a href="#2-安装MySQL服务" class="headerlink" title="2. 安装MySQL服务"></a><strong>2. 安装MySQL服务</strong></h1><h2 id="解决依赖关系"><a href="#解决依赖关系" class="headerlink" title="解决依赖关系"></a><strong>解决依赖关系</strong></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"># yum install -y gcc-c++ ncurses-devel openssh-clients</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="配置ssh互信"><a href="#配置ssh互信" class="headerlink" title="配置ssh互信"></a><strong>配置ssh互信</strong></h2><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></pre></td><td class="code"><pre><span class="line">在所有服务器均做如下配置</span><br><span class="line"># ssh-keygen -t rsa</span><br><span class="line"># ssh-copy-id -i /root/.ssh/id_rsa.pub &quot;-p 16811 root@kp-bt-101&quot;</span><br><span class="line"># ssh-copy-id -i /root/.ssh/id_rsa.pub &quot;-p 16812 root@kp-bt-102&quot;</span><br><span class="line"># ssh-copy-id -i /root/.ssh/id_rsa.pub &quot;-p 16813 root@kp-bt-103&quot;</span><br><span class="line"># ssh-copy-id -i /root/.ssh/id_rsa.pub &quot;-p 16813 root@kp-bt-13&quot;</span><br></pre></td></tr></table></figure><h2 id="安装cmake"><a href="#安装cmake" class="headerlink" title="安装cmake"></a><strong>安装cmake</strong></h2><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"># tar zxf cmake-3.6.2.tar.gz</span><br><span class="line"># cd cmake-3.6.2/</span><br><span class="line"># ./bootstrap</span><br><span class="line"># gmake &amp;&amp; gmake install</span><br><span class="line"># cmake --version</span><br></pre></td></tr></table></figure><h2 id="准备Boost库支持"><a href="#准备Boost库支持" class="headerlink" title="准备Boost库支持"></a><strong>准备Boost库支持</strong></h2><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"># mkdir /usr/local/boost</span><br><span class="line"># wget -o /usr/local/boost/boost_1_59_0.tar.gz http://ncu.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz</span><br><span class="line"></span><br><span class="line">boost1.63版本不支持MySQL5.7.17，编译时会报错。</span><br></pre></td></tr></table></figure><h2 id="创建Mysql安装目录以及数据库文件存放的路径"><a href="#创建Mysql安装目录以及数据库文件存放的路径" class="headerlink" title="创建Mysql安装目录以及数据库文件存放的路径"></a><strong>创建Mysql安装目录以及数据库文件存放的路径</strong></h2><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"># mkdir -p /home/mysql</span><br><span class="line"># mkdir -p /home/mysql/data</span><br></pre></td></tr></table></figure><h2 id="创建mysql用户以及对应用户组"><a href="#创建mysql用户以及对应用户组" class="headerlink" title="创建mysql用户以及对应用户组"></a><strong>创建mysql用户以及对应用户组</strong></h2><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"># groupadd mysql</span><br><span class="line"># useradd -r -g mysql mysql -s /sbin/nologin</span><br></pre></td></tr></table></figure><h2 id="编译安装MySQL"><a href="#编译安装MySQL" class="headerlink" title="编译安装MySQL"></a><strong>编译安装MySQL</strong></h2><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"># tar zxf mysql-5.7.17.tar.gz</span><br><span class="line"># # cd mysql-5.7.17/</span><br><span class="line"># cmake -DCMAKE_INSTALL_PREFIX=/home/mysql  -DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DWITH_MYISAM_STORAGE_ENGINE=1  -DWITH_INNOBASE_STORAGE_ENGINE=1  -DWITH_MEMORY_STORAGE_ENGINE=1  -DWITH_READLINE=1  -DENABLED_LOCAL_INFILE=1  -DMYSQL_DATADIR=/home/mysql/data  -DMYSQL_USER=mysql  -DMYSQL_TCP_PORT=3306 -DWITH_BOOST=/usr/local/boost</span><br><span class="line"># make &amp;&amp; make install</span><br></pre></td></tr></table></figure><h2 id="修改MySQL目录权限"><a href="#修改MySQL目录权限" class="headerlink" title="修改MySQL目录权限"></a><strong>修改MySQL目录权限</strong></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"># chown -R mysql.mysql /home/mysql/</span><br></pre></td></tr></table></figure><h2 id="准备MySQL配置文件"><a href="#准备MySQL配置文件" class="headerlink" title="准备MySQL配置文件"></a><strong>准备MySQL配置文件</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"># cp support-files/my-default.cnf /etc/my.cnf</span><br><span class="line">kp-bt-101   Master</span><br><span class="line"># vim /etc/my.cnf</span><br><span class="line">[mysqld]</span><br><span class="line">port            = 3306</span><br><span class="line">basedir         = /home/mysql</span><br><span class="line">datadir         = /home/mysql/data</span><br><span class="line">tmpdir          = /home/mysql/tmp</span><br><span class="line"></span><br><span class="line">log-error = /home/mysql/log/mysql_run.err</span><br><span class="line">log-bin = /home/mysql/data/mysql-bin</span><br><span class="line">binlog_format=mixed</span><br><span class="line">expire_logs_days = 15</span><br><span class="line">skip-name-resolve</span><br><span class="line"></span><br><span class="line">#replication options</span><br><span class="line">server-id = 1</span><br><span class="line">relay-log=rep_relay_log</span><br><span class="line">relay-log-index=rep_relay_log_index</span><br><span class="line">skip-slave-start</span><br><span class="line"></span><br><span class="line">kp-bt-102   Candidate Master</span><br><span class="line"># vim /etc/my.cnf</span><br><span class="line">[mysqld]</span><br><span class="line">port            = 3306</span><br><span class="line">socket          = /tmp/mysql.sock</span><br><span class="line">basedir         = /home/mysql</span><br><span class="line">datadir         = /home/mysql/data</span><br><span class="line">tmpdir          = /home/mysql/tmp</span><br><span class="line"></span><br><span class="line">log-error = /home/mysql/log/mysql_run.err</span><br><span class="line">log-bin = /home/mysql/data/mysql-bin</span><br><span class="line">binlog_format=mixed</span><br><span class="line">expire_logs_days = 15</span><br><span class="line">skip-name-resolve</span><br><span class="line"></span><br><span class="line">#replication options</span><br><span class="line">server-id = 2</span><br><span class="line">relay-log=rep_relay_log</span><br><span class="line">relay-log-index=rep_relay_log_index</span><br><span class="line">skip-slave-start</span><br><span class="line"></span><br><span class="line">kp-bt-103   Slave</span><br><span class="line"># vim /etc/my.cnf</span><br><span class="line">[mysqld]</span><br><span class="line">port            = 3306</span><br><span class="line">socket          = /tmp/mysql.sock</span><br><span class="line">basedir         = /home/mysql</span><br><span class="line">datadir         = /home/mysql/data</span><br><span class="line">tmpdir          = /home/mysql/tmp</span><br><span class="line"></span><br><span class="line">log-error = /home/mysql/log/mysql_run.err</span><br><span class="line">log-bin = /home/mysql/data/mysql-bin</span><br><span class="line">binlog_format=mixed</span><br><span class="line">expire_logs_days = 15</span><br><span class="line">skip-name-resolve</span><br><span class="line"></span><br><span class="line">#replication options</span><br><span class="line">server-id = 3</span><br><span class="line">relay-log=rep_relay_log</span><br><span class="line">relay-log-index=rep_relay_log_index</span><br><span class="line">skip-slave-start</span><br></pre></td></tr></table></figure><h2 id="初始化数据库、创建数据库系统表"><a href="#初始化数据库、创建数据库系统表" class="headerlink" title="初始化数据库、创建数据库系统表"></a><strong>初始化数据库、创建数据库系统表</strong></h2><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></pre></td><td class="code"><pre><span class="line"># cd /home/mysql/</span><br><span class="line"># bin/mysqld --initialize --user=mysql --basedir=/home/mysql/ --datadir=/home/mysql/data/</span><br><span class="line">mysql初始化过程如果正常将不会出现任何提示，初始化过程中创建的默认密码输出到配置文件中指定的log_error文件中。</span><br></pre></td></tr></table></figure><h2 id="设置环境变量"><a href="#设置环境变量" class="headerlink" title="设置环境变量"></a><strong>设置环境变量</strong></h2><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"># vim /etc/profile.d/mysql.sh</span><br><span class="line">export PATH=/home/mysql/bin:$PATH</span><br></pre></td></tr></table></figure><h2 id="为MySQL提供服务脚本，并将MySQL服务加入开机启动"><a href="#为MySQL提供服务脚本，并将MySQL服务加入开机启动" class="headerlink" title="为MySQL提供服务脚本，并将MySQL服务加入开机启动"></a><strong>为MySQL提供服务脚本，并将MySQL服务加入开机启动</strong></h2><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></pre></td><td class="code"><pre><span class="line"># cp support-files/mysql.server /etc/init.d/mysql</span><br><span class="line"># chmod +x /etc/init.d/mysql</span><br><span class="line"># chkconfig mysql on</span><br></pre></td></tr></table></figure><h2 id="启动MySQL服务"><a href="#启动MySQL服务" class="headerlink" title="启动MySQL服务"></a><strong>启动MySQL服务</strong></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"># /etc/init.d/mysql start</span><br></pre></td></tr></table></figure><p><strong>修改MySQL初始root密码</strong></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"># mysqladmin -uroot password &apos;password&apos; -p&apos;dh9&gt;qmyaBIZe&apos;</span><br></pre></td></tr></table></figure><p><strong>配置iptables规则</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></pre></td><td class="code"><pre><span class="line"># iptables -I INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT</span><br><span class="line"># service iptables save</span><br><span class="line">所有MySQL节点都要配置iptables规则。</span><br></pre></td></tr></table></figure><h1 id="3-配置主从复制"><a href="#3-配置主从复制" class="headerlink" title="3. 配置主从复制"></a><strong>3. 配置主从复制</strong></h1><h2 id="创建数据库管理账号和复制账号及MHA监控账号"><a href="#创建数据库管理账号和复制账号及MHA监控账号" class="headerlink" title="创建数据库管理账号和复制账号及MHA监控账号"></a><strong>创建数据库管理账号和复制账号及MHA监控账号</strong></h2><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">mysql&gt; grant all privileges on *.* to &apos;root&apos;@&apos;192.168.1.%&apos; identified by &apos;nhE93d0qjPhkEcp3D&apos;;</span><br><span class="line">mysql&gt; grant replication slave,replication client,super on *.* to &apos;rep&apos;@&apos;192.168.1.%&apos; identified by &apos;2wsxzaq1&apos;;</span><br><span class="line">mysql&gt; grant all privileges on *.* to &apos;mha&apos;@&apos;192.168.1.%&apos; identified by &apos;4rfvxsw2&apos;;</span><br><span class="line">mysql&gt; flush privileges;</span><br></pre></td></tr></table></figure><h2 id="配置主从复制"><a href="#配置主从复制" class="headerlink" title="配置主从复制"></a><strong>配置主从复制</strong></h2><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">Master</span><br><span class="line">查询Master状态</span><br><span class="line">mysql&gt; show master status;</span><br><span class="line"></span><br><span class="line">Candidate Master</span><br><span class="line">mysql&gt; change master to master_host=&apos;192.168.1.101&apos;,master_port=3306,master_user=&apos;rep&apos;,master_password=&apos;2wsxzaq1&apos;,master_log_file=&apos;mysql-bin.000002&apos;,master_log_pos=1204;</span><br><span class="line">mysql&gt; start slave;</span><br><span class="line"></span><br><span class="line">Slave</span><br><span class="line">mysql&gt; change master to master_host=&apos;192.168.1.101&apos;,master_port=3306,master_user=&apos;rep&apos;,master_password=&apos;2wsxzaq1&apos;,master_log_file=&apos;mysql-bin.000002&apos;,master_log_pos=1204;</span><br><span class="line">mysql&gt; start slave ;</span><br></pre></td></tr></table></figure><h2 id="设置从库只读"><a href="#设置从库只读" class="headerlink" title="设置从库只读"></a><strong>设置从库只读</strong></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">mysql&gt; set global read_only=1;</span><br></pre></td></tr></table></figure><h2 id="检查主库、从库状态"><a href="#检查主库、从库状态" class="headerlink" title="检查主库、从库状态"></a><strong>检查主库、从库状态</strong></h2><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></pre></td><td class="code"><pre><span class="line">Master</span><br><span class="line">mysql&gt; show master status \G</span><br><span class="line"></span><br><span class="line">Slave</span><br><span class="line">mysql&gt; show slave tatus\G</span><br><span class="line">检查Slave_IO_Running、Slave_SQL_Running是否为Yes，如果</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></pre></td></tr></table></figure><h1 id="4-安装配置MHA"><a href="#4-安装配置MHA" class="headerlink" title="4. 安装配置MHA"></a><strong>4. 安装配置MHA</strong></h1><h2 id="安装MHA-manager"><a href="#安装MHA-manager" class="headerlink" title="安装MHA-manager"></a><strong>安装MHA-manager</strong></h2><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></pre></td><td class="code"><pre><span class="line">解决依赖关系</span><br><span class="line"># yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager  perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y</span><br><span class="line"># wget http://www.cpan.org/authors/id/A/AN/ANDK/CPAN-2.14.tar.gz</span><br><span class="line"># tar zxf CPAN-2.14.tar.gz </span><br><span class="line"># cd CPAN-2.14</span><br><span class="line"># perl Makefile.PL</span><br><span class="line"># make &amp;&amp; make install</span><br><span class="line"></span><br><span class="line">在mha-manager服务器上也需要安装mha-node</span><br><span class="line"># tar zxf mha4mysql-node-0.57.tar.gz</span><br><span class="line"># cd mha4mysql-node-0.57/</span><br><span class="line"># perl Makefile.PL</span><br><span class="line"># make &amp;&amp; make install</span><br><span class="line"></span><br><span class="line">安装mha-manager</span><br><span class="line"># tar zxf mha4mysql-manager-0.57.tar.gz</span><br><span class="line"># cd mha4mysql-manager-0.57/</span><br><span class="line"># perl Makefile.PL</span><br><span class="line"># make &amp;&amp; make install</span><br><span class="line"></span><br><span class="line">复制相关脚本到/usr/local/bin/</span><br><span class="line"># cp samples/scripts/* /usr/local/bin/</span><br></pre></td></tr></table></figure><h2 id="安装MHA-node"><a href="#安装MHA-node" class="headerlink" title="安装MHA-node"></a><strong>安装MHA-node</strong></h2><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></pre></td><td class="code"><pre><span class="line">在所有MySQL节点安装mha-node</span><br><span class="line">解决依赖关系</span><br><span class="line"># yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager  perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y</span><br><span class="line"># wget http://www.cpan.org/authors/id/A/AN/ANDK/CPAN-2.14.tar.gz</span><br><span class="line"># tar zxf CPAN-2.14.tar.gz </span><br><span class="line"># cd CPAN-2.14</span><br><span class="line"># perl Makefile.PL</span><br><span class="line"># make &amp;&amp; make install</span><br><span class="line"></span><br><span class="line">安装mha-node</span><br><span class="line"># tar zxf mha4mysql-node-0.57.tar.gz</span><br><span class="line"># cd mha4mysql-node-0.57/</span><br><span class="line"># perl Makefile.PL</span><br><span class="line"># make &amp;&amp; make install</span><br></pre></td></tr></table></figure><h2 id="配置MHA"><a href="#配置MHA" class="headerlink" title="配置MHA"></a><strong>配置MHA</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">创建MHA的工作目录，并且创建相关配置文件（在软件包解压后的目录里面有样例配置文件）</span><br><span class="line"># mkdir -p /etc/masterha</span><br><span class="line"># pwd</span><br><span class="line">/root/soft/mysql/mha4mysql-manager-0.57</span><br><span class="line"># cp samples/conf/app1.cnf /etc/masterha/</span><br><span class="line"># vim /etc/masterha/app1.cnf</span><br><span class="line">[server default]</span><br><span class="line">manager_workdir=/var/log/masterha/app1.log              //设置manager的工作目录</span><br><span class="line">manager_log=/var/log/masterha/app1/manager.log          //设置manager的日志</span><br><span class="line">master_binlog_dir=/home/mysql/data                      //设置master 保存binlog的位置，以便MHA可以找到master的日志，我这里的也就是mysql的数据目录</span><br><span class="line">master_ip_failover_script= /usr/local/bin/master_ip_failover    //设置自动failover时候的切换脚本</span><br><span class="line">master_ip_online_change_script= /usr/local/bin/master_ip_online_change  //设置手动切换时候的切换脚本</span><br><span class="line">user=mha                  设置监控用户mha</span><br><span class="line">password=4rfvxsw2         //设置监控用户的密码</span><br><span class="line">ping_interval=3         //设置监控主库，发送ping包的时间间隔，默认是3秒，尝试三次没有回应的时候自动进行railover</span><br><span class="line">remote_workdir=/tmp     //设置远端mysql在发生切换时binlog的保存位置</span><br><span class="line">repl_user=rep          //设置复制环境中的复制用户名</span><br><span class="line">repl_password=2wsxzaq1    //设置复制用户的密码</span><br><span class="line">report_script=/usr/local/bin/send_report    //设置发生切换后发送的报警的脚本</span><br><span class="line">secondary_check_script= /usr/local/bin/masterha_secondary_check -s kp-bt-103 -s kp-bt-101            </span><br><span class="line">shutdown_script=&quot;&quot;      //设置故障发生后关闭故障主机脚本（该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用）</span><br><span class="line">ssh_user=root           //设置ssh的登录用户名</span><br><span class="line"></span><br><span class="line">[server1]</span><br><span class="line">hostname=kp-bt-101</span><br><span class="line">ssh_port=16811</span><br><span class="line">port=3306</span><br><span class="line">candidate_master=1</span><br><span class="line"></span><br><span class="line">[server2]</span><br><span class="line">hostname=kp-bt-102</span><br><span class="line">ssh_port=16812</span><br><span class="line">port=3306</span><br><span class="line">candidate_master=1   //设置为候选master，如果设置该参数以后，发生主从切换以后将会将此从库提升为主库，即使这个主库不是集群中事件最新的slave</span><br><span class="line">check_repl_delay=0   //默认情况下如果一个slave落后master 100M的relay logs的话，MHA将不会选择该slave作为一个新的master，因为对于这个slave的恢复需要花费很长时间，通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时，这个参数对于设置了candidate_master=1的主机非常有用，因为这个候选主在切换的过程中一定是新的master</span><br><span class="line"></span><br><span class="line">[server3]</span><br><span class="line">hostname=kp-bt-103</span><br><span class="line">ssh_port=16813</span><br><span class="line">port=3306</span><br><span class="line">no_master=1</span><br></pre></td></tr></table></figure><h2 id="设置relay-log的清除方式（在每个slave节点上）"><a href="#设置relay-log的清除方式（在每个slave节点上）" class="headerlink" title="设置relay log的清除方式（在每个slave节点上）"></a><strong>设置relay log的清除方式（在每个slave节点上）</strong></h2><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></pre></td><td class="code"><pre><span class="line">mysql&gt; set global relay_log_purge=0;</span><br><span class="line">注意：</span><br><span class="line"></span><br><span class="line">MHA在发生切换的过程中，从库的恢复过程中依赖于relay log的相关信息，所以这里要将relay log的自动清除设置为OFF，采用手动清除relay log的方式。在默认情况下，从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中，这些中继日志在恢复其他从服务器时可能会被用到，因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下，删除大的文件需要一定的时间，会导致严重的复制延时。为了避免复制延时，需要暂时为中继日志创建硬链接，因为在linux系统中通过硬链接删除大文件速度会很快。（在mysql数据库中，删除大表时，通常也采用建立硬链接的方式）</span><br><span class="line"></span><br><span class="line">MHA节点中包含了pure_relay_logs命令工具，它可以为中继日志创建硬链接，执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志，再执行SET GLOBAL relay_log_purge=0。</span><br><span class="line"></span><br><span class="line">pure_relay_logs脚本参数如下所示：</span><br><span class="line"></span><br><span class="line">--user mysql                      用户名</span><br><span class="line">--password mysql                  密码</span><br><span class="line">--port                            端口号</span><br><span class="line">--workdir                         指定创建relay log的硬链接的位置，默认是/var/tmp，由于系统不同分区创建硬链接文件会失败，故需要执行硬链接具体位置，成功执行脚本后，硬链接的中继日志文件被删除</span><br><span class="line">--disable_relay_log_purge         默认情况下，如果relay_log_purge=1，脚本会什么都不清理，自动退出，通过设定这个参数，当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relay log之后，最后将参数设置为OFF。</span><br></pre></td></tr></table></figure><h2 id="设置定期清理relay脚本-slave"><a href="#设置定期清理relay脚本-slave" class="headerlink" title="设置定期清理relay脚本(slave)"></a><strong>设置定期清理relay脚本(slave)</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"># vim purge_relay_log.sh</span><br><span class="line"></span><br><span class="line">#!/bin/bash</span><br><span class="line">user=root</span><br><span class="line">passwd=nhE93d0qjPhkEcp3D</span><br><span class="line">port=3306</span><br><span class="line">log_dir=&apos;/home/mha/log/&apos;</span><br><span class="line">work_dir=&apos;/home/mysql/data/&apos;</span><br><span class="line">purge=&apos;/usr/local/bin/purge_relay_logs&apos;</span><br><span class="line"></span><br><span class="line">if [ ! -d $log_dir ]</span><br><span class="line">then</span><br><span class="line">   mkdir $log_dir -p</span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line">$purge --user=$user --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir &gt;&gt; $log_dir/purge_relay_logs.log 2&gt;&amp;1</span><br><span class="line"></span><br><span class="line"># chmod +x purge_relay_log.sh</span><br><span class="line">将此脚本加入计划任务</span><br><span class="line"># crontab -l</span><br><span class="line">0 4 * * * /bin/bash /home/scripts/purge_relay_log.sh</span><br><span class="line"></span><br><span class="line">手动执行日志清除命令测试</span><br><span class="line"># /usr/local/bin/purge_relay_logs --user=root --password=nhE93d0qjPhkEcp3D --port=3306 -disable_relay_log_purge --workdir=/home/mysql/data/</span><br><span class="line">2017-01-12 04:05:58: purge_relay_logs script started.</span><br><span class="line"> Found relay_log.info: /home/mysql/data/relay-log.info</span><br><span class="line"> Opening /home/mysql/data/rep_relay_log.000001 ..</span><br><span class="line"> Opening /home/mysql/data/rep_relay_log.000002 ..</span><br><span class="line"> Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files (if it keeps up); SET GLOBAL relay_log_purge=0; .. ok.</span><br><span class="line">2017-01-12 04:06:01: All relay log purging operations succeeded.</span><br><span class="line"></span><br><span class="line">如果出现错误提示：</span><br><span class="line">2017-01-12 03:47:16: purge_relay_logs script started.</span><br><span class="line">DBI connect(&apos;;host=127.0.0.1;port=3306&apos;,&apos;root&apos;,...) failed: Host &apos;127.0.0.1&apos; is not allowed to connect to this MySQL server at /usr/local/bin/purge_relay_logs line 185</span><br><span class="line">则是因为，在MySQL5.7中，默认没有创建root@127.0.0.1用户，此时我们需要手动创建用户</span><br><span class="line">mysql&gt; grant all privileges on *.* to &apos;root&apos;@&apos;127.0.0.1&apos; identified by &apos;nhE93d0qjPhkEcp3D&apos;;</span><br></pre></td></tr></table></figure><h2 id="在MHA-master上检查ssh配置"><a href="#在MHA-master上检查ssh配置" class="headerlink" title="在MHA-master上检查ssh配置"></a><strong>在MHA-master上检查ssh配置</strong></h2><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">检查MHA Manger到所有MHA Node的SSH连接状态：</span><br><span class="line"># masterha_check_ssh --conf=/etc/masterha/app1.cnf </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Reading application default configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Reading server configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Starting SSH connection tests..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-101(192.168.1.101:16811) to root@kp-bt-102(192.168.1.102:16812)..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-101(192.168.1.101:16811) to root@kp-bt-103(192.168.1.103:16813)..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-102(192.168.1.102:16812) to root@kp-bt-101(192.168.1.101:16811)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-102(192.168.1.102:16812) to root@kp-bt-103(192.168.1.103:16813)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-103(192.168.1.103:16813) to root@kp-bt-101(192.168.1.101:16811)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-103(192.168.1.103:16813) to root@kp-bt-102(192.168.1.102:16812)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [info] All SSH connection tests passed successfully.</span><br><span class="line">所有节点正常。</span><br></pre></td></tr></table></figure><h2 id="使用MHA-manager检查复制集群状态"><a href="#使用MHA-manager检查复制集群状态" class="headerlink" title="使用MHA-manager检查复制集群状态"></a><strong>使用MHA-manager检查复制集群状态</strong></h2><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><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"># masterha_check_ssh --conf=/etc/masterha/app1.cnf </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Reading application default configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Reading server configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [info] Starting SSH connection tests..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-101(192.168.1.101:16811) to root@kp-bt-102(192.168.1.102:16812)..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-101(192.168.1.101:16811) to root@kp-bt-103(192.168.1.103:16813)..</span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:23 2017 - [debug]  Connecting via SSH from root@kp-bt-102(192.168.1.102:16812) to root@kp-bt-101(192.168.1.101:16811)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-102(192.168.1.102:16812) to root@kp-bt-103(192.168.1.103:16813)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug] </span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-103(192.168.1.103:16813) to root@kp-bt-101(192.168.1.101:16811)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]  Connecting via SSH from root@kp-bt-103(192.168.1.103:16813) to root@kp-bt-102(192.168.1.102:16812)..</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [debug]   ok.</span><br><span class="line">Thu Jan 12 04:09:24 2017 - [info] All SSH connection tests passed successfully.</span><br><span class="line">[root@kp-bt-13 bin]# masterha_check_repl --conf=/etc/masterha/app1.cnf</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [info] Reading application default configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [info] Reading server configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [info] MHA::MasterMonitor version 0.57.</span><br><span class="line">Creating directory /var/log/masterha/app1.log.. done.</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln193] There is no alive slave. We can&apos;t do failover</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/share/perl5/MHA/MasterMonitor.pm line 329</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.</span><br><span class="line">Thu Jan 12 04:10:17 2017 - [info] Got exit code 1 (Not master dead).</span><br><span class="line"></span><br><span class="line">MySQL Replication Health is NOT OK!</span><br></pre></td></tr></table></figure><h2 id="检查复制状态is-NOT-OK的集中常见错误及解决办法"><a href="#检查复制状态is-NOT-OK的集中常见错误及解决办法" class="headerlink" title="检查复制状态is NOT OK的集中常见错误及解决办法"></a><strong>检查复制状态is NOT OK的集中常见错误及解决办法</strong></h2><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></pre></td><td class="code"><pre><span class="line">报错提示：</span><br><span class="line">[error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/share/perl5/MHA/MasterMonitor.pm line 329</span><br><span class="line">解决办法：</span><br><span class="line">在所有节点设置</span><br><span class="line"># ln -s /home/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog</span><br><span class="line"># ln -s /home/mysql/bin/mysql /usr/local/bin/mysql</span><br><span class="line"></span><br><span class="line">报错提示：</span><br><span class="line">mysqlbinlog: [ERROR] unknown variable &apos;default-character-set=utf8&apos;</span><br><span class="line">mysqlbinlog version command failed with rc 7:0, please verify PATH, LD_LIBRARY_PATH, and client options</span><br><span class="line"> at /usr/local/bin/apply_diff_relay_logs line 493</span><br><span class="line">产生这个问题的原因是因为我在my.cnf中的client选项组中添加了default-character-set=utf8</span><br><span class="line">解决办法：</span><br><span class="line">在所有MySQL节点上的my.cnf文件client配置段注释掉default-character-set =utf8</span><br><span class="line"># default-character-set =utf8</span><br><span class="line">无需重启MySQL服务，因为使用mysqlbinlog工具查看二进制日志时会重新读取的mysql的配置文件my.cnf，而不是服务器已经加载进内存的配置文件。</span><br><span class="line"></span><br><span class="line">报错提示：</span><br><span class="line">Execution of /usr/local/bin/master_ip_failover aborted due to compilation errors.</span><br><span class="line">Thu Jan 12 13:26:30 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln229]  Failed to get master_ip_failover_script status with return code 255:0.</span><br><span class="line">这是因为我们还没有配置master_ip_failover文件，先在配置文件中注释掉master_ip_failover_script= /usr/local/bin/master_ip_failover就可以了。</span><br><span class="line"># master_ip_failover_script= /usr/local/bin/master_ip_failover</span><br></pre></td></tr></table></figure><h2 id="再次运行masterha-check-repl脚本检查集群复制状态"><a href="#再次运行masterha-check-repl脚本检查集群复制状态" class="headerlink" title="再次运行masterha_check_repl脚本检查集群复制状态"></a><strong>再次运行masterha_check_repl脚本检查集群复制状态</strong></h2><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><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></pre></td><td class="code"><pre><span class="line"># masterha_check_repl --conf=/etc/masterha/app1.cnf</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Reading application default configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Reading server configuration from /etc/masterha/app1.cnf..</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] MHA::MasterMonitor version 0.57.</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] GTID failover mode = 0</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Dead Servers:</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Alive Servers:</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]   kp-bt-101(192.168.1.101:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]   kp-bt-102(192.168.1.102:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]   kp-bt-103(192.168.1.103:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Alive Slaves:</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]   kp-bt-102(192.168.1.102:3306)  Version=5.7.17-log (oldest major version between slaves) log-bin:enabled</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]     Replicating from 192.168.1.101(192.168.1.101:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]     Primary candidate for the new Master (candidate_master is set)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]   kp-bt-103(192.168.1.103:3306)  Version=5.7.17-log (oldest major version between slaves) log-bin:enabled</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]     Replicating from 192.168.1.101(192.168.1.101:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]     Not candidate for the new Master (no_master is set)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Current Alive Master: kp-bt-101(192.168.1.101:3306)</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Checking slave configurations..</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Checking replication filtering settings..</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]  binlog_do_db= , binlog_ignore_db= </span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info]  Replication filtering check ok.</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] GTID (with auto-pos) is not supported</span><br><span class="line">Thu Jan 12 14:29:38 2017 - [info] Starting SSH connection tests..</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] All SSH connection tests passed successfully.</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] Checking MHA Node version..</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info]  Version check ok.</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] Checking SSH publickey authentication settings on the current master..</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] HealthCheck: SSH to kp-bt-101 is reachable.</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] Master MHA Node version is 0.57.</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info] Checking recovery script configurations on kp-bt-101(192.168.1.101:3306)..</span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/home/mysql/data --output_file=/tmp/save_binary_logs_test --manager_version=0.57 --start_file=mysql-bin.000002 </span><br><span class="line">Thu Jan 12 14:29:40 2017 - [info]   Connecting to root@192.168.1.101(kp-bt-101:16811).. </span><br><span class="line">  Creating /tmp if not exists..    ok.</span><br><span class="line">  Checking output directory is accessible or not..</span><br><span class="line">   ok.</span><br><span class="line">  Binlog found at /home/mysql/data, up to mysql-bin.000002</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Binlog setting check done.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user=&apos;mha&apos; --slave_host=kp-bt-102 --slave_ip=192.168.1.102 --slave_port=3306 --workdir=/tmp --target_version=5.7.17-log --manager_version=0.57 --relay_log_info=/home/mysql/data/relay-log.info  --relay_dir=/home/mysql/data/  --slave_pass=xxx</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]   Connecting to root@192.168.1.102(kp-bt-102:16812).. </span><br><span class="line">  Checking slave recovery environment settings..</span><br><span class="line">    Opening /home/mysql/data/relay-log.info ... ok.</span><br><span class="line">    Relay log found at /home/mysql/data, up to rep_relay_log.000003</span><br><span class="line">    Temporary relay log file is /home/mysql/data/rep_relay_log.000003</span><br><span class="line">    Testing mysql connection and privileges..mysql: [Warning] Using a password on the command line interface can be insecure.</span><br><span class="line"> done.</span><br><span class="line">    Testing mysqlbinlog output.. done.</span><br><span class="line">    Cleaning up test file(s).. done.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user=&apos;mha&apos; --slave_host=kp-bt-103 --slave_ip=192.168.1.103 --slave_port=3306 --workdir=/tmp --target_version=5.7.17-log --manager_version=0.57 --relay_log_info=/home/mysql/data/relay-log.info  --relay_dir=/home/mysql/data/  --slave_pass=xxx</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]   Connecting to root@192.168.1.103(kp-bt-103:16813).. </span><br><span class="line">  Checking slave recovery environment settings..</span><br><span class="line">    Opening /home/mysql/data/relay-log.info ... ok.</span><br><span class="line">    Relay log found at /home/mysql/data, up to rep_relay_log.000003</span><br><span class="line">    Temporary relay log file is /home/mysql/data/rep_relay_log.000003</span><br><span class="line">    Testing mysql connection and privileges..mysql: [Warning] Using a password on the command line interface can be insecure.</span><br><span class="line"> done.</span><br><span class="line">    Testing mysqlbinlog output.. done.</span><br><span class="line">    Cleaning up test file(s).. done.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Slaves settings check done.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] </span><br><span class="line">kp-bt-101(192.168.1.101:3306) (current master)</span><br><span class="line"> +--kp-bt-102(192.168.1.102:3306)</span><br><span class="line"> +--kp-bt-103(192.168.1.103:3306)</span><br><span class="line"></span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Checking replication health on kp-bt-102..</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]  ok.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Checking replication health on kp-bt-103..</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info]  ok.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [warning] master_ip_failover_script is not defined.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [warning] shutdown_script is not defined.</span><br><span class="line">Thu Jan 12 14:29:41 2017 - [info] Got exit 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><h2 id="配置自动故障vip切换脚本"><a href="#配置自动故障vip切换脚本" class="headerlink" title="配置自动故障vip切换脚本"></a><strong>配置自动故障vip切换脚本</strong></h2><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><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></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env perl</span><br><span class="line">  </span><br><span class="line">use strict;</span><br><span class="line">use warnings FATAL =&gt; &apos;all&apos;;</span><br><span class="line">  </span><br><span class="line">use Getopt::Long;</span><br><span class="line">  </span><br><span class="line">my (</span><br><span class="line">    $command,          $ssh_user,        $orig_master_host, $orig_master_ip,</span><br><span class="line">    $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port</span><br><span class="line">);</span><br><span class="line">  </span><br><span class="line">my $vip = &apos;192.168.1.110/16&apos;;  # Virtual IP</span><br><span class="line">my $interface = &apos;em2&apos;;          #bind to interface</span><br><span class="line">my $key = &quot;1&quot;;</span><br><span class="line">my $ssh_start_vip = &quot;/sbin/ifconfig $interface:$key $vip&quot;;</span><br><span class="line">my $ssh_stop_vip = &quot;/sbin/ifconfig $interface:$key down&quot;;</span><br><span class="line">$ssh_user = &quot;root&quot;;</span><br><span class="line">  </span><br><span class="line">GetOptions(</span><br><span class="line">    &apos;command=s&apos;          =&gt; \$command,</span><br><span class="line">    &apos;ssh_user=s&apos;         =&gt; \$ssh_user,</span><br><span class="line">    &apos;orig_master_host=s&apos; =&gt; \$orig_master_host,</span><br><span class="line">    &apos;orig_master_ip=s&apos;   =&gt; \$orig_master_ip,</span><br><span class="line">    &apos;orig_master_port=i&apos; =&gt; \$orig_master_port,</span><br><span class="line">    &apos;new_master_host=s&apos;  =&gt; \$new_master_host,</span><br><span class="line">    &apos;new_master_ip=s&apos;    =&gt; \$new_master_ip,</span><br><span class="line">    &apos;new_master_port=i&apos;  =&gt; \$new_master_port,</span><br><span class="line">);</span><br><span class="line">  </span><br><span class="line">exit &amp;main();</span><br><span class="line">  </span><br><span class="line">sub main &#123;</span><br><span class="line">  </span><br><span class="line">    print &quot;\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n&quot;;</span><br><span class="line">  </span><br><span class="line">    if ( $command eq &quot;stop&quot; || $command eq &quot;stopssh&quot; ) &#123;</span><br><span class="line">  </span><br><span class="line">        # $orig_master_host, $orig_master_ip, $orig_master_port are passed.</span><br><span class="line">        # If you manage master ip address at global catalog database,</span><br><span class="line">        # invalidate orig_master_ip here.</span><br><span class="line">        my $exit_code = 1;</span><br><span class="line">  </span><br><span class="line">        #eval &#123;</span><br><span class="line">        #    print &quot;Disabling the VIP on old master: $orig_master_host \n&quot;;</span><br><span class="line">        #    &amp;stop_vip();</span><br><span class="line">        #    $exit_code = 0;</span><br><span class="line">        #&#125;;</span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">        eval &#123;</span><br><span class="line">                print &quot;Disabling the VIP on old master: $orig_master_host \n&quot;;</span><br><span class="line">                #my $ping=`ping -c 1 10.0.0.13 | grep &quot;packet loss&quot; | awk -F&apos;,&apos; &apos;&#123;print $3&#125;&apos; | awk &apos;&#123;print $1&#125;&apos;`;</span><br><span class="line">                #if ( $ping le &quot;90.0%&quot; &amp;&amp; $ping gt &quot;0.0%&quot; )&#123;</span><br><span class="line">                #$exit_code = 0;</span><br><span class="line">                #&#125;</span><br><span class="line">                #else &#123;</span><br><span class="line">  </span><br><span class="line">                &amp;stop_vip();</span><br><span class="line">  </span><br><span class="line">                # updating global catalog, etc</span><br><span class="line">                $exit_code = 0;</span><br><span class="line">  </span><br><span class="line">                #&#125;</span><br><span class="line">        &#125;;</span><br><span class="line">  </span><br><span class="line">  </span><br><span class="line">        if ($@) &#123;</span><br><span class="line">            warn &quot;Got Error: $@\n&quot;;</span><br><span class="line">            exit $exit_code;</span><br><span class="line">        &#125;</span><br><span class="line">        exit $exit_code;</span><br><span class="line">    &#125;</span><br><span class="line">    elsif ( $command eq &quot;start&quot; ) &#123;</span><br><span class="line">  </span><br><span class="line">        # all arguments are passed.</span><br><span class="line">        # If you manage master ip address at global catalog database,</span><br><span class="line">        # activate new_master_ip here.</span><br><span class="line">        # You can also grant write access (create user, set read_only=0, etc) here.</span><br><span class="line">        my $exit_code = 10;</span><br><span class="line">        eval &#123;</span><br><span class="line">            print &quot;Enabling the VIP - $vip on the new master - $new_master_host \n&quot;;</span><br><span class="line">            &amp;start_vip();</span><br><span class="line">            $exit_code = 0;</span><br><span class="line">        &#125;;</span><br><span class="line">        if ($@) &#123;</span><br><span class="line">            warn $@;</span><br><span class="line">            exit $exit_code;</span><br><span class="line">        &#125;</span><br><span class="line">        exit $exit_code;</span><br><span class="line">    &#125;</span><br><span class="line">    elsif ( $command eq &quot;status&quot; ) &#123;</span><br><span class="line">        print &quot;Checking the Status of the script.. OK \n&quot;;</span><br><span class="line">        `ssh $ssh_user\@$orig_master_ip \&quot; $ssh_start_vip \&quot;`;</span><br><span class="line">        exit 0;</span><br><span class="line">    &#125;</span><br><span class="line">    else &#123;</span><br><span class="line">        &amp;usage();</span><br><span class="line">        exit 1;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"># A simple system call that enable the VIP on the new master</span><br><span class="line">sub start_vip() &#123;</span><br><span class="line">    `ssh $ssh_user\@$new_master_host \&quot; $ssh_start_vip \&quot;`;</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line"># A simple system call that disable the VIP on the old_master</span><br><span class="line">sub stop_vip() &#123;</span><br><span class="line">    `ssh $ssh_user\@$orig_master_host \&quot; $ssh_stop_vip \&quot;`;</span><br><span class="line">&#125;</span><br><span class="line">  </span><br><span class="line">sub usage &#123;</span><br><span class="line">    print</span><br><span class="line">    &quot;Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n&quot;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="配置手动故障vip切换脚本"><a href="#配置手动故障vip切换脚本" class="headerlink" title="配置手动故障vip切换脚本"></a><strong>配置手动故障vip切换脚本</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env perl</span><br><span class="line">#  Copyright (C) 2011 DeNA Co.,Ltd.</span><br><span class="line">#</span><br><span class="line">#  This program is free software; you can redistribute it and/or modify</span><br><span class="line">#  it under the terms of the GNU General Public License as published by</span><br><span class="line">#  the Free Software Foundation; either version 2 of the License, or</span><br><span class="line">#  (at your option) any later version.</span><br><span class="line">#</span><br><span class="line">#  This program is distributed in the hope that it will be useful,</span><br><span class="line">#  but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span class="line">#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span class="line">#  GNU General Public License for more details.</span><br><span class="line">#</span><br><span class="line">#  You should have received a copy of the GNU General Public License</span><br><span class="line">#   along with this program; if not, write to the Free Software</span><br><span class="line">#  Foundation, Inc.,</span><br><span class="line">#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA</span><br><span class="line">## Note: This is a sample script and is not complete. Modify the script based on your environment.</span><br><span class="line">use strict;</span><br><span class="line">use warnings FATAL =&gt; &apos;all&apos;;</span><br><span class="line">use Getopt::Long;</span><br><span class="line">use MHA::DBHelper;</span><br><span class="line">use MHA::NodeUtil;</span><br><span class="line">use Time::HiRes qw( sleep gettimeofday tv_interval );</span><br><span class="line">use Data::Dumper;</span><br><span class="line">my $_tstart;</span><br><span class="line">my $_running_interval = 0.1;</span><br><span class="line">my (</span><br><span class="line">  $command,          $orig_master_host, $orig_master_ip,</span><br><span class="line">  $orig_master_port, $orig_master_user, $orig_master_ssh_user,</span><br><span class="line">  $new_master_host,  $new_master_ip,    $new_master_port,</span><br><span class="line">  $new_master_user,  $new_master_ssh_user, $orig_master_is_new_slave,</span><br><span class="line">  $orig_master_password, $new_master_password,</span><br><span class="line">);</span><br><span class="line">my $vip = &apos;192.168.1.110&apos;;      ###Virtual IP</span><br><span class="line">my $interface = &apos;em2&apos;;         ###interface</span><br><span class="line">my $key = &quot;1&quot;;</span><br><span class="line">my $ssh_start_vip = &quot;/sbin/ifconfig $interface:$key $vip/16&quot;;</span><br><span class="line">my $flush_arp = &quot;/sbin/arping -I $interface -c 2 -s $vip&quot;;</span><br><span class="line">my $ssh_stop_vip = &quot;/sbin/ifconfig $interface:$key down&quot;;</span><br><span class="line">my $ssh_user = &quot;root&quot;;</span><br><span class="line">GetOptions(</span><br><span class="line">  &apos;command=s&apos;              =&gt; \$command,</span><br><span class="line">  &apos;ssh_user=s&apos;             =&gt; \$ssh_user,</span><br><span class="line">  &apos;orig_master_host=s&apos;     =&gt; \$orig_master_host,</span><br><span class="line">  &apos;orig_master_ip=s&apos;       =&gt; \$orig_master_ip,</span><br><span class="line">  &apos;orig_master_port=i&apos;     =&gt; \$orig_master_port,</span><br><span class="line">  &apos;orig_master_user=s&apos;     =&gt; \$orig_master_user,</span><br><span class="line">  &apos;orig_master_password=s&apos; =&gt; \$orig_master_password,</span><br><span class="line">  &apos;new_master_host=s&apos;      =&gt; \$new_master_host,</span><br><span class="line">  &apos;new_master_ip=s&apos;        =&gt; \$new_master_ip,</span><br><span class="line">  &apos;new_master_port=i&apos;      =&gt; \$new_master_port,</span><br><span class="line">  &apos;new_master_user=s&apos;      =&gt; \$new_master_user,</span><br><span class="line">  &apos;new_master_password=s&apos;  =&gt; \$new_master_password,</span><br><span class="line">  &apos;orig_master_ssh_user=s&apos;   =&gt; \$orig_master_ssh_user,</span><br><span class="line">  &apos;new_master_ssh_user=s&apos;    =&gt; \$new_master_ssh_user,</span><br><span class="line">  &apos;orig_master_is_new_slave&apos; =&gt; \$orig_master_is_new_slave,</span><br><span class="line">);</span><br><span class="line">exit &amp;main();</span><br><span class="line">sub current_time_us &#123;</span><br><span class="line">  my ( $sec, $microsec ) = gettimeofday();</span><br><span class="line">  my $curdate = localtime($sec);</span><br><span class="line">  return $curdate . &quot; &quot; . sprintf( &quot;%06d&quot;, $microsec );</span><br><span class="line">&#125;</span><br><span class="line">sub sleep_until &#123;</span><br><span class="line">  my $elapsed = tv_interval($_tstart);</span><br><span class="line">  if ( $_running_interval &gt; $elapsed ) &#123;</span><br><span class="line">    sleep( $_running_interval - $elapsed );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">sub get_threads_util &#123;</span><br><span class="line">  my $dbh                    = shift;</span><br><span class="line">  my $my_connection_id       = shift;</span><br><span class="line">  my $running_time_threshold = shift;</span><br><span class="line">  my $type                   = shift;</span><br><span class="line">  $running_time_threshold = 0 unless ($running_time_threshold);</span><br><span class="line">  $type                   = 0 unless ($type);</span><br><span class="line">  my @threads;</span><br><span class="line">  my $sth = $dbh-&gt;prepare(&quot;SHOW PROCESSLIST&quot;);</span><br><span class="line">  $sth-&gt;execute();</span><br><span class="line">  while ( my $ref = $sth-&gt;fetchrow_hashref() ) &#123;</span><br><span class="line">    my $id         = $ref-&gt;&#123;Id&#125;;</span><br><span class="line">    my $user       = $ref-&gt;&#123;User&#125;;</span><br><span class="line">    my $host       = $ref-&gt;&#123;Host&#125;;</span><br><span class="line">    my $command    = $ref-&gt;&#123;Command&#125;;</span><br><span class="line">    my $state      = $ref-&gt;&#123;State&#125;;</span><br><span class="line">    my $query_time = $ref-&gt;&#123;Time&#125;;</span><br><span class="line">    my $info       = $ref-&gt;&#123;Info&#125;;</span><br><span class="line">    $info =~ s/^\s*(.*?)\s*$/$1/ if defined($info);</span><br><span class="line">    next if ( $my_connection_id == $id );</span><br><span class="line">    next if ( defined($query_time) &amp;&amp; $query_time &lt; $running_time_threshold );</span><br><span class="line">    next if ( defined($command)    &amp;&amp; $command eq &quot;Binlog Dump&quot; );</span><br><span class="line">    next if ( defined($user)       &amp;&amp; $user eq &quot;system user&quot; );</span><br><span class="line">    next</span><br><span class="line">      if ( defined($command)</span><br><span class="line">      &amp;&amp; $command eq &quot;Sleep&quot;</span><br><span class="line">      &amp;&amp; defined($query_time)</span><br><span class="line">      &amp;&amp; $query_time &gt;= 1 );</span><br><span class="line">    if ( $type &gt;= 1 ) &#123;</span><br><span class="line">      next if ( defined($command) &amp;&amp; $command eq &quot;Sleep&quot; );</span><br><span class="line">      next if ( defined($command) &amp;&amp; $command eq &quot;Connect&quot; );</span><br><span class="line">    &#125;</span><br><span class="line">    if ( $type &gt;= 2 ) &#123;</span><br><span class="line">      next if ( defined($info) &amp;&amp; $info =~ m/^select/i );</span><br><span class="line">      next if ( defined($info) &amp;&amp; $info =~ m/^show/i );</span><br><span class="line">    &#125;</span><br><span class="line">    push @threads, $ref;</span><br><span class="line">  &#125;</span><br><span class="line">  return @threads;</span><br><span class="line">&#125;</span><br><span class="line">sub main &#123;</span><br><span class="line">  if ( $command eq &quot;stop&quot; ) &#123;</span><br><span class="line">    ## Gracefully killing connections on the current master</span><br><span class="line">    # 1. Set read_only= 1 on the new master</span><br><span class="line">    # 2. DROP USER so that no app user can establish new connections</span><br><span class="line">    # 3. Set read_only= 1 on the current master</span><br><span class="line">    # 4. Kill current queries</span><br><span class="line">    # * Any database access failure will result in script die.</span><br><span class="line">    my $exit_code = 1;</span><br><span class="line">    eval &#123;</span><br><span class="line">      ## Setting read_only=1 on the new master (to avoid accident)</span><br><span class="line">      my $new_master_handler = new MHA::DBHelper();</span><br><span class="line">      # args: hostname, port, user, password, raise_error(die_on_error)_or_not</span><br><span class="line">      $new_master_handler-&gt;connect( $new_master_ip, $new_master_port,</span><br><span class="line">        $new_master_user, $new_master_password, 1 );</span><br><span class="line">      print current_time_us() . &quot; Set read_only on the new master.. &quot;;</span><br><span class="line">      $new_master_handler-&gt;enable_read_only();</span><br><span class="line">      if ( $new_master_handler-&gt;is_read_only() ) &#123;</span><br><span class="line">        print &quot;ok.\n&quot;;</span><br><span class="line">      &#125;</span><br><span class="line">      else &#123;</span><br><span class="line">        die &quot;Failed!\n&quot;;</span><br><span class="line">      &#125;</span><br><span class="line">      $new_master_handler-&gt;disconnect();</span><br><span class="line">      # Connecting to the orig master, die if any database error happens</span><br><span class="line">      my $orig_master_handler = new MHA::DBHelper();</span><br><span class="line">      $orig_master_handler-&gt;connect( $orig_master_ip, $orig_master_port,</span><br><span class="line">        $orig_master_user, $orig_master_password, 1 );</span><br><span class="line">      ## Drop application user so that nobody can connect. Disabling per-session binlog beforehand</span><br><span class="line">      #$orig_master_handler-&gt;disable_log_bin_local();</span><br><span class="line">      #print current_time_us() . &quot; Drpping app user on the orig master..\n&quot;;</span><br><span class="line">      #FIXME_xxx_drop_app_user($orig_master_handler);</span><br><span class="line">      ## Waiting for N * 100 milliseconds so that current connections can exit</span><br><span class="line">      my $time_until_read_only = 15;</span><br><span class="line">      $_tstart = [gettimeofday];</span><br><span class="line">      my @threads = get_threads_util( $orig_master_handler-&gt;&#123;dbh&#125;,</span><br><span class="line">        $orig_master_handler-&gt;&#123;connection_id&#125; );</span><br><span class="line">      while ( $time_until_read_only &gt; 0 &amp;&amp; $#threads &gt;= 0 ) &#123;</span><br><span class="line">        if ( $time_until_read_only % 5 == 0 ) &#123;</span><br><span class="line">          printf</span><br><span class="line">&quot;%s Waiting all running %d threads are disconnected.. (max %d milliseconds)\n&quot;,</span><br><span class="line">            current_time_us(), $#threads + 1, $time_until_read_only * 100;</span><br><span class="line">          if ( $#threads &lt; 5 ) &#123;</span><br><span class="line">            print Data::Dumper-&gt;new( [$_] )-&gt;Indent(0)-&gt;Terse(1)-&gt;Dump . &quot;\n&quot;</span><br><span class="line">              foreach (@threads);</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        sleep_until();</span><br><span class="line">        $_tstart = [gettimeofday];</span><br><span class="line">        $time_until_read_only--;</span><br><span class="line">        @threads = get_threads_util( $orig_master_handler-&gt;&#123;dbh&#125;,</span><br><span class="line">          $orig_master_handler-&gt;&#123;connection_id&#125; );</span><br><span class="line">      &#125;</span><br><span class="line">      ## Setting read_only=1 on the current master so that nobody(except SUPER) can write</span><br><span class="line">      print current_time_us() . &quot; Set read_only=1 on the orig master.. &quot;;</span><br><span class="line">      $orig_master_handler-&gt;enable_read_only();</span><br><span class="line">      if ( $orig_master_handler-&gt;is_read_only() ) &#123;</span><br><span class="line">        print &quot;ok.\n&quot;;</span><br><span class="line">      &#125;</span><br><span class="line">      else &#123;</span><br><span class="line">        die &quot;Failed!\n&quot;;</span><br><span class="line">      &#125;</span><br><span class="line">      ## Waiting for M * 100 milliseconds so that current update queries can complete</span><br><span class="line">      my $time_until_kill_threads = 5;</span><br><span class="line">      @threads = get_threads_util( $orig_master_handler-&gt;&#123;dbh&#125;,</span><br><span class="line">        $orig_master_handler-&gt;&#123;connection_id&#125; );</span><br><span class="line">      while ( $time_until_kill_threads &gt; 0 &amp;&amp; $#threads &gt;= 0 ) &#123;</span><br><span class="line">        if ( $time_until_kill_threads % 5 == 0 ) &#123;</span><br><span class="line">          printf</span><br><span class="line">&quot;%s Waiting all running %d queries are disconnected.. (max %d milliseconds)\n&quot;,</span><br><span class="line">            current_time_us(), $#threads + 1, $time_until_kill_threads * 100;</span><br><span class="line">          if ( $#threads &lt; 5 ) &#123;</span><br><span class="line">            print Data::Dumper-&gt;new( [$_] )-&gt;Indent(0)-&gt;Terse(1)-&gt;Dump . &quot;\n&quot;</span><br><span class="line">              foreach (@threads);</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        sleep_until();</span><br><span class="line">        $_tstart = [gettimeofday];</span><br><span class="line">        $time_until_kill_threads--;</span><br><span class="line">        @threads = get_threads_util( $orig_master_handler-&gt;&#123;dbh&#125;,</span><br><span class="line">          $orig_master_handler-&gt;&#123;connection_id&#125; );</span><br><span class="line">                &amp;stop_vip();</span><br><span class="line">      ## Terminating all threads</span><br><span class="line">      print current_time_us() . &quot; Killing all application threads..\n&quot;;</span><br><span class="line">      $orig_master_handler-&gt;kill_threads(@threads) if ( $#threads &gt;= 0 );</span><br><span class="line">      print current_time_us() . &quot; done.\n&quot;;</span><br><span class="line">      #$orig_master_handler-&gt;enable_log_bin_local();</span><br><span class="line">      $orig_master_handler-&gt;disconnect();</span><br><span class="line">      ## After finishing the script, MHA executes FLUSH TABLES WITH READ LOCK</span><br><span class="line">      $exit_code = 0;</span><br><span class="line">    &#125;;</span><br><span class="line">    if ($@) &#123;</span><br><span class="line">      warn &quot;Got Error: $@\n&quot;;</span><br><span class="line">      exit $exit_code;</span><br><span class="line">    &#125;</span><br><span class="line">    exit $exit_code;</span><br><span class="line">  &#125;</span><br><span class="line">  elsif ( $command eq &quot;start&quot; ) &#123;</span><br><span class="line">    ## Activating master ip on the new master</span><br><span class="line">    # 1. Create app user with write privileges</span><br><span class="line">    # 2. Moving backup script if needed</span><br><span class="line">    # 3. Register new master&apos;s ip to the catalog database</span><br><span class="line"># If exit code is 0 or 10, MHA does not abort</span><br><span class="line">    my $exit_code = 10;</span><br><span class="line">    eval &#123;</span><br><span class="line">      my $new_master_handler = new MHA::DBHelper();</span><br><span class="line">      # args: hostname, port, user, password, raise_error_or_not</span><br><span class="line">      $new_master_handler-&gt;connect( $new_master_ip, $new_master_port,</span><br><span class="line">        $new_master_user, $new_master_password, 1 );</span><br><span class="line">      ## Set read_only=0 on the new master</span><br><span class="line">      #$new_master_handler-&gt;disable_log_bin_local();</span><br><span class="line">      print current_time_us() . &quot; Set read_only=0 on the new master.\n&quot;;</span><br><span class="line">      $new_master_handler-&gt;disable_read_only();</span><br><span class="line">      ## Creating an app user on the new master</span><br><span class="line">      #print current_time_us() . &quot; Creating app user on the new master..\n&quot;;</span><br><span class="line">      #FIXME_xxx_create_app_user($new_master_handler);</span><br><span class="line">      #$new_master_handler-&gt;enable_log_bin_local();</span><br><span class="line">      $new_master_handler-&gt;disconnect();</span><br><span class="line">      ## Update master ip on the catalog database, etc</span><br><span class="line">                print &quot;Enabling the VIP - $vip on the new master - $new_master_host \n&quot;;</span><br><span class="line">                &amp;start_vip();</span><br><span class="line">                &amp;flush_arp();</span><br><span class="line">                $exit_code = 0;</span><br><span class="line">    &#125;;</span><br><span class="line">    if ($@) &#123;</span><br><span class="line">      warn &quot;Got Error: $@\n&quot;;</span><br><span class="line">      exit $exit_code;</span><br><span class="line">    &#125;</span><br><span class="line">    exit $exit_code;</span><br><span class="line">  &#125;</span><br><span class="line">    exit 0;</span><br><span class="line">  &#125;</span><br><span class="line">  else &#123;</span><br><span class="line">    &amp;usage();</span><br><span class="line">    exit 1;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"># A simple system call that enable the VIP on the new master</span><br><span class="line">sub start_vip() &#123;</span><br><span class="line">    `ssh $ssh_user\@$new_master_host \&quot; $ssh_start_vip \&quot;`;</span><br><span class="line">&#125;</span><br><span class="line"># A simple system call that disable the VIP on the old_master</span><br><span class="line">sub stop_vip() &#123;</span><br><span class="line">    `ssh $ssh_user\@$orig_master_host \&quot; $ssh_stop_vip \&quot;`;</span><br><span class="line">&#125;</span><br><span class="line">#flush arp</span><br><span class="line">sub flush_arp() &#123;</span><br><span class="line">    `ssh $ssh_user\@$new_master_host \&quot; $flush_arp \&quot;`;</span><br><span class="line">&#125;</span><br><span class="line">sub usage &#123;</span><br><span class="line">  print</span><br><span class="line">&quot;Usage: master_ip_online_change --command=start|stop|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n&quot;;</span><br><span class="line">  die;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>检查集群状态</strong></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"># masterha_check_repl --conf=/etc/masterha/app1.cnf</span><br><span class="line"># masterha_check_ssh --conf=/etc/masterha/app1.cnf</span><br></pre></td></tr></table></figure><h2 id="启动和关闭MHA-manager"><a href="#启动和关闭MHA-manager" class="headerlink" title="启动和关闭MHA-manager"></a><strong>启动和关闭MHA-manager</strong></h2><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"># nohup masterha_manager --conf=/etc/masterha/app1.cnf &gt; /etc/masterha//mha_manager.log &lt; /dev/null 2&gt;&amp;1 &amp;</span><br><span class="line"></span><br><span class="line">关闭</span><br><span class="line">masterha_stop --conf=/etc/masterha/app1.cnf</span><br></pre></td></tr></table></figure><h2 id="检查MHA-manager状态"><a href="#检查MHA-manager状态" class="headerlink" title="检查MHA-manager状态"></a><strong>检查MHA-manager状态</strong></h2><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"># masterha_check_status --conf=/etc/masterha/app1.cnf</span><br><span class="line">app1 (pid:50523) is running(0:PING_OK), master:kp-bt-101</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-准备工作&quot;&gt;&lt;a href=&quot;#1-准备工作&quot; class=&quot;headerlink&quot; title=&quot;1. 准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;软件包版本&quot;&gt;&lt;a href=&quot;#软件包版本&quot; class=&quot;headerlink&quot; title=&quot;软件包版本&quot;&gt;&lt;/a&gt;&lt;strong&gt;软件包版本&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;mysql-5.7.17.tar.gz&lt;br&gt;cmake-3.6.2.tar.gz&lt;br&gt;mha4mysql-manager-0.57.tar.gz&lt;br&gt;mha4mysql-node-0.57.tar.gz&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;服务器明细&quot;&gt;&lt;a href=&quot;#服务器明细&quot; class=&quot;headerlink&quot; title=&quot;服务器明细&quot;&gt;&lt;/a&gt;&lt;strong&gt;服务器明细&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;kp-bt-101 Master&lt;br&gt;kp-bt-102   Candidate Master&lt;br&gt;kp-bt-103   Slave&lt;br&gt;kp-bt-13    MHA-manager&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;2-安装MySQL服务&quot;&gt;&lt;a href=&quot;#2-安装MySQL服务&quot; class=&quot;headerlink&quot; title=&quot;2. 安装MySQL服务&quot;&gt;&lt;/a&gt;&lt;strong&gt;2. 安装MySQL服务&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;解决依赖关系&quot;&gt;&lt;a href=&quot;#解决依赖关系&quot; class=&quot;headerlink&quot; title=&quot;解决依赖关系&quot;&gt;&lt;/a&gt;&lt;strong&gt;解决依赖关系&lt;/strong&gt;&lt;/h2&gt;&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# yum install -y gcc-c++ ncurses-devel openssh-clients&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="MySQL" scheme="https://www.lucissfer.com/categories/Linux/MySQL/"/>
    
    
      <category term="MySQL" scheme="https://www.lucissfer.com/tags/MySQL/"/>
    
      <category term="MHA" scheme="https://www.lucissfer.com/tags/MHA/"/>
    
  </entry>
  
  <entry>
    <title>Tomcat安装配置</title>
    <link href="https://www.lucissfer.com/2017/01/10/Tomcat+%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.lucissfer.com/2017/01/10/Tomcat+安装配置/</id>
    <published>2017-01-09T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.159Z</updated>
    
    <content type="html"><![CDATA[<p><strong>安装JDK</strong></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"># rpm -ivh jdk-8u111-linux-x64.rpm</span><br></pre></td></tr></table></figure><p><strong>配置JAVA环境变量</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></pre></td><td class="code"><pre><span class="line"># vim /etc/profile.d/java.sh</span><br><span class="line">export JAVA_HOME=/usr/java/latest</span><br><span class="line">export PATH=$JAVA_HOME/bin:$PATH</span><br></pre></td></tr></table></figure><p><strong>导出环境变量</strong></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"># source /etc/profile.d/java.sh</span><br></pre></td></tr></table></figure><p><strong>查看JAVA版本</strong></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"># java -version</span><br></pre></td></tr></table></figure><p><strong>解压tomcat到指定目录</strong></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"># tar zxf apache-tomcat-8.0.39.tar.gz -C /usr/local/</span><br><span class="line"># ln -s /usr/local/apache-tomcat-8.0.39/ /usr/local/tomcat</span><br></pre></td></tr></table></figure><p><strong>配置tomcat环境变量</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></pre></td><td class="code"><pre><span class="line"># vim /etc/profile.d/tomcat.sh</span><br><span class="line">export CATALINA_HOME=/usr/local/tomcat</span><br><span class="line">export PATH=$CATALINA_HOME/bin:$PATH</span><br></pre></td></tr></table></figure><a id="more"></a><p><strong>导出tomcat环境变量</strong></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"># source /etc/profile.d/tomcat.sh</span><br></pre></td></tr></table></figure><p><strong>查看tomcat版本</strong></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"># catalina.sh version</span><br></pre></td></tr></table></figure><p><strong>启动tomcat</strong></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"># catalina.sh start</span><br></pre></td></tr></table></figure><p><strong>隐藏tomcat版本信息</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><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">在线上生产环境中，为了防止tomcat版本信息暴露导致的恶意攻击，我们需要将tomcat版本隐藏</span><br><span class="line"># cd $CATALINA_HOME/lib/</span><br><span class="line"># unzip catalina.jar</span><br><span class="line"># vim org/apache/catalina/util/ServerInfo.properties</span><br><span class="line">server.info=Apache Tomcat/X</span><br><span class="line">server.number=X</span><br><span class="line"></span><br><span class="line"># jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties</span><br><span class="line"># catalina.sh stop</span><br><span class="line"># catalina.sh start</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;安装JDK&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# rpm -ivh jdk-8u111-linux-x64.rpm&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;配置JAVA环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# vim /etc/profile.d/java.sh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export JAVA_HOME=/usr/java/latest&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export PATH=$JAVA_HOME/bin:$PATH&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;导出环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# source /etc/profile.d/java.sh&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;查看JAVA版本&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# java -version&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;解压tomcat到指定目录&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# tar zxf apache-tomcat-8.0.39.tar.gz -C /usr/local/&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# ln -s /usr/local/apache-tomcat-8.0.39/ /usr/local/tomcat&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;配置tomcat环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# vim /etc/profile.d/tomcat.sh&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export CATALINA_HOME=/usr/local/tomcat&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;export PATH=$CATALINA_HOME/bin:$PATH&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Tomcat" scheme="https://www.lucissfer.com/categories/Linux/Tomcat/"/>
    
    
      <category term="tomcat" scheme="https://www.lucissfer.com/tags/tomcat/"/>
    
      <category term="安装配置" scheme="https://www.lucissfer.com/tags/%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/"/>
    
  </entry>
  
  <entry>
    <title>编译安装配置zabbix 3.0监控平台</title>
    <link href="https://www.lucissfer.com/2016/12/20/zabbix3.0+install/"/>
    <id>https://www.lucissfer.com/2016/12/20/zabbix3.0+install/</id>
    <published>2016-12-19T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.161Z</updated>
    
    <content type="html"><![CDATA[<h1 id="1-前言"><a href="#1-前言" class="headerlink" title="1. 前言"></a><strong>1. 前言</strong></h1><blockquote><p>zabbix是一个基于WEB页面提供分布式系统监视以及网络监视功能的企业级开源解决方案。基于C/S架构，支持多种采集方式和采集客户端，有专用的Agent，也支持SNMP、IPMI、JMX、Telnet、SSH等多种协议，它可以运行在Linux，Solaris，HP-UX，AIX，Free BSD，Open BSD，OS X等平台上，它将采集到的数据存放到数据库，然后对其进行分析整理，达到条件触发告警。<br>对于运维工作来说，zabbix是一个不可或缺的企业监控工具，在日常业务环境中可以选择直接通过yum方式安装或者编译源码安装，因为本人喜欢将zabbix安装到自定义位置，故选择编译安装。</p></blockquote><h1 id="2-部署前准备工作"><a href="#2-部署前准备工作" class="headerlink" title="2. 部署前准备工作"></a><strong>2. 部署前准备工作</strong></h1><h2 id="2-1-部署规划"><a href="#2-1-部署规划" class="headerlink" title="2.1 部署规划"></a><strong>2.1 部署规划</strong></h2><blockquote><p>zabbix目前提供了三个版本的源码包供下载安装，分别是：Zabbix 2.2 LTS、Zabbix 3.0 LTS、Zabbix 3.2。<br>Zabbix2.2与3.0均为LTS即Long Term Support（长期支持）版本，Zabbix LTS版本可以为客户提供5年的技术支持，包括3年的全服务支持（一般，严重和安全的问题的解决）和后2年的限制性支持（只包括严重和安全问题的解决）。LTS版本发布会改变版本号第一个数字，比如X版本，X+1版本。<br>而3.2属于标准版本，标准版本会为客户提供6个月的全支持（一般，严重和安全的问题的解决）直到下一个稳定版本发布，还会提供附加一个月的限制性支持（只包括严重和安全问题的解决）。标准版本会改变版本号的第二个数字，比如：X.4、X.6版本。<br><strong>基于业务稳定性考虑，采用LTS版本更为稳妥，</strong>同时3.0 LTS相对于2.2 LTS在WEB界面与中文支持以及其他一些重要功能上做了很大的提升，因此我们选择3.0 LTS版本。<br>zabbix的web管理界面需要php+MySQL环境支持，在此我们选择LNMP环境。<br>zabbix的web页面安装路径：/home/zabbix<br>zabbix服务安装路径：/usr/local/zabbix<br>MySQL安装路径：/home/mysql</p></blockquote><a id="more"></a><h2 id="2-2-下载软件包"><a href="#2-2-下载软件包" class="headerlink" title="2.2 下载软件包"></a><strong>2.2 下载软件包</strong></h2><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></pre></td><td class="code"><pre><span class="line"># wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.0.8/zabbix-3.0.8.tar.gz</span><br><span class="line"># ls</span><br><span class="line">zabbix-3.0.8.tar.gz</span><br></pre></td></tr></table></figure><h2 id="2-3-创建相关安装目录"><a href="#2-3-创建相关安装目录" class="headerlink" title="2.3 创建相关安装目录"></a><strong>2.3 创建相关安装目录</strong></h2><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></pre></td><td class="code"><pre><span class="line"># mkdir -pv /home/&#123;zabbix,mysql&#125;</span><br><span class="line">mkdir: created directory `/home/zabbix&apos;</span><br><span class="line">mkdir: created directory `/home/mysql&apos;</span><br><span class="line"># tree /home/</span><br><span class="line">/home/</span><br><span class="line">├── mysql</span><br><span class="line">│   └── data</span><br><span class="line">├── soft</span><br><span class="line">│   └── zabbix-3.0.8.tar.gz</span><br><span class="line">└── zabbix</span><br><span class="line"></span><br><span class="line"># mkdir /usr/local/zabbix/log</span><br></pre></td></tr></table></figure><h1 id="3-安装配置LNMP环境"><a href="#3-安装配置LNMP环境" class="headerlink" title="3. 安装配置LNMP环境"></a><strong>3. 安装配置LNMP环境</strong></h1><blockquote><p>因为zabbix的web管理需要php环境支持，所以先配置LNMP环境，配置过程参考前文，此处不再赘述。</p></blockquote><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">php编译参数</span><br><span class="line"># ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-ftp --enable-zip --with-bz2 --with-jpeg-dir --with-png-dir --with-freetype-dir --with-libxml-dir --with-xmlrpc --with-zlib-dir --with-gd --enable-gd-native-ttf --with-curl --enable-mbstring --enable-bcmath --enable-sockets --enable-exif --enable-fpm --with-mcrypt --with-mhash --with-gmp --enable-inline-optimization --with-openssl --with-pcre-dir --enable-soap --with-gettext</span><br><span class="line"></span><br><span class="line">如果不加--with-gettext参数，zabbix将无法切换语言。</span><br></pre></td></tr></table></figure><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">MySQL编译参数</span><br><span class="line"># cmake -DCMAKE_INSTALL_PREFIX=/home/mysql  -DMYSQL_UNIX_ADDR=/tmp/mysql.sock  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DWITH_MYISAM_STORAGE_ENGINE=1  -DWITH_INNOBASE_STORAGE_ENGINE=1  -DWITH_MEMORY_STORAGE_ENGINE=1  -DWITH_READLINE=1  -DENABLED_LOCAL_INFILE=1  -DMYSQL_DATADIR=/home/mysql/data  -DMYSQL_USER=mysql  -DMYSQL_TCP_PORT=3406 -DWITH_BOOST=/usr/local/boost</span><br></pre></td></tr></table></figure><p><strong>程序包如下：</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><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"># tree</span><br><span class="line">.</span><br><span class="line">├── mysql-5.7.15.tar.gz</span><br><span class="line">├── openresty</span><br><span class="line">│   ├── drizzle7-2011.07.21.tar.gz</span><br><span class="line">│   ├── openresty-1.11.2.1.tar.gz</span><br><span class="line">│   ├── openssl-1.0.2j.tar.gz</span><br><span class="line">│   ├── pcre-8.38.tar.gz</span><br><span class="line">│   └── zlib-1.2.8.tar.gz</span><br><span class="line">└── zabbix-3.0.8.tar.gz</span><br></pre></td></tr></table></figure><h1 id="4-编译安装zabbix"><a href="#4-编译安装zabbix" class="headerlink" title="4. 编译安装zabbix"></a><strong>4. 编译安装zabbix</strong></h1><h2 id="4-1-创建zabbix服务用户"><a href="#4-1-创建zabbix服务用户" class="headerlink" title="4.1 创建zabbix服务用户"></a><strong>4.1 创建zabbix服务用户</strong></h2><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"># groupadd zabbix</span><br><span class="line"># useradd zabbix -g zabbix -s /sbin/nologin</span><br></pre></td></tr></table></figure><h2 id="4-2-安装依赖包"><a href="#4-2-安装依赖包" class="headerlink" title="4.2 安装依赖包"></a><strong>4.2 安装依赖包</strong></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"># yum install -y net-snmp-devel curl-devel unixODBC-devel OpenIPMI-devel java-devel libssh2-devel openldap-devel</span><br></pre></td></tr></table></figure><h2 id="4-3-编译前配置"><a href="#4-3-编译前配置" class="headerlink" title="4.3 编译前配置"></a><strong>4.3 编译前配置</strong></h2><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></pre></td><td class="code"><pre><span class="line"># pwd</span><br><span class="line">/home/soft/zabbix-3.0.8</span><br><span class="line"># ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-ipv6 --with-mysql --with-net-snmp --with-libcurl -with-openipmi --with-unixodbc --with-ldap --with-ssh2 --with-iconv --enable-java</span><br></pre></td></tr></table></figure><h2 id="4-4-编译安装zabbix"><a href="#4-4-编译安装zabbix" class="headerlink" title="4.4 编译安装zabbix"></a><strong>4.4 编译安装zabbix</strong></h2><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"># make &amp;&amp; make install</span><br><span class="line"># chown -R zabbix.zabbix /usr/local/zabbix/</span><br></pre></td></tr></table></figure><h2 id="4-5-为zabbix提供启动脚本"><a href="#4-5-为zabbix提供启动脚本" class="headerlink" title="4.5 为zabbix提供启动脚本"></a><strong>4.5 为zabbix提供启动脚本</strong></h2><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></pre></td><td class="code"><pre><span class="line"># cp misc/init.d/fedora/core/zabbix_* /etc/init.d/</span><br><span class="line"># chmod +x /etc/init.d/zabbix_*</span><br><span class="line"># sed -i &apos;s@BASEDIR=/usr/local@BASEDIR=/usr/local/zabbix@g&apos; /etc/init.d/zabbix_agentd</span><br><span class="line"># sed -i &apos;s@BASEDIR=/usr/local@BASEDIR=/usr/local/zabbix@g&apos; /etc/init.d/zabbix_server</span><br><span class="line"># chkconfig zabbix_server on</span><br><span class="line"># chkconfig zabbix_agentd on</span><br></pre></td></tr></table></figure><h2 id="4-6-创建zabbix数据库并导入数据"><a href="#4-6-创建zabbix数据库并导入数据" class="headerlink" title="4.6 创建zabbix数据库并导入数据"></a><strong>4.6 创建zabbix数据库并导入数据</strong></h2><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></pre></td><td class="code"><pre><span class="line">mysql&gt; create database zabbix character set utf8;</span><br><span class="line">Query OK, 1 row affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; grant all privileges on zabbix.* to zabbix@localhost identified by &apos;zabbix&apos;;</span><br><span class="line">Query OK, 0 rows affected, 2 warnings (0.01 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; flush privileges;</span><br><span class="line"></span><br><span class="line"># mysql -uzabbix -pzabbix zabbix</span><br><span class="line">测试新建数据库访问正常。</span><br><span class="line"></span><br><span class="line"># mysql -uzabbix -pzabbix zabbix &lt; ./database/mysql/schema.sql</span><br><span class="line"># mysql -uzabbix -pzabbix zabbix &lt; ./database/mysql/images.sql </span><br><span class="line"># mysql -uzabbix -pzabbix zabbix &lt; ./database/mysql/data.sql</span><br></pre></td></tr></table></figure><h2 id="4-7-修改zabbix配置文件"><a href="#4-7-修改zabbix配置文件" class="headerlink" title="4.7 修改zabbix配置文件"></a><strong>4.7 修改zabbix配置文件</strong></h2><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><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"># </span><br><span class="line"># vim /usr/local/zabbix/etc/zabbix_server.conf</span><br><span class="line">ListenPort=10051</span><br><span class="line">LogFile=/usr/local/zabbix/log/zabbix_server.log</span><br><span class="line">LogFileSize=1</span><br><span class="line">DebugLevel=3</span><br><span class="line">PidFile=/usr/local/zabbix/log/zabbix_server.pid</span><br><span class="line">DBHost=localhost</span><br><span class="line">DBName=zabbix</span><br><span class="line">DBUser=zabbix</span><br><span class="line">DBPassword=zabbix</span><br><span class="line">DBSocket=/home/mysql/tmp/mysql.sock</span><br><span class="line">DBPort=3406</span><br><span class="line">ListenIP=0.0.0.0</span><br><span class="line">Timeout=4</span><br><span class="line">LogSlowQueries=3000</span><br><span class="line"></span><br><span class="line"># vim /usr/local/zabbix/etc/zabbix_agentd.conf</span><br><span class="line">PidFile=/usr/local/zabbix/log/zabbix_agentd.pid</span><br><span class="line">LogType=file</span><br><span class="line">LogFile=/usr/local/zabbix/log/zabbix_agentd.log</span><br><span class="line">LogFileSize=1</span><br><span class="line">DebugLevel=3</span><br><span class="line">Server=127.0.0.1</span><br><span class="line">ListenPort=10050</span><br><span class="line">ListenIP=0.0.0.0</span><br><span class="line">ServerActive=127.0.0.1</span><br><span class="line">Hostname=Zabbix server</span><br></pre></td></tr></table></figure><h2 id="4-8-启动zabbix-server、zabbix-agentd服务"><a href="#4-8-启动zabbix-server、zabbix-agentd服务" class="headerlink" title="4.8 启动zabbix-server、zabbix-agentd服务"></a><strong>4.8 启动zabbix-server、zabbix-agentd服务</strong></h2><p><strong>启动服务</strong></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"># service zabbix_server start</span><br></pre></td></tr></table></figure><p><strong>如启动报错</strong></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">Starting zabbix_server:  /usr/local/zabbix/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory</span><br><span class="line">                                                           [FAILED]</span><br></pre></td></tr></table></figure><p><strong>检查是否库文件不存在</strong></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"># ldd $(which /usr/local/zabbix/sbin/zabbix_server)</span><br></pre></td></tr></table></figure><p><strong>确有一条</strong></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">libmysqlclient.so.20 =&gt; not found</span><br></pre></td></tr></table></figure><p><strong>解决办法</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></pre></td><td class="code"><pre><span class="line"># vim /etc/ld.so.conf.d/mysql.conf</span><br><span class="line">/home/mysql/lib</span><br><span class="line"># ldconfig</span><br></pre></td></tr></table></figure><p><strong>再次启动服务</strong></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"># service zabbix_server start</span><br><span class="line"># service zabbix_agentd start</span><br></pre></td></tr></table></figure><h1 id="5-安装配置zabbix-WEB前端"><a href="#5-安装配置zabbix-WEB前端" class="headerlink" title="5. 安装配置zabbix WEB前端"></a><strong>5. 安装配置zabbix WEB前端</strong></h1><h2 id="5-1-安装前相关配置"><a href="#5-1-安装前相关配置" class="headerlink" title="5.1 安装前相关配置"></a><strong>5.1 安装前相关配置</strong></h2><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"># vim /etc/php.ini     （此处的php.ini以服务器上实际位置为准）</span><br><span class="line">memory_limit = 128M</span><br><span class="line">post_max_size = 16M</span><br><span class="line">upload_max_filesize = 2M</span><br><span class="line">max_execution_time = 300</span><br><span class="line">max_input_time = 300</span><br><span class="line">session.auto_start = 0</span><br><span class="line">mbstring.func_overload = 0</span><br><span class="line">always_populate_raw_post_data = -1</span><br><span class="line">date.timezone = Asia/Shanghai</span><br></pre></td></tr></table></figure><h2 id="5-2-准备WEB前端文件"><a href="#5-2-准备WEB前端文件" class="headerlink" title="5.2 准备WEB前端文件"></a><strong>5.2 准备WEB前端文件</strong></h2><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"># pwd </span><br><span class="line">/home/soft/zabbix-3.0.8</span><br><span class="line"># cp -r frontends/php/* /home/zabbix-web/</span><br><span class="line"># chown -R www.www /home/zabbix-web/</span><br></pre></td></tr></table></figure><h2 id="5-3-配置nginx相关zabbix网站配置"><a href="#5-3-配置nginx相关zabbix网站配置" class="headerlink" title="5.3 配置nginx相关zabbix网站配置"></a><strong>5.3 配置nginx相关zabbix网站配置</strong></h2><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><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"># vim /usr/local/openresty/nginx/conf/nginx.conf</span><br><span class="line">    server &#123;</span><br><span class="line">        listen       80;</span><br><span class="line">        server_name  localhost;</span><br><span class="line">        charset utf-8;</span><br><span class="line">        location / &#123;</span><br><span class="line">            root   /home/zabbix;</span><br><span class="line">            index  index.php index.html index.htm;</span><br><span class="line">        &#125;</span><br><span class="line">        error_page   500 502 503 504  /50x.html;</span><br><span class="line">        location = /50x.html &#123;</span><br><span class="line">            root   html;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        location ~ \.php$ &#123;</span><br><span class="line">            root           /home/zabbix;</span><br><span class="line">            fastcgi_pass   127.0.0.1:9000;</span><br><span class="line">            fastcgi_index  index.php;</span><br><span class="line">            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</span><br><span class="line">            #include        fastcgi_params;</span><br><span class="line">            include        fastcgi.conf;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><h2 id="5-4-访问WEB页面配置zabbix-web"><a href="#5-4-访问WEB页面配置zabbix-web" class="headerlink" title="5.4 访问WEB页面配置zabbix web"></a><strong>5.4 访问WEB页面配置zabbix web</strong></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">http://IP</span><br></pre></td></tr></table></figure><h2 id="5-5-解决zabbix-web界面部分中文乱码的问题"><a href="#5-5-解决zabbix-web界面部分中文乱码的问题" class="headerlink" title="5.5 解决zabbix web界面部分中文乱码的问题"></a><strong>5.5 解决zabbix web界面部分中文乱码的问题</strong></h2><p>zabbix web安装完成后，<strong>默认的中文支持并不完善</strong>，在部分页面仍会出现中文支持不完全的问题，原因在于zabbix程序保重<strong>默认的字体文件DejaVuSans.ttf对中文支持不完善</strong>，所以需要我们<strong>自行上传中文字体并修改配置文件</strong>。<br>具体操作如下：</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></pre></td><td class="code"><pre><span class="line">在这里我采用的是微软雅黑字体，首先将微软字体库中的雅黑字体文件上传至zabbix服务器/home/zabbix-web/fonts/目录</span><br><span class="line"></span><br><span class="line"># ls /home/zabbix-web/fonts/</span><br><span class="line">DejaVuSans.ttf  msyh.ttf</span><br><span class="line"></span><br><span class="line">然后修改相应配置文件：</span><br><span class="line"># pwd</span><br><span class="line">/home/zabbix-web/include</span><br><span class="line"># vim +45 defines.inc.php</span><br><span class="line">define(&apos;ZBX_GRAPH_FONT_NAME&apos;,           &apos;msyh&apos;); // font file name</span><br><span class="line">第45行，将字体文件名更改为你上传的字体文件名，我这里用的是&quot;msyh&quot;</span><br><span class="line"></span><br><span class="line"># vim +93 defines.inc.php</span><br><span class="line">define(&apos;ZBX_FONT_NAME&apos;, &apos;msyh&apos;);</span><br><span class="line">第93行，同45行一致，修改字体文件名。</span><br></pre></td></tr></table></figure><p>修改完成后，重新刷新页面，中文显示就正常了。</p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;1-前言&quot;&gt;&lt;a href=&quot;#1-前言&quot; class=&quot;headerlink&quot; title=&quot;1. 前言&quot;&gt;&lt;/a&gt;&lt;strong&gt;1. 前言&lt;/strong&gt;&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;zabbix是一个基于WEB页面提供分布式系统监视以及网络监视功能的企业级开源解决方案。基于C/S架构，支持多种采集方式和采集客户端，有专用的Agent，也支持SNMP、IPMI、JMX、Telnet、SSH等多种协议，它可以运行在Linux，Solaris，HP-UX，AIX，Free BSD，Open BSD，OS X等平台上，它将采集到的数据存放到数据库，然后对其进行分析整理，达到条件触发告警。&lt;br&gt;对于运维工作来说，zabbix是一个不可或缺的企业监控工具，在日常业务环境中可以选择直接通过yum方式安装或者编译源码安装，因为本人喜欢将zabbix安装到自定义位置，故选择编译安装。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;2-部署前准备工作&quot;&gt;&lt;a href=&quot;#2-部署前准备工作&quot; class=&quot;headerlink&quot; title=&quot;2. 部署前准备工作&quot;&gt;&lt;/a&gt;&lt;strong&gt;2. 部署前准备工作&lt;/strong&gt;&lt;/h1&gt;&lt;h2 id=&quot;2-1-部署规划&quot;&gt;&lt;a href=&quot;#2-1-部署规划&quot; class=&quot;headerlink&quot; title=&quot;2.1 部署规划&quot;&gt;&lt;/a&gt;&lt;strong&gt;2.1 部署规划&lt;/strong&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;zabbix目前提供了三个版本的源码包供下载安装，分别是：Zabbix 2.2 LTS、Zabbix 3.0 LTS、Zabbix 3.2。&lt;br&gt;Zabbix2.2与3.0均为LTS即Long Term Support（长期支持）版本，Zabbix LTS版本可以为客户提供5年的技术支持，包括3年的全服务支持（一般，严重和安全的问题的解决）和后2年的限制性支持（只包括严重和安全问题的解决）。LTS版本发布会改变版本号第一个数字，比如X版本，X+1版本。&lt;br&gt;而3.2属于标准版本，标准版本会为客户提供6个月的全支持（一般，严重和安全的问题的解决）直到下一个稳定版本发布，还会提供附加一个月的限制性支持（只包括严重和安全问题的解决）。标准版本会改变版本号的第二个数字，比如：X.4、X.6版本。&lt;br&gt;&lt;strong&gt;基于业务稳定性考虑，采用LTS版本更为稳妥，&lt;/strong&gt;同时3.0 LTS相对于2.2 LTS在WEB界面与中文支持以及其他一些重要功能上做了很大的提升，因此我们选择3.0 LTS版本。&lt;br&gt;zabbix的web管理界面需要php+MySQL环境支持，在此我们选择LNMP环境。&lt;br&gt;zabbix的web页面安装路径：/home/zabbix&lt;br&gt;zabbix服务安装路径：/usr/local/zabbix&lt;br&gt;MySQL安装路径：/home/mysql&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Zabbix" scheme="https://www.lucissfer.com/categories/Linux/Zabbix/"/>
    
    
      <category term="zabbix3.0" scheme="https://www.lucissfer.com/tags/zabbix3-0/"/>
    
      <category term="监控平台" scheme="https://www.lucissfer.com/tags/%E7%9B%91%E6%8E%A7%E5%B9%B3%E5%8F%B0/"/>
    
  </entry>
  
  <entry>
    <title>keepalived部署</title>
    <link href="https://www.lucissfer.com/2016/12/10/keepalived%E9%83%A8%E7%BD%B2/"/>
    <id>https://www.lucissfer.com/2016/12/10/keepalived部署/</id>
    <published>2016-12-09T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.160Z</updated>
    
    <content type="html"><![CDATA[<p><strong>1. Director Server配置</strong><br><strong>安装软件依赖环境</strong></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"># yum install -y gcc*</span><br><span class="line"># yum install -y openssl*</span><br></pre></td></tr></table></figure><p><strong>安装ipvsadm</strong></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"># yum install -y ipvsadm</span><br></pre></td></tr></table></figure><p><strong>下载软件安装包并解压</strong></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"># wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz</span><br><span class="line"># tar zxf keepalived-1.3.2.tar.gz</span><br></pre></td></tr></table></figure><p><strong>为程序准备安装目录</strong></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"># mkdir /usr/local/keepalived</span><br><span class="line"># mkdir /etc/keepalived</span><br></pre></td></tr></table></figure><a id="more"></a><p><strong>编译前配置</strong></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"># cd keepalived-1.3.2</span><br><span class="line"># ./configure --prefix=/usr/local/keepalived/</span><br></pre></td></tr></table></figure><p><strong>编译安装</strong></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"># make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p><strong>为keepalived准备启动脚本和配置文件</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"># cd /usr/local/keepalived/</span><br><span class="line"># cp /usr/local/keepalived/sbin/keepalived /usr/sbin/</span><br><span class="line"># cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/</span><br><span class="line"># cp /root/soft/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/init.d/</span><br></pre></td></tr></table></figure><p><strong>将keepalived加入开机启动项</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></pre></td><td class="code"><pre><span class="line"># chmod +x /etc/init.d/keepalived</span><br><span class="line"># chkconfig --add keepalived</span><br><span class="line"># chkconfig keepalived on</span><br></pre></td></tr></table></figure><p><strong>在MASTER服务器上按需修改keepalived.conf配置文件</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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"># vim /etc/keepalived/keepalived.conf</span><br><span class="line">! Configuration File for keepalived</span><br><span class="line"></span><br><span class="line">global_defs &#123;</span><br><span class="line">    notification_email &#123;</span><br><span class="line">        wanglei@kuparts.com</span><br><span class="line">    &#125;</span><br><span class="line">    notification_email_from admin@test.com</span><br><span class="line">    smtp_server 127.0.0.1</span><br><span class="line">    smtp_connect_timeout 30</span><br><span class="line">    router_id LVS_MASTER</span><br><span class="line">    vrrp_skip_check_adv_addr</span><br><span class="line">    vrrp_strict</span><br><span class="line">    vrrp_garp_interval 0</span><br><span class="line">    vrrp_gna_interval 0</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">## for Nginx vrrp 实例配置</span><br><span class="line">vrrp_instance VI_nginx &#123;</span><br><span class="line">    state MASTER</span><br><span class="line">    interface em1     # 此处interface名称一定要跟服务器上实际的网卡名称一致，否则keepalived服务会启动失败。</span><br><span class="line">    virtual_router_id 61</span><br><span class="line">    priority 100</span><br><span class="line">    advert_int 1</span><br><span class="line">    authentication &#123;</span><br><span class="line">        auth_type PASS</span><br><span class="line">        auth_pass 123456</span><br><span class="line">    &#125;</span><br><span class="line">    virtual_ipaddress &#123;</span><br><span class="line">        121.201.40.140</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">## for Nginx real_server相关配置</span><br><span class="line">virtual_server 121.201.40.140 80 &#123;</span><br><span class="line">    delay_loop 6</span><br><span class="line">    lb_algo rr</span><br><span class="line">    lb_kind DR</span><br><span class="line">    nat_mask 255.255.255.0</span><br><span class="line">    persistence_timeout 50</span><br><span class="line">    protocol TCP</span><br><span class="line"></span><br><span class="line">    real_server 192.168.1.9 80 &#123;</span><br><span class="line">        weight 1</span><br><span class="line">        TCP_CHECK &#123;</span><br><span class="line">            connect_timeout 3</span><br><span class="line">            nb_get_retry 3</span><br><span class="line">            delay_before_retry 3</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    real_server 192.168.1.10 80 &#123;</span><br><span class="line">        weight 1</span><br><span class="line">        TCP_CHECK &#123;</span><br><span class="line">            connect_timeout 3</span><br><span class="line">            nb_get_retry 3</span><br><span class="line">            delay_before_retry 3</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>将MASTER上的配置同步到BACKUP服务器并相应修改</strong></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"># scp -P 16804 /etc/keepalived/keepalived.conf root@kp-bt-04:/etc/keepalived/</span><br></pre></td></tr></table></figure><p><strong>配置iptables规则</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"># iptables -I INPUT -d 224.0.0.0/8 -j ACCEPT</span><br><span class="line"># iptables -I INPUT -p vrrp -j ACCEPT</span><br><span class="line"># iptables -I INPUT -p tcp --dport 80 -j ACCEPT</span><br><span class="line"># service iptables save</span><br></pre></td></tr></table></figure><p><strong>启动keepalived服务</strong></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"># service keepalived start</span><br></pre></td></tr></table></figure><p><strong>2. Realserver配置</strong><br><strong>创建一个脚本配置arp抑制及绑定vip</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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"># vim /home/vip-add.sh</span><br><span class="line"></span><br><span class="line">#!/bin/bash  </span><br><span class="line">#   </span><br><span class="line"># Script to start LVS DR real server.   </span><br><span class="line"># description: LVS DR real server   </span><br><span class="line">#   </span><br><span class="line">.  /etc/rc.d/init.d/functions</span><br><span class="line">VIP=x.x.x.x   #这里根据需要改成自己的VIP地址</span><br><span class="line">host=`/bin/hostname`</span><br><span class="line">case &quot;$1&quot; in  </span><br><span class="line">start)   </span><br><span class="line">       # Start LVS-DR real server on this machine.   </span><br><span class="line">        /sbin/ifconfig lo down   </span><br><span class="line">        /sbin/ifconfig lo up   </span><br><span class="line">        echo 1 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore   </span><br><span class="line">        echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce   </span><br><span class="line">        echo 1 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore   </span><br><span class="line">        echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce</span><br><span class="line">        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up  </span><br><span class="line">        /sbin/route add -host $VIP dev lo:0</span><br><span class="line">;;  </span><br><span class="line">stop)</span><br><span class="line">        # Stop LVS-DR real server loopback device(s).  </span><br><span class="line">        /sbin/ifconfig lo:0 down   </span><br><span class="line">        echo 0 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore   </span><br><span class="line">        echo 0 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce   </span><br><span class="line">        echo 0 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore   </span><br><span class="line">        echo 0 &gt; /proc/sys/net/ipv4/conf/all/arp_announce</span><br><span class="line">;;  </span><br><span class="line">status)</span><br><span class="line">        # Status of LVS-DR real server.  </span><br><span class="line">        islothere=`/sbin/ifconfig lo:0 | grep $VIP`   </span><br><span class="line">        isrothere=`netstat -rn | grep &quot;lo:0&quot; | grep $VIP`   </span><br><span class="line">        if [ ! &quot;$islothere&quot; -o ! &quot;isrothere&quot; ];then   </span><br><span class="line">            # Either the route or the lo:0 device   </span><br><span class="line">            # not found.   </span><br><span class="line">            echo &quot;LVS-DR real server Stopped.&quot;   </span><br><span class="line">        else   </span><br><span class="line">            echo &quot;LVS-DR real server Running.&quot;   </span><br><span class="line">        fi   </span><br><span class="line">;;   </span><br><span class="line">*)   </span><br><span class="line">            # Invalid entry.   </span><br><span class="line">            echo &quot;$0: Usage: $0 &#123;start|status|stop&#125;&quot;   </span><br><span class="line">            exit 1   </span><br><span class="line">;;   </span><br><span class="line">esac</span><br><span class="line"></span><br><span class="line">该脚本来源：http://lovelace.blog.51cto.com/1028430/1550188</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"># chmod +x vip-add.sh</span><br><span class="line"># ./vip-add.sh start</span><br></pre></td></tr></table></figure><p>测试访问正常。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;1. Director Server配置&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;安装软件依赖环境&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# yum install -y gcc*&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# yum install -y openssl*&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;安装ipvsadm&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# yum install -y ipvsadm&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;下载软件安装包并解压&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# tar zxf keepalived-1.3.2.tar.gz&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;为程序准备安装目录&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;# mkdir /usr/local/keepalived&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;# mkdir /etc/keepalived&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="keepalived" scheme="https://www.lucissfer.com/categories/Linux/keepalived/"/>
    
    
      <category term="keepalived" scheme="https://www.lucissfer.com/tags/keepalived/"/>
    
  </entry>
  
  <entry>
    <title>openresty编译参数详解</title>
    <link href="https://www.lucissfer.com/2016/12/01/openresty+%E7%BC%96%E8%AF%91%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3/"/>
    <id>https://www.lucissfer.com/2016/12/01/openresty+编译参数详解/</id>
    <published>2016-11-30T16:00:00.000Z</published>
    <updated>2018-03-15T03:34:44.675Z</updated>
    
    <content type="html"><![CDATA[<p>表格太长，请直接点击查看全文。</p><a id="more"></a><table><thead><tr><th>参数选项</th><th>说明</th></tr></thead><tbody><tr><td>–help</td><td>this message <strong>帮助选项</strong></td></tr><tr><td></td><td></td></tr><tr><td>–prefix=PATH</td><td>set the installation prefix (default to /usr/local/openresty)   <strong>设置安装路径</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-debug</td><td>enable debug logging    <strong>启用调试日志</strong></td></tr><tr><td>–with-dtrace-probes</td><td>enable dtrace USDT probes   <strong>启用DTrace USDT探针</strong>    （DTrace 提供丰富的用于监视系统各方面（从内核直到应用程序）运行情况的探测。我们可以在不修改应用程序的情况下执行很多检查，但是要想获得详细的统计数据，就需要在应用程序中添加探测。USDT 让开发人员可以在代码中重要的位置添加特定的探测。还可以使用 USDT 从正在运行的应用程序获取数据，这些数据可作为跟踪应用程序的探测的参数而被访问。）</td></tr><tr><td>–with-dtrace=PATH</td><td>set dtrace utility pathname <strong>设置DTrace路径</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-no-pool-patch</td><td>enable the no-pool patch for debugging memory issues    <strong>启用无池补丁调试内存问题</strong>    （nginx的内存池可能会干扰nginx发现内存问题的第一现场，所以可以考虑在构造openresty时禁用nginx 的内存池，即使用 –with-no-pool-patch 选项）</td></tr><tr><td></td><td></td></tr><tr><td>-jN</td><td>pass -jN option to make while building the bundled Lua 5.1 interpreter or LuaJIT 2.1</td></tr><tr><td></td><td><strong>pass -jN选项，在构建捆绑的Lua 5.1解释器或LuaJIT 2.1时</strong></td></tr><tr><td>–without-http_echo_module</td><td>disable ngx_http_echo_module    <strong>禁用ngx_http_echo_module</strong>    （nginx的echo模块可以在nginx的url访问中通过echo命令输出字符到用户的浏览器，一般用来调试输出信息，检测nginx的可访问性、配置正确性。）</td></tr><tr><td>–without-http_xss_module</td><td>disable ngx_http_xss_module     <strong>禁用ngx_http_xss_module</strong> 跨站点脚本支持</td></tr><tr><td>–without-http_coolkit_module</td><td>disable ngx_http_coolkit_module <strong>禁用ngx_http_coolkit_module</strong> （ngx_http_coolkit_module是一个小而有用的nginx插件模块集合）</td></tr><tr><td>–without-http_set_misc_module</td><td>disable ngx_http_set_misc_module    <strong>禁用ngx_http_set_misc_module</strong>    （ngx_http_set_misc_module模块是标准的HttpRewriteModule指令的扩展，提供更多的功能，如URI转义与非转义、JSON引述、Hexadecimal/MD5/SHA1/Base32/Base64编码与解码、随机数等等。）</td></tr><tr><td>–without-http_form_input_module</td><td>disable ngx_http_form_input_module  <strong>禁用ngx_http_form_input_module</strong>  （ngx_http_form_input_module是 Openresty 中一个用于处理 HTTP 请求的 POST 以及 PUT 方法，在协议头 Content-Type 是 application/x-www-form-urlencoded 的情况下，解析请求实体内容并按 nginx 变量存储的模块。）</td></tr><tr><td>–without-http_encrypted_session_module</td><td>disable ngx_http_encrypted_session_module   <strong>禁用ngx_http_encrypted_session_module</strong>   （ngx_http_encrypted_session_module是一个加密解密nginx变量值的模块，此模块提供了基于AES-256与Mac的变量加密和解密支持，此模块通常与ngx_set_misc模块和标准rewrite模块的指令一起使用，此模块可用于实现简单的用户登录和ACL。）</td></tr><tr><td>–without-http_srcache_module</td><td>disable ngx_http_srcache_module <strong>禁用ngx_http_srcache_module</strong>    （此模块为任意nginx位置提供了一个透明缓存层，为location增加了透明的基于subrequest的缓存层（类似于使用upstream或者甚至提供静态磁盘文件的缓存层）。）</td></tr><tr><td>–without-http_lua_module</td><td>disable ngx_http_lua_module <strong>禁用ngx_http_lua_module</strong></td></tr><tr><td>–without-http_lua_upstream_module</td><td>disable ngx_http_lua_upstream_module    <strong>禁用ngx_http_lua_upstream_module</strong>    （ngx_http_lua_upstream_module是openresty的负载均衡模块）</td></tr><tr><td>–without-http_headers_more_module</td><td>disable ngx_http_headers_more_module    <strong>禁用ngx_http_headers_more_module</strong>    （ngx_http_headers_more_module是nginx定制header返回信息模块，用于添加、设置和清除输入和输出的头信息。nginx源码没有包含该模块，需要另行添加。该模块是ngx_http_headers_module模块的增强版，提供了更多的实用工具，比如复位或清除内置头信息，如Content-Type, Content-Length, 和Server。可以允许你使用-s选项指定HTTP状态码，使用-t选项指定内容类型，通过more_set_headers 和 more_clear_headers 指令来修改输出头信息。）</td></tr><tr><td>–without-http_array_var_module</td><td>disable ngx_http_array_var_module   <strong>禁用ngx_http_array_var_module</strong>   （此模块为nginx.conf提供了数组类型的nginx变量。）</td></tr><tr><td>–without-http_memc_module</td><td>disable ngx_http_memc_module    <strong>禁用ngx_http_memc_module</strong>    （memc模块扩展了Nginx标准的memcache模块，增加了set、add、delete等memcache命令）</td></tr><tr><td>–without-http_redis2_module</td><td>disable ngx_http_redis2_module  <strong>禁用ngx_http_redis2_module</strong>  （redis2-nginx-module 是一个支持 Redis 2.0 协议的 Nginx upstream 模块，它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务，同时支持 TCP 协议和 Unix Domain Socket 模式，并且可以启用强大的 Redis 连接池功能。）</td></tr><tr><td>–without-http_redis_module</td><td>disable ngx_http_redis_module   <strong>禁用ngx_http_redis_module</strong>   （此模块是一个简单的提供redis缓存的模块，目前仅提供select和get方法。）</td></tr><tr><td>–without-http_rds_json_module</td><td>disable ngx_http_rds_json_module    <strong>禁用ngx_http_rds_json_module</strong>    （此模块用来做数据格式转换）</td></tr><tr><td>–without-http_rds_csv_module</td><td>disable ngx_http_rds_csv_module <strong>禁用ngx_http_rds_csv_module</strong> （此模块用来做数据格式转换）</td></tr><tr><td>–without-ngx_devel_kit_module</td><td>disable ngx_devel_kit_module    <strong>禁用ngx_devel_kit_module</strong>    （Nginx的开发套件）</td></tr><tr><td>–without-http_ssl_module</td><td>disable ngx_http_ssl_module <strong>禁用ngx_http_ssl_module</strong> （该模块使Nginx支持SSL协议，提供HTTPS服务。<strong>该模块的安装依赖于OpenSSL。</strong>）</td></tr><tr><td></td><td></td></tr><tr><td>–with-http_iconv_module</td><td>enable ngx_http_iconv_module    <strong>启用ngx_http_iconv_module</strong>   （此模块使用libiconv来转换不同编码字符，依赖于libiconv。）</td></tr><tr><td>–with-http_drizzle_module</td><td>enable ngx_http_drizzle_module  <strong>启用ngx_http_drizzle_module</strong>  （此模块使NGINX直接与MySQL或Drizzle（一个精简版的MySQL分支）数据库服务器通信）</td></tr><tr><td>–with-http_postgres_module</td><td>enable ngx_http_postgres_module <strong>启用ngx_http_postgres_module</strong> （此模块允许NGINX直接与PostgreSQL数据库通信）</td></tr><tr><td></td><td></td></tr><tr><td>–without-lua_cjson</td><td>disable the lua-cjson library   <strong>禁用lua-cjson library</strong>   （Lua CJSON是一个Lua c模块，提供快速的JSON解析和Lua的编码支持）</td></tr><tr><td>–without-lua_redis_parser</td><td>disable the lua-redis-parser library    <strong>禁用lua-redis-parser library</strong>    （lua-redis解析器库实现了一个简单且快速的redis原始响应解析器，它构造相应的lua数据结构，以及一个构造redis raw请求的函数。）</td></tr><tr><td>–without-lua_rds_parser</td><td>disable the lua-rds-parser library  <strong>禁用lua-rds-parser library</strong>  （这个Lua库可以用于将Drizzle Nginx模块和Postgres Nginx模块生成的Resty-DBD-Stream格式的数据解析为Lua数据结构。在过去，我们必须使用JSON作为中间数据格式，这在内存和CPU时间方面是相当低效的。为了最大化速度和最小化内存占用，这个库以纯C语言实现。默认情况下启用此库。）</td></tr><tr><td>–without-lua_resty_dns</td><td>disable the lua-resty-dns library   <strong>禁用lua-resty-dns library</strong>   （非阻塞DNS（域名系统）解析器的Lua Nginx模块，基于cosocket API。）</td></tr><tr><td>–without-lua_resty_memcached</td><td>disable the lua-resty-memcached library <strong>禁用lua-resty-memcached library</strong>    （Memcached客户端驱动程序模块，基于cosocket API的Lua Nginx模块。）</td></tr><tr><td>–without-lua_resty_redis</td><td>disable the lua-resty-redis library <strong>禁用lua-resty-redis library</strong> （Lua Redis客户端驱动程序，基于cosocket API的Lua Nginx模块。）</td></tr><tr><td>–without-lua_resty_mysql</td><td>disable the lua-resty-mysql library <strong>禁用lua-resty-mysql library</strong> （Lua MySQL客户端驱动程序，基于cosocket API的Lua Nginx模块。）</td></tr><tr><td>–without-lua_resty_upload</td><td>disable the lua-resty-upload library    <strong>禁用lua-resty-upload library</strong>    （基于Lua Nginx模块的cosocket API用于HTTP文件上传流阅读器和分析器。）</td></tr><tr><td>–without-lua_resty_upstream_healthcheck</td><td>disable the lua-resty-upstream-healthcheck library <strong>禁用lua-resty-upstream-healthcheck library</strong>  （此模块是纯Lua的Nginx上游服务器健康检查器。）</td></tr><tr><td>–without-lua_resty_string</td><td>disable the lua-resty-string library    <strong>禁用lua-resty-string library</strong>    （一个Lua库，为Lua Nginx模块提供字符串实用程序和通用哈希函数。）</td></tr><tr><td>–without-lua_resty_websocket</td><td>disable the lua-resty-websocket library    <strong>禁用lua-resty-websocket library</strong> （这个Lua库实现了一个非阻塞WebSocket服务器和基于Lua Nginx模块的cosocket API的非阻塞WebSocket客户端。）</td></tr><tr><td>–without-lua_resty_lock</td><td>disable the lua-resty-lock library  <strong>禁用lua-resty-lock library</strong> （这个Lua库实现了一个基于Lua Nginx模块的共享内存字典的简单非阻塞互斥锁API。 主要用于消除“dog-pile effects”。dog-pile effect 指当网页缓存失效同时遇到大量请求，后端应用服务请求建立缓存，导致服务器卡顿甚至系统宕机的现象。）</td></tr><tr><td>–without-lua_resty_lrucache</td><td>disable the lua-resty-lrucache library  <strong>禁用lua-resty-lrucache library</strong>  （实现OpenResty的Lua-land LRU缓存。）</td></tr><tr><td>–without-lua_resty_core</td><td>disable the lua-resty-core library  <strong>禁用lua-resty-core library</strong>  （使用LuaJIT FFI实现Lua Nginx模块提供的Lua API。）</td></tr><tr><td></td><td></td></tr><tr><td>–with-lua51</td><td>enable and build the bundled standard Lua 5.1 interpreter <strong>启用并构建捆绑的标准Lua 5.1解释器</strong></td></tr><tr><td>–without-lua51</td><td>disable the bundled standard Lua 5.1 interpreter    <strong>禁用捆绑的标准Lua 5.1解释器</strong></td></tr><tr><td>–with-lua51=DIR</td><td>specify the external installation of Lua 5.1 by DIR <strong>指定由外部DIR安装Lua 5.1</strong></td></tr><tr><td>–with-luajit</td><td>enable and build the bundled LuaJIT 2.1 (the default)   <strong>启用并构建捆绑的LuaJIT 2.1（默认）</strong></td></tr><tr><td>–with-luajit=DIR</td><td>use the external LuaJIT 2.1 installation specified by DIR <strong>使用指定的DIR安装LuaJIT 2.1</strong></td></tr><tr><td>–with-luajit-xcflags=FLAGS</td><td>Specify extra C compiler flags for LuaJIT 2.1   <strong>为LuaJIT 2.1指定额外的C编译器标志</strong></td></tr><tr><td>–with-libdrizzle=DIR</td><td>specify the libdrizzle 1.0 (or drizzle) installation prefix  <strong>指定libdrizzle 1.0（或drizzle）安装路径</strong></td></tr><tr><td>–with-libpq=DIR</td><td>specify the libpq (or postgresql) installation prefix   <strong>指定libpq（或postgresql）安装路径</strong></td></tr><tr><td>–with-pg_config=PATH</td><td>specify the path of the pg_config utility   <strong>指定pg_config实用程序的路径</strong></td></tr><tr><td></td><td></td></tr><tr><td><strong>Options directly inherited from nginx</strong>  <strong>直接继承自nginx的选项</strong></td><td></td></tr><tr><td></td><td></td></tr><tr><td>–sbin-path=PATH</td><td>set nginx binary pathname   <strong>设置可执行文件放置路径</strong></td></tr><tr><td>–conf-path=PATH</td><td>set nginx.conf pathname <strong>设置配置文件的放置路径</strong></td></tr><tr><td>–error-log-path=PATH</td><td>set error log pathname  <strong>设置error日志文件的放置路径</strong></td></tr><tr><td>–pid-path=PATH</td><td>set nginx.pid pathname  <strong>设置pid文件的放置路径</strong></td></tr><tr><td>–lock-path=PATH</td><td>set nginx.lock pathname <strong>设置lock文件的放置路径</strong></td></tr><tr><td>–tapset-prefix=PATH</td><td>set systemtap tapset directory prefix <strong>设置systemtap tapset目录路径</strong></td></tr><tr><td>–stap-nginx-path=PATH</td><td>set stap-nginx pathname <strong>设置stap-nginx路径名</strong></td></tr><tr><td></td><td></td></tr><tr><td>–user=USER</td><td>set non-privileged user for worker processes    <strong>为工作进程设置非特权用户</strong></td></tr><tr><td>–group=GROUP</td><td>set non-privileged group for worker processes   <strong>为工作进程设置非特权组</strong></td></tr><tr><td></td><td></td></tr><tr><td>–builddir=DIR</td><td>set the build directory <strong>设置构建目录</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-select_module</td><td>enable select module    <strong>使用select module处理事件驱动</strong></td></tr><tr><td>–without-select_module</td><td>disable select module   <strong>禁用select module</strong></td></tr><tr><td>–with-poll_module</td><td>enable poll module  <strong>使用poll module处理事件驱动</strong></td></tr><tr><td>–without-poll_module</td><td>disable poll module <strong>禁用poll module</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-threads</td><td>enable thread pool support  <strong>启用线程池支持</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-file-aio</td><td>enable file aio support <strong>启用文件异步IO支持</strong></td></tr><tr><td>–with-ipv6</td><td>enable ipv6 support <strong>启用ipv6支持</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-http_realip_module</td><td>enable ngx_http_realip_module   <strong>启用ngx_http_realip_module</strong>  （该模块可以从客户端请求里的header信息（如X-Real-IP或者X-Forwared-For）中获取真正的客户端IP地址）</td></tr><tr><td>–with-http_addition_module</td><td>enable ngx_http_addition_module <strong>启用http addition module。该模块可以再返回客户端的HTTP包体头部或者尾部增加内容</strong></td></tr><tr><td>–with-http_xslt_module</td><td>enable ngx_http_xslt_module <strong>启用http xslt module。这个模块可以使XML格式的数据在发给客户端前加入XSL渲染，此模块依赖于libxml2和libxslt库。</strong></td></tr><tr><td>–with-http_image_filter_module</td><td>enable ngx_http_image_filter_module <strong>启用http image filter module。此模块将符合配置的图片实时压缩为指定大小（width*height）的缩略图再发送给用户，目前支持JPEG、PNG、GIF格式。此模块依赖于开源的libgd库。</strong></td></tr><tr><td>–with-http_geoip_module</td><td>enable ngx_http_geoip_module    <strong>启用http geoip module。该模块可以依据MaxMind GeoIP的IP地址数据库对客户端的IP地址得到实际的地理位置信息。</strong></td></tr><tr><td>–with-http_sub_module</td><td>enable ngx_http_sub_module  <strong>启用http sub module。该模块可以在Nginx返回客户端的HTTP响应包中将指定的字符串替换为自己需要的字符串。例如，在HTML的返回中，<code>将&lt;/head&gt;替换为&lt;/head&gt;&lt;script language=&quot;javascript&quot; src=&quot;$script&quot;&gt;&lt;/script&gt;</code></strong></td></tr><tr><td>–with-http_dav_module</td><td>enable ngx_http_dav_module  <strong>启用http dav module。这个模块可以让Nginx支持Webdav标准，如支持Webdav协议中的PUT、DELETE、COPY、MOVE、MKCOL等请求</strong></td></tr><tr><td>–with-http_flv_module</td><td>enable ngx_http_flv_module  <strong>启用http flv module。这个模块可以在向客户端返回响应时，对FLV格式的视频文件在header头做一些处理，使得客户端可以观看、拖动FLV视频</strong></td></tr><tr><td>–with-http_gzip_static_module</td><td>enable ngx_http_gzip_static_module  <strong>启用http gzip static module。如果采用gzip模块把一些文档进行gzip格式压缩后再返回给客户端，那么对同一个文件每次都会重新压缩，这是比较消耗服务器CPU资源的。gzip static模块可以在做gzip压缩前，先查看相同位置是否有已经做过gzip压缩的.gz文件，如果有就直接返回。这样就可以预先在服务器上做好文档的压缩，给CPU减负。</strong></td></tr><tr><td>–with-http_auth_request_module</td><td>enable ngx_http_auth_request_module <strong>启用http auth request module。这个是nginx的一个验证模块，这个模块允许您的nginx通过发送请求到后端服务器（一般是应用服务器，例如tomcat，或者php等）进行请求，并且根据请求决定是验证通过或者不通过。</strong></td></tr><tr><td>–with-http_random_index_module</td><td>enable ngx_http_random_index_module <strong>启用http random index module。该模块在客户端访问某个目录时，随机返回该目录下的任意文件。</strong></td></tr><tr><td>–with-http_secure_link_module</td><td>enable ngx_http_secure_link_module  <strong>启用http secure link module。该模块提供一种验证请求是否有效的机制。例如，它会验证URL中需要加入的token参数是否属于特定客户端发来的，以及检查时间戳是否过期。</strong></td></tr><tr><td>–with-http_degradation_module</td><td>enable ngx_http_degradation_module  <strong>启用http degradation module。该模块针对一些特殊的系统调用（如sbrk）做一些优化，如直接返回HTTP响应码为204或444，目前不支持Linux系统。</strong></td></tr><tr><td>–with-http_stub_status_module</td><td>enable ngx_http_stub_status_module  <strong>启用http stub status module。该模块可以让运行中的Nginx提供性能统计页面，获取相关的并发连接、请求的信息。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–without-http_charset_module</td><td>disable ngx_http_charset_module <strong>禁用http charset module。这个模块可以将服务器发出的HTTP响应重编码。</strong></td></tr><tr><td>–without-http_gzip_module</td><td>disable ngx_http_gzip_module    <strong>禁用http gzip module。在服务器发出的HTTP响应包中，这个模块可以按照配置文件指定的content-type对特定大小的HTTP响应包体执行gzip压缩。</strong></td></tr><tr><td>–without-http_ssi_module</td><td>disable ngx_http_ssi_module <strong>禁用http ssi module。该模块可以在向用户返回的HTTP响应包体中加入特定的内容，如HTML文件中固定的页头和页尾。</strong></td></tr><tr><td>–without-http_userid_module</td><td>disable ngx_http_userid_module  <strong>禁用http userid module。该模块可以通过HTTP请求头部信息里的一些字段认证用户信息，以确定请求是否合法。</strong></td></tr><tr><td>–without-http_access_module</td><td>disable ngx_http_access_module  <strong>禁用http access module。该模块可以根据IP地址限制能够访问服务器的客户端。</strong></td></tr><tr><td>–without-http_auth_basic_module</td><td>disable ngx_http_auth_basic_module  <strong>禁用http auth basic module。该模块可以提供最简单的用户名/密码认证。</strong></td></tr><tr><td>–without-http_autoindex_module</td><td>disable ngx_http_autoindex_module   <strong>禁用http autoindex module。该模块提供简单的目录浏览功能。</strong></td></tr><tr><td>–without-http_geo_module</td><td>disable ngx_http_geo_module <strong>禁用http geo module。该模块可以定义一些变量，这些变量的值将与客户端IP地址关联，这样Nginx针对不同的地区的客户端（根据IP地址判断）返回不一样的结果，例如不同地区显示不同语言的网页。</strong></td></tr><tr><td>–without-http_map_module</td><td>disable ngx_http_map_module <strong>禁用http map module。该模块可以建立一个key/value映射表，不同的key得到相应的value，这样可以针对不同的URL做特殊处理。例如，返回302重定向响应时，可以期望URL不同时返回的Location字段也不一样。</strong></td></tr><tr><td>–without-http_split_clients_module</td><td>disable ngx_http_split_clients_module   <strong>禁用http split clients module。该模块会根据客户端的信息，例如IP地址、header头、cookie等，来区分处理。</strong></td></tr><tr><td>–without-http_referer_module</td><td>disable ngx_http_referer_module <strong>禁用http referer module。该模块可以根据请求中的refer字段来拒绝请求。</strong></td></tr><tr><td>–without-http_rewrite_module</td><td>disable ngx_http_rewrite_module <strong>禁用http rewrite module。 该模块提供HTTP请求在Nginx服务内部的重定向功能，依赖PCRE库。</strong></td></tr><tr><td>–without-http_proxy_module</td><td>disable ngx_http_proxy_module   <strong>禁用http proxy module。 该模块提供基本的HTTP反向代理功能。</strong></td></tr><tr><td>–without-http_fastcgi_module</td><td>disable ngx_http_fastcgi_module <strong>禁用http fastcgi module。 该模块提供FastCGI功能。</strong></td></tr><tr><td>–without-http_uwsgi_module</td><td>disable ngx_http_uwsgi_module   <strong>禁用http uwsgi module 该模块提供uWSGI功能。uWSGI是一个Web服务器，它实现了WSGI协议、uwsgi、http等协议。</strong></td></tr><tr><td>–without-http_scgi_module</td><td>disable ngx_http_scgi_module    <strong>禁用http scgi module 该模块提供SCGI功能。SCGI(Simple Common Gateway Interface),简单通用网关接口。是CGI的替代协议，与FastCGI相似，但更简单。</strong></td></tr><tr><td>–without-http_memcached_module</td><td>disable ngx_http_memcached_module   <strong>禁用http memcached module。该模块可以使得Nginx直接由上游的memcached服务读取数据，并简单地适配成HTTP响应返回给客户端。</strong></td></tr><tr><td>–without-http_limit_conn_module</td><td>disable ngx_http_limit_conn_module  <strong>禁用http limit conn module。该模块针对某个IP地址限制并发连接数。</strong></td></tr><tr><td>–without-http_limit_req_module</td><td>disable ngx_http_limit_req_module   <strong>禁用http limit req module。该模块针对某个IP地址限制并发请求数。</strong></td></tr><tr><td>–without-http_empty_gif_module</td><td>disable ngx_http_empty_gif_module   <strong>禁用http empty gif module。该模块可以使得Nginx在收到无效请求时，立刻返回内存中的1×1像素的GIF图片。这种好处在于，对于明显的无效请求不会去试图浪费服务器资源。</strong></td></tr><tr><td>–without-http_browser_module</td><td>disable ngx_http_browser_module <strong>禁用http browser module。该模块会根据HTTP请求中的user-agent字段（该字段通常由浏览器填写）来识别浏览器。</strong></td></tr><tr><td>–without-http_upstream_ip_hash_module</td><td>disable ngx_http_upstream_ip_hash_module    <strong>禁用http upstream ip hash module。该模块提供当Nginx与后端server建立连接时，会根据IP做散列运算来决定与后端哪台server通信，这样可以实现负载均衡。</strong></td></tr><tr><td>–without-http_upstream_least_conn_module</td><td>disable ngx_http_upstream_least_conn_module <strong>禁用http upstream least conn module。该模块提供当Nginx与后端server建立连接时，会通过最少连接负载均衡算法来决定与后端哪台server通信，简单来说就是每次选择的都是当前最少连接的一个server(这个最少连接不是全局的，是每个进程都有自己的一个统计列表)。</strong></td></tr><tr><td>–without-http_upstream_keepalive_module</td><td>disable ngx_http_upstream_keepalive_module  <strong>禁用http upstream keepalive module。这是一个用于nginx的实现缓存的后端连接的keepalive平衡器模块。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-http_perl_module</td><td>enable ngx_http_perl_module</td></tr><tr><td>–with-perl_modules_path=PATH</td><td>set path to the perl modules    <strong>设置perl module的路径，只有使用了第三方的perl module，才需要配置这个路径。</strong></td></tr><tr><td>–with-perl=PATH</td><td>set path to the perl binary <strong>设置perl binary的路径。如果配置的Nginx会执行Perl脚本，那么就必须设置此路径。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–http-log-path=PATH</td><td>set path to the http access log <strong>设置access日志存放路径。</strong></td></tr><tr><td>–http-client-body-temp-path=PATH</td><td>set path to the http client request body temporary files   <strong>处理HTTP请求时如果请求的包体需要暂时存放到临时磁盘文件中，则把这样的临时文件存放到该路径下。</strong></td></tr><tr><td>–http-proxy-temp-path=PATH</td><td>set path to the http proxy temporary files  <strong>Nginx作为HTTP反向代理服务器时，上游服务器产生的HTTP包体在需要临时存放到磁盘文件时，这样的临时文件将存放到该路径下。</strong></td></tr><tr><td>–http-fastcgi-temp-path=PATH</td><td>set path to the http fastcgi temporary files    <strong>设置Fastcgi所使用临时文件的存放路径。</strong></td></tr><tr><td>–http-uwsgi-temp-path=PATH</td><td>set path to the http uwsgi temporary files  <strong>设置uWSGI所使用临时文件的存放路径。</strong></td></tr><tr><td>–http-scgi-temp-path=PATH</td><td>set path to the http scgi temporary files   <strong>设置SCGI所使用临时文件的存放路径。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–without-http</td><td>disable HTTP server <strong>禁用HTTP服务器。</strong></td></tr><tr><td>–without-http-cache</td><td>disable HTTP cache  <strong>禁用HTTP服务器里的缓存Cache特性。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-mail</td><td>enable POP3/IMAP4/SMTP proxy module <strong>安装邮件服务器反向代理模块，使Nginx可以反向代理IMAP、POP3、SMTP等协议，该模块默认不安装。</strong></td></tr><tr><td>–with-mail_ssl_module</td><td>enable ngx_mail_ssl_module  <strong>安装mail ssl module。该模块可以使IMAP、POP3、SMTP等协议基于SSL/TLS协议之上使用。该模块默认不安装并依赖于OpenSSL库。</strong></td></tr><tr><td>–without-mail_pop3_module</td><td>disable ngx_mail_pop3_module    <strong>不安装mail pop3 module。在使用–with-mail参数后，pop3 module是默认安装的，以使Nginx支持POP3协议。</strong></td></tr><tr><td>–without-mail_imap_module</td><td>disable ngx_mail_imap_module    <strong>不安装mail imap module。在使用–with-mail参数后，imap module是默认安装的，以使Nginx支持IMAP协议。</strong></td></tr><tr><td>–without-mail_smtp_module</td><td>disable ngx_mail_smtp_module    <strong>不安装smtp pop3 module。在使用–with-mail参数后，smtp module是默认安装的，以使Nginx支持SMTP协议。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-google_perftools_module</td><td>enable ngx_google_perftools_module  <strong>启用google perftools module。该模块提供Google的性能测试工具。</strong></td></tr><tr><td>–with-cpp_test_module</td><td>enable ngx_cpp_test_module  <strong>启用cpp测试模块</strong></td></tr><tr><td></td><td></td></tr><tr><td>–add-module=PATH</td><td>enable an external module   <strong>当在Nginx里加入第三方模块时，通过这个参数指定第三方模块的路径。</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-cc=PATH</td><td>set path to C compiler  <strong>设置C编译器的路径</strong></td></tr><tr><td>–with-cpp=PATH</td><td>set path to C preprocessor  <strong>设置C预编译器的路径</strong></td></tr><tr><td>–with-cc-opt=OPTIONS</td><td>set additional options for C compiler   <strong>如果希望在Nginx编译期间指定加入一些编译选项，如指定宏或者使用-I加入某些需要包含的目录，这时可以使用该参数达成目的</strong></td></tr><tr><td>–with-ld-opt=OPTIONS</td><td>set additional options for linker   <strong>最终的二进制可执行文件是由编译后生成的目标文件与一些第三方库链接生成的，在执行链接操作时可能会需要指定链接参数，–with-ld-opt就是用于加入链接时的参数。例如，如果我们希望将某个库链接到Nginx程序中，需要在这里加入–with-ld-opt=libraryName -LibraryPath，其中libraryName是目标库的名称，LibraryPath则是目标库所在的路径</strong></td></tr><tr><td>–with-cpu-opt=CPU</td><td>build for specified CPU, the valid values: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64    <strong>指定CPU处理器架构，只能从以下取值中选择：pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-make=PATH</td><td>specify the default make utility to be used <strong>指定要使用的默认make实用程序</strong></td></tr><tr><td></td><td></td></tr><tr><td>–without-pcre</td><td>disable PCRE library usage  <strong>如果确认Nginx不用解析正则表达式，也就是说，nginx.conf配置文件中不会出现正则表达式，那么可以使用这个参数</strong></td></tr><tr><td>–with-pcre</td><td>force PCRE library usage    <strong>强制使用PCRE库</strong></td></tr><tr><td>–with-pcre=DIR</td><td>set path to PCRE library sources    <strong>指定PCRE库的源码位置，在编译时会进入该目录编译PCRE源码</strong></td></tr><tr><td>–with-pcre-opt=OPTIONS</td><td>set additional make options for PCRE    <strong>编译PCRE源码时希望加入的编译选项</strong></td></tr><tr><td>–with-pcre-conf-opt=OPTIONS</td><td>set additional configure options for PCRE   <strong>设置PCRE的其他配置选项</strong></td></tr><tr><td>–with-pcre-jit</td><td>build PCRE with JIT compilation support <strong>使用JIT编译支持构建PCRE</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-md5=DIR</td><td>set path to md5 library sources <strong>指定MD5库的源码位置，在编译Nginx时会进入该目录编译MD5源码。注意：Nginx源码中已经有了MD5算法的实现，如果没有特殊需求，那么完全可以使用Nginx自身实现的MD5算法</strong></td></tr><tr><td>–with-md5-opt=OPTIONS</td><td>set additional options for md5 building <strong>编译MD5源码时希望加入的编译选项</strong></td></tr><tr><td>–with-md5-asm</td><td>use md5 assembler sources   <strong>使用MD5的汇编源码</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-sha1=DIR</td><td>set path to sha1 library sources    <strong>指定SHA1库的源码位置，在编译Nginx时会进入该目录编译SHA1源码。注意：OpenSSL中已经有了SHA1算法的实现，如果已经安装了OpenSSL，那么完全可以使用OpenSSL实现的SHA1算法</strong></td></tr><tr><td>–with-sha1-opt=OPTIONS</td><td>set additional options for sha1 building    <strong>编译SHA1源码时希望加入的编译选项</strong></td></tr><tr><td>–with-sha1-asm</td><td>use sha1 assembler sources  <strong>使用SHA1的汇编源码</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-zlib=DIR</td><td>set path to zlib library sources    <strong>指定zlib库的源码位置，在编译Nginx时会进入该目录编译zlib源码。如果使用了gzip压缩功能，就需要zlib库的支持</strong></td></tr><tr><td>–with-zlib-opt=OPTIONS</td><td>set additional options for zlib building    <strong>编译zlib源码时希望加入的编译选项</strong></td></tr><tr><td>–with-zlib-asm=CPU</td><td>use zlib assembler sources optimized  for specified CPU, the valid values:pentium, pentiumpro    <strong>指定对特定的CPU使用zlib库的汇编优化功能，目前仅支持两种架构：pentium和pentiumpro</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-libatomic</td><td>force libatomic_ops library usage   <strong>强制使用atomic库。atomic库是CPU架构独立的一种原子操作的实现。它支持以下体系架构：x86（包括i386和x86_64）、PPC64、Sparc64（v9或更高版本）或者安装了GCC4.1.0及更高版本的架构。</strong></td></tr><tr><td>–with-libatomic=DIR</td><td>set path to libatomic_ops library sources   <strong>atomic库所在的位置</strong></td></tr><tr><td></td><td></td></tr><tr><td>–with-openssl=DIR</td><td>set path to OpenSSL library sources <strong>指定OpenSSL库的源码位置，在编译Nginx时会进入该目录编译OpenSSL源码。 注意：如果Web服务器支持HTTPS，也就是SSL协议，Nginx要求必须使用OpenSSL。可以访问<a href="http://www.openssl.org/免费下载" target="_blank" rel="noopener">http://www.openssl.org/免费下载</a></strong></td></tr><tr><td>–with-openssl-opt=OPTIONS</td><td>set additional options for OpenSSL building <strong>编译OpenSSL源码时希望加入的编译选项</strong></td></tr><tr><td></td><td></td></tr><tr><td>–dry-run</td><td>dry running the configure, for testing only <strong>仅测试配置</strong></td></tr><tr><td>–platform=PLATFORM</td><td>forcibly specify a platform name, for testing only  <strong>强制指定平台名称，仅用于测试</strong></td></tr><tr><td></td><td></td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;表格太长，请直接点击查看全文。&lt;/p&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="Nginx/OpenResty" scheme="https://www.lucissfer.com/categories/Linux/Nginx-OpenResty/"/>
    
    
      <category term="openresty" scheme="https://www.lucissfer.com/tags/openresty/"/>
    
      <category term="编译参数" scheme="https://www.lucissfer.com/tags/%E7%BC%96%E8%AF%91%E5%8F%82%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>Centos环境搭建shadowsocks科学上网</title>
    <link href="https://www.lucissfer.com/2016/10/12/Centos+shadowsocks/"/>
    <id>https://www.lucissfer.com/2016/10/12/Centos+shadowsocks/</id>
    <published>2016-10-11T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.156Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>前言：</strong>作为一名IT技术狗，在日常工作学习中，难免会经常使用搜索引擎来搜索技术问题，而众所周知的是百度在技术搜索上就是个笑话，想要快速找到答案还是得靠Google，但是因为某些不可描述的原因，在国内想通过正规途径来访问Google完全是不可能的。<br>那么问题来了，如何通过一些技术小手段来正常访问Google呢？一般来说，常见的方法是通过国外线路的VPN来访问，然而这种情况下有一些使用上的不便。比如说：<em>很多时候在解决问题的时候我们会有这样的需求，一边使用VPN线路通过Google来搜索技术问题同时还需要通过QQ等即时通信软件与同事朋友交流沟通，此时因为我们通过VPN线路来上网，那么就会出现QQ异地登录警告，严重时腾讯会直接将QQ冻结</em>。所以，对于日常工作来说，我认为VPN太重，我们需要一个轻量级的工具仅需能够代理浏览器的请求即可，那么这时shadowsocks就是最好的选择了。</p></blockquote><h2 id="1-安装python-pip"><a href="#1-安装python-pip" class="headerlink" title="1.安装python-pip"></a>1.安装python-pip</h2><p>Pip是安装Python包的工具，提供了安装、列举已安装包、升级以及卸载包的功能。Pip 是对easy_install的取代，提供了和easy_install相同的查找包的功能，因此可以使用easy_install安装的包也同样可以使用pip进行安装。<br>目前有很多Python程序都是可以直接通过Pip来一键安装了，比如众所周知的Django、Markdown、Shadowsocks等。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> yum install -y python-pip</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="2-通过pip安装shadowsocks"><a href="#2-通过pip安装shadowsocks" class="headerlink" title="2.通过pip安装shadowsocks"></a>2.通过pip安装shadowsocks</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span> pip install shadowsocks</span><br><span class="line">/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.</span><br><span class="line">  InsecurePlatformWarning</span><br><span class="line">You are using pip version 7.1.0, however version 8.1.2 is available.</span><br><span class="line">You should consider upgrading via the 'pip install --upgrade pip' command.</span><br><span class="line">Collecting shadowsocks</span><br><span class="line">/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.</span><br><span class="line">  InsecurePlatformWarning</span><br><span class="line">  Downloading shadowsocks-2.8.2.tar.gz</span><br><span class="line">Installing collected packages: shadowsocks</span><br><span class="line">  Running setup.py install for shadowsocks</span><br><span class="line">Successfully installed shadowsocks-2.8.2</span><br></pre></td></tr></table></figure><h2 id="3-创建shadowsocks配置文件"><a href="#3-创建shadowsocks配置文件" class="headerlink" title="3.创建shadowsocks配置文件"></a>3.创建shadowsocks配置文件</h2><p>shadowsocks安装完成后默认是没有配置文件的，这时候就需要我们自己来创建配置文件，配置文件为json格式，很简单。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span> vim /etc/shadowsocks.json</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    "server":"your_server_ip",</span><br><span class="line">    "server_port":8989,</span><br><span class="line">    "local_address": "127.0.0.1",   #这一行可不写</span><br><span class="line">    "local_port":1080,</span><br><span class="line">    "password":"yourpassword",</span><br><span class="line">    "timeout":600,</span><br><span class="line">    "method":"aes-256-cfb",</span><br><span class="line">    "fast_open": false,     #这一行可不写</span><br><span class="line">    "workers": 1    #这一行可不写</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>配置文件各字段含义：</strong><br>各字段的含义：<br><strong>server：</strong>服务器 IP (IPv4/IPv6)，注意这也将是服务端监听的 IP 地址<br><strong>server_port：</strong>监听的服务器端口<br><strong>local_address：</strong>本地监听的 IP 地址<br><strong>local_port：</strong>本地端端口<br><strong>password：</strong>用来加密的密码<br><strong>timeout：</strong>超时时间（秒）<br><strong>method：</strong>加密方法，可选择 “bf-cfb”, “aes-256-cfb”, “des-cfb”, “rc4”, 等等。默认是一种不安全的加密，推荐用 “aes-256-cfb”<br><strong>fast_open :</strong> true 或 false。如果你的服务器 Linux 内核在3.7+，可以开启 fast_open 以降低延迟。开启方法：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> echo 3 &gt; /proc/sys/net/ipv4/tcp_fastopen</span><br></pre></td></tr></table></figure><p>开启之后，将 fast_open 的配置设置为 true 即可。<br><strong>works :</strong> works数量，默认为 1<br>这一段参考：<a href="https://teddysun.com/339.html" target="_blank" rel="noopener">https://teddysun.com/339.html</a></p><h2 id="4-服务器端启动shadowsocks"><a href="#4-服务器端启动shadowsocks" class="headerlink" title="4.服务器端启动shadowsocks"></a>4.服务器端启动shadowsocks</h2><p>在服务器端启动shadowsocks有很多方法，此处我们使用的是指定配置文件启动。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> ssserver -c /etc/shadowsocks.json</span><br></pre></td></tr></table></figure><p>但这种启动方式将一直启动在当前会话，所以，我们要将其放入后台启动，同时还可以指定记录日志。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> nohup ssserver -c /etc/shadowsocks.json 2&gt; /var/log/shaowsocks.log &amp;</span><br></pre></td></tr></table></figure><p>将启动命令写入/etc/rc.local设置为开机启动</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo "nohup ssserver -c /etc/shadowsocks.json 2&gt; /var/log/shaowsocks.log &amp;" &gt;&gt; /etc/rc.local</span><br></pre></td></tr></table></figure><p>查看端口是否监听，判断服务是否正常启动</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><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="meta">#</span> netstat -nultp</span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   </span><br><span class="line">tcp        0      0 0.0.0.0:8989                0.0.0.0:*                   LISTEN      31593/python</span><br></pre></td></tr></table></figure><p>如果端口没有监听，那么一定是启动过程中出错了，直接根据报错提示排错，我在配置过程中也出了一次错误。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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">#</span> ssserver -c /etc/shadowsocks.json</span><br><span class="line">INFO: loading config from /etc/shadowsocks.json</span><br><span class="line">/usr/lib/python2.6/site-packages/shadowsocks/shell.py:154: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6</span><br><span class="line">  e.message)</span><br><span class="line">ERROR: found an error in config.json: Expecting property name: line 9 column 1 (char 189)</span><br></pre></td></tr></table></figure><p>其实这个错误提示很明显，配置文件第9行出错，检查了下shadowsocks.json发现，第9行多写了一个”,”</p><h2 id="5-添加防火墙规则"><a href="#5-添加防火墙规则" class="headerlink" title="5.添加防火墙规则"></a>5.添加防火墙规则</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> iptables -I INPUT -p tcp --dport 8489 -j ACCEPT</span><br></pre></td></tr></table></figure><p>至此，服务器端的 Shadowsocks 安装和配置完毕。</p><h2 id="6-shadowsocks客户端配置"><a href="#6-shadowsocks客户端配置" class="headerlink" title="6.shadowsocks客户端配置"></a>6.shadowsocks客户端配置</h2><p>shadowsocks客户端配置非常简单，自行百度即可。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前言：&lt;/strong&gt;作为一名IT技术狗，在日常工作学习中，难免会经常使用搜索引擎来搜索技术问题，而众所周知的是百度在技术搜索上就是个笑话，想要快速找到答案还是得靠Google，但是因为某些不可描述的原因，在国内想通过正规途径来访问Google完全是不可能的。&lt;br&gt;那么问题来了，如何通过一些技术小手段来正常访问Google呢？一般来说，常见的方法是通过国外线路的VPN来访问，然而这种情况下有一些使用上的不便。比如说：&lt;em&gt;很多时候在解决问题的时候我们会有这样的需求，一边使用VPN线路通过Google来搜索技术问题同时还需要通过QQ等即时通信软件与同事朋友交流沟通，此时因为我们通过VPN线路来上网，那么就会出现QQ异地登录警告，严重时腾讯会直接将QQ冻结&lt;/em&gt;。所以，对于日常工作来说，我认为VPN太重，我们需要一个轻量级的工具仅需能够代理浏览器的请求即可，那么这时shadowsocks就是最好的选择了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-安装python-pip&quot;&gt;&lt;a href=&quot;#1-安装python-pip&quot; class=&quot;headerlink&quot; title=&quot;1.安装python-pip&quot;&gt;&lt;/a&gt;1.安装python-pip&lt;/h2&gt;&lt;p&gt;Pip是安装Python包的工具，提供了安装、列举已安装包、升级以及卸载包的功能。Pip 是对easy_install的取代，提供了和easy_install相同的查找包的功能，因此可以使用easy_install安装的包也同样可以使用pip进行安装。&lt;br&gt;目前有很多Python程序都是可以直接通过Pip来一键安装了，比如众所周知的Django、Markdown、Shadowsocks等。&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; yum install -y python-pip&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
    
      <category term="Centos" scheme="https://www.lucissfer.com/tags/Centos/"/>
    
      <category term="shadowsocks" scheme="https://www.lucissfer.com/tags/shadowsocks/"/>
    
      <category term="科学上网" scheme="https://www.lucissfer.com/tags/%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/"/>
    
  </entry>
  
  <entry>
    <title>MySQL 5.6单机多实例配置</title>
    <link href="https://www.lucissfer.com/2016/09/28/MySQL%205.6+%E5%8D%95%E6%9C%BA%E5%A4%9A%E5%AE%9E%E4%BE%8B/"/>
    <id>https://www.lucissfer.com/2016/09/28/MySQL 5.6+单机多实例/</id>
    <published>2016-09-27T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.157Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>前言：</strong>因为所在公司是小公司，经费有限，所以线下测试服务器数量不足。一直以来，开发与测试都是公用一套MySQL环境，然而由于开发与数据对于MySQL数据的需求不完全一致，导致日常工作中经常出现数据干扰，影响工作。因此，为了提高工作效率，决定将开发与测试的MySQL环境分离，然而当前手上只有一台服务器，条件有限，所以只能部署MySQL单机多实例。<br>MySQL服务器环境：Centos 7.1 + MySQL 5.6.24</p></blockquote><ol><li>创建数据目录</li></ol><hr><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> mkdir -p /data/mysql /data/mysql2</span><br></pre></td></tr></table></figure><ol start="2"><li>初始化数据库</li></ol><hr><figure class="highlight shell"><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="meta">#</span> scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql</span><br><span class="line"><span class="meta">#</span> scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql2 --user=mysql</span><br></pre></td></tr></table></figure><ol start="3"><li>生成MySQL多实例配置文件</li></ol><hr><figure class="highlight shell"><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="meta">#</span> mysqld_multi --example &gt; /data/multi.cnf</span><br><span class="line"><span class="meta">#</span> chown mysql.mysql multi.cnf</span><br></pre></td></tr></table></figure><p>此处，我们采用的MySQL的官方解决方案mysqld_multi来实现。</p><a id="more"></a><ol start="4"><li>配置MySQL多实例配置文件</li></ol><hr><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> vim multi.cnf</span><br><span class="line"></span><br><span class="line">[mysqld_multi]</span><br><span class="line">mysqld     = /usr/local/mysql/bin/mysqld_safe</span><br><span class="line">mysqladmin = /usr/local/mysql/bin/mysqladmin</span><br><span class="line">user       = multi_admin</span><br><span class="line">password   = password</span><br><span class="line"><span class="meta">#</span>这个用户应该有关机权限，然后没有其他的权限。建议创建一个通用的multi_admin用户控制其它的MySQL用户，例如</span><br><span class="line"><span class="meta">#</span>GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'password'</span><br><span class="line"></span><br><span class="line">[mysqld1]</span><br><span class="line">character_set_server =utf8</span><br><span class="line">socket     = /tmp/mysql.sock1</span><br><span class="line">port       = 3306</span><br><span class="line">pid-file   = /data/mysql/hostname.pid1</span><br><span class="line">datadir    = /data/mysql</span><br><span class="line">log-error = /data/mysql/log/mysql_run.err</span><br><span class="line"><span class="meta">#</span>language   = /usr/local/mysql/share/mysql/english</span><br><span class="line"><span class="meta">#</span>user       = mysql</span><br><span class="line"></span><br><span class="line">slow_query_log=1</span><br><span class="line">long_query_time=2</span><br><span class="line">max_connections = 3000</span><br><span class="line">log_bin_trust_function_creators=1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">[mysqld2]</span><br><span class="line">character_set_server =utf8</span><br><span class="line">socket     = /tmp/mysql.sock2</span><br><span class="line">port       = 3307</span><br><span class="line">pid-file   = /data/mysql2/hostname.pid2</span><br><span class="line">datadir    = /data/mysql2</span><br><span class="line">log-error = /data/mysql2/log/mysql_run.err</span><br><span class="line"><span class="meta">#</span>language   = /usr/local/mysql/share/mysql/english</span><br><span class="line"><span class="meta">#</span>user       = mysql</span><br><span class="line"></span><br><span class="line">slow_query_log=1</span><br><span class="line">long_query_time=2</span><br><span class="line">max_connections = 3000</span><br><span class="line"><span class="meta">#</span>log_bin_trust_function_creators=1</span><br></pre></td></tr></table></figure><ol start="5"><li>启动、关闭MySQL数据库多实例</li></ol><hr><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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="meta">#</span> mysqld_multi --defaults-file=/data/multi.cnf start 1,2</span><br><span class="line">启动时需指定multi.cnf配置文件。</span><br><span class="line"></span><br><span class="line">如果只需要启动实例mysqld1，仅需</span><br><span class="line"><span class="meta">#</span> mysqld_multi --defaults-file=/data/multi.cnf start 1</span><br><span class="line"></span><br><span class="line">关闭多个实例</span><br><span class="line"><span class="meta">#</span> /usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/data/multi.cnf --user=mysql_admin --password=password stop 1,2</span><br><span class="line"></span><br><span class="line">关闭单个实例</span><br><span class="line"><span class="meta">#</span> /usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/data/multi.cnf --user=mysql_admin --password=password stop 1</span><br></pre></td></tr></table></figure><ol start="6"><li>配置管理脚本</li></ol><hr><p>为了管理方便，写一个简单的管理脚本。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> vim /etc/init.d/mysql_multi</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span>!/bin/bash</span><br><span class="line"><span class="meta">#</span></span><br><span class="line">basedir=/usr/local/mysql</span><br><span class="line">bindir=/usr/local/mysql/bin</span><br><span class="line">conf=/data/multi.cnf</span><br><span class="line">user=multi_admin</span><br><span class="line">password=password</span><br><span class="line"></span><br><span class="line">export PATH=$bindir:/$PATH</span><br><span class="line">if test -x $bindir/mysqld_multi</span><br><span class="line">then</span><br><span class="line">  mysqld_multi="$bindir/mysqld_multi";</span><br><span class="line">else</span><br><span class="line">  echo "Can't execute $bindir/mysqld_multi from dir $basedir";</span><br><span class="line">  exit;</span><br><span class="line">fi</span><br><span class="line">case "$1" in</span><br><span class="line">    'start' )</span><br><span class="line">        "$mysqld_multi" --defaults-extra-file=$conf --user=$user --password=$password start $2</span><br><span class="line">        ;;</span><br><span class="line">    'stop' )</span><br><span class="line">        "$mysqld_multi" --defaults-extra-file=$conf --user=$user --password=$password stop $2</span><br><span class="line">        ;;</span><br><span class="line">    'report' )</span><br><span class="line">        "$mysqld_multi" --defaults-extra-file=$conf --user=$user --password=$password report $2</span><br><span class="line">        ;;</span><br><span class="line">    'restart' )</span><br><span class="line">        "$mysqld_multi" --defaults-extra-file=$conf --user=$user --password=$password stop $2</span><br><span class="line">        "$mysqld_multi" --defaults-extra-file=$conf --user=$user --password=$password start $2</span><br><span class="line">        ;;</span><br><span class="line">    *)</span><br><span class="line">        echo "Usage: $0 &#123;start|stop|report|restart&#125;" &gt;&amp;2</span><br><span class="line">        ;;</span><br><span class="line">esac</span><br></pre></td></tr></table></figure><ol start="7"><li>多实例MySQL登录</li></ol><hr><p>因为我们配置了多实例，在配置文件中指定了不同的sock文件，因此在服务器本地登录MySQL时需要指定sock文件。</p><figure class="highlight shell"><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="meta">#</span> mysql -uroot -p -S /tmp/mysql.sock1</span><br><span class="line"><span class="meta">#</span> mysql -uroot -p -S /tmp/mysql.sock2</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前言：&lt;/strong&gt;因为所在公司是小公司，经费有限，所以线下测试服务器数量不足。一直以来，开发与测试都是公用一套MySQL环境，然而由于开发与数据对于MySQL数据的需求不完全一致，导致日常工作中经常出现数据干扰，影响工作。因此，为了提高工作效率，决定将开发与测试的MySQL环境分离，然而当前手上只有一台服务器，条件有限，所以只能部署MySQL单机多实例。&lt;br&gt;MySQL服务器环境：Centos 7.1 + MySQL 5.6.24&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;创建数据目录&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; mkdir -p /data/mysql /data/mysql2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;初始化数据库&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql2 --user=mysql&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;生成MySQL多实例配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; mysqld_multi --example &amp;gt; /data/multi.cnf&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; chown mysql.mysql multi.cnf&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;此处，我们采用的MySQL的官方解决方案mysqld_multi来实现。&lt;/p&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="MySQL" scheme="https://www.lucissfer.com/categories/Linux/MySQL/"/>
    
    
      <category term="MySQL5.6" scheme="https://www.lucissfer.com/tags/MySQL5-6/"/>
    
      <category term="单机多实例" scheme="https://www.lucissfer.com/tags/%E5%8D%95%E6%9C%BA%E5%A4%9A%E5%AE%9E%E4%BE%8B/"/>
    
  </entry>
  
  <entry>
    <title>MySQL 5.7源码编译安装几处变化</title>
    <link href="https://www.lucissfer.com/2016/09/27/MySQL%205.7+%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E5%8F%98%E5%8C%96/"/>
    <id>https://www.lucissfer.com/2016/09/27/MySQL 5.7+源码编译变化/</id>
    <published>2016-09-26T16:00:00.000Z</published>
    <updated>2018-03-15T03:25:49.157Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>前言</strong>：因为之前blog一直放在朋友的vps上，一来管理不便，二来也麻烦人。于是，花了点小钱在XX主机买了一个香港VPS，然后就准备开始部署blog环境。部署MySQL的时候，想尝尝鲜，就下载了最新的MySQL5.7.15源码编译安装，在编译安装的过程中踩了不少坑。究其主要原因，还是因为MySQL5.7相对于前面的版本做了一些小改动，在编译安装的过程中有一些变化，在此就将我遇到的坑整理出来与大家分享分享。</p></blockquote><p><strong>CMAKE版本</strong><br>在MySQL的源码编译安装过程中需要使用cmake来安装，而在MySQL5.7的编译安装过程中要求cmake版本最低为2.8，如果版本低于2.8则需要升级cmake版本。</p><p>查询版本命令：</p><figure class="highlight shell"><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">#</span> cmake --version</span><br><span class="line">cmake version 3.6.2</span><br><span class="line">CMake suite maintained and supported by Kitware (kitware.com/cmake)</span><br></pre></td></tr></table></figure><p>升级cmake有两种方法，可以直接使用yum工具来升级，也可以直接去cmake官网下载源码包然后编译安装。目前常见yum源中的cmake版本都在2.8.X，这里就不细说了，简单说下如何编译安装cmake。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><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">#</span> wget https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz</span><br><span class="line"><span class="meta">#</span> tar zxvf cmake-3.6.2.tar.gz</span><br><span class="line"><span class="meta">#</span> cd cmake-3.6.2</span><br><span class="line"><span class="meta">#</span> ./bootstrap</span><br><span class="line"><span class="meta">#</span> make &amp;&amp; make install</span><br><span class="line"><span class="meta">#</span> cmake --version</span><br><span class="line">cmake version 3.6.2</span><br></pre></td></tr></table></figure><p>如果上述编译安装过程中报错，先检查是否安装gcc库。</p><a id="more"></a><p><strong>Boost库支持</strong><br>MySQL5.7的编译安装过程需要boost类库支持，可以直接在CMAKE编译参数中指定下载，也可以下载到指定目录，然后在CMAKE编译参数中指定boost位置。</p><p>CMAKE编译参数中指定下载</p><figure class="highlight shell"><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">#</span> cmake ............</span><br><span class="line">    -DDOWNLOAD_BOOST=1\    #指定是否下载boost</span><br><span class="line">    -DWITH_BOOST=/usr/local/boost  #指定boost位置</span><br></pre></td></tr></table></figure><p>不过依据我多次编译MySQL5.7的经验，在CMAKE编译参数中指定下载boost会因为网络原因出现错误，最好还是直接下载到服务器，然后编译安装时指定目录。</p><p>直接下载boost到服务器并在编译安装时指定目录</p><figure class="highlight shell"><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">#</span> wget -o /usr/local/boost/boost_1_59_0.tar.gz http://ncu.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz</span><br><span class="line"><span class="meta">#</span> cmake ............</span><br><span class="line">    -DWITH_BOOST=/usr/local/boost  #指定boost位置</span><br></pre></td></tr></table></figure><p>此处下载完成后无需解压，MySQL在CMAKE编译配置时会自动解压。</p><p><strong>MySQL初始化数据库</strong><br>MySQL5.7跟以前版本的MySQL在编译安装过程中最大的变化还是初始化数据库不再使用scripts/mysql_install_db脚本来实现，而是直接使用bin/mysqld指定–initialize参数来实现。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span> bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/</span><br></pre></td></tr></table></figure><p><strong>MySQL5.7数据库初始密码</strong><br>在MySQL5.7版本以前，编译安装完成MySQL后，首次登录无需密码，而在MySQL5.7中，在编译安装完成，初始化MySQL数据库时会生成一个随机密码，首次登录需使用随机密码。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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">#</span> bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/</span><br><span class="line">2016-09-27T08:45:57.023651Z 1 [Note] A temporary password is generated for root@localhost: dh9&gt;qmyaBIZe</span><br><span class="line"></span><br><span class="line">修改root密码</span><br><span class="line"><span class="meta">#</span> mysqladmin -uroot password 'password' -p'dh9&gt;qmyaBIZe'</span><br></pre></td></tr></table></figure><p>大体上，MySQL5.7与以前版本的在编译安装过程中就这几处变化，其他的与之前版本的编译安装过程无异，仅供参考，如有不同意见，欢迎补充。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;：因为之前blog一直放在朋友的vps上，一来管理不便，二来也麻烦人。于是，花了点小钱在XX主机买了一个香港VPS，然后就准备开始部署blog环境。部署MySQL的时候，想尝尝鲜，就下载了最新的MySQL5.7.15源码编译安装，在编译安装的过程中踩了不少坑。究其主要原因，还是因为MySQL5.7相对于前面的版本做了一些小改动，在编译安装的过程中有一些变化，在此就将我遇到的坑整理出来与大家分享分享。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CMAKE版本&lt;/strong&gt;&lt;br&gt;在MySQL的源码编译安装过程中需要使用cmake来安装，而在MySQL5.7的编译安装过程中要求cmake版本最低为2.8，如果版本低于2.8则需要升级cmake版本。&lt;/p&gt;
&lt;p&gt;查询版本命令：&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; cmake --version&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;cmake version 3.6.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;CMake suite maintained and supported by Kitware (kitware.com/cmake)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;升级cmake有两种方法，可以直接使用yum工具来升级，也可以直接去cmake官网下载源码包然后编译安装。目前常见yum源中的cmake版本都在2.8.X，这里就不细说了，简单说下如何编译安装cmake。&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; wget https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; tar zxvf cmake-3.6.2.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; cd cmake-3.6.2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; ./bootstrap&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; make &amp;amp;&amp;amp; make install&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;#&lt;/span&gt; cmake --version&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;cmake version 3.6.2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;如果上述编译安装过程中报错，先检查是否安装gcc库。&lt;/p&gt;
    
    </summary>
    
      <category term="Linux" scheme="https://www.lucissfer.com/categories/Linux/"/>
    
      <category term="MySQL" scheme="https://www.lucissfer.com/categories/Linux/MySQL/"/>
    
    
      <category term="MySQL5.7" scheme="https://www.lucissfer.com/tags/MySQL5-7/"/>
    
      <category term="源码编译变化" scheme="https://www.lucissfer.com/tags/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E5%8F%98%E5%8C%96/"/>
    
  </entry>
  
</feed>
