PageSourceSearch

https://yindashan.github.io/blog/2014/11/02/redisclusterda-jian-jiao-cheng/

html yindashan.github.io collected 2026-10-03 10:12:58 UTC 37,026 bytes, 792 lines download raw bytes

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 &hellip;">
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&lt;&ndash;>slot&lt;&ndash;>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状态.&lt;br&gt;
138b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.&lt;br&gt;
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/ &lt;br&gt;
160</span><span class='line'>2. 下载yaml-0.1.4.tar.gz, http://pyyaml.org/wiki/LibYAML &lt;br&gt;
161</span><span class='line'>3. 解压libyaml,然后编译安装, &lt;br&gt;
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'>&gt;&gt;&gt; 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'>&gt;&gt;&gt; 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'>&gt;&gt;&gt; Nodes configuration updated
358</span><span class='line'>&gt;&gt;&gt;
358 Assign a different config epoch to each node
359</span><span class='line'>&gt;&gt;&gt; Sending CLUSTER MEET messages to join the cluster
360</span><span class='line'>Waiting for the cluster to join......
361</span><span class='line'>&gt;&gt;&gt; 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'>&gt;&gt;&gt; Check for open slots...
379</span><span class='line'>&gt;&gt;&gt; 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 &lt;ip&gt; &lt;port&gt; 将 ip 和 port
457</span><span class='line'>所指定的节点添加到集群当中,让它成为集群的一份子。
458</span><span class='line'>CLUSTER FORGET &lt;node_id&gt; 从集群中移除 node_id 指定的节点。
459</span><span class='line'>CLUSTER REPLICATE &lt;node_id&gt; 将当前节点设置为 node_id 指定的节点的从节点。
460</span><span class='line'>CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
461</span><span class='line'>æ§½(slot)
462</span><span class='line'>CLUSTER ADDSLOTS &lt;slot&gt; [slot ...]
463</span><span class='line'>将一个或多个槽(slot)指派(assign)给当前节点。
464</span><span class='line'>CLUSTER DELSLOTS &lt;slot&gt; [slot ...] 移除一个或多个槽对当前节点的指派。
465</span><span class='line'>CLUSTER FLUSHSLOTS
466</span><span class='line'>移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
467</span><span class='line'>CLUSTER SETSLOT &lt;slot&gt; NODE &lt;node_id&gt; 将槽 slot 指派给 node_id
468</span><span class='line'>
468指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽&gt;,
469</span><span class='line'>然后再进行指派。
470</span><span class='line'>CLUSTER SETSLOT &lt;slot&gt; MIGRATING &lt;node_id&gt; 将本节点的槽 slot 迁移到 node_id
471</span><span class='line'>指定的节点中。
472</span><span class='line'>CLUSTER SETSLOT &lt;slot&gt; IMPORTING &lt;node_id&gt; 从 node_id 指定的节点中导入槽 slot
473</span><span class='line'>到本节点。
474</span><span class='line'>CLUSTER SETSLOT &lt;slot&gt; STABLE 取消对槽 slot
475</span><span class='line'>的导入(import)或者迁移(migrate)。
476</span><span class='line'>键
477</span><span class='line'>CLUSTER KEYSLOT &lt;key&gt; 计算键 key 应该被放置在哪个槽上。
478</span><span class='line'>CLUSTER COUNTKEYSINSLOT &lt;slot&gt; 返回槽 slot 目前包含的键值对数量。
479</span><span class='line'>CLUSTER GETKEYSINSLOT &lt;slot&gt; &lt;count&gt; 返回 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&gt; 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中代码风格的改变和相应的性能优化">&laquo; 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 &copy; 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.