记录redis集群搭建以及遇到的问题
前言:项目需要搭建一个redis集群环境。先简单说明下哨兵模式和cluster模式的区别。
哨兵模式:
基于HA机制,哨兵会盯着redis的主从集群,当master分支宕机时,会从salve中重新选举出一个新的matster节点。但是缺点是内存/QPS受限于单机。
cluster模式:
因为存在多个master分支,受益于分布式集群高扩展性,内存/QPS不受限于单机,高并发场景会有更好的表现。带来的影响是集群会导致数据的分散,整个redis集群会分成一堆数据槽,即不同的key会放到不不同的槽中。
1.准备工作
所需环境和安装包:一台Linux主机, redis-3.2.8.tar.gz,redis-3.2.8.gem
2.预期效果
完成redis集群搭建
3.遇到问题
a.缺失ruby依赖包
b.在执行创建集群指令时卡在watting for the cluster to join....
c.重新执行创建集群指令时提示 err slot 0 is already busy
4.开始部署
1.解压压缩文件并安装 tar -zxvf redis-3.2.8.tar.gz cd redis-3.2.8 make make install 2.因为是集群模式至少3个master节点,所以我们新建一个redis文件夹,并复制共6个redis目录 mkdir /home/isap/redis cp -r redis-3.2.8 /home/isap/redis_7000 cp -r redis-3.2.8 /home/isap/redis_7001 ...... 3.修改配置文件redis.conf port 7000 //端口7000,7002,7003 bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群 daemonize yes //redis后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置 appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 然后将redis_7000复制5分放入/redis_cluster中命名分别为redis_7001、redis_7002、redis_7003、redis_7004、redis_7005; 然后分别修改其目录下的redis.conf文件中的端口和ip。 4.将启动集群的文件redis-trib.rb 拷贝到本地 /usr/local/bin 目录下 cd redis-3.2.8/src cp redis-trib.rb /usr/local/bin/ 5.启动各节点,进入redis_7000目录下,启动命令如下 redis-server redis.conf 然后依次启动redis_7001、redis_7002、redis_7003、redis_7004、redis_7005。 6.查看情况 ps -ef | grep redis 7、创建集群 Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。 redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 中途如果错误内容:/usr/bin/env: ruby: No such file or directory,则需要安装 ruby。这里推荐使用yum install ruby安装,安装命令如下: yum install ruby yum -y install ruby ruby-devel rubygems rpm-build redis-3.2.8.gem(这是自带的文件)
5.处理问题
下面我着重说明下我遇到的问题和处理的方法。
问题1:在执行创建集群指令时卡在watting for the cluster to join....
可以看到服务卡在了waiting。一直都没继续走下去这是为什么呢。我们一起来排查下原因。
首先我查阅了网上资料有份资料上说明了这步操作我们具体做了什么
7001,7002,7003,7004,7005 都会发送给7000 meet这个命令。
收到签名才算是分配成功
那么我们来评估下原因 1.网络端口问题 centos6.0 查看防火墙状态:service iptables status 关闭防火墙:chkconfig iptables off #开机不启动防火墙服务 -------------------------------------------------------------- centos7.0(默认是使用firewall作为防火墙,如若未改为iptables防火墙,使用以下命令查看和关闭防火墙) 查看防火墙状态 firewall-cmd --state 关闭防火墙:systemctl stop firewalld.service 我这边是没问题的,所以原因1排除 2.发送cluster meet指令失败 以集群方式进入redis客服端 redis-cli -h 127.0.0.1 p 7001 -c 发送meet指令 cluster meet 127.0.0.1:7000 结果还是停留在了waiting上,看着没有成功
可是网络端口和模拟口令都执行了,还是不行这是为什么呢,再次打开waitting界面终于有了发现
无论是master节点还是slave节点公用了同一个pid,这个很明显是有问题。redis集群中每个节点应该生成了自己对应的pid,修改了配置文件并启动redis后系统会对当前的redis目录分配固定的pid,如果你将当前的目录cp出新的redis模块,就会出现我这个问题。所以处理思路就很明确了,修改redis的配置文件后不要马上启动redis,先把当前的redis目录cp出一份新的模块。最后再统一启动就可以了。
问题2.重新执行创建集群指令时提示 err slot 0 is already busy
之前提到过,因为本身配置问题可能会导致一直卡在waiting阶段,当你强制退出后,想重新执行集群创建语句,因为原slot已经被占用所以,会导致语句执行失败。 处理方式:进入redis-cli客户端执行命令 flushAll cluster reset
最后我们可以简单确认下集群是否搭建完成
进入任意一个节点,查看集群信息
3个master对应3个slave,完成了