1 2<!DOCTYPE html> 3<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]--> 4<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]--> 5<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]--> 6<head> 7 <meta charset="utf-8"> 8 <title>RedisClusteræå»ºæç¨ - Hello World</title> 9 <meta name="author" content="yindashan"> 10 11 12 <meta name="description" content="1 RedisClusterç®ä» Redisç»§æ¨åºæ¯æLuaèæ¬ä¹ååä¸é大æ¹è¿ââRedisClusterï¼ä»æ¤åä¹ä¸ç¨å®¢æ·ç«¯èªå·±å®ç°ä¸è´æ§å叿è 使ç¨Twemproxyæ¥å®ç°ä¼ªé群äºãç°å¨çredisææ°çæ¬ä¸º3.0.0ï¼è¿å¤äºbetaæµè¯é¶æ®µï¼å°ä¼å¨å¹´åºæ¨åºç¨³å®çã 13Redis …"> 14 15 16 <!-- http://t.co/dKP3o1e --> 17 <meta name="HandheldFriendly" content="True"> 18 <meta name="MobileOptimized" content="320"> 19 <meta name="viewport" content="width=device-width, initial-scale=1"> 20 21 22 <link rel="canonical" href="http://yindashan.github.io/blog/2014/11/02/redisclusterda-jian-jiao-cheng"> 23 <link href="/favicon.png" rel="icon"> 24 <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> 25 <link href="/atom.xml" rel="alternate" title="Hello World" type="application/atom+xml"> 26
26<script src="/javascripts/modernizr-2.0.js"></script>
26 27 <!--
27<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
27--> 28
28<script src="http://cdn.staticfile.org/jquery/1.9.1/jquery.min.js"></script>
28 29
29<script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/libs/jquery.min.js"%3E%3C/script%3E'))</script>
29 30
30<script src="/javascripts/octopress.js" type="text/javascript"></script>
30 31 <!--Fonts from Google"s Web font directory at http://google.com/webfonts --> 32<!--<link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css"> 33<link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css"> 34--> 35 36 37 38</head> 39 40<body > 41 <header role="banner"><hgroup> 42 <h1><a href="/">Hello World</a></h1> 43 44 <h2>The door to the world!</h2> 45 46</hgroup> 47 48</header> 49 <nav role="navigation"><ul class="subscription" data-subscription="rss"> 50 <li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li> 51 52</ul> 53 54<form action="https://www.google.com/search" method="get"> 55 <fieldset role="search"> 56 <input type="hidden" name="q" value="site:yindashan.github.io" /> 57 <input class="search" type="text" name="q" results="0" placeholder="Search"/> 58 </fieldset> 59</form> 60 61<ul class="main-navigation"> 62 <li><a href="/">æçé¦é¡µ</a></li> 63 <li><a href="/blog/archives">æç« å表</a></li> 64 <li><a href="/about">å ³äº</a></li> 65</ul> 66 67</nav> 68 <div id="main"> 69 <div id="content"> 70 <div> 71<article class="hentry" role="article"> 72 73 <header> 74 75 <h1 class="entry-title">RedisClusteræå»ºæç¨</h1> 76 77 78 <p class="meta"> 79 80 81 82 83 84 85 86 87 88 89 90 91<time datetime="2014-11-02T11:40:59+08:00" pubdate data-updated="true">Nov 2<sup>nd</sup>, 2014</time> 92 93 </p> 94 95 </header> 96 97 98<div class="entry-content"><h2>1 RedisClusterç®ä»</h2> 99 100<p>Redisç»§æ¨åºæ¯æLuaèæ¬ä¹ååä¸é大æ¹è¿ââRedisClusterï¼ä»æ¤åä¹ä¸ç¨å®¢æ·ç«¯èªå·±å®ç°ä¸è´æ§å叿è 使ç¨Twemproxyæ¥å®ç°ä¼ªé群äºãç°å¨çredisææ°çæ¬ä¸º3.0.0ï¼è¿å¤äºbetaæµè¯é¶æ®µï¼å°ä¼å¨å¹´åºæ¨åºç¨³å®çã 101Redis éç¾¤ä½¿ç¨æ°æ®åçï¼shardingï¼èéä¸è´æ§åå¸ï¼consistency hashingï¼æ¥å®ç°ï¼ä¸ä¸ªRedis é群å 102å«16384 个å叿§½ï¼hash slotï¼ï¼æ°æ®åºä¸çæ¯ä¸ªé®é½å±äºè¿16384 个å叿§½çå ¶ä¸ä¸ä¸ªï¼é群使ç¨å ¬å¼ 103CRC16(key) % 16384 æ¥è®¡ç®é®key å±äºåªä¸ªæ§½ï¼å ¶ä¸CRC16(key) è¯å¥ç¨äºè®¡ç®é®key çCRC16 æ ¡éªåã</p> 104 105<h2>2 RedisClusterçä¼ç¹å缺ç¹</h2> 106 107<p>ä¸è¬ä¸ä¸ªäºå¡çä¼ç¹å缺ç¹é½æ¯æ¾å¨æåä½ä¸ºæ»ç»ï¼ä¸è¿å¨è¿éç´æ¥å ç»åºredisclusterçä¼ç¹å缺ç¹ï¼æ¾å¾ç´è§ï¼ 108ä¼ç¹ï¼<br> 1091. å¨çº¿åçï¼å¯ä»¥å¨çº¿æ·»å èç¹åå é¤èç¹ï¼æäºæ©å®¹<br> 1102. é群容éï¼ä¸»åºfailåä»åºä¼èªå¨å级为主åº<br> 1113. 客æ·ç«¯å¯ä»¥åæä½å个å®ä¾ä¸æ ·æä½redisé群ï¼ä¸éè¦å ³å¿æ°æ®åå¸å°åªä¸ªå®ä¾ä¸<br></p> 112 113<p>缺ç¹ï¼<br> 1141. 䏿¯æéè¦å¤çå¤ä¸ªé®çrediså½ä»¤ï¼å 为è¿ä¼éä½redisçæ§è½<br> 1152. 没æå¤ä¸ªdbçæ¦å¿µï¼åªæä¸ä¸ªé»è®¤çdb0ï¼ä¹å°±æ¯ä¸åæ¯æselectå½ä»¤<br> 1163. ä»åºä» å主åºçå¤ä»½ï¼ä¸æ¯æè¯»åå离<br></p> 117 118<h2>3 RedisClusteæ¶æ</h2> 119 120<h3>3.1 RedisClusteræ¶æå¾</h3> 121 122<p><img src="/images/rediscluster/rediscluster_architecture.jpg" alt="Git Bash" /></p> 123 124<p>æ¶æç»è: 125(1)ææçredisèç¹å½¼æ¤äºè(PING-PONGæºå¶),å é¨ä½¿ç¨äºè¿å¶åè®®ä¼åä¼ è¾é度å带宽.<br> 126(2)èç¹çfailæ¯éè¿é群ä¸è¶ è¿åæ°çèç¹æ£æµå¤±ææ¶æçæ.<br> 127(3)客æ·ç«¯ä¸redisèç¹ç´è¿,ä¸éè¦ä¸é´proxyå±.客æ·ç«¯ä¸éè¦è¿æ¥é群ææèç¹,è¿æ¥é群ä¸ä»»ä½ä¸ä¸ªå¯ç¨èç¹å³å¯<br> 128(4)redis-clusteræææçç©çèç¹æ å°å°[0-16383]slotä¸,cluster è´è´£ç»´æ¤node<–>slot<–>value<br></p> 129 130<h3>3.2 RedisClusteé举:容é</h3> 131 132<p><img src="/images/rediscluster/rediscluster_failover.jpg" alt="Git Bash" /></p> 133 134<p>(1)æ´ä¸ªé举è¿ç¨æ¯éç¾¤ä¸ææmasteråä¸,妿忰以ä¸masterèç¹ä¸masterèç¹éä¿¡è¶ è¿(cluster-node-timeout),认为å½åmasterèç¹ææ.<br> 135(2):ä»ä¹æ¶åæ´ä¸ªé群ä¸å¯ç¨(cluster_state:fail)? <br></p> 136 137<pre><code>a:妿é群任æmasterææ,ä¸å½åmaster没æslave.é群è¿å ¥failç¶æ,ä¹å¯ä»¥çè§£æé群çslotæ å°[0-16383]ä¸å®ææ¶è¿å ¥failç¶æ.<br> 138b:妿éç¾¤è¶ è¿åæ°ä»¥ä¸masterææï¼æ 论æ¯å¦æslaveé群è¿å ¥failç¶æ.<br> 139</code></pre> 140 141<p>ps:å½é群ä¸å¯ç¨æ¶,ææå¯¹é群çæä½åé½ä¸å¯ç¨ï¼æ¶å°((error) CLUSTERDOWN The cluster is down)é误</p> 142 143<h2>4 å®è£ redis软件å åç¸åºçä¾èµ</h2> 144 145<h3>4.1 å®è£ rubyä¾èµ</h3> 146 147<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 148<span class='line-number'>2</span> 149<span class='line-number'>3</span> 150<span class='line-number'>4</span> 151<span class='line-number'>5</span> 152<span class='line-number'>6</span> 153<span class='line-number'>7</span> 154<span class='line-number'>8</span> 155<span class='line-number'>9</span> 156<span class='line-number'>10</span> 157<span class='line-number'>11</span> 158<span class='line-number'>12</span> 159</pre></td><td class='code'><pre><code class=''><span class='line'>1. ä¸è½½æºç , http://www.ruby-lang.org/en/news/2012/02/16/ruby-1-9-3-p125-is-released/ <br> 160</span><span class='line'>2. ä¸è½½yaml-0.1.4.tar.gz, http://pyyaml.org/wiki/LibYAML <br> 161</span><span class='line'>3. è§£ålibyaml,ç¶åç¼è¯å®è£ , <br> 162</span><span class='line'>./configure 163</span><span class='line'>make 164</span><span class='line'>make install 165</span><span class='line'>ldconfig 166</span><span class='line'>4. è§£åruby,ç¶åç¼è¯å®è£ å³å¯: 167</span><span class='line'>./configure 168</span><span class='line'>make 169</span><span class='line'>make install 170</span><span class='line'>5. æ£æ¥æ¯å¦ok </span></code></pre></td></tr></table></div></figure> 171 172 173<p><img src="/images/rediscluster/0.jpg" alt="Git Bash" /></p> 174 175<h3>4.2 å®è£ è¿æ¥redisçruby客æ·ç«¯ç¨åºgem-redis</h3> 176 177<p>è¿æ¥redisçruby客æ·ç«¯ç¨åºï¼é群å½ä»¤é½ä¾èµäºå ä¸çrubyèæ¬ã</p> 178 179<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 180<span class='line-number'>2</span> 181<span class='line-number'>3</span> 182<span class='line-number'>4</span> 183<span class='line-number'>5</span> 184<span class='line-number'>6</span> 185<span class='line-number'>7</span> 186</pre></td><td class='code'><pre><code class=''><span class='line'>å¨çº¿å®è£ ï¼ 187</span><span class='line'>gem install redis âversion 3.1.0 188</span><span class='line'>离线å®è£ ï¼ 189</span><span class='line'>ä¸è½½å°åï¼ 190</span><span class='line'>http://rubygems.org/gems/redis/versions/3.1.0 191</span><span class='line'>å®è£ å½ä»¤ï¼ 192</span><span class='line'>gem install âl ./redis-3.1.0.gem</span></code></pre></td></tr></table></div></figure> 193 194 195<h3>4.3 å®è£ Redis-3.0.0ç¨åº</h3> 196 197<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 198<span class='line-number'>2</span> 199<span class='line-number'>3</span> 200</pre></td><td class='code'><pre><code class=''><span class='line'>tar -zxvf redis-3.0.0-rc1.tar.gz 201</span><span class='line'>cd redis-3.0.0-rc1 202</span><span class='line'>make</span></code></pre></td></tr></table></div></figure> 203 204 205<h2>5 æå»ºé群</h2> 206 207<p>é»è®¤æ åµä¸rediså®ä¾æ¯ä¸å¼å¯é群模å¼çï¼å¿ é¡»æå¨ä¿®æ¹ä¸ä¸é ç½®æä»¶ï¼æå¼é群ç设置ä¹åé ç½®æä»¶å ³äºé群çé£ä¸é¨åå¦ä¸æç¤ºï¼</p> 208 209<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 210<span class='line-number'>2</span> 211<span class='line-number'>3</span> 212<span class='line-number'>4</span> 213<span class='line-number'>5</span> 214</pre></td><td class='code'><pre><code class=''><span class='line'>port 7000 215</span><span class='line'>cluster-enabled yes 216</span><span class='line'>cluster-config-file nodes.conf 217</span><span class='line'>cluster-node-timeout 5000 218</span><span class='line'>appendonly yes</span></code></pre></td></tr></table></div></figure> 219 220 221<p>å ¶ä¸nodes.confæ¯å¨å®ä¾å¯å¨çæ¶åèªå¨å建ï¼å¹¶å¨éè¦çæ¶åèªå¨æ´æ°ï¼æ é人为å建ã</p> 222 223<h3>5.1 å¨redisclusterç®å½ä¸å建binç®å½</h3> 224 225<p>æå®è£ ç®å½ä¸é¢çsrvç®å½ä¸çæä»¶å¤å¶å°binéé¢ä¸ä»½ï¼å¦ä¸æç¤ºï¼ 226<img src="/images/rediscluster/1.jpg" alt="Git Bash" /></p> 227 228<h3>5.2 å¨redisclusterç®å½ä¸å建7000 7001 7002 7003 7004 7005ç®å½</h3> 229 230<p>ç®å½å称表示端å£å·ï¼ä»£è¡¨ä¸åçå®ä¾ï¼ç¶å卿¯ä¸ªç®å½ä¸é¢é½å¤å¶ä¸ä»½redis-serveråredis.conf 231<img src="/images/rediscluster/2.jpg" alt="Git Bash" /></p> 232 233<br> 234 235 236<p>忢å°7000ç®å½ï¼<br> 237<img src="/images/rediscluster/3.jpg" alt="Git Bash" /></p> 238 239<h3>5.3 æredisæ¹æä»¥daemonå½¢å¼å¯å¨</h3> 240 241<p>é»è®¤æ åµä¸redisæ¯ä»¥édaemonå½¢å¼å¯å¨çï¼è¿éæå®æ¹æä»¥daemonæ¹å¼å¯å¨ï¼åªéä¿®æ¹ä¸é ç½®æä»¶å³å¯ï¼ 242<img src="/images/rediscluster/4.jpg" alt="Git Bash" /></p> 243 244<h3>5.4 便¬¡å¯å¨ææçå®ä¾</h3> 245 246<p>å¯å¨å®ä¾çå½ä»¤ï¼</p> 247 248<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 249<span class='line-number'>2</span> 250<span class='line-number'>3</span> 251<span class='line-number'>4</span> 252<span class='line-number'>5</span> 253<span class='line-number'>6</span> 254</pre></td><td class='code'><pre><code class=''><span class='line'>/data0/dashan/rediscluster/7000/redis-server /data0/dashan/rediscluster/7000/redis.conf 255</span><span class='line'>/data0/dashan/rediscluster/7001/redis-server /data0/dashan/rediscluster/7001/redis.conf 256</span><span class='line'>/data0/dashan/rediscluster/7002/redis-server /data0/dashan/rediscluster/7002/redis.conf 257</span><span class='line'>/data0/dashan/rediscluster/7003/redis-server /data0/dashan/rediscluster/7003/redis.conf 258</span><span class='line'>/data0/dashan/rediscluster/7004/redis-server /data0/dashan/rediscluster/7004/redis.conf 259</span><span class='line'>/data0/dashan/rediscluster/7005/redis-server /data0/dashan/rediscluster/7005/redis.conf</span></code></pre></td></tr></table></div></figure> 260 261 262<p>å¨10.75.22.202ä¸7002端å£è¢«å ç¨ï¼æ æ°å¢ä¸ä¸ªç«¯å£7006</p> 263 264<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 265</pre></td><td class='code'><pre><code class=''><span class='line'>/data0/dashan/rediscluster/7006/redis-server /data0/dashan/rediscluster/7006/redis.conf</span></code></pre></td></tr></table></div></figure> 266 267 268<p>å®ä¾è¿è¡æ åµï¼ 269<img src="/images/rediscluster/5.jpg" alt="Git Bash" /></p> 270 271<h3>5.5 æå»ºredisé群</h3> 272 273<p>ä¸é¢6个rediså®ä¾æ¯ç¸äºç¬ç«çï¼å½¼æ¤ä¹é´äºä¸å½±åï¼å¯ä»¥æå®ä»¬ç为å个redisèç¹ï¼
273æè æä»ä»¬ç使¯6个å°éç¾¤ï¼æ¯ä¸ªé群éé¢åªæä¸ä¸ªèç¹ï¼ç°å¨è¦æå®ä»¬å ³èå°ä¸åã</p> 274 275<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 276<span class='line-number'>2</span> 277<span class='line-number'>3</span> 278<span class='line-number'>4</span> 279<span class='line-number'>5</span> 280<span class='line-number'>6</span> 281<span class='line-number'>7</span> 282<span class='line-number'>8</span> 283<span class='line-number'>9</span> 284<span class='line-number'>10</span> 285<span class='line-number'>11</span> 286<span class='line-number'>12</span> 287<span class='line-number'>13</span> 288<span class='line-number'>14</span> 289<span class='line-number'>15</span> 290<span class='line-number'>16</span> 291<span class='line-number'>17</span> 292<span class='line-number'>18</span> 293<span class='line-number'>19</span> 294<span class='line-number'>20</span> 295<span class='line-number'>21</span> 296<span class='line-number'>22</span> 297<span class='line-number'>23</span> 298<span class='line-number'>24</span> 299<span class='line-number'>25</span> 300<span class='line-number'>26</span> 301<span class='line-number'>27</span> 302<span class='line-number'>28</span> 303<span class='line-number'>29</span> 304<span class='line-number'>30</span> 305<span class='line-number'>31</span> 306<span class='line-number'>32</span> 307<span class='line-number'>33</span> 308<span class='line-number'>34</span> 309<span class='line-number'>35</span> 310<span class='line-number'>36</span> 311<span class='line-number'>37</span> 312<span class='line-number'>38</span> 313<span class='line-number'>39</span> 314<span class='line-number'>40</span> 315<span class='line-number'>41</span> 316<span class='line-number'>42</span> 317<span class='line-number'>43</span> 318<span class='line-number'>44</span> 319<span class='line-number'>45</span> 320<span class='line-number'>46</span> 321<span class='line-number'>47</span> 322<span class='line-number'>48</span> 323<span class='line-number'>49</span> 324<span class='line-number'>50</span> 325<span class='line-number'>51</span> 326<span class='line-number'>52</span> 327<span class='line-number'>53</span> 328</pre></td><td class='code'><pre><code class=''><span class='line'>[root@vwolf 7006]# /data0/dashan/rediscluster/bin/redis-trib.rb create --replicas 1 10.75.22.202:7000 10.75.22.202:7001 10.75.22.202:7003 10.75.22.202:7004 10.75.22.202:7005 10.75.22.202:7006 329</span><span class='line'>>>> Creating cluster 330</span><span class='line'>Connecting to node 10.75.22.202:7000: OK 331</span><span class='line'>Connecting to node 10.75.22.202:7001: OK 332</span><span class='line'>Connecting to node 10.75.22.202:7003: OK 333</span><span class='line'>Connecting to node 10.75.22.202:7004: OK 334</span><span class='line'>Connecting to node 10.75.22.202:7005: OK 335</span><span class='line'>Connecting to node 10.75.22.202:7006: OK 336</span><span class='line'>>>> Performing hash slots allocation on 6 nodes... 337</span><span class='line'>Using 3 masters: 338</span><span class='line'>10.75.22.202:7000 339</span><span class='line'>10.75.22.202:7001 340</span><span class='line'>10.75.22.202:7003 341</span><span class='line'>Adding replica 10.75.22.202:7004 to 10.75.22.202:7000 342</span><span class='line'>Adding replica 10.75.22.202:7005 to 10.75.22.202:7001 343</span><span class='line'>Adding replica 10.75.22.202:7006 to 10.75.22.202:7003 344</span><span class='line'>M: 150be26a9a3508663f6751f229df000e0103e4ad 10.75.22.202:7000 345</span><span class='line'> slots:0-5460 (5461 slots) master 346</span><span class='line'>M: 1e2bcb961eeeb4653b3df242b7c4eccd476d9216 10.75.22.202:7001 347</span><span class='line'> slots:5461-10922 (5462 slots) master 348</span><span class='line'>M: 4b9858e2cc3b1c788ce91a057db5c5ec5447109f 10.75.22.202:7003 349</span><span class='line'> slots:10923-16383 (5461 slots) master 350</span><span class='line'>S: d4bbd493d9a060f6dfa36c3426a9b6568cf85ea2 10.75.22.202:7004 351</span><span class='line'> replicates 150be26a9a3508663f6751f229df000e0103e4ad 352</span><span class='line'>S: 00abe61bcee514e6c3e8babb061862f178b20082 10.75.22.202:7005 353</span><span class='line'> replicates 1e2bcb961eeeb4653b3df242b7c4eccd476d9216 354</span><span class='line'>S: 76f2a2eb73504d631cd79e7264887e22b69c994c 10.75.22.202:7006 355</span><span class='line'> replicates 4b9858e2cc3b1c788ce91a057db5c5ec5447109f 356</span><span class='line'>Can I set the above configuration? (type 'yes' to accept): yes 357</span><span class='line'>>>> Nodes configuration updated 358</span><span class='line'>>>>
358 Assign a different config epoch to each node 359</span><span class='line'>>>> Sending CLUSTER MEET messages to join the cluster 360</span><span class='line'>Waiting for the cluster to join...... 361</span><span class='line'>>>> Performing Cluster Check (using node 10.75.22.202:7000) 362</span><span class='line'>M: 150be26a9a3508663f6751f229df000e0103e4ad 10.75.22.202:7000 363</span><span class='line'> slots:0-5460 (5461 slots) master 364</span><span class='line'>M: 1e2bcb961eeeb4653b3df242b7c4eccd476d9216 10.75.22.202:7001 365</span><span class='line'> slots:5461-10922 (5462 slots) master 366</span><span class='line'>M: 4b9858e2cc3b1c788ce91a057db5c5ec5447109f 10.75.22.202:7003 367</span><span class='line'> slots:10923-16383 (5461 slots) master 368</span><span class='line'>M: d4bbd493d9a060f6dfa36c3426a9b6568cf85ea2 10.75.22.202:7004 369</span><span class='line'> slots: (0 slots) master 370</span><span class='line'> replicates 150be26a9a3508663f6751f229df000e0103e4ad 371</span><span class='line'>M: 00abe61bcee514e6c3e8babb061862f178b20082 10.75.22.202:7005 372</span><span class='line'> slots: (0 slots) master 373</span><span class='line'> replicates 1e2bcb961eeeb4653b3df242b7c4eccd476d9216 374</span><span class='line'>M: 76f2a2eb73504d631cd79e7264887e22b69c994c 10.75.22.202:7006 375</span><span class='line'> slots: (0 slots) master 376</span><span class='line'> replicates 4b9858e2cc3b1c788ce91a057db5c5ec5447109f 377</span><span class='line'>[OK] All nodes agree about slots configuration. 378</span><span class='line'>>>> Check for open slots... 379</span><span class='line'>>>> Check slots coverage... 380</span><span class='line'>[OK] All 16384 slots covered.</span></code></pre></td></tr></table></div></figure> 381 382 383<p>æ»å ±6个å®ä¾ï¼åé¢ä¸ä¸ªæ¯ä¸»åºï¼åé¢ä¸ä¸ªæ¯ä»åºï¼å¯¹äºredisclusterï¼æå°è¦æ3个主åºï¼è¿äºé½æ¯å¨redis-trib.rbç¨åºéé¢åæ»çï¼æå ´è¶£çå¯ä»¥çä¸ä¸æºç ã</p> 384 385<p>ç°å¨éç¾¤ç®æ¯æå»ºå®æäºï¼å¯ä»¥æ¥çå½åéç¾¤ç¶æï¼ 386è¿ä¸éç¾¤åæ§è¡cluster nodesåcluster infoå½ä»¤ï¼å¯¹äºredisé群ï¼åªè¦è¿æ¥ä¸ä¸ä¸ªå®ä¾ï¼ç¸å½äºæ´ä¸ªé群就已ç»è¿æ¥ä¸äºã 387<img src="/images/rediscluster/6.jpg" alt="Git Bash" /></p> 388 389<h3>5.6 æ£æ¥éç¾¤ç¶æ</h3> 390 391<p>è°ç¨redis-trib.rbçcheckåå½ä»¤ 392<img src="/images/rediscluster/7.jpg" alt="Git Bash" /></p> 393 394<h3>5.7 è¿æ¥é群ç客æ·ç«¯</h3> 395 396<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 397<span class='line-number'>2</span> 398<span class='line-number'>3</span> 399<span class='line-number'>4</span> 400<span class='line-number'>5</span> 401<span class='line-number'>6</span> 402<span class='line-number'>7</span> 403<span class='line-number'>8</span> 404<span class='line-number'>9</span> 405<span class='line-number'>10</span> 406<span class='line-number'>11</span> 407<span class='line-number'>12</span> 408</pre></td><td class='code'><pre><code class=''><span class='line'>ç°å¨æ¯æredisé群ç客æ·ç«¯è¿æ¯è¾å°ï¼ç°å¨æéå°çæä¸é¢è¿æ ·ï¼ 409</span><span class='line'>æ¯ærubyç客æ·ç«¯ï¼ 410</span><span class='line'>https://github.com/antirez/redis-rb-cluster 411</span><span class='line'>æ¯æpythonç客æ·ç«¯ï¼ 412</span><span class='line'>https://github.com/Grokzen/redis-py-cluster 413</span><span class='line'>æ¯æjavaç客æ·ç«¯ï¼ 414</span><span class='line'>https://github.com/xetorthio/jedis 415</span><span class='line'>æ¯æC#/.NET/VBç客æ·ç«¯ï¼ 416</span><span class='line'>https://github.com/StackExchange/StackExchange.Redis 417</span><span class='line'>å½ä»¤è¡è¿æ¥éç¾¤çæ¹æ³ï¼ 418</span><span class='line'>å¨åæ¥çåºç¡ä¸æ·»å -cåæ°ï¼å¦ä¸æç¤ºï¼ 419</span><span class='line'>redis-cli âc âh 10.75.22.202 âp 7000</span></code></pre></td></tr></table></div></figure> 420 421 422<p>忬¡å¼ºè°ï¼å¯¹äºéç¾¤è¿æ¥ï¼åªè¦è¿æ¥ä¸é群ä¸ä»»æä¸ä¸ªå®ä¾å³å¯ï¼å 为é群ä¸å个å®ä¾æ¯ç¸äºå ³èçï¼æä»¥ç¸å½äºè¿æ¥ä¸æ´ä¸ªé群ã</p> 423 424<h2>6 éç¾¤å¸¸ç¨æä½</h2> 425 426<h2>6.1 é群ç¸å ³å½ä»¤</h2> 427 428<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 429<span class='line-number'>2</span> 430<span class='line-number'>3</span> 431<span class='line-number'>4</span> 432<span class='line-number'>5</span> 433<span class='line-number'>6</span> 434<span class='line-number'>7</span> 435<span class='line-number'>8</span> 436<span class='line-number'>9</span> 437<span class='line-number'>10</span> 438<span class='line-number'>11</span> 439<span class='line-number'>12</span> 440<span class='line-number'>13</span> 441<span class='line-number'>14</span> 442<span class='line-number'>15</span> 443<span class='line-number'>16</span> 444<span class='line-number'>17</span> 445<span class='line-number'>18</span> 446<span class='line-number'>19</span> 447<span class='line-number'>20</span> 448<span class='line-number'>21</span> 449<span class='line-number'>22</span> 450<span class='line-number'>23</span> 451<span class='line-number'>24</span> 452<span class='line-number'>25</span> 453<span class='line-number'>26</span> 454</pre></td><td class='code'><pre><code class=''><span class='line'>redisé群ç¸å ³å½ä»¤ï¼ 455</span><span class='line'>èç¹ 456</span><span class='line'>CLUSTER MEET <ip> <port> å° ip å port 457</span><span class='line'>ææå®çèç¹æ·»å å°é群å½ä¸ï¼è®©å®æä¸ºé群çä¸ä»½åã 458</span><span class='line'>CLUSTER FORGET <node_id> ä»é群ä¸ç§»é¤ node_id æå®çèç¹ã 459</span><span class='line'>CLUSTER REPLICATE <node_id> å°å½åèç¹è®¾ç½®ä¸º node_id æå®çèç¹çä»èç¹ã 460</span><span class='line'>CLUSTER SAVECONFIG å°èç¹çé ç½®æä»¶ä¿åå°ç¡¬çéé¢ã 461</span><span class='line'>æ§½(slot) 462</span><span class='line'>CLUSTER ADDSLOTS <slot> [slot ...] 463</span><span class='line'>å°ä¸ä¸ªæå¤ä¸ªæ§½ï¼slotï¼ææ´¾ï¼assignï¼ç»å½åèç¹ã 464</span><span class='line'>CLUSTER DELSLOTS <slot> [slot ...] ç§»é¤ä¸ä¸ªæå¤ä¸ªæ§½å¯¹å½åèç¹çææ´¾ã 465</span><span class='line'>CLUSTER FLUSHSLOTS 466</span><span class='line'>ç§»é¤ææ´¾ç»å½åèç¹çæææ§½ï¼è®©å½åèç¹åæä¸ä¸ªæ²¡æææ´¾ä»»ä½æ§½çèç¹ã 467</span><span class='line'>CLUSTER SETSLOT <slot> NODE <node_id> å°æ§½ slot ææ´¾ç» node_id 468</span><span class='line'>
468æå®çèç¹ï¼å¦ææ§½å·²ç»ææ´¾ç»å¦ä¸ä¸ªèç¹ï¼é£ä¹å 让å¦ä¸ä¸ªèç¹å é¤è¯¥æ§½>ï¼ 469</span><span class='line'>ç¶ååè¿è¡ææ´¾ã 470</span><span class='line'>CLUSTER SETSLOT <slot> MIGRATING <node_id> å°æ¬èç¹çæ§½ slot è¿ç§»å° node_id 471</span><span class='line'>æå®çèç¹ä¸ã 472</span><span class='line'>CLUSTER SETSLOT <slot> IMPORTING <node_id> ä» node_id æå®çèç¹ä¸å¯¼å ¥æ§½ slot 473</span><span class='line'>å°æ¬èç¹ã 474</span><span class='line'>CLUSTER SETSLOT <slot> STABLE åæ¶å¯¹æ§½ slot 475</span><span class='line'>çå¯¼å ¥ï¼importï¼æè è¿ç§»ï¼migrateï¼ã 476</span><span class='line'>é® 477</span><span class='line'>CLUSTER KEYSLOT <key> 计ç®é® key åºè¯¥è¢«æ¾ç½®å¨åªä¸ªæ§½ä¸ã 478</span><span class='line'>CLUSTER COUNTKEYSINSLOT <slot> è¿åæ§½ slot ç®åå å«çé®å¼å¯¹æ°éã 479</span><span class='line'>CLUSTER GETKEYSINSLOT <slot> <count> è¿å count 个 slot æ§½ä¸çé®ã</span></code></pre></td></tr></table></div></figure> 480 481 482<h3>6.2 å¨å½ä»¤è¡æä½rediscluster</h3> 483 484<p>éç¾¤è¿æ¥ä¸ä¹å对å®è¿è¡setægetæä½ï¼ä¼æ ¹æ®keyç弿å®åå¸å°ä¸åçå®ä¾ä¸é¢ï¼å ·ä½å叿¹æ³ä¸ºï¼ 485CRC16(key) % 16384 486æ§è¡setægetæä½æ¶å¦ækeyåå¸å°å ¶ä»å®ä¾ä¸ï¼ä¼èªå¨Redirectedè¿å»ï¼å¦ä¸æç¤ºï¼<br> 487<img src="/images/rediscluster/8.jpg" alt="Git Bash" /></p> 488 489<h3>6.3 使ç¨è¿æ¥redisclusterçruby客æ·ç«¯å¾redisclusteréé¢ç䏿¹æ°æ®</h3> 490 491<p>æ§è¡ruby ./example.rbå½ä»¤ 492<img src="/images/rediscluster/9.jpg" alt="Git Bash" /></p> 493 494<h3>6.4 å¨çº¿åçæä½</h3> 495 496<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 497</pre></td><td class='code'><pre><code class=''><span class='line'># ./redis-trib.rb reshard 127.0.0.1:7000</span></code></pre></td></tr></table></div></figure> 498 499 500<p>ä½ åªéè¦æå®é群ä¸å ¶ä¸ä¸ä¸ªèç¹çå°åï¼redis-trib.rb å°±ä¼èªå¨æ¾å°é群ä¸çå ¶ä»èç¹ã 501<img src="/images/rediscluster/10.jpg" alt="Git Bash" /></p> 502 503<p>便¬¡è¾å ¥éè¦ç§»å¨çæ§½ç个æ°ï¼æ¥æ¶æ§½çrediså®ä¾å¯¹åºçnodeidï¼è¿äºæ§½çæ¥æºï¼å¦ææ¥èªå ¶ä»ææçå®ä¾ï¼è¿éè¾å ¥allï¼å¦ææ¥èªä¸ªå«å®ä¾ï¼è¿éè¾å ¥å®ä¾å¯¹åºçnodeidï¼ç¶åè¾å ¥done.</p> 504 505<p>å¨çº¿åç宿åå¯çå°7000å®ä¾ååå¯¹æ¯æ åµï¼å¦ä¸æç¤ºï¼ 506<img src="/images/rediscluster/11.jpg" alt="Git Bash" /></p> 507 508<p>6.5 æ·»å masterèç¹ 509é¦å åå ¶ä»å®ä¾ä¸æ ·ï¼å好端å£åé ç½®ï¼æèç¹å¯å¨èµ·æ¥ï¼ä»¥10.75.22.202:7007ä¸ºä¾ 510ç¶å使ç¨redis-trib.rbç¨åºï¼åæ°ä¸ºadd-node</p> 511 512<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 513</pre></td><td class='code'><pre><code class=''><span class='line'>./redis-trib.rb add-node 10.75.22.202:7007 10.75.22.202:7000</span></code></pre></td></tr></table></div></figure> 514 515 516<p>10.75.22.202:7007表示åæå¯èµ·æ¥çèç¹ 51710.75.22.202:7000表示é群ä¸ä»»æä¸ä¸ªå®ä¾</p> 518 519<p>æ°èç¹æ·»å 宿åéé¢å¹¶æ²¡ææ°æ®ï¼å 为没æä¸ºæ°èç¹åé æ§½æ°ï¼åé æ¹æ³ç±»ä¼¼äºä¸é¢çâå¨çº¿åçâæä½ã</p> 520 521<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 522<span class='line-number'>2</span> 523<span class='line-number'>3</span> 524<span class='line-number'>4</span> 525<span class='line-number'>5</span> 526<span class='line-number'>6</span> 527<span class='line-number'>7</span> 528<span class='line-number'>8</span> 529<span class='line-number'>9</span> 530<span class='line-number'>10</span> 531<span class='line-number'>11</span> 532<span class='line-number'>12</span> 533<span class='line-number'>13</span> 534<span class='line-number'>14</span> 535<span class='line-number'>15</span> 536<span class='line-number'>16</span> 537<span class='line-number'>17</span> 538<span class='line-number'>18</span> 539<span class='line-number'>19</span> 540<span class='line-number'>20</span> 541<span class='line-number'>21</span> 542<span class='line-number'>22</span> 543<span class='line-number'>23</span> 544</pre></td><td class='code'><pre><code class=''><span class='line'>redis-trib.rb reshard 10.75.22.202:7000 545</span><span class='line'>
545#æ ¹æ®æç¤ºéæ©è¦è¿ç§»çslotæ°é(ps:è¿ééæ©1000) 546</span><span class='line'>How many slots do you want to move (from 1 to 16384)? 1000 547</span><span class='line'>#éæ©è¦æ¥åè¿äºslotçnode-id 548</span><span class='line'>What is the receiving node ID? 150be26a9a3508663f6751f229df000e0103e4ad 549</span><span class='line'>#éæ©slotæ¥æº: 550</span><span class='line'>#allè¡¨ç¤ºä»ææçmasteréæ°åé ï¼ 551</span><span class='line'>#æè æ°æ®è¦æåslotçmasterèç¹id,æåç¨doneç»æ 552</span><span class='line'>Please enter all the source node IDs. 553</span><span class='line'>Type 'all' to use all the nodes as source nodes for the hash slots. 554</span><span class='line'>Type 'done' once you entered all the source nodes IDs. 555</span><span class='line'>Source node #1:all 556</span><span class='line'>#æå°è¢«ç§»å¨çslotåï¼è¾å ¥yeså¼å§ç§»å¨slot以å对åºçæ°æ®. 557</span><span class='line'>#Do you want to proceed with the proposed reshard plan (yes/no)? yes 558</span><span class='line'>#ç»æ 559</span><span class='line'>6.6 æ·»å slaveèç¹ 560</span><span class='line'>å ¶ä»ç±»ä¼¼ï¼å½ä»¤æ¹æä¸é¢æ¹æ ·ï¼ 561</span><span class='line'>./redis-trib.rb add-node --slave 10.75.22.202:7007 10.75.22.202:7000 562</span><span class='line'>æ§è¡æååï¼7007å°ä½ä¸º7000çä»åºã 563</span><span class='line'>æè ç¨å¦å¤ä¸ç§æ¹æ³ï¼ 564</span><span class='line'>æ°èç¹å建æååï¼ç¨redis-cliè¿æ¥ä¸æ°èç¹ï¼ç¶åæ§è¡ä¸é¢çå½ä»¤ï¼ 565</span><span class='line'>redis 10.75.22.202:7007> cluster replicate 150be26a9a3508663f6751f229df000e0103e4ad 566</span><span class='line'>å ¶ä¸150be26a9a3508663f6751f229df000e0103e4ad表示7000端å£å®ä¾å¯¹åºçnodeid,è¿æ ·æ°å»ºç7007å®ä¾å°ä½ä¸º7000å®ä¾çä»åºã</span></code></pre></td></tr></table></div></figure> 567 568 569<p>6.7 å é¤ä¸ä¸ªslaveèç¹</p> 570 571<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 572<span class='line-number'>2</span> 573<span class='line-number'>3</span> 574</pre></td><td class='code'><pre><code class=''><span class='line'>redis-trib.rb del-node ip:port nodeid 575</span><span class='line'>示ä¾ï¼ 576</span><span class='line'>./redis-trib.rb del-node 10.75.22.202:7004 d4bbd493d9a060f6dfa36c3426a9b6568cf85ea2</span></code></pre></td></tr></table></div></figure> 577 578 579<p>6.8 å é¤ä¸ä¸ªmasterèç¹</p> 580 581<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> 582<span class='line-number'>2</span> 583<span class='line-number'>3</span> 584<span class='line-number'>4</span> 585<span class='line-number'>5</span> 586<span class='line-number'>6</span> 587<span class='line-number'>7</span> 588<span class='line-number'>8</span> 589<span class='line-number'>9</span> 590<span class='line-number'>10</span> 591<span class='line-number'>11</span> 592<span class='line-number'>12</span> 593<span class='line-number'>13</span> 594<span class='line-number'>14</span> 595<span class='line-number'>15</span> 596<span class='line-number'>16</span> 597<span class='line-number'>17</span> 598</pre></td><td class='code'><pre><code class=''><span class='line'>å é¤masterèç¹ä¹åé¦å è¦ä½¿ç¨reshardç§»é¤masterçå ¨é¨slot,ç¶ååå é¤å½åèç¹(ç®ååªè½æè¢«å é¤masterçslotè¿ç§»å°ä¸ä¸ªèç¹ä¸) 599</span><span class='line'>#æ10.75.22.202:7001å½åmasterè¿ç§»å°10.75.22.202:7000ä¸ 600</span><span class='line'>redis-trib.rb reshard 10.75.22.202:7000 601</span><span class='line'>#æ ¹æ®æç¤ºéæ©è¦è¿ç§»çslotæ°é(ps:è¿ééæ©4960) 602</span><span class='line'>How many slots do you want to move (from 1 to 16384)? 4960(被å é¤masterçææslotæ°é) 603</span><span class='line'>#éæ©è¦æ¥åè¿äºslotçnode-id(10.75.22.202:7000) 604</span><span class='line'>What is the receiving node ID? 150be26a9a3508663f6751f229df000e0103e4ad (ps:10.75.22.202:7000çnode-id) 605</span><span class='line'>Please enter all the source node IDs. 606</span><span class='line'>Type 'all' to use all the nodes as source nodes for the hash slots. 607</span><span class='line'>Type 'done' once you entered all the source nodes IDs. 608</span><span class='line'>Source node #1:1e2bcb961eeeb4653b3df242b7c4eccd476d9216(被å é¤masterçnode-id) 609</span><span class='line'>
609Source node #2:done 610</span><span class='line'>#æå°è¢«ç§»å¨çslotåï¼è¾å ¥yeså¼å§ç§»å¨slot以å对åºçæ°æ®. 611</span><span class='line'>#Do you want to proceed with the proposed reshard plan (yes/no)? yes 612</span><span class='line'> 613</span><span class='line'>ä¸è¿°æä½æ§è¡æååï¼masterèç¹ä¸é¢å·²ç»æ²¡ææ°æ®äºï¼è¿æ¶åå¯ä»¥åå é¤slaveèç¹ä¸æ ·å é¤masterèç¹ï¼ 614</span><span class='line'>./redis-trib.rb del-node 10.75.22.202:7001 1e2bcb961eeeb4653b3df242b7c4eccd476d9216</span></code></pre></td></tr></table></div></figure> 615 616 617 618</div> 619 620 621 <footer> 622 <p class="meta"> 623 624 625 626<span class="byline author vcard">Posted by <span class="fn">yindashan</span></span> 627 628 629 630 631 632 633 634 635 636 637 638 639 640<time datetime="2014-11-02T11:40:59+08:00" pubdate data-updated="true">Nov 2<sup>nd</sup>, 2014</time> 641 642 643<span class="categories"> 644 645 <a class='category' href='/blog/categories/redis/'>redis</a> 646 647</span> 648 649 650 </p> 651 652 <div class="sharing"> 653 654 655 656 657 <!-- JiaThis Button BEGIN --> 658<div class="jiathis_style_32x32"> 659 <a class="jiathis_button_qzone"></a> 660 <a class="jiathis_button_tsina"></a> 661 <a class="jiathis_button_tqq"></a> 662 <a class="jiathis_button_weixin"></a> 663 <a class="jiathis_button_renren"></a> 664 <a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a> 665 <a class="jiathis_counter_style"></a> 666</div>
667<script type="text/javascript" src="http://v3.jiathis.com/code/jia.js?uid=1395155901683607" charset="utf-8"></script>
667 668<!-- JiaThis Button END --> 669<!-- UY BEGIN --> 670<div id="uyan_frame"></div>
671<script type="text/javascript" src="http://v2.uyan.cc/code/uyan.js"></script>
671 672<!-- UY END --> 673 674 675</div> 676 677 678 <p class="meta"> 679 680 <a class="basic-alignment left" href="/blog/2014/10/27/pythonzhong-dai-ma-feng-ge-de-gai-bian-he-xiang-ying-de-xing-neng-you-hua/" title="Previous Post: Pythonä¸ä»£ç 飿 ¼çæ¹ååç¸åºçæ§è½ä¼å">« Pythonä¸ä»£ç 飿 ¼çæ¹ååç¸åºçæ§è½ä¼å</a> 681 682 683 </p> 684 </footer> 685</article> 686 687</div> 688 689<aside class="sidebar"> 690 691 <section> 692 <h1>æç« ç±»å«</h1> 693 <ul id="category-list"><li><a href='/blog/categories/octopress'>octopress (2)</a></li><li><a href='/blog/categories/python'>python (4)</a></li><li><a href='/blog/categories/redis'>redis (1)</a></li><li><a href='/blog/categories/ce-shi'>æµè¯ (3)</a></li><li><a href='/blog/categories/sheng-huo'>çæ´» (1)</a></li></ul> 694</section> 695<section> 696 <h1>æ ç¾äº</h1> 697 <ul class="tag-cloud"> 698 <a style="font-size: 100%" href="/tags/github/">Github</a> 699<a style="font-size: 100%" href="/tags/linux/">Linux</a> 700<a style="font-size: 100%" href="/tags/thinking/">Thinking</a> 701<a style="font-size: 100%" href="/tags/jekyll/">jekyll</a> 702<a style="font-size: 100%" href="/tags/tag-test/">tag_test</a> 703<a style="font-size: 210%" href="/tags/test/">test</a> 704 705 </ul> 706</section> 707<section> 708 <h1>Recent Posts</h1> 709 <ul id="recent_posts"> 710 711 <li class="post"> 712 <a href="/blog/2014/11/02/redisclusterda-jian-jiao-cheng/">RedisClusteræå»ºæç¨</a> 713 </li> 714 715 <li class="post"> 716 <a href="/blog/2014/10/27/pythonzhong-dai-ma-feng-ge-de-gai-bian-he-xiang-ying-de-xing-neng-you-hua/">Pythonä¸ä»£ç 飿 ¼çæ¹ååç¸åºçæ§è½ä¼å</a> 717 </li> 718 719 <li class="post"> 720 <a href="/blog/2014/10/26/pythonzhong-fan-she-he-zi-sheng/">Pythonä¸åå°åèªç</a> 721 </li> 722 723 <li class="post"> 724 <a href="/blog/2014/10/25/pythonzhong-json-pickle-cpicklezai-xu-lie-hua-shi-de-dui-bi/">Pythonä¸json_pickle_cPickleå¨åºååæ¶çæ§è½å¯¹æ¯</a> 725 </li> 726 727 <li class="post"> 728 <a href="/blog/2014/10/24/pythonzhong-zhuang-shi-qi-xiang-jie/">Pythonä¸è£ 饰å¨è¯¦è§£</a> 729 </li> 730 731 </ul> 732</section> 733 734<section> 735 <h1>GitHub Repos</h1> 736 <ul id="gh_repos"> 737 <li class="loading">Status updating...</li> 738 </ul> 739 740 <a href="https://github.com/yindashan">@yindashan</a> on GitHub 741 742
742<script type="text/javascript"> 743 $(document).ready(function(){ 744 if (!window.jXHR){ 745 var jxhr = document.createElement('script'); 746 jxhr.type = 'text/javascript'; 747 jxhr.src = '/javascripts/libs/jXHR.js'; 748 var s = document.getElementsByTagName('script')[0]; 749 s.parentNode.insertBefore(jxhr, s); 750 } 751 752 github.showRepos({ 753 user: 'yindashan', 754 count: 0, 755 skip_forks: true, 756 target: '#gh_repos' 757 }); 758 }); 759 </script>
759 760
760<script src="/javascripts/github.js" type="text/javascript"> </script>
760 761</section> 762 763 764 765 766 767 768</aside> 769 770 771 </div> 772 </div> 773 <footer role="contentinfo"><p> 774 Copyright © 2014 - yindashan - 775 <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> 776</p> 777 778</footer> 779 780 781 782 783 784 785 786 787 788 789 790 791</body> 792</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.