`
code727
  • 浏览: 65681 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Redis3.x集群部署

阅读更多

1.实现目标

目标清单:

1)192.168.31.220、192.168.31.221和192.168.31.222为三台redis服务器的地址。初始状态下,所有服务器上6379端口的redis节点都为master,而6380端口的节点都为本机master的slave;

2)当某个master节点处于不可用时,则要求集群监控到后将某个slave(不一定是当前master主机上的slave)切换为新的master;

3)如果半数(及以上)节点挂掉,则整个集群进入fail状态。

2.实现过程

2.1安装Redis3.x

     此步骤省略,可参考http://code727.iteye.com/blog/2251399

2.2安装cluster依赖工具

     在任意一台主机上(如220)进行如下操作:

yum install ruby
yum install rubygems
gem install redis
2.3cluster配置
# 为Master和Slave节点拷贝两个配置文件到/etc/redis目录
cp /usr/local/redis/redis.conf /etc/redis/redis-6379.conf
cp /usr/local/redis/redis.conf /etc/redis/redis-6380.conf
 2.3.1修改master节点配置
vi /ect/redis/redis-6379.conf
    主要配置项如下:
# master节点服务端口
port 6379
# 开启集群
cluster-enabled yes
# master节点的配置文件
cluster-config-file nodes-6379.conf
# 集群节点互联超时时间(10秒)
cluster-node-timeout 10000
2.3.2修改slave节点配置
vi /ect/redis/redis-6380.conf
# slave节点服务端口
port 6380
# 开启集群
cluster-enabled yes
# slave节点的配置文件,名称与master的不一样
cluster-config-file nodes-6380.conf
# 集群节点互联超时时间(10秒)
cluster-node-timeout 10000
   完成后,将redis-6379.conf和redis-6380.conf两个配置拷贝到所有主机的/etc/redis/目录下

2.3.2启动redis服务

   在所有主机上进行如下操作:

# 进入redis-server目录
cd /usr/local/redis/src
# 启动master节点服务
./redis-server /etc/redis/redis-6379.conf
# 启动slave节点服务
./redis-server /etc/redis/redis-6380.conf
2.3.3创建集群环境

    在2.2节中安装了cluster依赖工具的主机上进行如下操作:

cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 192.168.31.220:6379 192.168.31.221:6379 192.168.31.222:6379 192.168.31.220:6380 192.168.31.221:6380 192.168.31.222:6380
    创建集群环境的命令格式为./redis-trib.rb create --replicas <slaveCount> masterNode1,masterNode2,masterNodeN,slaveNode1,slaveNode2,slaveNodeN
    Node的格式为"IP:port",slaveCount表示每个masterNode对应的slaveNode个数,在集群环境中可以没有slave(在命令中省略掉slaveNode部分即可)。但如果有slave,则命令中,前n中个节点都为master,后n个节点都为slave,第n个master节点对应的slave应该是第n个。在上面的创建命令中,各节点的顺序正好满足目标清单中的第1)条需求。

    从上图可看出,六个节点都处于"OK"状态,并且前三个6379端口的都为master,而都三个6380端口的都为slave。此时出现提示,键入yes后,各节点将会进行互联操作

     从上图可看出16384个哈希槽已均匀分配给了三个master节点,分别为:
     192.168.31.220:6379(10923-16384)
     192.168.31.221:6379(5461-10922)
     192.168.31.222:6379(0-5460)
2.4定义服务
    在所有的主机上进行如下操作:
2.4.1定义redis-6379服务
vi /etc/init.d/redis-6379 
    输入如下内容:
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
 
REDISPORT=6379
EXEC=/usr/local/redis/src/redis-server
REDIS_CLI=/usr/local/redis/src/redis-cli 

CONF="/etc/redis/redis-6379.conf" 
 
case "$1" in
        start)
                echo "Starting Redis-6379 server..."
                $EXEC $CONF
		sleep 1
	        echo "Redis-6379 is running..."  
                ;;
        stop)
                echo "Stopping..."
                $REDIS_CLI -p $REDISPORT SHUTDOWN      
                sleep 1
                echo "Redis-6379 stopped"              
                ;;
        restart|force-reload)
                ${0} stop
                ${0} start
                ;;
        *)
                echo "Usage: /etc/init.d/redis-6379 {start|stop|restart|force-reload}" >&2
                exit 1
esac
chmod -R 755 /etc/rc.d/init.d/redis-6379
2.4.1定义redis-6380服务
vi /etc/init.d/redis-6380
 输入如下内容:
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
 
REDISPORT=6380
EXEC=/usr/local/redis/src/redis-server
REDIS_CLI=/usr/local/redis/src/redis-cli 

CONF="/etc/redis/redis-6380.conf" 
 
case "$1" in
        start)
                echo "Starting Redis-6380 server..."
                $EXEC $CONF
		sleep 1
		echo "Redis-6380 is running..."  
                ;;
        stop)
                echo "Stopping..."
                $REDIS_CLI -p $REDISPORT SHUTDOWN      
                sleep 1
                echo "Redis-6380 stopped"              
                ;;
        restart|force-reload)
                ${0} stop
                ${0} start
                ;;
        *)
                echo "Usage: /etc/init.d/redis-6380 {start|stop|restart|force-reload}" >&2
                exit 1
esac
chmod -R 755 /etc/rc.d/init.d/redis-6380
2.5设置开机启动
    在所有的主机上进行如下操作:
vi /etc/rc.d/rc.local
    加入如下内容:
service redis-6379 start
service redis-6380 start
3.测试
3.1redis-cli连接
# 常规的连接命令  
./redis-cli -h 192.168.31.220 -p 6379  
# redis set命令  
set name daniele  
    执行set命令后,将会返回MOVED错误,如下图:

    这是因为键(name)应该映射到0-5460范围内,因此不能在220(10923-16384范围)上进行操作,将-h的后ip修改为222重新连接后再进行set操作将会成功处理。
3.2改良后的redis-cli连接
    在redis-cli后加一个-c参数可以避免MOVED错误的发生,如下:
# 具备重定向功能的连接
./redis-cli -c -h 192.168.31.220 -p 6379  
# redis set命令  
set name daniele  
    执行set命令后,将会自动重定向,并返回正确的结果:

3.3宕机测试
1)kill掉222的master节点,再进行3.2节的操作,此时将不会再重定向到已不可用的222的master节点上

    此时重定向到了221的master节点上。这是因为同样的一个键,此时的slot值为5789而不是先前的4808,因此它将存储到221的master节点范围5461-10922内,可以通过如下命令查看到各节点状态
# 查看220上node-6379.conf文件内容
./redis-cli -h 192.168.31.220 -p 6379 cluster nodes
# 查看220上node-6380.conf文件内容
./redis-cli -h 192.168.31.220 -p 6380 cluster nodes

    上图展示的结果正好是220上node-6379.conf文件内容
    有时在执行操作时会遇到“(error) CLUSTERDOWN The cluster is down”错误,见下图:

     在这种情况下,221是可连接的(否则上图中最后一行的转向地址信息不可能会出现),需要对221:6379节点进行修复:
# 格式为./redis-trib.rb fix 被损节点ip:port
./redis-trib.rb fix 192.168.31.221:6379
2)kill掉半数(当前架构为3个)节点,再进行3.2节的操作,将同样会出现“(error) CLUSTERDOWN The cluster is down”错误:

见上图,最后一行的地址信息表明没有发生转向,说明整个集群环境down掉了。
3)重启被kill掉的节点,再进行3.2节的操作,此时又恢复了正常。
4.Jedis对Redis Cluster的支持
    ShardedJedis是Jedis2.2+提供的基于一致性哈希算法实现的分布式Redis集群客户端,详情可参考http://www.cnblogs.com/liuling/p/2014-4-21-01.htmlhttp://blog.csdn.net/xiaolang85/article/details/12655519
5.总结
       在整个集群环境中,如果有半数的节点处于不可用状态时,会使整个集群系统都变为不可用,这是一个相当严重的问题。在上面章节的实施过程,都是人工值守的。对于可靠性高的系统来说,必须要加入自动检测恢复机制来实现,可以为每个节点加入keepalived来满足要求,当检测到某个redis节点不可用时,让它自动调用redis的重启脚本。    
     Redis Cluster目前不支持跨库操作,即在任意一个节点进行select操作是不允许的。个人认为,对于那种需要将数据按库进行分类的系统来说,还是采用Sentinel架构比较好,可参考http://code727.iteye.com/blog/2251399
  • 大小: 18.3 KB
  • 大小: 20.7 KB
  • 大小: 22.8 KB
  • 大小: 2.3 KB
  • 大小: 3 KB
  • 大小: 4.6 KB
  • 大小: 3 KB
  • 大小: 15.3 KB
  • 大小: 3.8 KB
  • 大小: 2.8 KB
分享到:
评论

相关推荐

    redis4.0.x集群创建及问题处理

    1.redis4.0.x 集群搭建的前提环境准备; 2.搭建redis4.0.x 集群; 3.验证集群; (1)Linux服务器端验证集群; (2)本机写一段Jedis来连接阿里云服务器验证集群。 4.从搭建开始到结束遇到的所有坑 ,百度找到你心态...

    redis集群一键自动部署脚本.rar

    redis集群自动搭建脚本,按照脚本中说明,简单修改ip 端口等参数 便可执行脚本自动搭建redis集群,适用centos7.X版本

    redis集群部署Win版本.zip

    Win版本Redis:Redis-x64-3.0.504 ruby:rubyinstaller-2.2.4-x64.exe ruby的redis驱动:redis-3.2.2.gem redis客户端:redis-desktop-manager-0.9.3.817.exe Redis集群部署教程.docx 供参考哈。

    Redis集群部署手册

    redis集群部署文档,一、RedisCluster集群安装(centos6.5 X64系统),二、安装结果测试,三、Redis集群常用管理命令,四、集群节点管理命令

    Redis-x64-3.0.504可视化迷你安装包.zip

    Redis是一个快速、开源、高性能的内存键值数据库,它支持多种不同类型的数据...Redis支持分布式部署,可以通过集群的方式实现数据的扩容和负载均衡。 除了这些特点,Redis还有许多其他详细的特性,如发布/订阅、Lua

    Redis3.0 集群安装过程

    3. 修改redis.conf配置文件 4. 部署6份redis 实例 5. 修改 6个redis实例的配置文件 6. 安装集群需安装ruby运行环境 7. 编写脚本启动6个redis实例 8. 编辑启动集群脚本,启动集群 9. 测试集群环境 10. 关闭redis集群

    redis cluster集群部署文档(Linux)

    一个比较全的redis cluster的部署文档,介绍在linux环境中下载、安装redis,配置各个节点,并最终形成集群,本人已用该文档在多套环境中进行部署,真实可用

    docker 一键部署redis集群 shell脚本 适用centos7.x版本

    docker 一键部署redis集群 shell脚本 适用centos7.x版本,按照说明 将参数传递给 安装脚本,自动执行部署程序,亲测可用

    tomcat-redis-session-manager tomcat+nginx+redis集群所需jar

    apache-tomcat-7.0.67+nginx-1.14.0+Redis-x64-3.2.6379集群部署所需JAR包

    Windows Redis集群所需资源包.rar

    包含Redis-x64-3.2.100、ruby环境rubyinstaller-2.2.4-x64.exe、驱动redis-3.2.2.gem、集群工具redis-trib.rb

    tomcat集群使用redis解决session共享问题

    tomcat集群使用redis解决session共享问题,压缩包包含redisclient-win32.x86.2.0客户端、Redis-x64-3.2.100服务、tomcat-redis-session以及部署安装文档

    tomcat8+Redis+nginx

    tomcat8+Redis+nginx负载均衡集群部署,apache-tomcat-8.0.47+nginx-1.13.6+Redis-x64-3.2.100

    K8sRedisExercise

    在启用安全性的情况下在k8s集群顶部部署Redis,并将Redis日志记录设置为调试模式 我们使用StatefulSet部署Redis 原因: 可以访问卷的Redis Pod,但是我们希望它保持对同一卷的访问,即使重新部署或重新启动它也需要...

    kxmall-生鲜商城+APP+小程序+H5 同时支持微信小程序、H5、安卓App、苹果App 支持集群部署,单机部署

    支持集群部署,单机部署。可用于B2C商城,O2O外卖,社区超市,生鲜【带配套骑手端配送系统】。kxmall使用uniapp编码。使用Java开发,SpringBoot 2.1.x框架,MyBatis-plus持久层框架、Redis作为缓存、MySql作为数据库...

    Windows环境部署Redis集群

    安装到 c:\Redis 目录下(Redis-x64-3.2.100.msi ) 2.下载 RubyInstaller 下载地址:http://rubyinstaller.org/downloads/  安装时,勾选:(所使用版本rubyinstaller-2.3.1-x64.exe)  Install Td/Tk Support  ...

    Redis hash数据存储空间优化

    于是部署了16个分片,每个分片10G的集群。但是实际数据推上集群后,发现占用了140G空间,这大大超出了之前的预估。 感到很疑惑,于是查找相关资料。发现...

    开源 MQTT 服务器(基于reactor-netty实现高性能的、可扩展、支持千万级设备接入集群)

    开发,底层采用Reactor3反应堆模型,支持单机部署,支持容器化部署,具备低延迟,高吞吐量,支持百万TCP连接,同时支持多种协议交互,是一款非常优秀的消息中间件! 1. 消息质量等级实现(支持qos0,qos1,qos2) 2. ...

    本项目JDK8x64+SpringBoot+MyBatis+Redis+Durid+Beetl的框架组合的开源OA系统

    本项目JDK8x64+SpringBoot+MyBatis+Redis+Durid+Beetl的框架组合的开源OA系统,自研工作流引擎,支持可视化表单设计与流程设计。支持分布式部署,支持文档全文检索,支持集群应用,支持私有化部署,支持钉钉微信,...

    jmqtt:由Java和Netty实现的MQTT代理,支持持久性和集群

    基于Redis的支持集群 支持嵌入式启动使用内存,但不支持集群 支持sprint-boot-jmqtt-starter 支持测试用例 正式文件 快速开始 下载(3. X以上的版本)或clone此项目 在根目录中执行: mvn -Ppackage-all -...

Global site tag (gtag.js) - Google Analytics