<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>服务器安全维护工作室 &#187; 阿里云代维</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e9%98%bf%e9%87%8c%e4%ba%91%e4%bb%a3%e7%bb%b4/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>标准化商品数据迁移仅迁移数据库</title>
		<link>https://www.fuwuqiok.com/%e6%a0%87%e5%87%86%e5%8c%96%e5%95%86%e5%93%81%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%bb%85%e8%bf%81%e7%a7%bb%e6%95%b0%e6%8d%ae%e5%ba%93/</link>
		<comments>https://www.fuwuqiok.com/%e6%a0%87%e5%87%86%e5%8c%96%e5%95%86%e5%93%81%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%bb%85%e8%bf%81%e7%a7%bb%e6%95%b0%e6%8d%ae%e5%ba%93/#comments</comments>
		<pubDate>Mon, 17 Feb 2020 13:44:43 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[标准化数据迁移]]></category>
		<category><![CDATA[云主机代维]]></category>
		<category><![CDATA[云服务器专业安全代维]]></category>
		<category><![CDATA[代理维护服务器]]></category>
		<category><![CDATA[代维服务器]]></category>
		<category><![CDATA[承接网站和服务器代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[标准化商品数据迁移仅迁移数据库]]></category>
		<category><![CDATA[运维外包服务]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=4035</guid>
		<description><![CDATA[<p>标准化商品数据迁移仅迁移数据库 通过远程方式协助用户将云下的数据库，迁移至阿里云服务器，让用户网站上云过程变的 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%a0%87%e5%87%86%e5%8c%96%e5%95%86%e5%93%81%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%bb%85%e8%bf%81%e7%a7%bb%e6%95%b0%e6%8d%ae%e5%ba%93/">标准化商品数据迁移仅迁移数据库</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h1 class="view-title"><span data-spm-anchor-id="5176.730006-52734001-52738004-cmfw011257.content.i0.536545d9fTXBN4">标准化商品数据迁移仅迁移数据库</span></h1>
<p class="product-head-desccription" data-spm-anchor-id="5176.730006-52734001-52738004-cmfw011257.content.i2.536545d9fTXBN4">通过远程方式协助用户将云下的数据库，迁移至阿里云服务器，让用户网站上云过程变的更加简单。</p>
<p class="product-head-desccription" data-spm-anchor-id="5176.730006-52734001-52738004-cmfw011257.content.i2.536545d9fTXBN4">
<div class="box-icon">
<div class="element">
<div class="r-product-detail">
<div class="d-item rich-text">
<h2 data-spm-anchor-id="5176.730006-52734001-52738004-cmfw011257.content.i3.536545d9fTXBN4">产品亮点</h2>
<div>该服务由阿里云区域服务提供商，通过远程方式协助用户将云下的数据库，迁移至阿里云服务器，并进行数据核对及数据库环境架设，让用户网站上云过程变的更加简单。</div>
</div>
<div class="d-item rich-text">
<h2>产品说明</h2>
<div>
<table>
<tbody>
<tr>
<td><strong>服务流程</strong></td>
<td>提交订单 -&gt; 付款 -&gt; 提交服务需求 -&gt; 开始服务 -&gt; 服务结果确认</td>
</tr>
<tr>
<td><strong>适用场景</strong></td>
<td>该服务由阿里云区域服务提供商，通过远程方式协助用户将云下的数据库，迁移至阿里云服务器，并进行数据库环境搭建和设置，让用户网站上云过程变的更加简单。</td>
</tr>
<tr>
<td><strong>服务对象</strong></td>
<td>希望将数据库无损迁移到阿里云服务器 ECS，并需要由专业工程师协助迁移实施的用户。</td>
</tr>
<tr>
<td><strong>服务标准</strong></td>
<td>1）数据库迁移</p>
<p>协助用户将数据库迁移至阿里云服务器。</p>
<p>2）数据库基础环境配置服务</p>
<p>根据用户原有的数据库环境，协助用户对阿里云服务器进行数据库环境搭建（如MSSQL、MYSQL等），以帮助用户完成网站上云迁移的基础配置操作。</p>
<p>3）按照客户要求迁移完毕，数据放到指定位置，数据库可以正常访问</td>
</tr>
<tr>
<td><strong>服务注意</strong><strong>事</strong><strong>项</strong></td>
<td>1) 该数据迁移服务仅支持同系统、同版本迁移操作，暂不支持跨系统与跨版本迁移。</p>
<p>2) 在服务过程中，如有关于用户的机密信息沟通（如云账号、密码等），建议用户在服务结束后及时进行机密信息变更。</p>
<p>3) 该服务交付完成后，如用户未及时进行服务验收，服务流程将在服务完成之日起的7个工作日内关闭，并视为用户已对服务结果无异议。</p>
<p>4) 服务操作过程中需要用户全程及时配合，否则可能导致交付周期的延迟。</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="d-item broderno">
<h2>产品参数</h2>
<table class="param-table" width="100%">
<tbody>
<tr>
<td class="title borderleft" width="20%">适用系统版本</td>
<td class="borderright pl20" width="80%">Windows,Linux</td>
</tr>
<tr>
<td class="title borderleft" width="20%">交付方式</td>
<td class="borderright pl20" width="80%">人工服务</td>
</tr>
<tr>
<td class="title borderleft" width="20%">依托云产品</td>
<td class="borderright pl20" width="80%">云服务器</td>
</tr>
<tr>
<td class="title borderleft" width="20%">质保时间</td>
<td class="borderright pl20" width="80%">7天</td>
</tr>
<tr>
<td class="title borderleft" width="20%">交付时间</td>
<td class="borderright pl20" width="80%">3工作日</td>
</tr>
</tbody>
</table>
</div>
<div class="d-item rich-text"></div>
</div>
</div>
</div>
<div class="box-icon"></div>
<div class="box-icon">
<div class="element">
<div class="d-item">
<h2>产品价格</h2>
<table class="param-table price-table module-table" width="100%">
<thead>
<tr>
<td>版本名称</td>
<td>计费项</td>
<td>新购</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="1">数据量≤10G</td>
<td>版本基础价格</td>
<td>3000元</td>
</tr>
<tr>
<td rowspan="1">10G＜数据量≤20G</td>
<td>版本基础价格</td>
<td>3600元</td>
</tr>
<tr>
<td rowspan="1">20G＜数据量≤50G</td>
<td>版本基础价格</td>
<td>4000元</td>
</tr>
<tr>
<td rowspan="1">50G＜数据量≤100G</td>
<td>版本基础价格</td>
<td>4500元</td>
</tr>
<tr>
<td rowspan="1" data-spm-anchor-id="5176.730006-52734001-52738004-cmfw011257.content.i4.536545d9fTXBN4">100G＜数据量≤200G</td>
<td>版本基础价格</td>
<td>5000元</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="box-icon">
<div class="element">
<div class="d-item">
<h2></h2>
</div>
</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%a0%87%e5%87%86%e5%8c%96%e5%95%86%e5%93%81%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%bb%85%e8%bf%81%e7%a7%bb%e6%95%b0%e6%8d%ae%e5%ba%93/">标准化商品数据迁移仅迁移数据库</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e6%a0%87%e5%87%86%e5%8c%96%e5%95%86%e5%93%81%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%bb%85%e8%bf%81%e7%a7%bb%e6%95%b0%e6%8d%ae%e5%ba%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索</title>
		<link>https://www.fuwuqiok.com/%e5%bc%80%e6%ba%90%e5%88%86%e5%b8%83%e5%bc%8f%e6%90%9c%e7%b4%a2%e5%b9%b3%e5%8f%b0elkelasticsearchlogstashkibanaredissyslog-ng%e5%ae%9e%e7%8e%b0%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e6%90%9c/</link>
		<comments>https://www.fuwuqiok.com/%e5%bc%80%e6%ba%90%e5%88%86%e5%b8%83%e5%bc%8f%e6%90%9c%e7%b4%a2%e5%b9%b3%e5%8f%b0elkelasticsearchlogstashkibanaredissyslog-ng%e5%ae%9e%e7%8e%b0%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e6%90%9c/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 13:33:01 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2876</guid>
		<description><![CDATA[<p>logstash + elasticsearch + Kibana+Redis+Syslog-ng Elast [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%bc%80%e6%ba%90%e5%88%86%e5%b8%83%e5%bc%8f%e6%90%9c%e7%b4%a2%e5%b9%b3%e5%8f%b0elkelasticsearchlogstashkibanaredissyslog-ng%e5%ae%9e%e7%8e%b0%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e6%90%9c/">开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>logstash + elasticsearch + Kibana+Redis+Syslog-ng</p>
<p>ElasticSearch是一个基于Lucene构建的开源，分布式，RESTful搜索引擎。设计用于云计算中，能够达到实时搜索，稳定，可靠，快速，安装使用方便。支持通过HTTP使用JSON进行数据索引。</p>
<p>logstash是一个应用程序日志、事件的传输、处理、管理和搜索的平台。你可以用它来统一对应用程序日志进行收集管理，提供 Web 接口用于查询和统计。其实logstash是可以被别的替换，比如常见的fluented</p>
<p>Kibana是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。</p>
<p>Redis是一个高性能的内存key-value数据库,非必需安装,可以防止数据丢失.<br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/kibana.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/kibana.jpg" alt="kibana" width="536" height="177" /></a><br />
参考:<br />
http://www.logstash.net/<br />
http://chenlinux.com/2012/10/21/elasticearch-simple-usage/<br />
http://www.elasticsearch.cn<br />
http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz?AuthParam=1408083909_3bf5b46169faab84d36cf74407132bba<br />
http://curran.blog.51cto.com/2788306/1263416<br />
http://storysky.blog.51cto.com/628458/1158707/<br />
http://zhumeng8337797.blog.163.com/blog/static/10076891420142712316899/<br />
http://enable.blog.51cto.com/747951/1049411<br />
http://chenlinux.com/2014/06/11/nginx-access-log-to-elasticsearch/<br />
http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B3%E5%8F%B0elkelasticsearchlogstashkibana%E5%85%A5%E9%97%A8%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90%E7%B4%A2%E5%BC%95<br />
http://woodygsd.blogspot.com/2014/06/an-adventure-with-elk-or-how-to-replace.html<br />
http://www.ricardomartins.com.br/enviando-dados-externos-para-a-stack-elk/<br />
http://tinytub.github.io/logstash-install.html</p>
<p>http://jamesmcfadden.co.uk/securing-elasticsearch-with-nginx/<br />
https://github.com/elasticsearch/logstash/blob/master/patterns/grok-patterns<br />
http://zhaoyanblog.com/archives/319.html<br />
http://www.vpsee.com/2014/05/install-and-play-with-elasticsearch/</p>
<p>ip说明<br />
118.x.x.x/16 为客户端ip<br />
192.168.0.39和61.x.x.x为ELK的内网和外网ip</p>
<h1>安装JDK</h1>
<p>http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">tar zxvf jdk-7u67-linux-x64.tar.gz\?AuthParam\=1408083909_3bf5b46169faab84d36cf74407132b</li>
<li>mv jdk1.7.0_67 /usr/local/</li>
<li>cd /usr/local/</li>
<li>ln -s jdk1.7.0_67 jdk</li>
<li>chown -R root:root jdk/</li>
</ol>
</div>
<p><strong>配置环境变量</strong><br />
vi /etc/profile</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">export JAVA_HOME=/usr/local/jdk</li>
<li>export JRE_HOME=$JAVA_HOME/jre</li>
<li>export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH</li>
<li>export PATH=$JAVA_HOME/bin:$PATH</li>
<li>export REDIS_HOME=/usr/local/redis</li>
<li>export ES_HOME=/usr/local/elasticsearch</li>
<li>export ES_CLASSPATH=$ES_HOME/config</li>
</ol>
</div>
<p><strong>变量生效</strong><br />
source /etc/profile</p>
<p><strong>验证版本</strong><br />
java -version</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">java version &#8220;1.7.0_67&#8243;</li>
<li>Java(TM) SE Runtime Environment (build 1.7.0_67-b01)</li>
<li>Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)</li>
</ol>
</div>
<p>如果之前安装过java,可以先卸载<br />
rpm -qa |grep java<br />
java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5<br />
java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5</p>
<p>rpm -e java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5 java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5</p>
<h1>安装redis</h1>
<p>http://redis.io/</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget http://download.redis.io/releases/redis-2.6.17.tar.gz</li>
<li>tar zxvf redis-2.6.17.tar.gz</li>
<li>mv redis-2.6.17 /usr/local/</li>
<li>cd /usr/local</li>
<li>ln -s redis-2.6.17 redis</li>
<li>cd /usr/local/redis</li>
<li>make</li>
<li>make install</li>
</ol>
</div>
<p>cd utils<br />
./install_server.sh</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">Please select the redis port for this instance: [6379]</li>
<li>Selecting default: 6379</li>
<li>Please select the redis config file name [/etc/redis/6379.conf]</li>
<li>Selected default &#8211; /etc/redis/6379.conf</li>
<li>Please select the redis log file name [/var/log/redis_6379.log]</li>
<li>Selected default &#8211; /var/log/redis_6379.log</li>
<li>Please select the data directory for this instance [/var/lib/redis/6379]</li>
<li>Selected default &#8211; /var/lib/redis/6379</li>
<li>Please select the redis executable path [/usr/local/bin/redis-server]</li>
</ol>
</div>
<p><strong>编辑配置文件</strong><br />
vi /etc/redis/6379.conf</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">daemonize yes</li>
<li>port 6379</li>
<li>timeout 300</li>
<li>tcp-keepalive 60</li>
</ol>
</div>
<p><strong>启动</strong><br />
/etc/init.d/redis_6379 start</p>
<p>exists, process is already running or crashed<br />
如报这个错,需要编辑下/etc/init.d/redis_6379,去除头上的\n</p>
<p><strong>加入自动启动</strong><br />
chkconfig –add redis_6379</p>
<h1>安装Elasticsearch</h1>
<p>http://www.elasticsearch.org/<br />
http://www.elasticsearch.cn<br />
集群安装只要节点在同一网段下，设置一致的cluster.name，启动的Elasticsearch即可相互检测到对方，组成集群</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.tar.gz</li>
<li>tar zxvf elasticsearch-1.3.2.tar.gz</li>
<li>mv elasticsearch-1.3.2 /usr/local/</li>
<li>cd /usr/local/</li>
<li>ln -s elasticsearch-1.3.2 elasticsearch</li>
<li>elasticsearch/bin/elasticsearch -f</li>
</ol>
</div>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">[2014-08-20 13:19:05,710][INFO ][node                     ] [Jackpot] version[1.3.2], pid[19320], build[dee175d/2014-08-13T14:29:30Z]</li>
<li>[2014-08-20 13:19:05,727][INFO ][node                     ] [Jackpot] initializing &#8230;</li>
<li>[2014-08-20 13:19:05,735][INFO ][plugins                  ] [Jackpot] loaded [], sites []</li>
<li>[2014-08-20 13:19:10,722][INFO ][node                     ] [Jackpot] initialized</li>
<li>[2014-08-20 13:19:10,723][INFO ][node                     ] [Jackpot] starting &#8230;</li>
<li>[2014-08-20 13:19:10,934][INFO ][transport                ] [Jackpot] bound_address {inet[/0.0.0.0:9301]}, publish_address {inet[/61.x.x.x:9301]}</li>
<li>[2014-08-20 13:19:10,958][INFO ][discovery                ] [Jackpot] elasticsearch/5hUOX-2ES82s_0zvI9BUdg</li>
<li>[2014-08-20 13:19:14,011][INFO ][cluster.service          ] [Jackpot] new_master [Jackpot][5hUOX-2ES82s_0zvI9BUdg][Impala][inet[/61.x.x.x:9301]], reason: zen-disco-join (elected_as_master)</li>
<li>[2014-08-20 13:19:14,060][INFO ][http                     ] [Jackpot] bound_address {inet[/0.0.0.0:9201]}, publish_address {inet[/61.x.x.x:9201]}</li>
<li>[2014-08-20 13:19:14,061][INFO ][node                     ] [Jackpot] started</li>
<li>[2014-08-20 13:19:14,106][INFO ][gateway                  ] [Jackpot] recovered [0] indices into cluster_state</li>
<li></li>
<li></li>
<li>[2014-08-20 13:20:58,273][INFO ][node                     ] [Jackpot] stopping &#8230;</li>
<li>[2014-08-20 13:20:58,323][INFO ][node                     ] [Jackpot] stopped</li>
<li>[2014-08-20 13:20:58,323][INFO ][node                     ] [Jackpot] closing &#8230;</li>
<li>[2014-08-20 13:20:58,332][INFO ][node                     ] [Jackpot] closed</li>
</ol>
</div>
<p>ctrl+c退出</p>
<p><strong>以后台方式运行</strong><br />
elasticsearch/bin/elasticsearch -d</p>
<p><strong>访问默认的9200端口</strong><br />
curl -X GET http://localhost:9200</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">{</li>
<li>  &#8220;status&#8221; : 200,</li>
<li>  &#8220;name&#8221; : &#8220;Steve Rogers&#8221;,</li>
<li>  &#8220;version&#8221; : {</li>
<li>    &#8220;number&#8221; : &#8220;1.3.2&#8221;,</li>
<li>    &#8220;build_hash&#8221; : &#8220;dee175dbe2f254f3f26992f5d7591939aaefd12f&#8221;,</li>
<li>    &#8220;build_timestamp&#8221; : &#8220;2014-08-13T14:29:30Z&#8221;,</li>
<li>    &#8220;build_snapshot&#8221; : false,</li>
<li>    &#8220;lucene_version&#8221; : &#8220;4.9&#8221;</li>
<li>  },</li>
<li>  &#8220;tagline&#8221; : &#8220;You Know, for Search&#8221;</li>
<li>}</li>
</ol>
</div>
<h1>安装logstash</h1>
<p>http://logstash.net/</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget https://download.elasticsearch.org/logstash/logstash/logstash-1.4.2.tar.gz</li>
<li>tar zxvf logstash-1.4.2.tar.gz</li>
<li>mv logstash-1.4.2 /usr/local</li>
<li>cd /usr/local</li>
<li>ln -s logstash-1.4.2 logstash</li>
<li>mkdir logstash/conf</li>
<li>chown -R root:root logstash</li>
</ol>
</div>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/logstash.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/logstash.png" alt="logstash" width="304" height="486" /></a></p>
<p>因为java的默认heap size,回收机制等原因,logstash从1.4.0开始不再使用jar运行方式.<br />
以前方式:<br />
java -jar logstash-1.3.3-flatjar.jar agent -f logstash.conf<br />
现在方式:<br />
bin/logstash agent -f logstash.conf</p>
<p>logstash下载即可使用，命令行参数可以参考logstash flags，主要有<br />
http://logstash.net/docs/1.2.1/flags</p>
<h1>安装kibana</h1>
<p>logstash的最新版已经内置kibana，你也可以单独部署kibana。kibana3是纯粹JavaScript+html的客户端，所以可以部署到任意http服务器上。<br />
http://www.elasticsearch.org/overview/elkdownloads/</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.0.tar.gz</li>
<li>tar zxvf kibana-3.1.0.tar.gz</li>
<li>mv kibana-3.1.0 /opt/htdocs/www/kibana</li>
<li>vi /opt/htdocs/www/kibana/config.js</li>
</ol>
</div>
<p>配置elasticsearch源<br />
elasticsearch: “http://”+window.location.hostname+”:9200″,</p>
<p><strong>加入iptables</strong><br />
6379为redis端口,9200为elasticsearch端口,118.x.x.x/16为当前测试时的客户端ip</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">iptables -A INPUT -p tcp -m tcp -s 118.x.x.x/16 &#8211;dport 9200 &#8211;j ACCEPT</li>
</ol>
</div>
<p><strong>测试运行前端输出</strong><br />
bin/logstash -e ‘input { stdin { } } output { stdout {} }’</p>
<p><strong>输入hello测试 </strong><br />
2014-08-20T05:17:02.876+0000 Impala hello</p>
<p><strong>测试运行输出到后端</strong><br />
bin/logstash -e ‘input { stdin { } } output { elasticsearch { host =&gt; localhost } }’</p>
<p><strong>访问kibana</strong><br />
http://adminimpala.campusapply.com/kibana/index.html#/dashboard/file/default.json<br />
Yes- Great! We have a prebuilt dashboard: (<a href="http://adminimpala.campusapply.com/kibana/index.html#/dashboard/file/logstash.json">Logstash Dashboard</a>). See the note to the right about making it your global default</p>
<p>No results There were no results because no indices were found that match your selected time span</p>
<p><strong>设置kibana读取源</strong><br />
在kibana的右上角有个 configure dashboard,再进入Index Settings<br />
[logstash-]YYYY.MM.DD<br />
这个需和logstash的输出保持一致</p>
<p><strong>elasticsearch 跟 MySQL 中定义资料格式的角色关系对照表如下</strong></p>
<p>MySQL elasticsearch<br />
database index<br />
table type</p>
<p>table schema mapping<br />
row document<br />
field field</p>
<h1>ELK整合</h1>
<p><strong>syslog-ng.conf</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">#省略其它内容</li>
<li></li>
<li># Remote logging syslog</li>
<li>source s_remote {</li>
<li>        udp(ip(192.168.0.39) port(514));</li>
<li>};</li>
<li></li>
<li>#nginx log</li>
<li>source s_remotetcp {</li>
<li>        tcp(ip(192.168.0.39) port(514) log_fetch_limit(100) log_iw_size(50000) max-connections(50) );</li>
<li>};</li>
<li></li>
<li>filter f_filter12     { program(&#8216;c1gstudio\.com&#8217;); };</li>
<li></li>
<li>#logstash syslog</li>
<li>destination d_logstash_syslog { udp(&#8220;localhost&#8221; port(10999) localport(10998)  ); };</li>
<li></li>
<li>#logstash web</li>
<li>destination d_logstash_web { tcp(&#8220;localhost&#8221; port(10997) localport(10996) ); };</li>
<li></li>
<li>log { source(s_remote); destination(d_logstash_syslog); };</li>
<li></li>
<li>log { source(s_remotetcp); filter(f_filter12); destination(d_logstash_web); };</li>
</ol>
</div>
<p><strong>logstash_syslog.conf</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">input {</li>
<li>  udp {</li>
<li>    port =&gt; 10999</li>
<li>    type =&gt; syslog</li>
<li>  }</li>
<li>}</li>
<li>filter {</li>
<li>  if [type] == &#8220;syslog&#8221; {</li>
<li>    grok {</li>
<li>      match =&gt; { &#8220;message&#8221; =&gt; &#8220;%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}&#8221; }</li>
<li>      add_field =&gt; [ &#8220;received_at&#8221;, &#8220;%{@timestamp}&#8221; ]</li>
<li>      add_field =&gt; [ &#8220;received_from&#8221;, &#8220;%{host}&#8221; ]</li>
<li>    }</li>
<li>    syslog_pri { }</li>
<li>    date {</li>
<li>      match =&gt; [ &#8220;syslog_timestamp&#8221;, &#8220;MMM  d HH:mm:ss&#8221;, &#8220;MMM dd HH:mm:ss&#8221; ]</li>
<li>    }</li>
<li>  }</li>
<li>}</li>
<li></li>
<li>output {</li>
<li>  elasticsearch {</li>
<li>  host =&gt; localhost</li>
<li>  index =&gt; &#8220;syslog-%{+YYYY}&#8221;</li>
<li>}</li>
<li>}</li>
</ol>
</div>
<p><strong>logstash_redis.conf</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">input {</li>
<li>  tcp {</li>
<li>    port =&gt; 10997</li>
<li>    type =&gt; web</li>
<li>  }</li>
<li>}</li>
<li>filter {</li>
<li>  grok {</li>
<li>    match =&gt; [ &#8220;message&#8221;, &#8220;%{SYSLOGTIMESTAMP:syslog_timestamp} (?:%{SYSLOGFACILITY:syslog_facility} )?%{SYSLOGHOST:syslog_source} %{PROG:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{IPORHOST:clientip} &#8211; (?:%{USER:remote_user}|-) \[%{HTTPDATE:timestamp}\] \&#8221;%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\&#8221; %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) \&#8221;(?:%{URI:http_referer}|-)\&#8221; %{QS:agent} (?:%{IPV4:http_x_forwarded_for}|-)&#8221;]</li>
<li>    remove_field =&gt; [ &#8216;@version&#8217;,&#8217;host&#8217;,&#8217;syslog_timestamp&#8217;,&#8217;syslog_facility&#8217;,&#8217;syslog_pid&#8217;]</li>
<li>  }</li>
<li>  date {</li>
<li>    match =&gt; [ &#8220;timestamp&#8221; , &#8220;dd/MMM/yyyy:HH:mm:ss Z&#8221; ]</li>
<li>  }</li>
<li>   useragent {</li>
<li>        source =&gt; &#8220;agent&#8221;</li>
<li>        prefix =&gt; &#8220;useragent_&#8221;</li>
<li>        remove_field =&gt; [ &#8220;useragent_device&#8221;, &#8220;useragent_major&#8221;, &#8220;useragent_minor&#8221; ,&#8221;useragent_patch&#8221;,&#8221;useragent_os&#8221;,&#8221;useragent_os_major&#8221;,&#8221;useragent_os_minor&#8221;]</li>
<li>    }</li>
<li>   geoip {</li>
<li>        source =&gt; &#8220;clientip&#8221;</li>
<li>        fields =&gt; [&#8220;country_name&#8221;, &#8220;region_name&#8221;, &#8220;city_name&#8221;, &#8220;real_region_name&#8221;, &#8220;latitude&#8221;, &#8220;longitude&#8221;]</li>
<li>        remove_field =&gt; [ &#8220;[geoip][longitude]&#8221;, &#8220;[geoip][latitude]&#8221;,&#8221;location&#8221;,&#8221;region_name&#8221; ]</li>
<li>    }</li>
<li>}</li>
<li></li>
<li>output {</li>
<li>  #stdout { codec =&gt; rubydebug }</li>
<li> redis {</li>
<li> batch =&gt; true</li>
<li> batch_events =&gt; 500</li>
<li> batch_timeout =&gt; 5</li>
<li> host =&gt; &#8220;127.0.0.1&#8221;</li>
<li> data_type =&gt; &#8220;list&#8221;</li>
<li> key =&gt; &#8220;logstash:web&#8221;</li>
<li> workers =&gt; 2</li>
<li> }</li>
<li>}</li>
</ol>
</div>
<p><strong>logstash_web.conf</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">input {</li>
<li>  redis {</li>
<li>    host =&gt; &#8220;127.0.0.1&#8221;</li>
<li>    port =&gt; &#8220;6379&#8221;</li>
<li>    key =&gt; &#8220;logstash:web&#8221;</li>
<li>    data_type =&gt; &#8220;list&#8221;</li>
<li>    codec  =&gt; &#8220;json&#8221;</li>
<li>    type =&gt; &#8220;web&#8221;</li>
<li>  }</li>
<li>}</li>
<li></li>
<li>output {</li>
<li>  elasticsearch {</li>
<li>  flush_size =&gt; 5000</li>
<li>  host =&gt; localhost</li>
<li>  idle_flush_time =&gt; 10</li>
<li>  index =&gt; &#8220;web-%{+YYYY.MM.dd}&#8221;</li>
<li>  }</li>
<li>  #stdout { codec =&gt; rubydebug }</li>
<li>}</li>
</ol>
</div>
<p><strong>启动elasticsearch和logstash</strong><br />
/usr/local/elasticsearch/bin/elasticsearch -d</p>
<p>/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_syslog.conf &amp;<br />
/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_redis.conf &amp;<br />
/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_web.conf &amp;</p>
<p><strong>关闭</strong><br />
ps aux|egrep ‘search|logstash’<br />
kill pid</p>
<p><strong>安装控制器elasticsearch-servicewrapper</strong><br />
如果是在服务器上就可以使用elasticsearch-servicewrapper这个es插件，它支持通过参数，指定是在后台或前台运行es，并且 支持启动，停止，重启es服务（默认es脚本只能通过ctrl+c关闭es）。使用方法是到https://github.com /elasticsearch/elasticsearch-servicewrapper下载service文件夹，放到es的bin目录下。下面是命 令集合：<br />
bin/service/elasticsearch +<br />
console 在前台运行es<br />
start 在后台运行es<br />
stop 停止es<br />
install 使es作为服务在服务器启动时自动启动<br />
remove 取消启动时自动启动</p>
<p>vi /usr/local/elasticsearch/service/elasticsearch.conf<br />
set.default.ES_HOME=/usr/local/elasticsearch</p>
<h1>命令示例</h1>
<p><strong>查看状态</strong><br />
http://61.x.x.x:9200/_status?pretty=true</p>
<p><strong>集群健康查看</strong><br />
http://61.x.x.x:9200/_cat/health?v<br />
epoch timestamp cluster status node.total node.data shards pri relo init unassign<br />
1409021531 10:52:11 elasticsearch yellow 2 1 20 20 0 0 20</p>
<p><strong>列出集群索引</strong><br />
http://61.x.x.x:9200/_cat/indices?v<br />
health index pri rep docs.count docs.deleted store.size pri.store.size<br />
yellow web-2014.08.25 5 1 5990946 0 3.6gb 3.6gb<br />
yellow kibana-int 5 1 2 0 20.7kb 20.7kb<br />
yellow syslog-2014 5 1 709 0 585.6kb 585.6kb<br />
yellow web-2014.08.26 5 1 1060326 0 712mb 712mb</p>
<p><strong>删除索引</strong><br />
curl -XDELETE ‘http://localhost:9200/kibana-int/’<br />
curl -XDELETE ‘http://localhost:9200/logstash-2014.08.*’</p>
<p><strong>优化索引</strong><br />
$ curl -XPOST ‘http://localhost:9200/old-index-name/_optimize’</p>
<p><strong>查看日志</strong><br />
tail /usr/local/elasticsearch/logs/elasticsearch.log</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">2.4mb]-&gt;[2.4mb]/[273mb]}{[survivor] [3.6mb]-&gt;[34.1mb]/[34.1mb]}{[old] [79.7mb]-&gt;[80mb]/[682.6mb]}</li>
<li>[2014-08-26 10:37:14,953][WARN ][monitor.jvm              ] [Red Shift] [gc][young][71044][54078] duration [43s], collections [1]/[46.1s], total [43s]/[26.5m], memory [384.7mb]-&gt;[123mb]/[989.8mb], all_pools {[young] [270.5mb]-&gt;[1.3mb]/[273mb]}{[survivor] [34.1mb]-&gt;[22.3mb]/[34.1mb]}{[old] [80mb]-&gt;[99.4mb]/[682.6mb]}</li>
<li>[2014-08-26 10:38:03,619][WARN ][monitor.jvm              ] [Red Shift] [gc][young][71082][54080] duration [6.6s], collections [1]/[9.1s], total [6.6s]/[26.6m], memory [345.4mb]-&gt;[142.1mb]/[989.8mb], all_pools {[young] [224.2mb]-&gt;[2.8mb]/[273mb]}{[survivor] [21.8mb]-&gt;[34.1mb]/[34.1mb]}{[old] [99.4mb]-&gt;[105.1mb]/[682.6mb]}</li>
<li>[2014-08-26 10:38:10,109][INFO ][cluster.service          ] [Red Shift] removed {[logstash-Impala-26670-2010][av8JOuEoR_iK7ZO0UaltqQ][Impala][inet[/61.x.x.x:9302]]{client=true, data=false},}, reason: zen-disco-node_failed([logstash-Impala-26670-2010][av8JOuEoR_iK7ZO0UaltqQ][Impala][inet[/61.x.x.x:9302]]{client=true, data=false}), reason transport disconnected (with verified connect)</li>
<li>[2014-08-26 10:39:37,899][WARN ][monitor.jvm              ] [Red Shift] [gc][young][71171][54081] duration [3.4s], collections [1]/[4s], total [3.4s]/[26.6m], memory [411.7mb]-&gt;[139.5mb]/[989.8mb], all_pools {[young] [272.4mb]-&gt;[1.5mb]/[273mb]}{[survivor] [34.1mb]-&gt;[29.1mb]/[34.1mb]}{[old] [105.1mb]-&gt;[109mb]/[682.6mb]}</li>
</ol>
</div>
<p><strong>安装bigdesk</strong><br />
要想知道整个插件的列表，请访问http://www.elasticsearch.org/guide/reference/modules /plugins/ 插件还是很多的，个人认为比较值得关注的有以下几个，其他的看你需求，比如你要导入数据当然就得关注river了。</p>
<p>该插件可以查看集群的jvm信息，磁盘IO，索引创建删除信息等，适合查找系统瓶颈，监控集群状态等，可以执行如下命令进行安装，或者访问项目地址:https://github.com/lukas-vlcek/bigdesk</p>
<p>bin/plugin -install lukas-vlcek/bigdesk</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">Downloading &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;DONE</li>
<li>Installed lukas-vlcek/bigdesk into /usr/local/elasticsearch/plugins/bigdesk</li>
<li>Identified as a _site plugin, moving to _site structure &#8230;</li>
</ol>
</div>
<p>cp -ar plugins/bigdesk/_site/ /opt/htdocs/www/bigdesk<br />
<strong>访问</strong><br />
http://localhost/bigdesk</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/bigdesk-2.0.0-SNAPSHOT.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/bigdesk-2.0.0-SNAPSHOT.jpg" alt="bigdesk-2.0.0-SNAPSHOT" width="980" height="763" /></a></p>
<h1>安全优化</h1>
<p>1.安全漏洞,影响ElasticSearch 1.2及以下版本 http://bouk.co/blog/elasticsearch-rce/<br />
/usr/local/elasticsearch/config/elasticsearch.yml<br />
script.disable_dynamic: true</p>
<p>2.如果有多台机器，可以以每台设置n个shards的方式，根据业务情况，可以考虑取消replias<br />
这里设置默认的5个shards, 复制为0，shards定义后不能修改,replicas可以动态修改<br />
/usr/local/elasticsearch/config/elasticsearch.yml<br />
index.number_of_shards: 5<br />
index.number_of_replicas: 0</p>
<p>#定义数据目录(可选)<br />
path.data: /opt/elasticsearch</p>
<p>3.内存适当调大，初始是-Xms256M, 最大-Xmx1G,-Xss256k，<br />
调大后，最小和最大一样，避免GC, 并根据机器情况，设置内存大小，<br />
vi /usr/local/elasticsearch/bin/elasticsearch.in.sh<br />
if [ “x$ES_MIN_MEM” = “x” ]; then<br />
#ES_MIN_MEM=256m<br />
ES_MIN_MEM=2g<br />
fi<br />
if [ “x$ES_MAX_MEM” = “x” ]; then<br />
#ES_MAX_MEM=1g<br />
ES_MAX_MEM=2g<br />
fi</p>
<p>4.减少shard刷新间隔<br />
curl -XPUT ‘http://61.x.x.x:9200/dw-search/_settings’ -d ‘{<br />
“index” : {<br />
“refresh_interval” : “-1”<br />
}<br />
}’</p>
<p>完成bulk插入后再修改为初始值<br />
curl -XPUT ‘http://61.x.x.x:9200/dw-search/_settings’ -d ‘{<br />
“index” : {<br />
“refresh_interval” : “1s”<br />
}<br />
}’</p>
<p>/etc/elasticsearch/elasticsearch.yml<br />
tranlog数据达到多少条进行平衡，默认为5000,刷新频率，默认为120s<br />
index.translog.flush_threshold_ops: “100000”<br />
index.refresh_interval: 60s</p>
<p>5.关闭文件的更新时间</p>
<p>/etc/fstab</p>
<p>在文件中添加 noatime,nodiratime<br />
/dev/sdc1 /data1 ext4 noatime,nodiratime 0 0</p>
<p>自启动<br />
chkconfig add redis_6379<br />
vi /etc/rc.local<br />
/usr/local/elasticsearch/bin/elasticsearch -d<br />
/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_syslog.conf &amp;<br />
/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_redis.conf &amp;<br />
/usr/local/logstash/bin/logstash agent -f /usr/local/logstash/conf/logstash_web.conf &amp;<br />
/opt/lemp startnginx</p>
<h1>安装问题</h1>
<p>==========================================<br />
LoadError: Could not load FFI Provider: (NotImplementedError) FFI not available: null<br />
See http://jira.codehaus.org/browse/JRUBY-4583</p>
<p>一开始我以为是没有FFI,把jruby,ruby gem都装了一遍.<br />
实际是由于我的/tmp没有运行权限造成的,建个tmp目录就可以了,附上ruby安装步骤.</p>
<p>mkdir /usr/local/jdk/tmp</p>
<p>vi /usr/local/logstash/bin/logstash.lib.sh<br />
JAVA_OPTS=”$JAVA_OPTS -Djava.io.tmpdir=/usr/local/jdk/tmp”</p>
<p>===============================<br />
jruby 安装</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget http://jruby.org.s3.amazonaws.com/downloads/1.7.13/jruby-bin-1.7.13.tar.gz</li>
<li>mv jruby-1.7.13 /usr/local/</li>
<li>cd /usr/local/</li>
<li>ln -s jruby-1.7.13 jruby</li>
</ol>
</div>
<p>Ruby Gem 安装<br />
Ruby 1.9.2版本默认已安装Ruby Gem<br />
安装gem 需要ruby的版本在 1.8.7 以上，默认的centos5 上都是1.8.5 版本，所以首先你的升级你的ruby ，</p>
<p>ruby -v<br />
ruby 1.8.5 (2006-08-25) [x86_64-linux]
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">wget http://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p547.tar.gz</li>
<li>tar zxvf ruby-1.9.3-p547.tar.gz</li>
<li>cd ruby-1.9.3-p547</li>
<li>./configure &#8211;prefix=/usr/local/ruby-1.9.3-p547</li>
<li>make &amp;&amp; make install</li>
<li>cd /usr/local</li>
<li>ln -s ruby-1.9.3-p547 ruby</li>
</ol>
</div>
<p>vi /etc/profile<br />
export PATH=$JAVA_HOME/bin:/usr/local/ruby/bin:$PATH<br />
source /etc/profile</p>
<p>gem install bundler<br />
gem install i18n<br />
gem install ffi</p>
<p>=======================</p>
<p>elasticsearch 端口安全<br />
绑定内网ip</p>
<p>iptables 只开放内网</p>
<p>前端机反向代理<br />
server<br />
{<br />
listen 9201;<br />
server_name big.c1gstudio.com;<br />
index index.html index.htm index.php;<br />
root /opt/htdocs/www;<br />
include manageip.conf;<br />
deny all;</p>
<p>location / {<br />
proxy_pass http://192.168.0.39:9200;<br />
proxy_set_header Host $host;<br />
proxy_set_header X-Real-IP $remote_addr;<br />
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
#proxy_set_header X-Forwarded-For $remote_addr;<br />
add_header X-Cache Cache-156;<br />
proxy_redirect off;<br />
}</p>
<p>access_log /opt/nginx/logs/access.log access;<br />
}</p>
<p>kibana的config.js<br />
elasticsearch: “http://”+window.location.hostname+”:9201″,</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%bc%80%e6%ba%90%e5%88%86%e5%b8%83%e5%bc%8f%e6%90%9c%e7%b4%a2%e5%b9%b3%e5%8f%b0elkelasticsearchlogstashkibanaredissyslog-ng%e5%ae%9e%e7%8e%b0%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e6%90%9c/">开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%bc%80%e6%ba%90%e5%88%86%e5%b8%83%e5%bc%8f%e6%90%9c%e7%b4%a2%e5%b9%b3%e5%8f%b0elkelasticsearchlogstashkibanaredissyslog-ng%e5%ae%9e%e7%8e%b0%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e6%90%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装MySQL中间层 Atlas实现不改程序就能读写分离</title>
		<link>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/</link>
		<comments>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 13:29:59 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[安装MySQL中间层 Atlas实现不改程序就能读写分离]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2874</guid>
		<description><![CDATA[<p>Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/">安装MySQL中间层 Atlas实现不改程序就能读写分离</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/Qihoo360/Atlas/">Atlas</a>是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上，修改了大量bug，添加了很多功能特性。目前该项目在360公司内部得到了广泛应用，很多MySQL业务已经接入了Atlas平 台，每天承载的读写请求数达几十亿条。</p>
<p>主要功能：<br />
* 读写分离<br />
* 从库负载均衡<br />
* IP过滤<br />
* SQL语句黑白名单<br />
* 自动分表</p>
<p>Q &amp; A<br />
——————-<br />
Q: 是否支持多字符集？<br />
A: 这是我们对原版MySQL-Proxy的第一项改进，符合国情是必须的</p>
<p>Q: 自动读写分离挺好，但有时候我写完马上就想读，万一主从同步延迟怎么办?<br />
A: SQL语句前增加 /*master*/ 就可以将读请求强制发往主库</p>
<p>Q: 主库宕机，读操作受影响么？<br />
A: 在atlas中是不会的! 能问这样的问题, 说明你用过官方的mysql-proxy, 很遗憾官方版本并未解决这个问题</p>
<p>Q: 检测后端DB状态会阻塞正常请求么？<br />
A: 不会, atlas中检测线程是异步进行检测的，即使有db宕机，也不会阻塞主流程。在atlas中没有什么异常会让主流程阻塞! 同上，官方版本也会让你失望</p>
<p>Q: 想下线一台DB, 又不想停掉mysql server, 怎么办？<br />
A: 可以通过管理接口手动上下线后端db, atlas会优先考虑管理员的意愿</p>
<p>Q: 想给集群中增加一台DB, 不想影响线上正常访问可以吗？<br />
A: 通过管理接口可以轻松实现</p>
<p>Q: 相比官方mysql-proxy, atlas还有哪些改进？<br />
A: 这实在是个难以回答的问题，性能，稳定性，可靠性，易维护性，我们做过几十项的改进，下面会尽量列一些较大的改动</p>
<p>VS 官方MySQL-Proxy<br />
——————-<br />
1. 将主流程中所有Lua代码改为纯C实现，Lua仅用在管理接口<br />
2. 重写网络模型、线程模型<br />
3. 实现了真正意义的连接池<br />
4. 优化了锁机制，性能提高数十倍<br />
……</p>
<p>附名字来源：<br />
Atlas，希腊神话中双肩撑天的巨人，普罗米修斯的兄弟，最高大强壮的神之一，因反抗宙斯失败而被罚顶天。我们期望这个系统能够脚踏后端DB，为前端应用撑起一片天。</p>
<p>一.安装dbproxy altas<br />
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%AE%89%E8%A3%85</p>
<p>wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el5.x86_64.rpm<br />
rpm –ivh Atlas-2.2.1.el5.x86_64.rpm</p>
<p>注意事项：</p>
<p>(1).Atlas只能安装运行在64位的系统上。</p>
<p>(2).Centos 5.X安装 Atlas-XX.el5.x86_64.rpm，Centos 6.X安装Atlas-XX.el6.x86_64.rpm。</p>
<p>(3).如果执行sudo rpm –i Atlas-XX.el6.x86_64.rpm，提示类似：“file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64”错误，则表示该系统之前已经安装过Atlas-1.0.3-1.x86_64，需要执行：sudo rpm –e Atlas-1.0.3-1.x86_64，将之前安装的Atlas删除掉，再执行sudo rpm –i Atlas-XX.el6.x86_64.rpm安装新版本的Atlas。</p>
<p>(4).后端mysql版本应大于5.1，建议使用Mysql 5.6</p>
<p>二.配置文件修改<br />
cd /usr/local/mysql-proxy/conf<br />
cp tests.cnf dbproxy.cnf<br />
vi dbproxy.cnf</p>
<p>Atlas运行需要依赖一个配置文件（test.cnf）。在运行Atlas之前，需要对该文件进行配置。Atlas的安装目录是/usr /local/mysql-proxy，进入安装目录下的conf目录，可以看到已经有一个名为test.cnf的默认配置文件，我们只需要修改里面的某 些配置项，不需要从头写一个配置文件。</p>
<p>1.配置范例及说明如下：</p>
[mysql-proxy]
<p>(必备，默认值即可)管理接口的用户名</p>
<p>admin-username = user</p>
<p>(必备，默认值即可)管理接口的密码</p>
<p>admin-password = pwd</p>
<p>(必备，根据实际情况配置)主库的IP和端口</p>
<p>proxy-backend-addresses = 192.168.0.12:3306</p>
<p>(非必备，根据实际情况配置)从库的IP和端口，@后面的数字代表权重，用来作负载均衡，若省略则默认为1，可设置多项，用逗号分隔。如果想让主库也能分担读请求的话，只需要将主库信息加入到下面的配置项中。</p>
<p>proxy-read-only-backend-addresses = 192.168.0.12:3306@2,192.168.0.13:3306@4,192.168.0.14:3306@4</p>
<p>(必备，根据实际情况配置)用户名与其对应的加密过的MySQL密码，密码使用PREFIX/bin目录下的加密程序encrypt加密，用户名与 密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码（用户名和密码在主从数据库上要一致）。比如用户名为myuser，密码为mypwd，执 行./encrypt mypwd结果为HJBoxfRsjeI=。如果有多个用户用逗号分隔即可。则设置如下行所示：</p>
<p>pwds = dbproxy: /iZxz+0GRoA=</p>
<p>（必备，默认值即可)Atlas的运行方式，设为true时为守护进程方式，设为false时为前台方式，一般开发调试时设为false，线上运行时设为true</p>
<p>daemon = true</p>
<p>(必备，默认值即可)设置Atlas的运行方式，设为true时Atlas会启动两个进程，一个为monitor，一个为 worker，monitor在worker意外退出后会自动将其重启，设为false时只有worker，没有monitor，一般开发调试时设为 false，线上运行时设为true</p>
<p>keepalive = true</p>
<p>(必备，根据实际情况配置)工作线程数，推荐设置成系统的CPU核数的2至4倍</p>
<p>event-threads = 4</p>
<p>(必备，默认值即可)日志级别，分为message、warning、critical、error、debug五个级别</p>
<p>log-level = message</p>
<p>(必备，默认值即可)日志存放的路径</p>
<p>log-path = /usr/local/mysql-proxy/log</p>
<p>(必备，根据实际情况配置)SQL日志的开关，可设置为OFF、ON、REALTIME，OFF代表不记录SQL日志，ON代表记录SQL日志，该 模式下日志刷新是基于缓冲区的，当日志填满缓冲区后，才将日志信息刷到磁盘。REALTIME用于调试，代表记录SQL日志且实时写入磁盘，默认为OFF</p>
<p>sql-log = OFF</p>
<p>(可选项，可不设置）慢日志输出设置。当设置了该参数时，则日志只输出执行时间超过sql-log-slow（单位：ms)的日志记录。不设置该参数则输出全部日志。</p>
<p>#sql-log-slow = 10</p>
<p>(可选项，可不设置）关闭不活跃的客户端连接设置。当设置了该参数时，Atlas会主动关闭经过’wait-timeout’时间后一直未活跃的连接。单位：秒</p>
<p>wait-timeout = 10</p>
<p>(必备，默认值即可)Atlas监听的工作接口IP和端口</p>
<p>proxy-address = 0.0.0.0:1234</p>
<p>(必备，默认值即可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345</p>
<p>(可选项，可不设置)分表设置，此例中person为库名，mt为表名，id为分表字段，3为子表数量，可设置多项，以逗号分隔，若不分表则不需要 设置该项，子表需要事先建好，子表名称为表名_数字，数字范围为[0,子表数-1]，如本例里，子表名称为mt_0、mt_1、mt_2</p>
<p>#tables = person.mt.id.3</p>
<p>(可选项，可不设置)默认字符集，若不设置该项，则默认字符集为latin1</p>
<p>#charset = utf8</p>
<p>(可选项，可不设置)允许连接Atlas的客户端的IP，可以是精确IP，也可以是IP段，以逗号分隔，若不设置该项则允许所有IP连接，否则只允许列表中的IP连接</p>
<p>client-ips = 127.0.0.1, 192.168.1</p>
<p>(可选项，极少需要)Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP)，若有LVS且设置了client-ips则此项必须设置，否则可以不设置</p>
<p>#lvs-ips = 192.168.1.1</p>
<p>2. 重要配置说明</p>
<p>以下几项配置参数对性能和正常运行起到重要作用，需要正确设置。</p>
<p>(1)线程数</p>
<p>event-threads项设置，过小无法充分发挥多核CPU的性能，过大造成不必要的线程切换开销，推荐设置为CPU的核数。</p>
<p>(2)最小空闲连接数(2.x以上版本不需要该项，1.x版本需要)</p>
<p>min-idle-connections项设置，过小则在高并发下会有报错，过大虽然不报错但在测试时不容易看出读写分离效果，推荐设置为比客户 端的并发峰值稍大，详见《配置参数详解》。上面的配置范例是针对Atlas 2.X版本，没有该选项。对于Atlas 1.X版本的配置文件，需要加入该配置选项。</p>
<p>3. 可选配置说明</p>
<p>以下几项可以设置，也可以使用默认值，区别不大。</p>
<p>(1)Atlas的工作端口</p>
<p>proxy-address项配置，例如proxy-address = 0.0.0.0:1234代表客户端应该使用1234这个端口连接Atlas来发送SQL请求。</p>
<p>(2)Atlas的管理端口</p>
<p>admin-address项配置，例如admin-address = 0.0.0.0:2345代表DBA应该使用2345这个端口连接Atlas来执行运维管理操作。</p>
<p>(3)管理接口的用户名和密码</p>
<p>admin-username项和admin-password项设置，这两项是用来进入Atlas的管理界面的，与后端连接的MySQL没有关系，所以可以任意设置，不需要MySQL在配置上做任何改动。</p>
<p>(4)日志级别</p>
<p>以log-level项配置，分为message、warning、critical、error、debug五个级别。</p>
<p>(5)日志路径</p>
<p>以log-path项配置，如log-path = /usr/local/mysql-proxy/log。</p>
<p>三. 给后端mysql增加访问用户<br />
CREATE USER ‘dbproxy’@’192.168.0.11’ IDENTIFIED BY ‘***’;</p>
<p>GRANT USAGE ON * . * TO ‘dbproxy’@’192.168.0.11’ IDENTIFIED BY ‘***’ WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;<br />
GRANT SELECT , INSERT , UPDATE , DELETE , LOCK TABLES ON `c1gstudio` . * TO ‘dbproxy’@’192.168.0.11’;</p>
<p>加密密码<br />
bin/encrypt 123456<br />
/iZxz+0GRoA=</p>
<p>添加iptables<br />
iptables<br />
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -p tcp -m tcp –dport 1234 -j ACCEPT</p>
<p>四.启动<br />
1.启动dbproxy<br />
cd /home/mysql/dbproxy/bin<br />
./mysql-proxyd dbproxy start</p>
<p># /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy start<br />
# /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy stop<br />
# /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy restart</p>
<p>2.访问测试<br />
mysql -udbproxy -h192.168.0.11 -P1234 -p<br />
password<br />
mysql-&gt; show databases;<br />
mysql&gt; show variables like “server_id”;<br />
+—————+——-+<br />
| Variable_name | Value |<br />
+—————+——-+<br />
| server_id | 19 |<br />
+—————+——-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; show variables like “server_id”;<br />
+—————+——-+<br />
| Variable_name | Value |<br />
+—————+——-+<br />
| server_id | 20 |<br />
+—————+——-+<br />
1 row in set (0.00 sec)</p>
<p>五、Atlas管理接口使用</p>
<p># mysql -u管理用户 -p管理密码 -h127.0.0.1 -P管理端口<br />
mysql -uadmin -h192.168.0.11 -P2345 -p<br />
password<br />
#查看管理语句参数：<br />
mysql&gt; select * from help;<br />
+—————————-+———————————————————+<br />
| command | description |<br />
+—————————-+———————————————————+<br />
| SELECT * FROM help | shows this help |<br />
| SELECT * FROM backends | lists the backends and their state |<br />
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx’s id |<br />
| SET ONLINE $backend_id | online backend server, … |<br />
| ADD MASTER $backend | example: “add master 127.0.0.1:3306”, … |<br />
| ADD SLAVE $backend | example: “add slave 127.0.0.1:3306”, … |<br />
| REMOVE BACKEND $backend_id | example: “remove backend 1”, … |<br />
| SELECT * FROM clients | lists the clients |<br />
| ADD CLIENT $client | example: “add client 192.168.1.2”, … |<br />
| REMOVE CLIENT $client | example: “remove client 192.168.1.2”, … |<br />
| SELECT * FROM pwds | lists the pwds |<br />
| ADD PWD $pwd | example: “add pwd user:raw_password”, … |<br />
| ADD ENPWD $pwd | example: “add enpwd user:encrypted_password”, … |<br />
| REMOVE PWD $pwd | example: “remove pwd user”, … |<br />
| SAVE CONFIG | save the backends to config file |<br />
| SELECT VERSION | display the version of Atlas |<br />
+—————————-+———————————————————+<br />
#查看DB状态：<br />
mysql&gt; select * from backends;<br />
+————-+——————-+——-+——+<br />
| backend_ndx | address | state | type |<br />
+————-+——————-+——-+——+<br />
| 1 | 192.168.0.12:3306 | up | rw |<br />
| 2 | 192.168.0.12:3306 | up | ro |<br />
| 3 | 192.168.0.13:3306 | up | ro |<br />
| 4 | 192.168.0.14:3306 | up | ro |<br />
+————-+——————-+——-+——+</p>
<p>六.性能测试结果<br />
从Atlas处理三类SQL操作的QPS和完成每条SQL操作的时间对比来看，将event-threads参数设置为CPU个数的2-4倍较为合理。将 event-threads参数设置为CPU个数的两倍时，带来的QPS提升较为明显，将其设置为CPU个数的四倍时，QPS也有提升但不是非常明显。对 于处理每条SQL操作的时间，通过提高event-threads值是没有显著效果的。</p>
<p>所以我们建议使用者：如果追求Atlas处理SQL请求时的QPS，将event-threads值设置为CPU个数的2-4倍。如果追求Atlas处理SQL请求的完成时间，将event-threads值设置为CPU个数即可。</p>
<p>下文主要测试了通过Atlas转发SQL请求与直连DB发送SQL请求这两种情形下的性能差距，和event-threads值对Atlas的性能 影响。从测试结果来看，Atlas性能表现较为优秀，并没有明显的性能下降。同时在测试中发现Atlas系统属于CPU密集型任务，相对于磁盘IO和内存 占用率而言，Atlas对CPU消耗显得最为明显，所以建议在部署Atlas的时候需要优先考虑服务器的CPU性能。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/">安装MySQL中间层 Atlas实现不改程序就能读写分离</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云下配置keepalive，利用HAVIP实现HA</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 13:11:25 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[阿里云下配置keepalive，利用HAVIP实现HA]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2849</guid>
		<description><![CDATA[<p>包括阿里云在内的很多云环境，因为不支持浮动IP广受诟病。目前阿里云在VPC网络下发布了HAVIP，能够实现ar [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha/">阿里云下配置keepalive，利用HAVIP实现HA</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>包括阿里云在内的很多云环境，因为不支持浮动IP广受诟病。目前阿里云在VPC网络下发布了HAVIP，能够实现arp宣告IP。这样也就让自己搭建HA成为了可能，有幸拿到了内测权限体验了一下。(classical网络依然不支持)</p>
<p>测试环境：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/1.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/1.jpg" alt="1" width="893" height="267" /></a></p>
<div id="crayon-5690f2a3a54f8155154372" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a54f8155154372-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a54f8155154372-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a54f8155154372-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a54f8155154372-4">4</div>
<div class="crayon-num" data-line="crayon-5690f2a3a54f8155154372-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a54f8155154372-6">6</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a54f8155154372-1" class="crayon-line"><span class="crayon-i">VPC</span>：<span class="crayon-cn">192.168.1.0</span><span class="crayon-o">/</span><span class="crayon-cn">24</span></div>
<div id="crayon-5690f2a3a54f8155154372-2" class="crayon-line crayon-striped-line"><span class="crayon-v">ECS</span><span class="crayon-o">:</span></div>
<div id="crayon-5690f2a3a54f8155154372-3" class="crayon-line"><span class="crayon-i">nginx1</span>：<span class="crayon-cn">192.168.1.1</span></div>
<div id="crayon-5690f2a3a54f8155154372-4" class="crayon-line crayon-striped-line"><span class="crayon-v">nginx2</span><span class="crayon-o">:</span><span class="crayon-cn">192.168.1.2</span></div>
<div id="crayon-5690f2a3a54f8155154372-5" class="crayon-line"><span class="crayon-v">HAVIP</span><span class="crayon-o">:</span><span class="crayon-cn">192.168.1.3</span></div>
<div id="crayon-5690f2a3a54f8155154372-6" class="crayon-line crayon-striped-line">绑定到<span class="crayon-i">havip</span>的公网<span class="crayon-i">EIP</span>：<span class="crayon-cn">121.43.187.37</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>配置完毕后的拓扑如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/4.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/4.jpg" alt="4" width="641" height="405" /></a><br />
环境搭建完毕后，登陆主备ECS服务器，分别配置nginx+keepalived</p>
<div id="crayon-5690f2a3a550e284021137" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a550e284021137-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a550e284021137-1" class="crayon-line"><span class="crayon-sy">[</span><span class="crayon-v">root</span><span class="crayon-sy">@</span><span class="crayon-v">Nginx1</span> <span class="crayon-o">~</span><span class="crayon-sy">]</span><span class="crayon-c"># yum install nginx keepalived -y</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>MASTER服务器（nginx1）配置文件/etc/keepalived/keepalived.conf内容以及解释如下：</p>
<div id="crayon-5690f2a3a5514992856578" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-4">4</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-6">6</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-8">8</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-10">10</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-12">12</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-14">14</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-15">15</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-16">16</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-17">17</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-18">18</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-19">19</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-20">20</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-21">21</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-22">22</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-23">23</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-24">24</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-25">25</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-26">26</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-27">27</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-28">28</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-29">29</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-30">30</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-31">31</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-32">32</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-33">33</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-34">34</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-35">35</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-36">36</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-37">37</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-38">38</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-39">39</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-40">40</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-41">41</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-42">42</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-43">43</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-44">44</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-45">45</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5514992856578-46">46</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5514992856578-47">47</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a5514992856578-1" class="crayon-line"><span class="crayon-o">!</span> <span class="crayon-e">Configuration</span> <span class="crayon-r">File</span> <span class="crayon-st">for</span> <span class="crayon-e">keepalived</span></div>
<div id="crayon-5690f2a3a5514992856578-2" class="crayon-line crayon-striped-line"><span class="crayon-c">#配置global_defs，主要用于标示机器，以及故障时通知</span></div>
<div id="crayon-5690f2a3a5514992856578-3" class="crayon-line"><span class="crayon-e">global_defs</span> <span class="crayon-sy">{</span><span class="crayon-h">  </span></div>
<div id="crayon-5690f2a3a5514992856578-4" class="crayon-line crayon-striped-line"><span class="crayon-h">   </span><span class="crayon-e">router_id </span><span class="crayon-i">Nginx1</span></div>
<div id="crayon-5690f2a3a5514992856578-5" class="crayon-line"><span class="crayon-sy">}</span></div>
<div id="crayon-5690f2a3a5514992856578-6" class="crayon-line crayon-striped-line"><span class="crayon-c">#配置vrrp_script，主要用于健康检查，以及检查失败后执行的动作。</span></div>
<div id="crayon-5690f2a3a5514992856578-7" class="crayon-line"><span class="crayon-e">vrrp_script</span> <span class="crayon-e">chk_nginx</span> <span class="crayon-sy">{</span></div>
<div id="crayon-5690f2a3a5514992856578-8" class="crayon-line crayon-striped-line"><span class="crayon-c">#健康检查脚本，当脚本返回值不为0时认为失败</span></div>
<div id="crayon-5690f2a3a5514992856578-9" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">script</span> <span class="crayon-s">&#8220;/etc/keepalived/ck_ng.sh&#8221;</span></div>
<div id="crayon-5690f2a3a5514992856578-10" class="crayon-line crayon-striped-line"><span class="crayon-c">#检查频率，以下配置每2秒检查1次</span></div>
<div id="crayon-5690f2a3a5514992856578-11" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">interval</span> <span class="crayon-cn">2</span></div>
<div id="crayon-5690f2a3a5514992856578-12" class="crayon-line crayon-striped-line"><span class="crayon-c">#当检查失败后，将vrrp_instance的priority减小5</span></div>
<div id="crayon-5690f2a3a5514992856578-13" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">weight</span> <span class="crayon-o">&#8211;</span><span class="crayon-cn">5</span></div>
<div id="crayon-5690f2a3a5514992856578-14" class="crayon-line crayon-striped-line"><span class="crayon-c">#连续监测失败3次，才认为真的健康检查失败。并调整优先级</span></div>
<div id="crayon-5690f2a3a5514992856578-15" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">fall</span> <span class="crayon-cn">3</span></div>
<div id="crayon-5690f2a3a5514992856578-16" class="crayon-line crayon-striped-line"><span class="crayon-c">#连续监测2次成功，就认为成功。但不调整优先级</span></div>
<div id="crayon-5690f2a3a5514992856578-17" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">rise</span> <span class="crayon-cn">2</span></div>
<div id="crayon-5690f2a3a5514992856578-18" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
<div id="crayon-5690f2a3a5514992856578-19" class="crayon-line"></div>
<div id="crayon-5690f2a3a5514992856578-20" class="crayon-line crayon-striped-line"><span class="crayon-c">#定义对外提供服务的VIP vrrp_instance配置</span></div>
<div id="crayon-5690f2a3a5514992856578-21" class="crayon-line"><span class="crayon-e">vrrp_instance</span> <span class="crayon-e">VI_1</span> <span class="crayon-sy">{</span></div>
<div id="crayon-5690f2a3a5514992856578-22" class="crayon-line crayon-striped-line"><span class="crayon-c">#指定vrrp_instance的初始状态，是MASTER还是BackUP主要还是看优先级。</span></div>
<div id="crayon-5690f2a3a5514992856578-23" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-e">state </span><span class="crayon-v">MASTER</span></div>
<div id="crayon-5690f2a3a5514992856578-24" class="crayon-line crayon-striped-line"><span class="crayon-c">#指定vrrp_instance绑定的网卡，最终会通过指定的网卡宣告VIP</span></div>
<div id="crayon-5690f2a3a5514992856578-25" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-t">interface</span> <span class="crayon-v">eth0</span></div>
<div id="crayon-5690f2a3a5514992856578-26" class="crayon-line crayon-striped-line"><span class="crayon-c">#发送心跳包的源IP，可使用绑定的网卡IP，也可以使用本服务器上的其他IP</span></div>
<div id="crayon-5690f2a3a5514992856578-27" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.1</span></div>
<div id="crayon-5690f2a3a5514992856578-28" class="crayon-line crayon-striped-line"><span class="crayon-c">#相当于VRID，用于在一个网内区分组播，需要组播域内内唯一。</span></div>
<div id="crayon-5690f2a3a5514992856578-29" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">virtual_router</span><span class="crayon-sy">_</span>id <span class="crayon-cn">55</span></div>
<div id="crayon-5690f2a3a5514992856578-30" class="crayon-line crayon-striped-line"><span class="crayon-c">#本机的优先级，VRID相同的机器中，优先级最高的会被选举为MASTER</span></div>
<div id="crayon-5690f2a3a5514992856578-31" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">priority</span> <span class="crayon-cn">101</span></div>
<div id="crayon-5690f2a3a5514992856578-32" class="crayon-line crayon-striped-line"><span class="crayon-c">#心跳间隔，下面配置，MASTER会每隔1秒发送一个报文高职组内其他机器，自己还活着。</span></div>
<div id="crayon-5690f2a3a5514992856578-33" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">advert</span><span class="crayon-sy">_</span>int <span class="crayon-cn">1</span></div>
<div id="crayon-5690f2a3a5514992856578-34" class="crayon-line crayon-striped-line"><span class="crayon-c">#定义主从的验证方式以及密码，一般使用PASS(最长8位，超过了只会识别前8位作为密码)</span></div>
<div id="crayon-5690f2a3a5514992856578-35" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-e">authentication</span> <span class="crayon-sy">{</span></div>
<div id="crayon-5690f2a3a5514992856578-36" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-e">auth_type </span><span class="crayon-e">PASS</span></div>
<div id="crayon-5690f2a3a5514992856578-37" class="crayon-line"><span class="crayon-e">        </span><span class="crayon-e">auth_pass </span><span class="crayon-i">aliyun</span></div>
<div id="crayon-5690f2a3a5514992856578-38" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-5690f2a3a5514992856578-39" class="crayon-line"><span class="crayon-c">#VIP,在阿里云下就是刚才创建的HAVIP</span></div>
<div id="crayon-5690f2a3a5514992856578-40" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-e">virtual_ipaddress</span> <span class="crayon-sy">{</span></div>
<div id="crayon-5690f2a3a5514992856578-41" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-cn">192.168.1.4</span></div>
<div id="crayon-5690f2a3a5514992856578-42" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-sy">}</span></div>
<div id="crayon-5690f2a3a5514992856578-43" class="crayon-line"><span class="crayon-c">#本vrrp_instance所引用的脚本配置，名称就是vrrp_script 定义的容器名</span></div>
<div id="crayon-5690f2a3a5514992856578-44" class="crayon-line crayon-striped-line"><span class="crayon-h">  </span><span class="crayon-e">track_script</span> <span class="crayon-sy">{</span></div>
<div id="crayon-5690f2a3a5514992856578-45" class="crayon-line"><span class="crayon-h">       </span><span class="crayon-v">chk</span><span class="crayon-sy">_</span>nginx</div>
<div id="crayon-5690f2a3a5514992856578-46" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-5690f2a3a5514992856578-47" class="crayon-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>BACKUP服务器（nginx2）的配置需要修改：</p>
<div id="crayon-5690f2a3a551b308423993" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a551b308423993-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a551b308423993-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a551b308423993-3">3</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a551b308423993-1" class="crayon-line"><span class="crayon-e">state </span><span class="crayon-i">MASTER</span>改为<span class="crayon-h">  </span><span class="crayon-e">state </span><span class="crayon-e">BACKUP</span></div>
<div id="crayon-5690f2a3a551b308423993-2" class="crayon-line crayon-striped-line"><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.1</span>改为<span class="crayon-i">backup</span>服务器实际的<span class="crayon-e">IP </span><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.2</span></div>
<div id="crayon-5690f2a3a551b308423993-3" class="crayon-line"><span class="crayon-i">priority</span> <span class="crayon-cn">101</span>改小一些，比如<span class="crayon-h">    </span><span class="crayon-i">priority</span> <span class="crayon-cn">100</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>其它保持一致即可</p>
<p>为了实现nginx服务异常的时候能够自动切换，需要自己写一个脚本，脚本没有硬性的要求，能够实现目标即可，这里 监控nginx进程数为例：</p>
<div id="crayon-5690f2a3a5520638273053" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-4">4</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-6">6</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-8">8</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-10">10</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-12">12</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-14">14</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-15">15</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5520638273053-16">16</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5520638273053-17">17</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a5520638273053-1" class="crayon-line"><span class="crayon-r">vim</span> <span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">keepalived</span><span class="crayon-o">/</span><span class="crayon-v">ck_ng</span><span class="crayon-e">.sh</span></div>
<div id="crayon-5690f2a3a5520638273053-2" class="crayon-line crayon-striped-line"><span class="crayon-c">#!/bin/bash</span></div>
<div id="crayon-5690f2a3a5520638273053-3" class="crayon-line"><span class="crayon-c">#检查nginx进程是否存在</span></div>
<div id="crayon-5690f2a3a5520638273053-4" class="crayon-line crayon-striped-line"><span class="crayon-v">count</span><span class="crayon-o">=</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-r">ps</span> <span class="crayon-o">&#8211;</span><span class="crayon-i">C</span> <span class="crayon-v">nginx</span> <span class="crayon-o">&#8212;</span><span class="crayon-v">no</span><span class="crayon-o">&#8211;</span><span class="crayon-v">heading</span><span class="crayon-o">|</span><span class="crayon-r">wc</span> <span class="crayon-o">&#8211;</span><span class="crayon-v">l</span><span class="crayon-sy">)</span></div>
<div id="crayon-5690f2a3a5520638273053-5" class="crayon-line"><span class="crayon-c">#进程数等于0的时候</span></div>
<div id="crayon-5690f2a3a5520638273053-6" class="crayon-line crayon-striped-line"><span class="crayon-st">if</span> <span class="crayon-sy">[</span> <span class="crayon-s">&#8220;${count}&#8221;</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;0&#8221;</span> <span class="crayon-sy">]</span><span class="crayon-sy">;</span> <span class="crayon-st">then</span></div>
<div id="crayon-5690f2a3a5520638273053-7" class="crayon-line"><span class="crayon-c">#尝试启动一次nginx，停止2秒后再次检测</span></div>
<div id="crayon-5690f2a3a5520638273053-8" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-e">service </span><span class="crayon-e">nginx </span><span class="crayon-e">start</span></div>
<div id="crayon-5690f2a3a5520638273053-9" class="crayon-line"><span class="crayon-e">    </span><span class="crayon-r">sleep</span> <span class="crayon-cn">2</span></div>
<div id="crayon-5690f2a3a5520638273053-10" class="crayon-line crayon-striped-line"><span class="crayon-h">   </span><span class="crayon-v">count</span><span class="crayon-o">=</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-r">ps</span> <span class="crayon-o">&#8211;</span><span class="crayon-i">C</span> <span class="crayon-v">nginx</span> <span class="crayon-o">&#8212;</span><span class="crayon-v">no</span><span class="crayon-o">&#8211;</span><span class="crayon-v">heading</span><span class="crayon-o">|</span><span class="crayon-r">wc</span> <span class="crayon-o">&#8211;</span><span class="crayon-v">l</span><span class="crayon-sy">)</span></div>
<div id="crayon-5690f2a3a5520638273053-11" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-st">if</span> <span class="crayon-sy">[</span> <span class="crayon-s">&#8220;${count}&#8221;</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;0&#8221;</span> <span class="crayon-sy">]</span><span class="crayon-sy">;</span> <span class="crayon-st">then</span></div>
<div id="crayon-5690f2a3a5520638273053-12" class="crayon-line crayon-striped-line"><span class="crayon-c">#如果启动没成功，就杀掉keepalive触发主备切换</span></div>
<div id="crayon-5690f2a3a5520638273053-13" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">init</span><span class="crayon-e">.d</span><span class="crayon-o">/</span><span class="crayon-e">keepalived </span><span class="crayon-e">stop</span></div>
<div id="crayon-5690f2a3a5520638273053-14" class="crayon-line crayon-striped-line"><span class="crayon-e">    </span><span class="crayon-st">fi</span></div>
<div id="crayon-5690f2a3a5520638273053-15" class="crayon-line"><span class="crayon-st">fi</span></div>
<div id="crayon-5690f2a3a5520638273053-16" class="crayon-line crayon-striped-line"><span class="crayon-c">#增加脚本的执行权限</span></div>
<div id="crayon-5690f2a3a5520638273053-17" class="crayon-line"><span class="crayon-r">chmod</span> <span class="crayon-o">+</span><span class="crayon-i">x</span> <span class="crayon-r">vim</span> <span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">keepalived</span><span class="crayon-o">/</span><span class="crayon-v">ck_ng</span><span class="crayon-e">.sh</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="crayon-5690f2a3a5526070782078" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a5526070782078-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5526070782078-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5526070782078-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5526070782078-4">4</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a5526070782078-1" class="crayon-line"><span class="crayon-c">#分别启动nginx1和nginx2的nginx&amp;keepalived服务：</span></div>
<div id="crayon-5690f2a3a5526070782078-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">[</span><span class="crayon-v">root</span><span class="crayon-sy">@</span><span class="crayon-v">Nginx1</span> <span class="crayon-o">~</span><span class="crayon-sy">]</span><span class="crayon-c"># /etc/init.d/nginx start;/etc/init.d/keepalived start</span></div>
<div id="crayon-5690f2a3a5526070782078-3" class="crayon-line"><span class="crayon-e">Starting </span><span class="crayon-v">nginx</span><span class="crayon-o">:</span><span class="crayon-h">                                            </span><span class="crayon-sy">[</span><span class="crayon-h">  </span><span class="crayon-i">OK</span><span class="crayon-h">  </span><span class="crayon-sy">]</span></div>
<div id="crayon-5690f2a3a5526070782078-4" class="crayon-line crayon-striped-line"><span class="crayon-e">Starting </span><span class="crayon-v">keepalived</span><span class="crayon-o">:</span><span class="crayon-h">                                       </span><span class="crayon-sy">[</span><span class="crayon-h">  </span><span class="crayon-i">OK</span><span class="crayon-h">  </span><span class="crayon-sy">]</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div>
<div>测试：</div>
<div>NGINX1/192.168.1.1的priority 为101，NGINX2/192.168.1.2的priority为100，这时候访问HAVIP绑定的EIP：http://121.43.187.37/可以看到访问到了服务器NGINX1,如下：</div>
<div>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/5.jpg" alt="5" width="485" height="205" /></a></p>
<p>到HAVIP控制台查看，192.168.1.1的服务器为主服务器</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/111.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/111.png" alt="111" width="596" height="330" /></a></p>
<p>这时候我们KILL掉nginx1服务器的nginx服务</p>
</div>
</div>
<div>
<div>查看日志，发送了移除VIP的报文：</div>
<div>
<div id="crayon-5690f2a3a552c031875935" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a552c031875935-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a552c031875935-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a552c031875935-3">3</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a552c031875935-1" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25019</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-i">sending</span> <span class="crayon-cn">0</span> <span class="crayon-e">priority</span></div>
<div id="crayon-5690f2a3a552c031875935-2" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25019</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">removing </span><span class="crayon-e">protocol </span><span class="crayon-v">VIPs</span><span class="crayon-sy">.</span></div>
<div id="crayon-5690f2a3a552c031875935-3" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_healthcheckers</span><span class="crayon-sy">[</span><span class="crayon-cn">25018</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">Netlink </span><span class="crayon-e">reflector </span><span class="crayon-e">reports </span><span class="crayon-i">IP</span> <span class="crayon-cn">192.168.1.3</span> <span class="crayon-v">removed</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>这时候访问<a href="http://121.43.187.37/%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E8%AE%BF%E9%97%AE%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2%E5%88%B0%E4%BA%86NGINX2">http://121.43.187.37/，可以看到访问自动切换到了NGINX2</a><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/6.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/6.jpg" alt="6" width="473" height="194" /></a></p>
</div>
<div>
<div>到HAVIP控制台查看，192.168.1.2的服务器为主服务器</div>
</div>
</div>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/2222.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/2222.png" alt="2222" width="603" height="354" /></a></p>
<div>
<div>重新启动nginx1的nginx和keepalive服务</div>
<div>查看日志可以看到keepalive重新发送了IP宣告的报文</div>
<div>
<div id="crayon-5690f2a3a5533945876468" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-5690f2a3a5533945876468-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5533945876468-2">2</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5533945876468-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5690f2a3a5533945876468-4">4</div>
<div class="crayon-num" data-line="crayon-5690f2a3a5533945876468-5">5</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-5690f2a3a5533945876468-1" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Entering </span><span class="crayon-e">MASTER </span><span class="crayon-e">STATE</span></div>
<div id="crayon-5690f2a3a5533945876468-2" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">setting </span><span class="crayon-e">protocol </span><span class="crayon-v">VIPs</span><span class="crayon-sy">.</span></div>
<div id="crayon-5690f2a3a5533945876468-3" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Sending </span><span class="crayon-e">gratuitous </span><span class="crayon-e">ARPs </span><span class="crayon-e">on </span><span class="crayon-e">eth0 </span><span class="crayon-st">for</span> <span class="crayon-cn">192.168.1.3</span></div>
<div id="crayon-5690f2a3a5533945876468-4" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_healthcheckers</span><span class="crayon-sy">[</span><span class="crayon-cn">25609</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">Netlink </span><span class="crayon-e">reflector </span><span class="crayon-e">reports </span><span class="crayon-i">IP</span> <span class="crayon-cn">192.168.1.3</span> <span class="crayon-e">added</span></div>
<div id="crayon-5690f2a3a5533945876468-5" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">19</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Sending </span><span class="crayon-e">gratuitous </span><span class="crayon-e">ARPs </span><span class="crayon-e">on </span><span class="crayon-e">eth0 </span><span class="crayon-st">for</span> <span class="crayon-cn">192.168.1.3</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>重新访问http://121.43.187.37/测试，重新访问到了服务器NGINX1，到HAVIP控制台查看，192.168.1.1的服务器重新夺回了控制权，成为了为主服务器</p></div>
<div><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/1111.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/1111.png" alt="1111" width="596" height="330" /></a></div>
<div>这样就实现了阿里云环境下的HA切换。</div>
<div>实际测试，阿里云的多个HAVIP可以绑定到同样的两台机器，可以配置多组vrrp_instance来实现双主。或者两台服务器同时为两个业务服务，避免资源浪费。同时能够做到主备</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha/">阿里云下配置keepalive，利用HAVIP实现HA</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云运维部署工具AppDeploy最佳实践</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 12:57:36 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云代维]]></category>
		<category><![CDATA[阿里云运维部署工具AppDeploy最佳实践]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2847</guid>
		<description><![CDATA[<p>阿里云 AppDeploy版是一个通过SSH实现的流式命令行工具，可用于完成应用部署和远程运维管理，其工作于p [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/">阿里云运维部署工具AppDeploy最佳实践</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="aly-article-con">
<p>阿里云 AppDeploy版是一个通过SSH实现的流式命令行工具，可用于完成应用部署和远程运维管理，其工作于python平台上，具有良好的可移植性；AppDeploy将本地应用软件上传到远端服务器，并执行用户预定义的产品部署命令。</p>
<p>工具当前免费下载使用，地址：<br />
<a href="http://market.aliyun.com/products/53690006/cmgj000331.html">http://market.aliyun.com/products/53690006/cmgj000331.html</a><br />
<a href="http://market.aliyun.com/products/53690006/cmgj000321.html">http://market.aliyun.com/products/53690006/cmgj000321.html</a></p>
<p>本文通过三个使用场景介绍AppDeploy：</p>
<p>1. 高效运维管理命令：<br />
1）实时监控服务器状态<br />
执行命令：$ adep check_status 将得到服务器的具体信息，包括ip、route、dns、resolve、iptables、mount、disk、load等；</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::0</p>
<p>也可以在命令后面加具体参数查看部分信息，例如：<br />
当前支持：ip、route、dns、resolve、iptables、mount、disk、load；<br />
$ adep check_status:resolve</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1</p>
<p>$ adep check_status:disk</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::2</p>
<p>2）实时监控服务器带宽<br />
在命令行执行 $ adepcheck_bandwidth 将会得到下面动态数据：</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::3</p>
<p>其中红框内的数据分别为：<br />
提示按”e”字母退出监控状态：此处注意输入格式；<br />
服务器流入带宽实时数据（动态显示）：分别显示KB/s 和Mb/s两中常见数据格式；<br />
服务器流出带宽实时数据（动态显示）：分别显示KB/s 和Mb/s两中常见数据格式；</p>
<p>3）文件的上传下载：<br />
通过命令行类似shell命令的方式实现：<br />
具体操作的哪些服务器、用户名、密码信息由appdeploy.py文件定义；</p>
<p>文件上传命令格式：$ adep put:localfile,remoteFolder<br />
“put”、”:”、”localFile”、”,”、”remoteFolder”之间都没有空格；<br />
LocalFile：本地上传文件路径及名字，RemoteFolder：上传到服务器的具体目录；</p>
<p>文件下载命令格式：$ adep get:remoteFile,localFolder<br />
”get”、”:”、”remoteFile”、”,”、”localFolder”之间都没有空格；<br />
RemoteFile：从服务器上下载的文件名，localFolder：下载文件本地存放目录；<br />
例如：</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::4</p>
<p>4）远程命令执行：<br />
通过命令行类似shell命令的方式实现：<br />
具体操作的哪些服务器、用户名、密码信息由appdeploy.py文件定义；</p>
<p>命令远程执行格式：$ adep run:shellCommand<br />
“run”、”:”、”shellCommand”之间都没有空格；<br />
ShellCommand：指远端执行的命令，有空格时要用引号引起来；</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::5</p>
<p>5）一键更新服务器源<br />
命令行输入 $ adep update_source<br />
可以更新服务器端的源配置，支持Ubuntu、Centos、Redhat、Opensuse、Debian等系统的多个版本源更新功能；</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::6</p>
<p>2. 一键部署Web服务器之Mysql + Nginx + PHP<br />
1）在appdeploy.py中输入以下定义<br />
def runtime():<br />
componets={“nginx” : “1.4.4″,<br />
“php” : “5.6.11″,<br />
“mysql” : “5.6.26″<br />
}<br />
install_runtime(componets)</p>
<p>2）在命令行执行下面命令，由于全部为源码安装，安装会占用相对较长时间。<br />
$ adep runtime</p>
<p>3）应用部署上线：上传您的PHP项目<br />
下面代码表示将本地PHP项目上传到服务器：/aliyun/www/phpwind目录；<br />
def deploy_php():<br />
put(“./php/*”, “/aliyun/www/phpwind/”)<br />
执行： $ adep deploy_php</p>
<p>4）检验应用部署效果</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::7</p>
<p>3. 一键部署Web服务器之JDK + Mysql + Nginx + Tomcat<br />
1）在appdeploy.py中输入以下定义<br />
def runtime():<br />
componets={ “jdk” : “1.8.0″,<br />
“nginx” : “1.4.4″,<br />
“tomcat” : “7.0.63″,<br />
“mysql” : “5.6.26″<br />
}<br />
install_runtime(componets)</p>
<p>2）在命令行执行下面命令，由于全部为源码安装，会占用相对较长时间。<br />
$ adep runtime</p>
<p>3）应用部署：上传您的java项目<br />
下面任务会将本地java项目编译、打包、上传到服务器（基于Maven，appdeploy会自动检测您的maven程序是否安装，若没有安装，则会自动安装），最后上传到服务器的/aliyun/server/tomcat/webapps目录；<br />
def pack_deploy():<br />
componets={“plugin”: “maven”,<br />
“project_dir” : “./java/myFirstWebApp”,<br />
“web_dir” : “/aliyun/server/tomcat/webapps”<br />
}<br />
package(componets)<br />
deploy(componets)<br />
执行： $ adep pack_deploy</p>
<p>4）检验应用部署效果</p>
<p>::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::8</p>
</div>
<div class="aly-article-next">
<div></div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/">阿里云运维部署工具AppDeploy最佳实践</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云运维部署工具AppDeploy详细教程</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 12:53:43 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[小说站代维]]></category>
		<category><![CDATA[阿里云代维]]></category>
		<category><![CDATA[阿里云运维部署工具AppDeploy详细教程]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2825</guid>
		<description><![CDATA[<p>AppDeploy是一个通过SSH实现的命令行工具，可完成应用部署和远程运维管理。当前工具实现为两个版本：普通 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b/">阿里云运维部署工具AppDeploy详细教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>AppDeploy<span style="font-family: 宋体;">是一个通过</span>SSH<span style="font-family: 宋体;">实现的命令行工具，可完成应用部署和远程运维管理。当前工具实现为两个版本：普通版（伪代码描述语言）和</span>Python<span style="font-family: 宋体;">版。</span>Python<span style="font-family: 宋体;">版使用</span>Python<span style="font-family: 宋体;">语法规则，可实现您的各种应用需求；普通版语法简单、容易上手，是对</span>Python<span style="font-family: 宋体;">版本的精简。两个版本当前都是免费使用。下载地址如下：</span><br />
<b><span style="font-family: 宋体;">普通版：</span></b><br />
<a id="url_3" href="http://market.aliyun.com/products/53690006/cmgj000331.html?spm=5176.900004.4.2.iTWBiC" target="_blank">http://market.aliyun.com/products/53690006/cmgj000331.html?spm=5176.900004.4.2.iTWBiC</a><br />
<b>Python</b><b><span style="font-family: 宋体;">版：</span></b><br />
<a id="url_4" href="http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY" target="_blank">http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY</a><br />
<b> </b><br />
<u><span style="font-size: x-large;"><b><span style="font-family: 宋体;">1 介绍一下</span></b><b>AppDeploy</b><b><span style="font-family: 宋体;">的主要功能</span></b></span></u><br />
<b>1）.</b><b><span style="font-family: 宋体;">远程应用部署：</span></b><br />
<span style="font-family: 宋体;">    可以将本地应用安装部署到远程<span id="rlt_6">云服务器</span>，软件包可以在本地编译打包好，也可以选择在云服务器编译安装；</span></p>
<p><b>2）.</b><b><span style="font-family: 宋体;">远程运维管理：</span></b><br />
<span style="font-family: 宋体;">    您可以使用</span>AppDeploy<span style="font-family: 宋体;">远程执行</span>shell<span style="font-family: 宋体;">脚本，让操作命令感觉在本地执行一般，大大的提高开发者的工作效率；</span><b></b></p>
<p><b>3）.</b><b><span style="font-family: 宋体;">一键环境安装：</span></b><br />
<span style="font-family: 宋体;">    一键安装</span>Web<span style="font-family: 宋体;">环境，当前支持</span>Java<span style="font-family: 宋体;">、</span>Nginx<span style="font-family: 宋体;">、</span>Apache<span style="font-family: 宋体;">、</span>Tomcat<span style="font-family: 宋体;">、</span>PHP<span style="font-family: 宋体;">、</span>Mysql<span style="font-family: 宋体;">等多款环境，可以根据具体业务选择适合工具的适合版本进行安装；</span></p>
<p><b>4）.</b><b><span style="font-family: 宋体;">一键应用部署：</span></b><br />
<span style="font-family: 宋体;">    可以一键编译、打包、部署常见的应用，支持</span>Maven<span style="font-family: 宋体;">、</span>Ant<span style="font-family: 宋体;">等打包部署的安装方案；</span></p>
<p><b>5）.</b><b><span style="font-family: 宋体;">一键式更新源：</span></b><br />
<span style="font-family: 宋体;">    执行</span>AppDeploy<span style="font-family: 宋体;"><span id="rlt_8">自</span>定义命令（</span>update_source<span style="font-family: 宋体;">）更新系统源，支持</span>Ubuntu<span style="font-family: 宋体;">、</span>Centos<span style="font-family: 宋体;">、</span>Redhat<span style="font-family: 宋体;">、</span>Opensuse<span style="font-family: 宋体;">、</span>Debian<span style="font-family: 宋体;">等系统的主流版本；</span></p>
<p><b>6）.</b><b><span style="font-family: 宋体;">文件上传下载：</span></b><br />
<span style="font-family: 宋体;">    您可以使用</span>AppDeploy<span style="font-family: 宋体;">在本地主机和远程服务器间实现上传、下载文件（夹）的功能；不仅实现了</span>ftp<span style="font-family: 宋体;">的功能，还可以远程执行管理命令；</span></p>
<p><b>7）.</b><b><span style="font-family: 宋体;">并发控制机器：</span></b><br />
<span style="font-family: 宋体;">    基于软件的部署场景，提供同时在多台服务器部署的功能，且可以选择顺序执行或者并发执行的运行模式；上面叙述的功能都可以使用并发模式在多服务器间同时运行。</span></p>
<p><b>8）.</b><b><span style="font-family: 宋体;">账号<span id="rlt_12">密码</span>管理：</span></b><br />
<span style="font-family: 宋体;">    提供灵活、易用的账号管理功能，用户可以设置免密码输入运行，且可为不同主机设置不同密码；</span></p>
<p><span style="font-size: x-large;"><u><b>2.AppDeploy</b><b><span style="font-family: 宋体;">的安装</span></b><b>&amp; </b></u><b><span style="font-family: 宋体;"><u><span id="rlt_9">配置</span></u></span></b></span><br />
AppDeploy<span style="font-family: 宋体;">支持在</span>Windows<span style="font-family: 宋体;">、</span>Linux<span style="font-family: 宋体;">、</span>Mac<span style="font-family: 宋体;">系统下使用，远端服务器当前只支持</span>Linux<span style="font-family: 宋体;">系统。根据不同系统分别介绍安装步骤（以</span>Python<span style="font-family: 宋体;">版为例，普通版类似）：</span></p>
<p><span style="font-size: medium;"><b>Linux</b><b><span style="font-family: 宋体;">系统平台安装：</span></b></span><br />
<span style="font-family: 宋体;">请预先安装好</span>python2.7<span style="font-family: 宋体;">；（一般安装在</span>/usr/local/lib/python2.7<span style="font-family: 宋体;">）</span><br />
1）.<span style="font-family: 宋体;">通过</span><a id="url_1" href="http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY" target="_blank"><span style="font-family: 宋体;">阿里云市场</span></a><span style="font-family: 宋体;">下载</span>AppDeploy<span style="font-family: 宋体;">源码安装包</span> &#8211; AppDeploy-Python-1.0.0.tar.gz<span style="font-family: 宋体;">；</span></p>
<p>2）.<span style="font-family: 宋体;">解压：</span>$ tar –zvxf AppDeploy-Python-1.0.0.tar.gz<span style="font-family: 宋体;">；得到</span>AppDeploy-Python-1.0.0-Linux.tar.gz;<br />
<span style="font-family: 宋体;">    解压：</span>$ tar –zvxf AppDeploy-Python-1.0.0-Linux.tar.gz<span style="font-family: 宋体;">；</span></p>
<p>3）.<span style="font-family: 宋体;">执行：</span>$ cd AppDeploy-Python &amp;&amp; sudo python setup.py install <span style="font-family: 宋体;">安装</span>appdeploy<span style="font-family: 宋体;">；</span></p>
<p>4）.<span style="font-family: 宋体;">执行：</span>$ adep<span style="font-family: 宋体;">命令，若果能找到命令说明安装完成（下图表示安装成功）；</span><br />
<span style="font-family: 宋体;">    <span id="att_81615" class="f12"><span id="td_att81615"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_47721b2b754e3f4.png6"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_47721b2b754e3f4.png6" alt="219_1171330362041663_47721b2b754e3f4" width="831" height="158" /></a></span></span></span><br />
<span style="font-size: medium;"><b>Windows</b><b><span style="font-family: 宋体;">系统安装：</span></b></span><br />
<span style="font-family: 宋体;">预先安装好</span>python2.7<span style="font-family: 宋体;">；（一般安装在</span>C:/Python27<span style="font-family: 宋体;">）；</span><br />
1）.<span style="font-family: 宋体;">通过</span><a id="url_2" href="http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY" target="_blank"><span style="font-family: 宋体;">阿里云市场</span></a><span style="font-family: 宋体;">下载</span>AppDeploy windows<span style="font-family: 宋体;">安装包</span> &#8211; AppDeploy-Python-1.0.1.zip<span style="font-family: 宋体;">；</span></p>
<p>2）.<span style="font-family: 宋体;">解压：</span>$ tar –zvxf AppDeploy-Python-1.0.1.tar.gz -&gt;AppDeploy-Python-1.0.1-Windows.tar.gz;</p>
<p>3）.<span style="font-family: 宋体;">解压：</span>$ tar –zvxf AppDeploy-Python-1.0.1-Windows.tar.gz<span style="font-family: 宋体;">；解压后可以发现一个安装文件</span>setup.exe<span style="font-family: 宋体;">安装包，即为</span>AppDeploy<span style="font-family: 宋体;">的安装文件；</span></p>
<p>4）.<span style="font-family: 宋体;">双击</span>setup.exe<span style="font-family: 宋体;">，双击</span>setup.exe<span style="font-family: 宋体;">（确定预先安装</span>python2.7<span style="font-family: 宋体;">），出现如下</span>AppDeploy<span style="font-family: 宋体;">的安装视图，安装目录应该选择</span>Python2.7<span style="font-family: 宋体;">的安装目录下的</span>Lib\site-packets<span style="font-family: 宋体;">子目录；</span><br />
<span style="font-family: 宋体;">    <span id="att_81616" class="f12"><span id="td_att81616"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_2a42f696783a100.png38"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_2a42f696783a100.png38" alt="219_1171330362041663_2a42f696783a100" width="499" height="388" /></a></span></span></span><br />
5）.<span style="font-family: 宋体;">根据向导直到安装完成；</span><br />
6）.<span style="font-family: 宋体;">设置环境变量：</span><br />
<b><span style="font-family: 宋体;">  环境变量一般为自动设置，不过这里您可以确认一下，以保证正常运行；</span></b><br />
<span style="font-family: 宋体;">  右键“计算机”</span> – <span style="font-family: 宋体;">选择属性</span>– <span style="font-family: 宋体;">选择“高级系统设置”</span>– <span style="font-family: 宋体;">选择高级</span>– <span style="font-family: 宋体;">选择</span><span style="font-family: 宋体;">“环境变量”：添加环境变量，名字（</span>APPDEPLOY<span style="font-family: 宋体;">）值（</span>C:\Python27\Lib\site-packages<span style="font-family: 宋体;">）；在</span>path<span style="font-family: 宋体;">系统变量中添加“</span>C:\Python27;%APPDEPLOY%; C:\Python27;<span style="font-family: 宋体;">”，</span><span style="font-family: 宋体;">分别为</span>Python2.7<span style="font-family: 宋体;">的安装目录和</span>AppDeploy<span style="font-family: 宋体;">的安装目录；</span></p>
<p>7）.<span style="font-family: 宋体;">验证：打开</span>cmd<span style="font-family: 宋体;">命令行工具，</span><br />
<span style="font-family: 宋体;">  输入：</span>python<span style="font-family: 宋体;">，如果能运行，则说明</span>python<span style="font-family: 宋体;">已经可用；</span><br />
<span style="font-family: 宋体;">  输入：</span>adep<span style="font-family: 宋体;">，如果显示下面日志，则说明安装成功；</span><br />
<span id="att_81617" class="f12"><span id="td_att81617"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_13417ebd963a822.png40"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_13417ebd963a822.png40" alt="219_1171330362041663_13417ebd963a822" width="864" height="131" /></a></span></span></p>
<div align="left"></div>
<div align="left"><span style="font-size: medium;"><b>Mac</b><b><span style="font-family: 宋体;">系统安装：（请预先安装好</span>python2.7</b><b><span style="font-family: 宋体;">）</span></b></span></div>
<div align="left">1）.<span style="font-family: 宋体;">下载</span>AppDeploy-python-1.0.1.tar.gz<span style="font-family: 宋体;">，解压可以得到</span>AppDeploy- python-1.0.1-Mac.zip <span style="font-family: 宋体;">的压缩包，解压</span>AppDeploy- python-1.0.1-Mac.zip<span style="font-family: 宋体;">，得到</span>pycrypto-2.6.1.tar.gz&amp; AppDeploy- python-1.0.1.tar.gz<span style="font-family: 宋体;">；</span></div>
<div align="left"></div>
<div align="left">2）.<span style="font-family: 宋体;">若您系统中尚未安装</span>pycrypto-2.6.1.tar.gz<span style="font-family: 宋体;">，解压后进入</span>pycrypto-2.6.1<span style="font-family: 宋体;">，执行</span>$ sudopython setup.py install<span style="font-family: 宋体;">；</span><span style="font-family: 宋体;">若已经安装，直接进入步骤</span>3<span style="font-family: 宋体;">；</span></div>
<p>&nbsp;</p>
<div align="left">3）.<span style="font-family: 宋体;">解压</span>AppDeploy-python-1.0.1.tar.gz<span style="font-family: 宋体;">，进入</span>appdeploy-python-1.0.1<span style="font-family: 宋体;">后执行</span>$ sudo pythonsetup.py install<span style="font-family: 宋体;">；</span></div>
<p>4）.<span style="font-family: 宋体;">进入命令行执行</span>$ adep<span style="font-family: 宋体;">，出现如下视图说明安装成功：</span></p>
<div align="left"><span style="font-family: 宋体;">  <span id="att_81618" class="f12"><span id="td_att81618"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_a01accf85543b40.png27"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_a01accf85543b40.png27" alt="219_1171330362041663_a01accf85543b40" width="562" height="135" /></a></span></span></span></div>
<p><b>3.</b><b><span style="font-family: 宋体;">基本使用方法</span></b><br />
AppDeploy<span style="font-family: 宋体;">的使用格式是在命令行执行</span>adep + <span style="font-family: 宋体;">参数</span> <span style="font-family: 宋体;">的命令格式运行，其执行的任务依据是根据其当前工作目录下的</span>appdeploy.py<span style="font-family: 宋体;">（默认）这个</span>python<span style="font-family: 宋体;">文件作为执行描述文件，若用户有自定义的描述文件，可用</span>”-f”<span style="font-family: 宋体;">参数指定。使用方式细分有两种：</span></p>
<p><span style="font-size: medium;"><b>1)</b><b><span style="font-family: 宋体;">通过命令行，直接执行命令</span></b></span><br />
<span style="font-family: 宋体;">格式：</span>$ <i>adep[options] &#8212; [shell command]</i></p>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>   <i>Option</i><i><span style="font-family: 宋体;">：为命令选项定义执行参数；</span></i><br />
<i><span style="font-family: 宋体;">  “</span>&#8212;</i><i><span style="font-family: 宋体;">”：</span></i><i><span style="font-family: 宋体;">双横线，为分割符将前面的参数和后面的</span>shell</i><i><span style="font-family: 宋体;">命令分开；</span></i><br />
<i>    [shell command]</i><i><span style="font-family: 宋体;">：</span>shell</i><i><span style="font-family: 宋体;">命令，会被在远端服务器执行；</span></i></td>
</tr>
</tbody>
</table>
<p><span style="font-family: 宋体;">常用的</span>option<span style="font-family: 宋体;">选项：</span><br />
<span id="att_81619" class="f12"><span id="td_att81619"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_19bfd3c7dde3712.png4"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_19bfd3c7dde3712.png4" alt="219_1171330362041663_19bfd3c7dde3712" width="483" height="103" /></a></span></span><br />
<span style="font-family: 宋体;">例如：查看服务器</span>nginx<span style="font-family: 宋体;">运行情况</span><br />
<i><u>$ adep -H &#8216;101.200.184.144&#8217; -u root -p xxxx &#8212; ps-aux | grep nginx</u></i><br />
<i>    <span id="att_81620" class="f12"><span id="td_att81620"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_31dc60efe538476.png9"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_31dc60efe538476.png9" alt="219_1171330362041663_31dc60efe538476" width="990" height="67" /></a></span></span></i><br />
<i>PS</i><i><span style="font-family: 宋体;">：上面方式使用方便，可以灵活、快速的执行您想执行的命令，但实现的功能相对简单，大部分情况下，您可以使用下面的方式实现您的具体任务；</span></i></p>
<p><b>2)</b><b><span style="font-family: 宋体;">通过编辑</span>appdeploy.py</b><b><span style="font-family: 宋体;">文件，以任务方式执行</span></b><br />
<span style="font-family: 宋体;">在</span>appdeploy.py<span style="font-family: 宋体;">文件中定义函数（任务的实现细节），并在命令行的当前目录下执行</span><i>$ adeptask1 task2</i><span style="font-family: 宋体;">（文件中定义的函数名）的方式依次执行定义的任务；</span><br />
<span style="font-family: Calibri,sans-serif;">appdeploy.py</span><span style="font-family: 宋体;">的编写规则:</span><br />
<i>    <span id="att_81621" class="f12"><span id="td_att81621"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_7726e52d4c3b0d9.png11"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_7726e52d4c3b0d9.png11" alt="219_1171330362041663_7726e52d4c3b0d9" width="535" height="166" /></a></span></span></i></p>
<div align="left"><span style="font-family: 宋体;">下面分别介绍</span>AppDeploy<span style="font-family: 宋体;">自定义的环境变量、操作命令、修饰符、并发执行等细节。</span></div>
<div align="left"><span style="font-family: 宋体;"><br />
</span></div>
<p><span style="font-size: x-large;"><b>4.</b><b><span style="font-family: 宋体;">获取设置</span></b></span><b><span style="font-size: x-large;">Access Key</span></b><br />
<span style="font-family: 宋体;">因为</span>AppDeploy<span style="font-family: 宋体;">工具基于阿里云产品设计实现，其某些功能会基于阿里云</span>OpenApi<span style="font-family: 宋体;">实现，所以需要设置</span>Access Key<span style="font-family: 宋体;">的值以获取调用</span>OpenApi<span style="font-family: 宋体;">的资格。</span><br />
<span style="font-family: 宋体;"><br />
</span><br />
<span style="font-family: 宋体;">获取Access Key的方法请参考：</span><a id="url_5" href="http://bbs.aliyun.com/read/253666.html?spm=5176.7189909.0.0.l1LU3c&amp;fpage=2" target="_blank">http://bbs.aliyun.com/read/253666.html?spm=5176.7189909.0.0.l1LU3c&amp;fpage=2</a><br />
<span style="font-family: 宋体;">得到的</span>Access KeyID<span style="font-family: 宋体;">和</span>Access Key Secret<span style="font-family: 宋体;">通过以下方式配置到</span>AppDeploy<span style="font-family: 宋体;">中：</span></p>
<div align="left"><span style="font-family: 宋体;">在</span>Appdeploy.py<span style="font-family: 宋体;">描述文件中设置</span>env.ak_id(Access Key ID)<span style="font-family: 宋体;">和</span>env.ak_sec(AccessKey Secret)<span style="font-family: 宋体;">变量；如下图所示：</span></div>
<p><i>     <span id="att_81622" class="f12"><span id="td_att81622"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_9d55655a8381c32.png8"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_9d55655a8381c32.png8" alt="219_1171330362041663_9d55655a8381c32" width="713" height="154" /></a></span></span></i><br />
<span style="font-size: x-large;"><b>5.</b><b><span style="font-family: 宋体;">环境变量</span></b></span></p>
<div align="left">AppDeploy<span style="font-family: 宋体;">工具通过自定义的环境变量来提高程序的可读性、以及描述文件的灵活性等；以下是常用的环境变量及其说明：</span></div>
<div align="left"><span style="font-family: 宋体;">  <span id="att_81623" class="f12"><span id="td_att81623"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_b12c240a84647ca.png15"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_b12c240a84647ca.png15" alt="219_1171330362041663_b12c240a84647ca" width="583" height="230" /></a></span></span><br />
</span></div>
<div align="left"><b>Hosts</b><b><span style="font-family: 宋体;">变量详细说明：</span></b></div>
<div align="left"><span style="font-family: 宋体;">用来定义需要连接的服务器地址集，在执行</span>appdeploy.py<span style="font-family: 宋体;">中任务时会在</span>hosts<span style="font-family: 宋体;">定义的每个服务器上运行一遍；定义格式：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><span style="font-family: arial;">env.hosts = [&#8216;host1&#8242;, &#8216;host2&#8242;]</span><span style="font-family: 宋体;">: 表示两个远端服务器，分别是</span><span style="font-family: arial;">host1</span><span style="font-family: 宋体;">和</span><span style="font-family: arial;">host2.</span></p>
<div align="left">env.hosts = [&#8216;host1&#8242;, &#8216;user2@host2&#8242;, &#8216;host3&#8242;]<span style="font-family: 宋体;">: 表示一共三个远端服务器</span>host1<span style="font-family: 宋体;">、</span>host2<span style="font-family: 宋体;">、</span>host3<span style="font-family: 宋体;">，其中</span>host2<span style="font-family: 宋体;">使用</span>user2<span style="font-family: 宋体;">用户名登录，</span>host1<span style="font-family: 宋体;">和</span>host3<span style="font-family: 宋体;">的用户名使用</span>env.user<span style="font-family: 宋体;">定义的值；</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div align="left"><span style="font-family: 宋体;"><br />
</span></div>
<div align="left"><span style="font-family: 宋体;">例如：在</span>appdeploy.py<span style="font-family: 宋体;">中定义：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>env.hosts = [&#8216;host1&#8242;, &#8216;host2&#8242;]</i></p>
<div align="left"><i>def task1():</i></div>
<div align="left"><i>    run(ls)</i></div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">则执行：</span>$ adeptask1<span style="font-family: 宋体;">时，会在</span>host1<span style="font-family: 宋体;">、</span>host2<span style="font-family: 宋体;">上分别执行</span>ls<span style="font-family: 宋体;">命令；</span></div>
<p>&nbsp;</p>
<div align="left"></div>
<div align="left"><b>User</b><b><span style="font-family: 宋体;">详细说明：</span></b></div>
<div align="left"><span style="font-family: 宋体;">定义远程服务器的登录名，如果没有定义，则默认为本地机器的当前用户名；</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<div align="left">env.user = &#8216;user1&#8242;</div>
<div align="left"></div>
<div align="left"><b>Password &amp; Passwords</b><b><span style="font-family: 宋体;">详细说明：</span></b></div>
<div align="left"><span style="font-family: 宋体;">首先推荐使用</span>SSH<span style="font-family: 宋体;">提供的密钥管理机制来实现免密码输入模式，可查阅资料；这里着重介绍</span>AppDeploy<span style="font-family: 宋体;">提供的密码管理方案。</span></div>
<div align="left"></div>
<div align="left">AppDeploy<span style="font-family: 宋体;">提供了两层管理密码的机制：</span></div>
<div align="left"><span style="font-family: 宋体;">如果您的</span>servers<span style="font-family: 宋体;">的密码都相同，可以通过在</span>env.password<span style="font-family: 宋体;">中设置统一密码；</span></div>
<div align="left"><span style="font-family: 宋体;">如果每个</span>server<span style="font-family: 宋体;">的密码不同，可以在</span>env.passwords<span style="font-family: 宋体;">中设置</span>host<span style="font-family: 宋体;">与</span>password<span style="font-family: 宋体;">对应表（</span>Json<span style="font-family: 宋体;">格式），对每个</span>server<span style="font-family: 宋体;">设置单独的密码；</span>host<span style="font-family: 宋体;">的格式：</span>user@host:port<span style="font-family: 宋体;">；</span></div>
<div align="left"><span style="font-family: 宋体;">例如:</span></div>
<p>&nbsp;</p>
<div align="left">env.password=’xxxxx’<span style="font-family: 宋体;">；</span> <span style="font-family: 宋体;">统一密码；</span></div>
<div align="left">env.passwords={&#8216;root@101.200.184.144:22&#8242;:’xxx’, &#8216;root@123.57.228.240:22&#8242;:’yyy’}</div>
<p>&nbsp;</p>
<div align="left"></div>
<div align="left"><b>parallel</b><b><span style="font-family: 宋体;">详细说明：</span></b></div>
<div align="left">Parallel<span style="font-family: 宋体;">设置时表明指定的任务在不同的服务器之间并发执行；格式为在任务前面：</span>@parallel(pool_size=5)<span style="font-family: 宋体;">，其中</span>pool_size<span style="font-family: 宋体;">指最多同时并发的个数，若不指定</span>pool_size<span style="font-family: 宋体;">，则默认不加限制；</span></div>
<div align="left"><span style="font-family: 宋体;">定义了</span>parallel<span style="font-family: 宋体;">只是一个任务在多个服务器之间并行，但不同的任务之间还是顺序执行；</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><span style="font-family: arial;">@parallel</span></p>
<div align="left">def task1():</div>
<div align="left">    pass</div>
<div align="left">def task2():</div>
<div align="left">    pass</div>
<div align="left">$ adep -H host1,host2,host3 task1task2</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">结果：</span></div>
<div align="left">Task1 on host1, host2, andhost3</div>
<div align="left">Task2 on host1</div>
<div align="left">Task2 on host2</div>
<div align="left">Task2 on host3</div>
<div align="left"></div>
<div align="left"><b>Roledefs &amp; Roles</b><b><span style="font-family: 宋体;">详细说明：</span></b></div>
<div align="left">AppDeploy<span style="font-family: 宋体;">可以为服务器地址定义组，用户可以基于不同组完成不同集群的部署，这样用户可以根据自己的业务定义不同的组群。格式为</span>JSON<span style="font-family: 宋体;">实现格式。</span></div>
<div align="left">Roles<span style="font-family: 宋体;">与</span>Hosts<span style="font-family: 宋体;">一样，都可以指定服务器地址集合，只是</span>Roles<span style="font-family: 宋体;">引用的服务器地址是经过</span>Roledefs<span style="font-family: 宋体;">定义的组名。</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><span style="font-family: arial;">env.roledefs = {</span></p>
<div align="left">   &#8216;apphosts': [‘host1&#8242;, &#8216;host2&#8242;, &#8216;host3&#8242;],</div>
<div align="left">   &#8216;webhosts': [&#8216;host3&#8242;, &#8216;host4&#8242;]</div>
<div align="left">}</div>
<div align="left">@roles(&#8216;apphosts&#8217;)</div>
<div align="left">@hosts(&#8216;host3&#8242;, &#8216;host5&#8242;)</div>
<div align="left">def task1():</div>
<div align="left">    run(&#8216;ls/var/www&#8217;)</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">执行：</span>$ adeptask1</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">会在</span>host1<span style="font-family: 宋体;">、</span>host2<span style="font-family: 宋体;">、</span>host3<span style="font-family: 宋体;">、</span>host5<span style="font-family: 宋体;">依次执行，</span>host3<span style="font-family: 宋体;">出现两次，被合并；</span></div>
<div align="left"><span style="font-family: 宋体;"><br />
</span></div>
<p><span style="font-size: x-large;"><b>6.</b><b><span style="font-family: 宋体;">执行命令</span></b></span><br />
<span style="font-family: 宋体;">环境变量定义任务执行的相关环境参数：如用户名、密码等，而任务的具体执行是很多具体指令组成的，下面是</span>AppDeploy<span style="font-family: 宋体;">自定义的执行命令集；</span><br />
<span style="font-family: 宋体;">  <span id="att_81624" class="f12"><span id="td_att81624"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_5c2ec18556495e3.png15"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_5c2ec18556495e3.png15" alt="219_1171330362041663_5c2ec18556495e3" width="579" height="243" /></a></span></span><br />
</span></p>
<div align="left"><b>Get</b><b><span style="font-family: 宋体;">命令详细说明：</span></b></div>
<div align="left">Get<span style="font-family: 宋体;">命令的功能是下载远端服务器上的文件或文件夹，根据不同常见可以如下格式：</span></div>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="1" rowspan="1" width="284">
<div align="left">get(&#8216;/path/to/remote_file.txt&#8217;, &#8216;local_dir&#8217;)</div>
</td>
<td colspan="1" rowspan="1" width="284">
<div align="left"><span style="font-family: 宋体;">新建</span>local_dir<span style="font-family: 宋体;">并保存文件；</span></div>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" width="284">
<div align="left">get(&#8216;/var/log/apache2/access.log&#8217;, &#8216;%(path)s&#8217;)</div>
</td>
<td colspan="1" rowspan="1" width="284">
<div align="left"><span style="font-family: 宋体;">下载</span>access.log<span style="font-family: 宋体;">的文件，保存在相同目录；</span></div>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" width="284">
<div align="left">get(&#8216;/var/log&#8217;, &#8216;%(path)s&#8217;)</div>
</td>
<td colspan="1" rowspan="1" width="284">
<div align="left"><span style="font-family: 宋体;">递归下载</span>/var/log<span style="font-family: 宋体;">下面所有文件；</span></div>
</td>
</tr>
<tr>
<td colspan="1" rowspan="1" width="284">
<div align="left">get(&#8216;/var/log&#8217;, ‘%(host)s/%(path)s’)</div>
</td>
<td colspan="1" rowspan="1" width="284">
<div align="left"><span style="font-family: 宋体;">多个</span>host<span style="font-family: 宋体;">时，保存在不同目录；</span></div>
</td>
</tr>
</tbody>
</table>
<div align="left"></div>
<div align="left"><b>Put</b><b><span style="font-family: 宋体;">命令详细说明：</span></b></div>
<div align="left">Put<span style="font-family: 宋体;">命令功能是将本地的文件、文件夹上传到远端服务器（一台或多台）；</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>put(&#8216;/path/test.txt&#8217;, &#8216;/root/&#8217;) </i><i><span style="font-family: 宋体;">将本地文件</span>test.txt</i><i><span style="font-family: 宋体;">上传到指定的服务器</span>/root</i><i><span style="font-family: 宋体;">下；</span></i></p>
<div align="left"><i>put(&#8216;/path/test&#8217;, &#8216;/root/&#8217;) </i><i><span style="font-family: 宋体;">将本地文件夹下面所有文件上传到指定服务器</span>/root</i><i><span style="font-family: 宋体;">下；</span></i></div>
<div align="left"><i>put(&#8216;/path/test.txt&#8217;, &#8216;/root/&#8217;) </i><i><span style="font-family: 宋体;">将本地文件</span>test.txt</i><i><span style="font-family: 宋体;">上传到指定的服务器</span>/root</i><i><span style="font-family: 宋体;">下，并设置权限；</span></i></div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"></div>
<div align="left"><b>Prompt</b><b><span style="font-family: 宋体;">命令详细说明：</span></b></div>
<div align="left">Prompt<span style="font-family: 宋体;">命令为用户提供一种交互式的选择功能，可以在程序运行时跳出选项供选择：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>env = prompt(&#8216;Please specify target environment: &#8216;)</i><i><span style="font-family: 宋体;">可以在运行时输入内容，并保存在</span>env</i><i><span style="font-family: 宋体;">中；</span></i></p>
<div align="left"><i>prompt(&#8216;Specify dish: &#8216;, &#8216;dish&#8217;, default=&#8217;spam &amp; eggs&#8217;)</i><i><span style="font-family: 宋体;">设置默认输入内容，不输入是用默认值；</span></i></div>
<div align="left"><i>prompt(&#8216;Please specify level: &#8216;, key=&#8217;nice&#8217;, validate=int)</i><i><span style="font-family: 宋体;">设定输入的内容只能是整数；</span></i></div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"></div>
<p><span style="font-size: x-large;"><b>7.</b><b><span style="font-family: 宋体;">修饰符</span></b></span></p>
<div align="left">AppDeploy<span style="font-family: 宋体;">通过定义修饰符来灵活的执行</span>appdeploy.py<span style="font-family: 宋体;">中的任务，常用的修饰符有：</span>hosts<span style="font-family: 宋体;">、</span>parallel<span style="font-family: 宋体;">、</span>roles<span style="font-family: 宋体;">、</span>serial<span style="font-family: 宋体;">、</span>task<span style="font-family: 宋体;">等，分别用例子描述他们的使用方法；</span></div>
<div align="left"></div>
<div align="left"><b>Hosts</b><b><span style="font-family: 宋体;">修饰符：</span></b></div>
<div align="left">hosts<span style="font-family: 宋体;">即为环境变量的名字，也可以用作修饰符来定义任务目标服务器。</span></div>
<div align="left"></div>
<p>&nbsp;</p>
<div align="left">@hosts(&#8216;user1@host1&#8242;, &#8216;host2&#8242;,&#8217;user3@host3&#8242;)</div>
<div align="left">def task1():</div>
<div align="left">    pass</div>
<div align="left"><span style="font-family: 宋体;">上例表明</span>task1<span style="font-family: 宋体;">会在</span>host1<span style="font-family: 宋体;">、</span>host2<span style="font-family: 宋体;">、</span>host3<span style="font-family: 宋体;">三个服务器上执行，其中在</span>host1<span style="font-family: 宋体;">、</span>host3<span style="font-family: 宋体;">上分别用</span>user1<span style="font-family: 宋体;">和</span>user3<span style="font-family: 宋体;">登录，</span>host2<span style="font-family: 宋体;">上用</span>env.user<span style="font-family: 宋体;">定义的用户名登录。</span></div>
<div align="left"></div>
<div align="left"><b>Parallel</b><b><span style="font-family: 宋体;">修饰符</span></b></div>
<div align="left">@parallel<span style="font-family: 宋体;">修饰符表明修饰的任务会在多个服务器之间并发执行；</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><span style="font-family: arial;">env.hosts = [‘host1’, ‘host2’]</span></p>
<div align="left">@parallel</div>
<div align="left">def task1():</div>
<div align="left">    pass</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">执行</span>$ adeptask1<span style="font-family: 宋体;">时，</span>task1<span style="font-family: 宋体;">会在</span>host1<span style="font-family: 宋体;">、</span>host2<span style="font-family: 宋体;">上同时执行；</span></div>
<div align="left"></div>
<div align="left"><b>Task</b><b><span style="font-family: 宋体;">修饰符：</span></b></div>
<div align="left">@task<span style="font-family: 宋体;">含义是：如果一个</span>appdeploy.py<span style="font-family: 宋体;">中使用了</span>@task<span style="font-family: 宋体;">，则所有函数都不再默认为任务（不对</span>adep<span style="font-family: 宋体;">命令可用），除非其前面标示了</span>@task<span style="font-family: 宋体;">标示。如果</span>appdeploy.py<span style="font-family: 宋体;">中没有任务前面使     用</span>@task<span style="font-family: 宋体;">标示，则所有函数都会默认为任务，可以被用户调用；</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<div align="left">
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><span style="font-family: arial;">@task</span></p>
<div align="left">def task1():</div>
<div align="left">   run(&#8220;ls&#8221;)</div>
<div align="left">def task2():</div>
<div align="left">    run(&#8220;pwd&#8221;)</div>
<div align="left">$ adep –list</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">结果是：</span>task2<span style="font-family: 宋体;">被看作</span>appdeploy.py<span style="font-family: 宋体;">的内部函数，不被暴漏给用户使用。</span></div>
<div align="left">Available commands:</div>
<div align="left">    task1</div>
<div align="left"></div>
<div align="left"><b>serial</b><b><span style="font-family: 宋体;">修饰符：</span></b></div>
<p>&nbsp;</p>
<div align="left">@serial<span style="font-family: 宋体;">的含义和</span>@parallel<span style="font-family: 宋体;">相反，作用是：如果全局设置了并发执行，但某个任务前面使用了</span>@serial<span style="font-family: 宋体;">参数，则这个任务依然用顺序执行模式。</span></div>
<div align="left"><span style="font-family: 宋体;"><br />
</span></div>
<p><span style="font-family: 宋体;">以上内容从</span>AK<span style="font-family: 宋体;">设置、环境变量、自定义命令、修饰符等方面描述了</span>AppDeploy<span style="font-family: 宋体;">的使用方法，下面以一个具体例子将上面内容展现出来。</span></p>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
# -*- coding: utf-8 -*-<br />
from src.api import *</p>
<p>env.ak_id=&#8221;xxx&#8221;<br />
env.ak_sec=&#8221;xxx&#8221;<br />
env.user = &#8216;root&#8217;<br />
env.password=&#8217;xxx&#8217;<br />
env.hosts = [&#8216;101.200.184.144&#8242;,&#8217;root@123.57.53.193:22&#8242;]
env.roledefs = {<br />
&#8216;apphosts': [&#8216;101.200.184.144&#8242;],<br />
&#8216;webhosts': [&#8216;root@123.57.53.193:22&#8242;]
}</p>
<p>@task<br />
def file_copy():<br />
put(&#8216;./test&#8217;, &#8216;/root/&#8217;)<br />
get(&#8216;/root/test&#8217;, &#8216;./test&#8217;)</p>
<p>@task<br />
@roles(&#8216;webhosts&#8217;)<br />
def remote_exec(cmd):<br />
local(&#8216;echo &#8220;run your cmd on remote hosts&#8221;&#8216;)<br />
run(cmd)</p>
<p>def useless():<br />
run(&#8216;pwd&#8217;)</td>
<td>
<p># Access Key ID<br />
# Access Key Secret<br />
# <span style="font-family: 宋体;">统一用户名</span><br />
# <span style="font-family: 宋体;">统一密码</span><br />
# <span style="font-family: 宋体;">定义</span>hosts<span style="font-family: 宋体;">变量</span><br />
# <span style="font-family: 宋体;">定义不同用户组</span></p>
<p># <span style="font-family: 宋体;">表明这个函数可以被执行</span></p>
<p># <span style="font-family: 宋体;">上传文件夹</span><br />
# <span style="font-family: 宋体;">下载文件夹</span></p>
<p># <span style="font-family: 宋体;">指定服务器集群</span></p>
<p># <span style="font-family: 宋体;">本地执行命令</span><br />
# <span style="font-family: 宋体;">远程执行命令</span></p>
<p># <span style="font-family: 宋体;">没有</span>@task<span style="font-family: 宋体;">，不能被执行</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: x-large;"><b>8.</b><b><span style="font-family: 宋体;">上传下载文件（夹）</span></b></span></p>
<p>AppDeploy<span style="font-family: 宋体;">对文件的上传、下载提供两种实现方式：</span><br />
<span style="font-family: 宋体;"><b>一种方式：</b>是在</span>appdeploy.py<span style="font-family: 宋体;">中定义文件上传下载的任务，然后再命令行执行</span>$ adep task<span style="font-family: 宋体;">以实现文件的上传下载功能。这种方式可以实现复杂逻辑的上传下载功能，例如：上传不同目录下、不同服务器的文件，但使用稍微繁琐，简单的上传下载功能参考方式二。</span><br />
<span style="font-family: 宋体;"><b><br />
</b></span><br />
<span style="font-family: 宋体;"><b>另一种方式：</b>直接使用</span>adep <span style="font-family: 宋体;">的命令行，格式如下：</span><br />
<i>$ adep put:local_file,remote_dir</i><br />
<i>$ adep get:remote_file,local_dir</i><br />
<span style="font-family: 宋体;">注意上述命令中没有空格，若目录中空格，可以用引号扩起来。下面是一些例子供参考：</span></p>
<p>1）<span style="font-family: 宋体;">将本地文件</span>a.txt<span style="font-family: 宋体;">上传到服务器</span>/root/<span style="font-family: 宋体;">目录下；</span><br />
<span style="font-family: 宋体;">   <span id="att_81625" class="f12"><span id="td_att81625"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_e8b52d80b53d9e7.png4"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_e8b52d80b53d9e7.png4" alt="219_1171330362041663_e8b52d80b53d9e7" width="358" height="95" /></a></span></span></span><br />
2）<span style="font-family: 宋体;">本地</span>”D:\ProgramFiles\”<span style="font-family: 宋体;">目录下的</span>b.txt<span style="font-family: 宋体;">上传到服务器</span>/root/<span style="font-family: 宋体;">目录下；</span><br />
<span style="font-family: 宋体;">   <span id="att_81626" class="f12"><span id="td_att81626"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_35b7b997284aa92.png4"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_35b7b997284aa92.png4" alt="219_1171330362041663_35b7b997284aa92" width="495" height="97" /></a></span></span></span><br />
3）<span style="font-family: 宋体;">将服务器</span>/root/b.txt<span style="font-family: 宋体;">文件下载到本地；</span><br />
<span style="font-family: 宋体;">   <span id="att_81627" class="f12"><span id="td_att81627"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_ebf6b61fe1e5b5d.png4"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_ebf6b61fe1e5b5d.png4" alt="219_1171330362041663_ebf6b61fe1e5b5d" width="490" height="99" /></a></span></span></span><br />
4）<span style="font-family: 宋体;">将本地的</span>./test/<span style="font-family: 宋体;">目录（及包含文件）上传到服务器</span>/root/<span style="font-family: 宋体;">下面；</span><br />
<span style="font-family: 宋体;">   <span id="att_81628" class="f12"><span id="td_att81628"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_b91449782b68db6.png5"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_b91449782b68db6.png5" alt="219_1171330362041663_b91449782b68db6" width="456" height="115" /></a></span></span></span><br />
5）<span style="font-family: 宋体;">下面服务器</span>/root/test<span style="font-family: 宋体;">目录到本地的</span>./test1/<span style="font-family: 宋体;">目录下；</span><br />
<span style="font-family: 宋体;">   <span id="att_81629" class="f12"><span id="td_att81629"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_96ca80096752ddf.png6"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_96ca80096752ddf.png6" alt="219_1171330362041663_96ca80096752ddf" width="590" height="124" /></a></span></span></span><br />
<span style="font-size: x-large;"><b>9.</b><b><span style="font-family: 宋体;">远程执行命令</span></b></span><br />
AppDeploy<span style="font-family: 宋体;">工具内置了</span>run<span style="font-family: 宋体;">指令做远程执行命令，在编辑</span>appdeploy.py<span style="font-family: 宋体;">中的任务时使用</span>run<span style="font-family: 宋体;">命令可以轻松实现远程执行，而在命令行想执行一个远程命令如何实现<span id="rlt_11">呢</span>？</span><br />
AppDeploy<span style="font-family: 宋体;">提供了两种实现方式：</span></p>
<p><span style="font-family: 宋体;"><b>一种方式</b>：在命令行执行</span>$ adep [options] &#8212; [shell command]<span style="font-family: 宋体;">，</span> option<span style="font-family: 宋体;">为命令的参数。</span><br />
<span style="font-family: 宋体;">例如：查看服务器</span>/root/test/<span style="font-family: 宋体;">文件夹里的文件列表；</span><br />
<span style="font-family: 宋体;">    <span id="att_81630" class="f12"><span id="td_att81630"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_348604fedf323a2.png8"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_348604fedf323a2.png8" alt="219_1171330362041663_348604fedf323a2" width="619" height="171" /></a></span></span></span><br />
<span style="font-family: 宋体;"><b>另一种方式</b>：在命令行中使用</span> $ adep run:”shell command”<span style="font-family: 宋体;">，需要注意的是</span>run<span style="font-family: 宋体;">和后面的</span>shell <span style="font-family: 宋体;">命令之间用“：”连接，且无空格，如果</span>shell<span style="font-family: 宋体;">命令有空格，请用引号将其引起来。</span><br />
<span style="font-family: 宋体;">    <span id="att_81631" class="f12"><span id="td_att81631"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_4dfcfbf5532e5c7.png7"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_4dfcfbf5532e5c7.png7" alt="219_1171330362041663_4dfcfbf5532e5c7" width="624" height="175" /></a></span></span></span><br />
<span style="font-size: x-large;"><b>10.</b><b><span style="font-family: 宋体;">一键更新源站</span></b></span><br />
<span style="font-family: 宋体;">买好了</span>ECS<span style="font-family: 宋体;">机器，安装完了系统，大部分用户都需要更新系统源这个任务。</span>AppDeploy<span style="font-family: 宋体;">为大家搜集了阿里云服务器上最常用、高效的源站链接，并提供一键更新的功能。此功能已经支持</span>Ubuntu<span style="font-family: 宋体;">、</span>Centos<span style="font-family: 宋体;">、</span>Fedora<span style="font-family: 宋体;">、</span>Opensuse<span style="font-family: 宋体;">、</span>Debain<span style="font-family: 宋体;">等</span>Unix<span style="font-family: 宋体;">系统。</span></p>
<p><span style="font-family: 宋体;">更新源站命令：</span> $ adep update_source<br />
<span id="att_81632" class="f12"><span id="td_att81632"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_8e73809adefbe20.png17"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_8e73809adefbe20.png17" alt="219_1171330362041663_8e73809adefbe20" width="618" height="308" /></a></span></span><br />
<span style="font-size: x-large;"><b>11.</b><b><span style="font-family: 宋体;">并发执行</span></b></span></p>
<div align="left">Appdeploy<span style="font-family: 宋体;">默认是串行执行所有命令的。但在设定参数的情况下可以实现并发执行任务。</span></div>
<div align="left">AppDeploy<span style="font-family: 宋体;">有两种方式并发执行任务：</span></div>
<div align="left">1）<span style="font-family: 宋体;">在命令行执行任务时添加</span>-P <span style="font-family: 宋体;">选项，则执行的所有任务都会在不同的服务器之间并发执行，但不同任务之间依然按照顺序执行进行；</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<p>&nbsp;</p>
<div align="left"><i>$ adep -P -H host1,host2update reload</i></div>
<div align="left"><i><span style="font-family: 宋体;">执行结果</span></i></div>
<div align="left"><i>update on host1 and host2</i></div>
<div align="left"><i>reload on host1 and host2</i></div>
<div align="left"></div>
<div align="left">2）<span style="font-family: 宋体;">通过在</span>appdeploy.py<span style="font-family: 宋体;">文件中的任务前面添加</span>@parallel<span style="font-family: 宋体;">来表明某个任务会被并行执行；</span></div>
<div align="left"><span style="font-family: 宋体;">例如：</span></div>
<p>&nbsp;</p>
<div align="left">def task1():</div>
<div align="left">    pass</div>
<div align="left">@parallel</div>
<div align="left">def task2():</div>
<div align="left">    pass</div>
<div align="left">$adep -H host1,host2,host3 task1 task2</div>
<div align="left"><span style="font-family: 宋体;">结果：</span></div>
<div align="left">Task1 on host1</div>
<div align="left">Task1 on host2</div>
<div align="left">Task1 on host3</div>
<div align="left">Task2 on host1,host2, and host3</div>
<div align="left">$adep -P -H host1,host2,host3 task1 task2</div>
<div align="left"><span style="font-family: 宋体;">结果：（</span>-P<span style="font-family: 宋体;">参数会覆盖</span>appdeploy<span style="font-family: 宋体;">中的定义）</span></div>
<div align="left">Task1 on host1,host2, and host3</div>
<div align="left">Task2 on host1,host2, and host3</div>
<p><span style="font-family: 宋体;">此类命令是基于用户工作习惯的总结，如果您有想新添加的功能或快捷方式，请与我们联系，我们会考虑将您需要的功能添加到工具的下个版本。</span></p>
<p>AppDeploy<span style="font-family: 宋体;">设计之初的重点研究对象就是应用部署，然而工具在开发初期更多的侧重于底层信息流的互通和通用功能的实现。当前</span>AppDeploy<span style="font-family: 宋体;">工具对应用部署的支持还不是很全面，这正是我们近期需要加强的地方。</span></p>
<p><span style="font-family: 宋体;">应用的部署相关工作可分为：服务器端的运行环境安装、应用的编译打包、应用的上传部署；</span></p>
<p><span style="font-size: x-large;"><b>12.</b><b><span style="font-family: 宋体;">服务器端的运行环境安装</span></b></span><br />
<span style="font-family: 宋体;">当前</span>[font=&amp;amp]AppDeploy<span style="font-family: 宋体;">更多侧重w</span>[font=&amp;amp]eb<span style="font-family: 宋体;">服务器安装，</span>[font=&amp;amp]AppDeploy<span style="font-family: 宋体;">支持常用W</span>[font=&amp;amp]eb<span style="font-family: 宋体;">环境的一键安装功能，支持的环境和版本见下表：</span><br />
<span id="att_81633" class="f12"><span id="td_att81633"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_1f7e191c7503463.png5"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_1f7e191c7503463.png5" alt="219_1171330362041663_1f7e191c7503463" width="438" height="158" /></a></span></span><br />
<span style="font-family: 宋体;">然而上述有些环境在不同操作系统上依赖库、安装细节等都不相同，所以当前无法保证以上工具能在所有操作系统环境安装无误，若出现安装失败，请查看错误日志或联系我们的<span id="rlt_10">邮箱</span>。</span> <span style="font-family: 宋体;">安装步骤如下：</span><br />
1）<span style="font-family: 宋体;">编辑</span>appdeploy.py<span style="font-family: 宋体;">文件，输入希望运行的</span>web<span style="font-family: 宋体;">环境组件。</span><br />
2）<span style="font-family: 宋体;">定义一个任务，任务中调用</span>appdeploy<span style="font-family: 宋体;">的内置函数：</span>install_runtime(para)<span style="font-family: 宋体;">，参数</span>para<span style="font-family: 宋体;">为想要安装的</span>web<span style="font-family: 宋体;">组件细节，使用</span>json<span style="font-family: 宋体;">格式输入。</span><br />
3）<span style="font-family: 宋体;">在命令行执行执行：</span>$adep runtime<span style="font-family: 宋体;">即可。</span></p>
<p><b><span style="font-family: 宋体;">例子</span>1</b><b><span style="font-family: 宋体;">：</span></b><b><span style="font-family: 宋体;">服务器上安装</span>Jdk-1.7.0</b><b><span style="font-family: 宋体;">和</span>Tomcat-7.0.63</b><b><span style="font-family: 宋体;">的运行环境</span></b><br />
1）<span style="font-family: 宋体;">在</span>appdeploy.py<span style="font-family: 宋体;">中定义任务</span>runtime<span style="font-family: 宋体;">，并调用</span>install_runtime(compontens)<span style="font-family: 宋体;">函数，参数为要安装的</span>jdk<span style="font-family: 宋体;">、</span>tomcat<span style="font-family: 宋体;">版本号，用</span>json<span style="font-family: 宋体;">格式输入。</span></p>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>def runtime():</i><i>   componets={&#8220;jdk&#8221;    :&#8221;1.7.0&#8243;,</i><br />
<i>           &#8220;tomcat&#8221;  :&#8221;7.0.63&#8243;</i><i>  }</i><br />
<i>    install_runtime(componets)</i></td>
</tr>
</tbody>
</table>
<p>2）<span style="font-family: 宋体;">在命令行执行：</span>$ adep runtime<span style="font-family: 宋体;">执行安装过程，</span><br />
<span style="font-family: 宋体;">    <span id="att_81634" class="f12"><span id="td_att81634"><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_3b2ff6a43d36bd1.png12"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/01/219_1171330362041663_3b2ff6a43d36bd1.png12" alt="219_1171330362041663_3b2ff6a43d36bd1" width="818" height="225" /></a></span></span><br />
</span><br />
3）IE<span style="font-family: 宋体;">中输入访问地址，验证安装结果，下图表明</span>tomcat<span style="font-family: 宋体;">已经安装成功</span><span style="font-family: 宋体;">。</span><br />
<span style="font-family: 宋体;">    [attachment=81519]
</span><br />
<span style="font-family: 宋体;">例子</span>2<span style="font-family: 宋体;">：<b>服务器上安装</b></span><b>apache</b><b><span style="font-family: 宋体;">和</span>Tomcat-7.0.63</b><b><span style="font-family: 宋体;">的运行环境</span></b><br />
1）<span style="font-family: 宋体;">在</span>appdeploy.py<span style="font-family: 宋体;">中定义任务</span>runtime<span style="font-family: 宋体;">，并调用</span>install_runtime(compontens)<span style="font-family: 宋体;">函数，参数为要安装的</span>Apache<span style="font-family: 宋体;">、</span>PHP<span style="font-family: 宋体;">版本号，用</span>json<span style="font-family: 宋体;">格式输入。</span></p>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>def runtime():</i><i>    componets={&#8220;</i> <i>apache&#8221;    : &#8220;</i> <i>2.2.31&#8243;,</i><br />
<i>           &#8220;php&#8221;        : &#8220;5.0&#8221;,</i><i>              }</i><br />
<i>    install_runtime(componets)</i></td>
</tr>
</tbody>
</table>
<p>2）<span style="font-family: 宋体;">在命令行执行：</span>$ adep runtime<span style="font-family: 宋体;">执行安装过程，</span><br />
<span style="font-family: 宋体;">    [attachment=81520]
</span><br />
<b>3）</b>IE<span style="font-family: 宋体;">中输入访问地址，验证安装结果，下图表明</span>PHP<span style="font-family: 宋体;">已经安装成功（</span>hello.php<span style="font-family: 宋体;">是环境安装后放到</span>php<span style="font-family: 宋体;">指定目录下的文件）；</span><b></b><br />
<span style="font-family: 宋体;">    [attachment=81521]
</span><br />
<span style="font-size: x-large;"><b>13.</b><b><span style="font-family: 宋体;">应用打包部署</span></b></span><br />
<b><span style="font-family: 宋体;">例子</span></b><b>1</b><b><span style="font-family: 宋体;">：将本地</span></b><b>Java</b><b><span style="font-family: 宋体;">应用部署到服务器。</span></b><br />
<span style="font-family: 宋体;">结合上面环境安装的例子（</span>1<span style="font-family: 宋体;">），将本地一个</span>java<span style="font-family: 宋体;">应用部署到服务器。</span></p>
<p>1）<span style="font-family: 宋体;">在</span>appdeploy.py<span style="font-family: 宋体;">中添加如下任务，任务中定义：打包工具、本地项目目录、服务器端的</span>web<span style="font-family: 宋体;">应用目录，并调用打包、部署命令</span>package<span style="font-family: 宋体;">和</span>deploy<span style="font-family: 宋体;">接口。</span></p>
<table class="read_form" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td><i>def pack_deploy():</i><i>   componets={&#8220;package_tool&#8221;: &#8220;maven&#8221;,</i><br />
<i>              &#8220;project_dir&#8221; : &#8220;/home/xxx/src/example/maven/myFirstWebApp&#8221;,</i><i>              </i><br />
<i>              &#8220;web_dir&#8221;   :&#8221;/alidata/server/tomcat/webapps&#8221;</i><br />
<i>               }</i><i> </i><br />
<i>    package(componets)</i><br />
<i>    deploy(componets)</i></td>
</tr>
</tbody>
</table>
<p>2）<span style="font-family: 宋体;">在命令行输入命令：</span>$ adep pack_deploy<span style="font-family: 宋体;">执行打包部署任务，如下：</span><br />
<span style="font-family: 宋体;">    [attachment=81522]
</span><br />
3）<span style="font-family: 宋体;">在</span>IE<span style="font-family: 宋体;">上输入应用地址，检查部署效果。下图表示应用部署成功：</span><br />
<span style="font-family: 宋体;">    [attachment=81523]
</span><br />
<span style="font-family: 宋体;">应用部署是</span>AppDeploy<span style="font-family: 宋体;">以后重点研究方向，我们深知当前做的还很有限，也正是借此机会和广大开发者交流，希望您能把工具的不足之处和您自己的需求发送给我们，一起把应用部署方案做到更新、更方便使用。</span><br />
&nbsp;</p>
<div align="left"><span style="font-family: 宋体;">欢迎下载使用阿里云</span>AppDeploy<span style="font-family: 宋体;">，期待您的反馈和建议！！</span></div>
<p><a id="url_7" href="http://market.aliyun.com/products/53690006/cmgj000321.html?spm=5176.9000004.0.0.8AlNTY" target="_blank"></a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b/">阿里云运维部署工具AppDeploy详细教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e8%bf%90%e7%bb%b4%e9%83%a8%e7%bd%b2%e5%b7%a5%e5%85%b7appdeploy%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XtraBackup不停机不锁表搭建MySQL主从同步教程</title>
		<link>https://www.fuwuqiok.com/xtrabackup%e4%b8%8d%e5%81%9c%e6%9c%ba%e4%b8%8d%e9%94%81%e8%a1%a8%e6%90%ad%e5%bb%bamysql%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/xtrabackup%e4%b8%8d%e5%81%9c%e6%9c%ba%e4%b8%8d%e9%94%81%e8%a1%a8%e6%90%ad%e5%bb%bamysql%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Sun, 23 Aug 2015 10:14:06 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[XtraBackup不停机不锁表搭建MySQL主从同步教程]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2690</guid>
		<description><![CDATA[<p>前言 Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具，支持在线无锁表同步复制和 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/xtrabackup%e4%b8%8d%e5%81%9c%e6%9c%ba%e4%b8%8d%e9%94%81%e8%a1%a8%e6%90%ad%e5%bb%bamysql%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e6%95%99%e7%a8%8b/">XtraBackup不停机不锁表搭建MySQL主从同步教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/02ftb7pa.jpeg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/02ftb7pa.jpeg" alt="02ftb7pa" width="562" height="580" /></a></p>
<h2 id="前言">前言</h2>
<p>Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具，支持在线无锁表同步复制和可并行高效率的安全备份恢复机制相比<code>mysqldump</code>来说确实让人眼前一亮，与<code>MySQL Enterprise Backup(InnoDB Hot Backup)</code>的功能对比可以参考扩展阅读。当然我们在实际运维过程中都应针对不同的业务需求分析和选择合适的备份恢复方案，这篇文章就是针对MySQL多实例且一个实例对应多个database的情况，实现MySQL在线不停机不锁表的主从同步，日后再继续更新分享基于<code>XtraBackup</code>的其它实用技能。</p>
<blockquote><p>XtraBackup是目前首选的备份方案之一</p>
<h2 id="原理">原理</h2>
<h3 id="MySQL主从同步原理">MySQL主从同步原理</h3>
<p>MySQL主从同步是在 MySQL主从复制(Master-Slave Replication)基础上实现的，通过设置在Master MySQL上的binlog(使其处于打开状态)，Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog，然后传输到Slave MySQL的中继日志中，然后Slave MySQL的SQL线程从中继日志中读取中继日志，然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。</p>
<h3 id="XtraBackup备份原理">XtraBackup备份原理</h3>
<p>innobackupex在后台线程不断追踪 InnoDB的日志文件，然后复制InnoDB的数据文件。数据文件复制完成之后，日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始 备份以后的事务日志。完成上面的步骤之后，就可以使用InnoDB崩溃恢复代码执行事务日志（redo log），以达到数据的一致性。<br />
备份分为两个过程：</p>
<ol>
<li>backup，备份阶段，追踪事务日志和复制数据文件（物理备份）。</li>
<li>preparing，重放事务日志，使所有的数据处于同一个时间点，达到一致性状态。</li>
</ol>
<h3 id="XtraBackup的优点">XtraBackup的优点</h3>
<ol>
<li>可以快速可靠的完成数据备份（复制数据文件和追踪事务日志）</li>
<li>数据备份过程中不会中断事务的处理（热备份）</li>
<li>节约磁盘空间和网络带宽</li>
<li>自动完成备份鉴定</li>
<li>因更快的恢复时间而提高在线时间</li>
</ol>
<h2 id="配置">配置</h2>
<h3 id="准备工作">准备工作</h3>
<blockquote><p>MySQL步骤和my.cnf配置</p>
<pre><span class="line">#原有主数据库版本</span>
<span class="line">mysql -V</span>
<span class="line">mysql  Ver 14.14 Distrib 5.5.31, for Linux (x86_64) using readline 5.1</span>

<span class="line">#迁移从数据库版本</span>
<span class="line">mysql -V</span>
<span class="line">mysql  Ver 14.14 Distrib 5.6.25, for linux-glibc2.5 (x86_64) using  EditLine wrapper</span>

<span class="line">#检查数据库引擎</span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">engines</span>;</span></span>

<span class="line">+<span class="comment">--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span></span>
<span class="line">| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |</span>
<span class="line">+<span class="comment">--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span></span>
<span class="line">| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |</span>
<span class="line">| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |</span>
<span class="line">| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |</span>
<span class="line">| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |</span>
<span class="line">| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |</span>
<span class="line">| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |</span>
<span class="line">| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |</span>
<span class="line">| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |</span>
<span class="line">| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |</span>
<span class="line">+<span class="comment">--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span></span>


<span class="line">#主从数据库同步注意点</span>
<span class="line">[mysqld]</span>
<span class="line">#主从之间的id不能相同</span>
<span class="line">server-id</span>
<span class="line">#启用二进制日志</span>
<span class="line">log-bin</span>
<span class="line">#一般在从库开启（可选）</span>
<span class="line">read_only</span>
<span class="line">#推荐使用InnoDB并做好相关配置</span>


<span class="line">#检查主从数据库状态</span>
<span class="line">mysql -S /tmp/mysql.sock -e "<span class="operator"><span class="keyword">show</span> <span class="keyword">global</span> <span class="keyword">variables</span> <span class="keyword">like</span> <span class="string">'server_id'</span>;</span>"</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>
<span class="line">| Variable_name | Value |</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>
<span class="line">| server_id     | 1     |</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>

<span class="line">mysql -S /tmp/mysql.sock -e "<span class="operator"><span class="keyword">show</span> <span class="keyword">global</span> <span class="keyword">variables</span> <span class="keyword">like</span> <span class="string">'log_bin'</span>;</span>"</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>
<span class="line">| Variable_name | Value |</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>
<span class="line">| log_bin       | ON    |</span>
<span class="line">+<span class="comment">---------------+-------+</span></span>


</pre>
<h3 id="安装percona-xtrabackup">安装percona-xtrabackup</h3>
<blockquote><p>一般推荐rpm安装 &#8211; <a href="https://www.percona.com/downloads/XtraBackup/LATEST/" target="_blank" rel="external">https://www.percona.com/downloads/XtraBackup/LATEST/</a></p></blockquote>
<figure class="highlight bash">
<table>
<tbody>
<tr>
<td class="code">
<pre><span class="line">yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL</span>
<span class="line"><span class="comment">#rpm -ivh percona-xtrabackup-2.2.12-1.el6.x86_64.rpm </span></span>
<span class="line">rpm -Uvh percona-xtrabackup-<span class="number">2.2</span>.<span class="number">12</span>-<span class="number">1</span>.el6.x86_64.rpm</span></pre>
</td>
</tr>
</tbody>
</table>
</figure>
<h3 id="备份和恢复">备份和恢复</h3>
<blockquote><p>通常一般都直接使用innobackupex，因为它能同时备份InnoDB和MyISAM引擎的表<br />
重点关注Slave_IO_Running和Slave_SQL_Runningd的状态是否为YES</p>
<figure class="highlight sql">
<table>
<tbody>
<tr>
<td class="code">
<pre><span class="line">#备份</span>
<span class="line">innobackupex <span class="comment">--socket=/usr/local/var/mysql2/mysql2.sock --user=root --password --defaults-file=/etc/mysqld_multi.cnf --parallel=4 --database=passport /tmp/backup</span></span>
<span class="line">#保持事务一致性</span>
<span class="line">innobackupex <span class="comment">--socket=/usr/local/var/mysql2/mysql2.sock --user=root --password --defaults-file=/etc/mysqld_multi.cnf --database=passport --apply-log /tmp/backup/2015-08-05_16-08-14</span></span>
<span class="line">#传输</span>
<span class="line">scp -r /tmp/<span class="operator"><span class="keyword">backup</span>/<span class="number">2015</span>-<span class="number">08</span>-<span class="number">05</span>_16-<span class="number">08</span>-<span class="number">14</span> <span class="number">10.10</span><span class="number">.16</span><span class="number">.24</span>:/tmp/<span class="keyword">backup</span>/ </span>
#恢复
innobackupex <span class="comment">--socket=/tmp/mysql.sock --user=root --password --defaults-file=/app/local/mysql/my.cnf --copy-back /tmp/backup/2015-08-05_16-08-14/</span>
#还原权限
chown -R mysql:mysql /app/<span class="keyword">data</span>/mysql/<span class="keyword">data</span>
service mysqld <span class="keyword">start</span>
/app/<span class="keyword">local</span>/mysql/scripts/mysql_install_db <span class="comment">--basedir=/app/local/mysql --datadir=/app/data/mysql/data --no-defaults --skip-name-resolve --user=mysql</span>


#主库授权同步帐号
<span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> <span class="keyword">CONCAT</span>(<span class="string">'User: '''</span>,<span class="keyword">user</span>,<span class="string">'''@'''</span>,host,<span class="string">''';'</span>) <span class="keyword">AS</span> <span class="keyword">query</span> <span class="keyword">FROM</span> mysql.<span class="keyword">user</span>;</span>
<span class="line"><span class="operator"><span class="keyword">GRANT</span> REPLICATION <span class="keyword">SLAVE</span> <span class="keyword">ON</span> *.* <span class="keyword">TO</span> <span class="string">'slave_passport'</span>@<span class="string">'10.10.16.24'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'slave_passport'</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">FLUSH</span> <span class="keyword">PRIVILEGES</span>;</span></span>

<span class="line">#从库开启同步</span>
<span class="line">cat /tmp/<span class="operator"><span class="keyword">backup</span>/<span class="number">2015</span>-<span class="number">08</span>-<span class="number">05</span>_16-<span class="number">08</span>-<span class="number">14</span>/xtrabackup_binlog_info </span>
mysql-<span class="keyword">bin</span><span class="number">.002599</span>    <span class="number">804497686</span>

<span class="keyword">CHANGE</span> <span class="keyword">MASTER</span> <span class="keyword">TO</span>
MASTER_HOST=<span class="string">'10.10.16.51'</span>,
MASTER_USER=<span class="string">'slave_passport'</span>,
MASTER_PASSWORD=<span class="string">'slave_passport'</span>,
MASTER_PORT=<span class="number">3307</span>,
MASTER_LOG_FILE=<span class="string">'mysql-bin.002599'</span>,
MASTER_LOG_POS=<span class="number">804497686</span>;</span>

<span class="line">#开启主从同步</span>
<span class="line"><span class="operator"><span class="keyword">start</span> <span class="keyword">slave</span>;</span></span>
<span class="line">#查看从库状态</span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">slave</span> <span class="keyword">status</span>\ G</span>
#从库的检查参数
Slave_IO_Running=Yes
Slave_SQL_Running=Yes

#主库的检查参数
<span class="keyword">show</span> <span class="keyword">master</span> <span class="keyword">status</span> \G

+<span class="comment">------------------+-----------+--------------+------------------+</span>
| File             | <span class="keyword">Position</span>  | Binlog_Do_DB | Binlog_Ignore_DB |
+<span class="comment">------------------+-----------+--------------+------------------+</span>
| mysql-<span class="keyword">bin</span><span class="number">.002600</span> | <span class="number">454769337</span> |              |                  |
+<span class="comment">------------------+-----------+--------------+------------------+</span>
<span class="number">1</span> <span class="keyword">row</span> <span class="keyword">in</span> <span class="keyword">set</span> (<span class="number">0.00</span> sec)


<span class="keyword">show</span> <span class="keyword">processlist</span>;</span>

<span class="line">Master has sent all binlog to slave; waiting for binlog to be updated</span></pre>
</td>
</tr>
</tbody>
</table>
</figure>
<h3 id="MySQL主从切换">MySQL主从切换</h3>
<blockquote><p>切换前断开主库访问连接观察进程状态，无写操作后再停止从库IO_THREAD进行切换</p></blockquote>
<figure class="highlight sql">
<table>
<tbody>
<tr>
<td class="code">
<pre><span class="line">#查看主库状态</span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">processlist</span>;</span></span>
<span class="line">Master has sent all binlog to slave; waiting for binlog to be updated</span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">master</span> <span class="keyword">status</span> \G</span>

#从库停止 IO_THREAD 线程
<span class="keyword">stop</span> <span class="keyword">slave</span> IO_THREAD;</span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">processlist</span>;</span></span>
<span class="line">Slave has read all relay log; waiting for the slave I/O thread to <span class="operator"><span class="keyword">update</span> it</span>
<span class="keyword">show</span> <span class="keyword">slave</span> <span class="keyword">status</span> \G

#从库切换为主库
<span class="keyword">stop</span> <span class="keyword">slave</span>;</span>
<span class="line"><span class="operator"><span class="keyword">reset</span> <span class="keyword">master</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">reset</span> <span class="keyword">slave</span> <span class="keyword">all</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">master</span> <span class="keyword">status</span> \G</span>

#激活帐户
<span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> <span class="keyword">CONCAT</span>(<span class="string">'User: '''</span>,<span class="keyword">user</span>,<span class="string">'''@'''</span>,host,<span class="string">''';'</span>) <span class="keyword">AS</span> <span class="keyword">query</span> <span class="keyword">FROM</span> mysql.<span class="keyword">user</span>;</span>
<span class="line"><span class="operator"><span class="keyword">GRANT</span> REPLICATION <span class="keyword">SLAVE</span> <span class="keyword">ON</span> *.* <span class="keyword">TO</span> <span class="string">'slave_passport'</span>@<span class="string">'10.10.16.51'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'slave_passport'</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">FLUSH</span> <span class="keyword">PRIVILEGES</span>;</span></span>

<span class="line">#切换原有主库为从库</span>
<span class="line"><span class="operator"><span class="keyword">reset</span> <span class="keyword">master</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">reset</span> <span class="keyword">slave</span> <span class="keyword">all</span>;</span></span>

<span class="line"><span class="operator"><span class="keyword">CHANGE</span> <span class="keyword">MASTER</span> <span class="keyword">TO</span></span>
MASTER_HOST=<span class="string">'10.10.16.24'</span>,
MASTER_USER=<span class="string">'slave_passport'</span>,
MASTER_PASSWORD=<span class="string">'slave_passport'</span>,
MASTER_PORT=<span class="number">3306</span>,
MASTER_LOG_FILE=<span class="string">'mysql-bin.000001'</span>,
MASTER_LOG_POS=<span class="number">804497686</span>;</span>

<span class="line">#检查主库</span>
<span class="line"><span class="operator"><span class="keyword">SHOW</span> <span class="keyword">PROCESSLIST</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">master</span> <span class="keyword">status</span> \G</span>

#启动从库
<span class="keyword">SHOW</span> <span class="keyword">PROCESSLIST</span>;</span>
<span class="line"><span class="operator"><span class="keyword">start</span> <span class="keyword">slave</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">slave</span> <span class="keyword">status</span> \G</span></span></pre>
</td>
</tr>
</tbody>
</table>
</figure>
<h3 id="常见问题">常见问题</h3>
<blockquote><p>Slave_SQL_Running:No</p></blockquote>
<pre><span class="line">#一般是事务回滚造成的</span>
<span class="line"><span class="operator"><span class="keyword">stop</span> <span class="keyword">slave</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">set</span> <span class="keyword">GLOBAL</span> SQL_SLAVE_SKIP_COUNTER=<span class="number">1</span>;</span></span>
<span class="line"><span class="operator"><span class="keyword">start</span> <span class="keyword">slave</span>;</span></span></pre>
</blockquote>
</blockquote>
</blockquote>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/xtrabackup%e4%b8%8d%e5%81%9c%e6%9c%ba%e4%b8%8d%e9%94%81%e8%a1%a8%e6%90%ad%e5%bb%bamysql%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e6%95%99%e7%a8%8b/">XtraBackup不停机不锁表搭建MySQL主从同步教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/xtrabackup%e4%b8%8d%e5%81%9c%e6%9c%ba%e4%b8%8d%e9%94%81%e8%a1%a8%e6%90%ad%e5%bb%bamysql%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云slb服务器SSL证书部署指南</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e6%9c%8d%e5%8a%a1%e5%99%a8ssl%e8%af%81%e4%b9%a6%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e6%9c%8d%e5%8a%a1%e5%99%a8ssl%e8%af%81%e4%b9%a6%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97/#comments</comments>
		<pubDate>Thu, 20 Aug 2015 14:02:58 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[slb]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[ssl证书]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云slb服务器SSL证书部署指南]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2637</guid>
		<description><![CDATA[<p>一、 安装SSL证书的环境 1.1 SSl证书安装环境简介 Linux服务器一台， 阿里云slb服务器 SSL [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e6%9c%8d%e5%8a%a1%e5%99%a8ssl%e8%af%81%e4%b9%a6%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97/">阿里云slb服务器SSL证书部署指南</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>一、 安装SSL证书的环境</strong></p>
<p><strong>1.1 SSl证书安装环境简介</strong></p>
<p>Linux服务器一台，</p>
<p>阿里云slb服务器</p>
<p>SSL证书一张(备注：本指南使用www.fuwuqiok.com域名<a href="https://www.fuwuqiok.com" target="_blank">Yunwei123</a>进行操作,通用其它版本证书)</p>
<p><strong>1.2网络环境要求</strong></p>
<p>请确保站点是一个合法的外网可以访问的域名地址，可以正常通过或http：//XXX进行正常访问。</p>
<p><strong>二、 SSL证书的安装</strong></p>
<p><strong>2.1获取SSl证书</strong></p>
<p>成功在沃通CA申请证书后，会得到一个有密码的压缩包文件，输入证书密码后解压得到五个文件：for Apache、for IIS、for Ngnix、for Other Server，这个是证书的几种格式，Ngnix上需要用到for Ngnix格式的证书。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51901.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51901.jpg" alt="51901" width="510" height="109" /></a></p>
<p>图1</p>
<p><strong>2. 2合成证书文件</strong></p>
<p>打开for Ngnix文件可以看到2个文件。包括公钥、私钥，如图1</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51902.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51902.jpg" alt="51902" width="456" height="53" /></a></p>
<p>图2</p>
<p><strong>2.3安装SSL证书</strong></p>
<p>打开阿里云slb配置面板</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51903.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51903.jpg" alt="51903" width="581" height="626" /></a></p>
<p>可以看到证书需要pem格式的证书，而证书包里面给的类型是crt的，下面就是怎样导出pem格式证书的方法啦!</p>
<p>第一步：将for nginx里面的1_domain.com.bundle.crt文件拷贝到windows环境下，并采用加密外壳扩展方式打开</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51904.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51904.png" alt="51904" width="478" height="261" /></a></p>
<p>第二步：用加密外壳扩展打开后，查看证书路径</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51905.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51905.png" alt="51905" width="413" height="488" /></a></p>
<p>选择域名，查看详细信息，导出证书，并命名为1</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51906.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51906.png" alt="51906" width="915" height="490" /></a></p>
<p>然后回到证书路径里面，选择上一级证书，导出并命名为2</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51907.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51907.png" alt="51907" width="831" height="483" /></a></p>
<p>第三步：依次向上导出证书，直到最上面的证书也被导出，并分别命名为3，4.接下来，新建一个txt，并依次将1.2.3.4.cer用记事本方式 打开，粘帖到新建的txt中，注意中间不要留有空格(如下图)，然后保存txt，并将txt重命名为1_domain.com.bundle.pem(您 的域名，和for nginx里面crt证书名字一样)</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51908.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51908.png" alt="51908" width="526" height="215" /></a></p>
<p>第四步：将新合成的pem证书导入(粘贴)到面板的证书内容里面，将for nginx里面的key文件导入(粘贴)到私钥文件里面。</p>
<p>通过https方式访问您的站点，测试站点证书的安装配置。</p>
<p><strong>2.3.1安全签章安装</strong></p>
<p>您购买了WoSign SSL证书后，将免费获得一个能直观地显示贵网站的认证信息的可信网站安全认证标识，能大大增强用户的在线信任，促成更多在线交易。所以，建议您在安装成功SSL证书后马上在网站的首页和其他页面中添加如下代码动态显示可信网站安全认证标识：</p>
<p>(目前该安全签章只支持OV级以上证书使用)</p>
<p><strong>&lt;SCRIPT LANGUAGE=”JavaScript” TYPE=”text/javascript” SRC=”http://seal.wosign.com/tws.js”&gt;&lt;/SCRIPT&gt;</strong></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51910.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51910.png" alt="51910" width="347" height="44" /></a></p>
<p>如果您希望在英文页面显示认证标识，则在英文页面添加如下代码：</p>
<p>&lt;SCRIPT LANGUAGE=”JavaScript” TYPE=”text/javascript” SRC=”http://seal.wosign.com/tws-en.js”&gt;&lt;/SCRIPT&gt;</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51911.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/51911.png" alt="51911" width="343" height="44" /></a></p>
<p>详细请访问：https://www.wosign.com/support/siteseal.htm</p>
<p><strong>2.4测试SSL证书</strong></p>
<p>在浏览器地址栏输入：https://www.fuwuqiok.com (申请证书的域名)测试您的SSL证书是否安装成功，如果成功，则浏览器下方会显示一个安全锁标志。测试站点证书的安装配置。</p>
<p><strong>2.5 SSL证书的备份</strong></p>
<p>请保存好收到的证书压缩包文件及密码，以防丢失</p>
<p><strong>2.6SSL证书的恢复</strong></p>
<p>重复2.3操作即可。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e6%9c%8d%e5%8a%a1%e5%99%a8ssl%e8%af%81%e4%b9%a6%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97/">阿里云slb服务器SSL证书部署指南</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e6%9c%8d%e5%8a%a1%e5%99%a8ssl%e8%af%81%e4%b9%a6%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云备案流程教程</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Thu, 20 Aug 2015 13:53:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[阿里云代维]]></category>
		<category><![CDATA[阿里云备案]]></category>
		<category><![CDATA[阿里云备案流程，记录网站运营的准备工作]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2624</guid>
		<description><![CDATA[<p>阿里云网站备案流程一共是7步：第一步提交备案，第二步备案初审，第三步真实性核验，第四步邮寄资料收到，第五步邮寄 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b/">阿里云备案流程教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>阿里云网站备案流程一共是7步：第一步提交备案，第二步备案初审，第三步真实性核验，第四步邮寄资料收到，第五步邮寄资料审核，第六步通信局审核，第七步备案成功。</p>
<p>首先我们需要到阿里云备案站注册ID号，如果你的域名还没有备案过，那就要选择首次备案。然后阿里云会让你填写你个人真实资料，就是要填你身份证上的资料。包括你现在的住址，要精确到几室几号。</p>
<p><center><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators1.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators1" width="400" height="229" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators2.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators2" width="400" height="206" /></a></center>注意这边是要购买备案服务号的，是要填写到个人备案资料内的。</p>
<p><center><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators3.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators3" width="400" height="293" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators4.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators4" width="400" height="144" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators6.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators6" width="400" height="268" /></a></center>要把这个服务号绑定到你购买的服务器IP地址上。这个备案服务号才能用。</p>
<p>接下来就是第三步真实性核验，对方会要求你到对应的你身份证上的省拍半身的照片，这个时候，如果你不方便的话，最好到阿里云网站后台递交邮寄备案幕 布的要求，让他们把备案幕布寄给你，这样就方便多了。然后你把备案幕布贴到自己家的墙上，请朋友帮你拍张上半身的照片。照片拍完后，就到阿里云后台发工单让对方把你的个人备案用的照片核验通过一下。接下来就是填网站 备案真实性核验单跟信息安全管理协议。</p>
<p><center><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators7.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators7" width="400" height="157" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators10.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators10" width="400" height="137" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators11.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators11" width="400" height="162" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators8.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators8" width="400" height="163" /></a><br />
<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators12.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators12" width="400" height="167" /></a></center><br />
按照官方提示，在两份单子上签上自己的姓名就行了。然后就是打印这两份资料各三份。邮寄到下面这个地址：<br />
请邮寄至：河南省洛阳市洛龙区太康路东段洛阳信息通信产业园顺兴园区9号楼4楼 邮编：471000<br />
收件人：信息认证事业部 联系电话：15139943094</p>
<p>记得跟踪一下你邮寄这两份资料的进度，到百度上查自己邮寄这资料到哪了。</p>
<p><center><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/Aliyun_filing_process_the_preparation_of_recording_site_operators9.png" alt="Aliyun_filing_process_the_preparation_of_recording_site_operators9" width="400" height="345" /></a></center>接下来就是到第五步了，邮寄资料审核，阿里云官方人员核对资料之后，就到第六步了，把备案资料寄到通信局进行核验下网站备案号。这个时候，就只能耐心等待了。一般情况下，网站备案号的下号时间要在15天到20号左右。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b/">阿里云备案流程教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e5%a4%87%e6%a1%88%e6%b5%81%e7%a8%8b%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何将APP部署在阿里云服务器上</title>
		<link>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%b0%86app%e9%83%a8%e7%bd%b2%e5%9c%a8%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a/</link>
		<comments>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%b0%86app%e9%83%a8%e7%bd%b2%e5%9c%a8%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a/#comments</comments>
		<pubDate>Thu, 20 Aug 2015 13:43:45 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[如何将APP部署在阿里云服务器上]]></category>
		<category><![CDATA[阿里云代维]]></category>
		<category><![CDATA[阿里云服务器]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2621</guid>
		<description><![CDATA[<p>如果将APP部署在阿里云服务器，可能会有一些操作需要我们来完成，下面的介绍里的说明大家可以参考下。 随 着移动 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%b0%86app%e9%83%a8%e7%bd%b2%e5%9c%a8%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a/">如何将APP部署在阿里云服务器上</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="context">
<p>如果将APP部署在阿里云服务器，可能会有一些操作需要我们来完成，下面的介绍里的说明大家可以参考下。</p>
<p><center><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/08/how_app_deployed_on_cloud_aliyun.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/08/how_app_deployed_on_cloud_aliyun.png" alt="how_app_deployed_on_cloud_aliyun" width="302" height="200" /></a></center>随 着移动通信设备终端的逐步流行，移动互联网在互联网交流中起着越来越大的作用，而移动互联网采用纯网站应用的部分相当之少，曲而代之的APP应用软件正以 雨后春笋般的速度生发出来，例如说苹果IOS市场里的很多APP、谷歌安卓尔市场里的APP等。很多APP会布局在有些手机市场里运营、但也有非常多的 APP会采取自己租用服务器且自己配置环境的方式来运营，这样拥有更多的自主权、减少很多在综合APP市场里的限制，很多大型的APP都是采用自主运营的 操作。如果将APP部署在阿里云服务器，可能会有以下一些操作值得您参考：</p>
<p><strong>1，APP应用需要什么样的云服务器？</strong></p>
<p>为了帮助大家了解如何使用阿里云云服务器及相关应用，阿里云的移动云团队开发了一个简单的APP应用：移动云相册，其中使用了ECS主要用作部署云 相册的API服务（图片信息调用、图片列表调用）和图片缩略图处理，因为这个应用服务端使用了JAVA语言开发，因此在上面安装tomcat来部署应用。<br />
具体部署<br />
1、远程登录：<br />
第一次购买ECS后，会把该ECS服务器的root账号、密码发送购买者的邮箱，然后购买者可以通过远程登录到ECS服务器，</p>
<p>具体远程登录可以参考如下：<br />
Windows：http://help.aliyun.com/manual?spm=5176.383518.5.16.4lLZzn&amp;helpId=59<br />
Linux:http://help.aliyun.com/manual?spm=5176.383518.5.16.4lLZzn&amp;helpId=59<br />
2、安装web环境<br />
根据自己应用特点选择安装相关web服务器tomcat或者jetty，阿里云提供了一条龙安装部署脚本，为开发者提供了更多的方便，请参考如下链 接：http://help.aliyun.com/manual?spm=0.0.0.0.RGeYy4&amp;helpId=129<br />
3、打包应用<br />
将web源码下载到本地，使用命令mvnpackage打成war包。如果不是maven工程，可以用类似ant打成war包。<br />
4、上传war包<br />
Linux下面可以使用sftp上传war包，上传war包到指定目录后进行解压，具体使用方式参考：http://help.aliyun.com/manual?spm=0.0.0.0.PnfpSL&amp;helpId=1848<br />
5、启动web服务<br />
将tomcat或jetty服务启动<br />
6、配置反向代理、绑定域名<br />
具体配置信息参考：http://help.aliyun.com/manual?spm=0.0.0.0.Ti7iuA&amp; helpId=532, http://help.aliyun.com/manual?spm=0.0.0.0.MKbFj1&amp;helpId=65</p>
<p><strong>2，APP应用如何把图片存到云存储服务器中？</strong></p>
<p>图片类APP应用的架构核心在于大量小文件的存储与访问，在文件数量较多的情况下将文件直接存储在硬盘上将极大影响应用的访问效率。阿里云存储服务 OSS对海量小文件的存储及管理具有很大优势，图片不从服务端下载，减少了服务端压力。阿里云的OSS的备份机制也保证了文件的存储安全，其存储容量可以 无限扩展，每秒请求数超过50000次，多线BGP网络确保全国各地访问流畅。</p>
<p>使用阿里云OSS步骤：<br />
1）登录阿里云官网（aliyun.com）开通OSS<br />
2）获取KEY及密钥<br />
3）下载SDK<br />
（JAVA版下载地址为：http://bbs.aliyun.com/job.php?action=download&amp;aid=38817<br />
帮助手册： http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/index.html ）</p>
<p>4）开始APP开发<br />
很简单吧，下面是一个使用阿里云的OSS上传图片的代码样例：</p>
<p>StringupLoadURI = OSSClient.generateUploadUrl(Constants.SERVER_URL.GENERATE_URL,fileName, null);<br />
int status =OSSClient.uploadFile(upLoadURI, path);</p>
<p><strong>3，APP上云后如何使用云数据库？</strong></p>
<p>为了帮助大家了解如何使用阿里云云服务器及相关应用，阿里云的移动云团队开发了一个简单的APP应用：移动云相册，其中使用了RDS中提供的 MYSQL服务，数据库中主要存储了用户上传的图片信息，包括原图、缩略图的信息及存储地址，通过WEB端API向客户端提供数据调用。<br />
使用阿里云RDS和使用本地数据库基本上没有区别，使用样例如下：<br />
1）创建数据库实例<br />
使用阿里云账号购买RDS后，可以创建数据库实例。<br />
2）创建数据库以及管理账号<br />
创建数据库名称以及管理账号，用于应用程序调用数据库连接。<br />
3）访问数据库：<br />
创建完数据库（test）后，在数据库test里添加账户：test、密码：test，可以在RDS控制台查看到数据库相关信息，从中能够得到数据库的外 网地址如：xxxx.mysql.rds.aliyuncs.com，可以使用应用程序连接数据库，javajdbc连接数据库示例代码如下：</p>
<p>String url = “jdbc:mysql://xxxx.mysql.rds.aliyun:3306/test”;<br />
String username = “test” ;<br />
String password = “test” ;<br />
try{<br />
Connection con = DriverManager.getConnection(url ,username , password ) ;<br />
}catch(SQLException e){<br />
e.printStackTrace() ; //需要对异常做处理<br />
}</p>
<p>具体数据库访问步骤可以参考：http://help.aliyun.com/manual?spm=0.0.0.0.dAfLT5&amp;helpId=227</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%b0%86app%e9%83%a8%e7%bd%b2%e5%9c%a8%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a/">如何将APP部署在阿里云服务器上</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%a6%82%e4%bd%95%e5%b0%86app%e9%83%a8%e7%bd%b2%e5%9c%a8%e9%98%bf%e9%87%8c%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
