您的位置:首页 > 数据库 > Redis

Redis集群搭建

2016-10-21 11:44 260 查看
原文链接:http://blog.csdn.net/xyang81/article/details/51881900

安装环境:CentOS7 64位 MINI版,当前Redis最新版本为3.2,所以本文以3.2为例担建Redis集群。


1、Redis服务器说明

用2台虚拟机(192.168.0.201和192.168.0.202),各安装3个Redis实例。分别为3个master和3个slave,模拟6台机器担建一个Redis集群。 

192.168.0.201:6379 

192.168.0.201:6380 

192.168.0.201:6381

192.168.0.202:6382 

192.168.0.202:6383 

192.168.0.202:6384


2、安装Redis集群节点实例

单实例安装请参考《 Redis单实例安装与配置》 

编译Redis源码前先检查系统是否安装了gcc,没安装的话执行
yum install -y gcc
安装。


1> 安装Redis

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> wget <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">http</span>://download.redis.io/releases/redis-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>.tar.gz
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> tar -zxvf redis-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>.tar.gz
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> cd redis-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> make && make install
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ln</span> -s /usr/<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">local</span>/bin/redis* /usr/bin/
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> cp src/redis-trib.rb /usr/bin/</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>


2> 创建Redis节点

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> ./utils/install_server.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>



 

在两台虚拟机上依次执行install_server.sh脚本分别各安装3个redis实例。在安装提示时输入上面约定的端口(如:6380),改变端口后同时配置文件、日志文件和数据存储目录名会自动加上端口号,以和其它实例区别。如果对安装路径没有特殊要求的话,在安装时只需改变端口号,其它都保持默认即可。默认配置文件如下: 

配置文件:/etc/redis/port.conf 

日志文件:/etc/log/redis_port.log 

数据存储目录(aof文件、rdb文件、集群节点配置文件):/var/lib/redis/port

注意:port为你设置的端口

make时如果遇到zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory错误,用make MALLOC=libc && make install重新安装。

Redis服务安装完成之后,服务会同时启动,且会自动加入到系统服务中,并设为开机启动。


3> 修改Redis实例的集群配置


修改绑定IP

Redis默认绑定的是127.0.0.0地址,需要将其修改为本机IP或0.0.0.0,集群中的各个节点才能互相通信。
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 192.168.0.201节点</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6379.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6381.</span>conf
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 192.168.0.202节点</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16379.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16380.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/127.0.0.1/0.0.0.0/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16381.</span>conf</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>


修改端口号

安装完redis服务后,配置文件中集群的相关端口配置默认为6379,需要将其它几个非6379的端口修改过来。
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 192.168.0.201节点</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/6379/6380/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/6379/6381/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6381.</span>conf
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 192.168.0.202节点</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/6379/16379/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16379.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/6379/16380/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16380.</span>conf
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> sed -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'s/6379/16381/g'</span> /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16381.</span>conf</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>


检查修改结果:
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">shell<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> cat /etc/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380.</span>conf <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|</span> awk <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'{if($0 !~ /^$/ && $0 !~ /#/) {print $0}}'</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|</span> grep <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380</span>

port <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380</span>
pidfile /<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span>/run/redis_6380<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>pid
logfile /<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">log</span>/redis_6380<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">log</span>
dir /<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span>/lib/redis/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380</span>
cluster<span class="hljs-attribute" style="box-sizing: border-box;">-config</span><span class="hljs-attribute" style="box-sizing: border-box;">-file</span> nodes<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380.</span>conf</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>


有5处修改端口的地方,修改成功!


修改集群配置

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">cluster<span class="hljs-attribute" style="box-sizing: border-box;">-enabled</span> yes
cluster<span class="hljs-attribute" style="box-sizing: border-box;">-config</span><span class="hljs-attribute" style="box-sizing: border-box;">-file</span> nodes<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6379.</span>conf
cluster<span class="hljs-attribute" style="box-sizing: border-box;">-node</span><span class="hljs-attribute" style="box-sizing: border-box;">-timeout</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5000</span>
appendonly yes</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>


cluster-enabled:开启集群模式 

cluster-config-file:保存节点的配置信息,如集群中所有节点的IP、端口、状态、节点类型(master/slave)、节点ID、slots等 

cluster-node-timeout:节点心跳超时时长 

appendonly:开启aof文件存储

依次将每个实例配置文件中的以上注释打开,并修改成对应的值。

重新启动所有redis服务:
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> service redis_portN restart</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


此时通过PS命令查看redis进程,和普通进程不同的是在进程名后边加了一个[cluster]标识。192.168.0.201节点如下图所示: 



但它们现在都还是独立的实例,还没有分配到一个集群当中。没有master和slave关系。

查看服务详情及配置文件信息: 




3、创建Redis集群


1> 安装ruby环境

创建集群要用到ruby的一个脚本,在创建集群前,先安装ruby的运行环境和ruby的redis客户端。
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> yum -y install ruby rubygems
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> gem sources <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">--add https://ruby.taobao.org/ --remove https://rubygems.org/  # 配置taobao的源</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> gem install redis <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">--version 3.2.0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>


2> 创建集群

<code class="hljs css has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">shell</span>> <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">redis-trib</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.rb</span> <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">create</span> <span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">--replicas</span> 1 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.201</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:6379</span> 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.201</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:6380</span> 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.201</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:6381</span> 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.202</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:16379</span> 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.202</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:16380</span> 192<span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.168</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.0</span><span class="hljs-class" style="box-sizing: border-box; color: rgb(155, 112, 63);">.202</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:16381</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


参数说明: 

1> redis-trib.rb脚本默认安装在$REDIS_SRC_HOME/src目录下,在安装redis服务时,已将其拷贝到/usr/bin目录下 

2> create:创建集群参数 

3> –replicas 1:每个master有1个slave节点 

根据节点顺序确定master与slave节点,前边的优先选择做为master节点,后边优先选择做为slave节点。由脚本自动分配,但master和slave绝对不会分配在同一台机器上。


3> 检查Redis集群状态

<code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">shell> redis-trib.rb <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">check</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.201</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6379</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>



 

从上图可以看出,192.168.0.201:6379、192.168.0.201:6380、192.168.0.201:6381被选为了master节点。192.168.0.202:16379被选为192.168.0.201:6381的slave节点,192.168.0.202:16380被选为192.168.0.201:6379的slave节点,192.168.0.202:16381被选为192.168.0.201:6380的slave节点。

到这儿Redis的集群就配置成功了!


4、验证Redis集群


数据存储测试

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 连接到201的6379节点</span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">shell</span>> redis-cli -c -h <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.201</span> -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6379</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.201</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6379</span>> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">set</span> foo abc
-> Redirected <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> slot [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12182</span>] located <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.201</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380</span>
OK
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.201</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6380</span>></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>


set foo abc本想在201的6379节点保存foo这个key,但201的6379节点并没有存,而是将请求转发给了201的6380节点存储。而且客户端自动切换到了6380节点。这是神马情况?这其实是redis集群数据存储的机制,通过crc16算法计算key的hash值,然后对16384取模,得到一个0~16384以内的slot值来决定由哪个节点存储,而每一个节点在创建集群的时候,都会均匀的分配相应的slot数量。有关数据存储的机制,请参考后面的文章。


自动选主测试

从上边的集群状态中得知,192.168.0.202:16381被选为192.168.0.201:6380的slave节点,现在把6380 master节点kill掉,看redis会不会将16381选主为master节点,并将刚刚保存的foo这个key有没有复制到16381节点中。如下图所示: 



从上图测试结果可以看出,当master节点挂掉之后,slave节点自动选举成了master节点,并且之前保存在master节点的数据foo也成功复制给了slave节点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: