摘要用两台虚拟机(ip: 10.60.44.76、ip: 10.60.44.105)共 6 个节点,一台虚拟机 3 个节点,模拟出 3 master、3 salve 环境redis 版本:redis-3.2.4linux 版本:centos6.5(ip: 10.60.44.76)、centos7.0(ip: 10.60.44.105)注意:一个 redis 实例就是一个节点linux 最好是都在 root 权限下操作redis-cluster 最小配置是三主三从关闭防火墙(节点与节点之间通信需要开放指定的端口,单纯为了方便,在生产环境忌用)centos 6.5service iptables stop # 关闭命令:chkconfig iptables off # 永久关闭防火墙service iptables status # 两个命令同时运行,运行完成后查看防火墙关闭状态 centos 7.0systemctl stop firewalld.service # 停止firewallsystemctl disable firewalld.service # 禁止firewall开机启动firewall-cmd –state # 查看默认防火墙状态(关闭后显示notrunning,开启后显示running)一、下载安装包安装包在附件 redis-3.2.4.tar.gz。也可以使用 wget 插件下载wget http://download.redis.io/releases/redis-3.2.4.tar.gz二、单点安装部署单点指的是一个 redis 实例,需要先下载 redis 的源码,接着进行编译、安装,完成通过命令启动该实例解压、编译、安装[root@localhost Desktop]# tar zxvf redis-3.2.4.tar.gz[root@localhost Desktop]# cd redis-3.2.4[root@localhost redis-3.2.4]# cd src && make install创建相关目录# 存放 redis 相关命令文件[root@localhost src]# mkdir -p /usr/local/redis/bin# 存放 redis 的配置文件[root@localhost src]# mkdir -p /usr/local/redis/etc移动命令、配置文件# 移动 redis 配置文件(配置文件在解压好的目录)[root@localhost redis-3.2.4]# mv redis.conf /usr/local/redis/etc# 移动 redis 命令文件(命令文件在解压好的目录中的 src 目录)[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin启动服务# 指定配置文件启动 redis[root@localhost src]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf查看状态# 或者是 netstat -tunpl | grep 6379ps -ef | grep redis三、集群搭建部署创建集群节点文件夹名为 7031-7033 的文件夹置于 10.60.44.76 的机子中,7034-7036 文件夹置于 10.60.44.105 的机子中mkdir -p /usr/local/redis-clustercd /usr/local/redis-cluster# 创建各个节点文件夹mkdir 7031 7032 7033 # IP 为 10.60.44.76 的机子上执行mkdir 7034 7035 7036 # IP 为 10.60.44.105 的机子上执行修改、拷贝配置文件此处以 10.60.44.76 的机子为例,另一台操作一致cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7031cd /usr/local/redis-cluster/7031vi redis.conf 修改配置文件,范本如下port 7031 # 绑定端口bind 本机ip # 物理 ip:如 10.60.44.76 dir /usr/local/redis-cluster/7031 # 指定数据存放路径cluster-enabled yes # 启动集群模式cluster-config-file redis-7031.conf # 指定集群节点配置文件daemonize yes # 后台启动cluster-node-timeout 5000 # 指定集群节点超时时间appendonly yes # 指定持久化方式将 7031 的 redis.conf 改完后再拷贝到剩下的 2 个目录(7032、7033)中,再全局替换 redis.conf 中的 7031 为对应的节点编号(7032、7033)即可。同理得 10.60.44.105 机子移动完后 ip 为 10.60.44.76 的 /usr/local/ 目录结构图如下:(10.60.44.105 同理)[root@localhost local]# cd /usr/local/ && tree -L 3.├── bin…….├── redis│ ├── bin│ │ ├── mkreleasehdr.sh│ │ ├── redis-benchmark│ │ ├── redis-check-aof│ │ ├── redis-check-rdb│ │ ├── redis-cli│ │ ├── redis-sentinel│ │ ├── redis-server│ │ └── redis-trib.rb│ └── etc│ └── redis.conf├── redis-cluster│ ├── 7031│ │ └── redis.conf│ ├── 7032│ │ └── redis.conf│ └── 7033│ └── redis.conf…….└── src安装 Ruby 和启动插件集群的启动需要用到 Ruby 实现的 redis-trib.rb 插件,所以需要先安装 Ruby 环境和其插件,命令如下:# 步骤一:建议不使用 yum 安装。使用网上自己下载源码的形式安装,版本可以稍微新一点yum install ruby# 步骤二:一般不会出错yum install rubygems# 步骤三:容易出错,下面有常见解决方案gem install redis此步骤需要很多环境,容易出错,附上常见错误解决方法:错误一:no such file to load – zlib进入 ruby 源码文件夹并安装 ruby 自身提供的 zlib 包[root@localhost ruby-2.3.3]# cd ext/zlib[root@localhost zlib]# ruby ./extconf.rb[root@localhost zlib]# make[root@localhost zlib]# make install错误二:–with-openssl-include=/usr/local/ssl/include/ –with-openssl-lib=/usr/local/ssl/lib处理方法同错误一:[root@localhost ruby-2.3.3]# cd ext/openssl[root@localhost zlib]# ruby ./extconf.rb[root@localhost zlib]# make[root@localhost zlib]# make install错误三:Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources首先查看一下 $openssl version 是不是安装了 OpenSSL[root@localhost /]# openssl versionOpenSSL 1.0.1e-fips 11 Feb 2013没有,则新安装一个 OpenSSL,具体教程不展开。如果有,则更换 gem 源的地址:# 查看 gem 源[root@localhost /]# gem source# 删除 https 源 [root@localhost /]# gem source -r https://rubygems.org/ to remove# 添加 http 源[root@localhost /]# gem source -a http://rubygems.org/ to read开启集群个节点在两台机子中分别运行下面命令,启动集群中的每个节点 # 10.60.44.76for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done# 10.60.44.105for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done 查看各节点状态查看节点的开启状态ps -ef | grep redis-server结果如下:### 10.60.44.76root 18992 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7031 [cluster] root 18994 1 0 04:37 ? 00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7032 [cluster] root 18998 1 0 04:37 ? 00:00:10 /usr/local/redis/bin/redis-server 10.60.44.76:7033 [cluster] root 41471 16554 0 05:29 pts/2 00:00:00 grep redis-server### 10.60.44.105root 50565 1 0 04:37 ? 00:00:07 /usr/local/redis/bin/redis-server 10.60.44.105:7034 [cluster]root 50567 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7035 [cluster]root 50571 1 0 04:37 ? 00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7036 [cluster]root 51273 34592 0 05:29 pts/1 00:00:00 grep –color=auto redis-server创建集群每个节点正常开启后,在两台机子任意一台上运行:/usr/local/redis/bin/redis-trib.rb create –replicas 1 10.60.44.76:7031 10.60.44.76:7032 10.60.44.76:7033 10.60.44.105:7034 10.60.44.105:7035 10.60.44.105:7036连接集群查看状态登录客户端,并测试读写(记得要加上 -c 选项,不然会报错)# 10.60.44.76/usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 7031cluster info # 显示集群信息显示字段 cluster_state:ok 为正常运行状态,说明集群搭建成功使用 cluster nodes 查看集群各节点的当前状态,可以查看主从节点的分配和连接和情况。如下:10.60.44.76:7031> cluster nodes1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498187489957 11 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498187486928 9 connected 5461-1092237ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 slave 396e92e2e8207be6a4a93e29fd16670656477131 0 1498187488947 9 connected82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498187483893 6 connected1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498187487937 11 connected 0-5460135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 myself,master - 0 0 3 connected 10923-16383关闭集群关闭集群需要将节点逐个关闭,可以使用脚本自动完成:# 10.60.44.76for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 703$i shutdown; done # 10.60.44.105for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.105 -p 703$i shutdown; done 删除集群文件每次新创建集群之前需要将自动生成的配置文件和数据库删除,命令如下:# 10.60.44.76for((i=1;i<=3;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done# 10.60.44.105for((i=4;i<=6;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done四、集群操作当前存在集群节点情况如下:# 7034(主)- 7032(从)# 7035(主)- 7033(从)# 7036(主)- 7031(从)82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498199288536 6 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199282454 9 connected 5461-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199289546 3 connected 10923-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199285499 11 connected 0-546037ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 myself,slave 396e92e2e8207be6a4a93e29fd16670656477131 0 0 1 connected1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498199287523 11 connected增加一个主节点在原有的集群之上添加一个新的主节点,需要开启新的节点,接着将此节点添加进集群中并分配槽,详细如下描述:1. 创建节点需要的相关文件(文件夹、配置文件)[root@localhost /]# mkdir /usr/local/redis-cluster/70372. 拷贝并修改配置文件将配置文件中的 7036 字符串全部替换为 7037,此处不再累述[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7037/3. 启动新创建的节点[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf4. 将新节点添加进已存在集群中成为其中一主节点# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7037 10.60.44.105:7034成功后打印信息如下:>>> Adding node 10.60.44.105:7037 to cluster 10.60.44.105:7034>>> Performing Cluster Check (using node 10.60.44.105:7034)…………… 省略>>> Send CLUSTER MEET to node 10.60.44.105:7037 to make it join the cluster.[OK] New node added correctly.5. 查看添加新节点后的集群节点信息3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498199380639 0 connected396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199384698 9 connected 5461-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199381655 3 connected 10923-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199383685 11 connected 0-54606. 给新节点分配哈希槽[root@localhost /]# /usr/local/redis/bin/redis-trib.rb reshard 10.60.44.105:7037# 分配多少槽点给新节点How many slots do you want to move (from 1 to 16384)? 1000# 哪个是接受节点?(填入新节点的 id)What is the receiving node ID? 3f2c74e5888907c494b8b728210175144657f218Please enter all the source node IDs. Type ‘all’ to use all the nodes as source nodes for the hash slots. Type ‘done’ once you entered all the source nodes IDs.# 从所有主节点中随机选取Source node #1: all7. 查看分配槽后的集群节点信息3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201081749 12 connected 0-332 5461-5794 10923-11255396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498201080733 9 connected 5795-10922135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498201082755 3 connected 11256-163831baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498201078714 11 connected 333-5460增加一个从节点在原有的集群之上为其中一个主节点(7037)添加一个新的从节点(7038),需要开启新的从节点,并将此节点添加进集群中,详细如下描述:1. 创建节点需要的相关文件(文件夹、配置文件)[root@localhost /]# mkdir /usr/local/redis-cluster/70382. 拷贝并修改配置文件将配置文件中的 7036 字符串,全部替换为 7038,此处不再累述[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf /usr/local/redis-cluster/7038/3. 启动新创建的节点[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf4. 将新节点添加进集群中# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7038 10.60.44.105:7034成功后打印信息如下:>>> Adding node 10.60.44.105:7038 to cluster 10.60.44.105:7034>>> Performing Cluster Check (using node 10.60.44.105:7034)…………… 省略>>> Send CLUSTER MEET to node 10.60.44.105:7038 to make it join the cluster.[OK] New node added correctly.5. 查看添加新节点后的集群节点信息9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 master - 0 1498201399078 0 connected3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255…….6. 将端口为 7038 的节点置为 7037 端口的从节点[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f2187. 查看设置为从节点后的集群节点信息9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 slave 3f2c74e5888907c494b8b728210175144657f218 0 1498201731111 12 connected3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255…….删除一个主节点删除集群中端口为 7037 的主节点,填入集群中集群中任意节点 ip 端口和所要删除节点的 id。(需要先将所拥有的槽分配到其他的主节点)[root@localhost /]# usr/local/redis/bin/redis-trib.rb del-node 10.60.44.105:7034 3f2c74e5888907c494b8b728210175144657f218删除一个从节点同理得主节点五、集群测试模拟 oom(Out Of Meomery)redis-cli debug oom模拟宕机redis-cli debug segfault模拟 hangredis-cli -p 6379 DEBUG sleep 30参考资料:http://www.cnblogs.com/hjwubl…http://blog.csdn.net/cfl20121...http://www.cnblogs.com/wuxl36...http://www.redis.cn/topics/cl...http://wiki.jikexueyuan.com/p…