下面介绍Redis的集群方案。前端
Redis的replication机制容许slave从master那里经过网络传输拷贝到完整的数据备份,从而达到主从机制。为了实现主从复制,咱们准备三个redis服务,依次命名为master,slave1,slave2。node
为了测试效果,咱们先修改主服务器的配置文件redis.conf的端口信息git
port 6300
复制代码
replication相关的配置比较简单,只须要把下面一行加到slave的配置文件中。你只须要把ip地址和端口号改一下。github
slaveof 192.168.1.1 6379
复制代码
咱们先修改从服务器1的配置文件redis.conf的端口信息和从服务器配置。redis
port 6301
slaveof 127.0.0.1 6300
复制代码
咱们再修改从服务器2的配置文件redis.conf的端口信息和从服务器配置。后端
port 6302
slaveof 127.0.0.1 6300
复制代码
值得注意的是,从redis2.6版本开始,slave支持只读模式,并且是默认的。能够经过配置项slave-read-only来进行配置。 此外,若是master经过requirepass配置项设置了密码,slave每次同步操做都须要验证密码,能够经过在slave的配置文件中添加如下配置项服务器
masterauth <password>
复制代码
分别启动主服务器,从服务器,咱们来验证下主从复制。咱们在主服务器写入一条消息,而后再其余从服务器查看是否成功复制了。网络
主从机制,上面的方案中主服务器可能存在单点故障,万一主服务器宕机,这是个麻烦事情,因此Redis提供了Redis-Sentinel,以此来实现主从切换的功能,相似与zookeeper。数据结构
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis作master-slave的高可用方案时,假如master宕机了,Redis自己(包括它的不少客户端)都没有实现自动进行主备切换,而Redis-Sentinel自己也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。app
它的主要功能有如下几点
Redis Sentinel 兼容 Redis 2.4.16 或以上版本, 推荐使用 Redis 2.8.0 或以上的版本。
必须指定一个sentinel的配置文件sentinel.conf,若是不指定将没法启动sentinel。首先,咱们先建立一个配置文件sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6300 2
复制代码
官方典型的配置以下
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
复制代码
配置文件只须要配置master的信息就好啦,不用配置slave的信息,由于slave可以被自动检测到(master节点会有关于slave的消息)。
须要注意的是,配置文件在sentinel运行期间是会被动态修改的,例如当发生主备切换时候,配置文件中的master会被修改成另一个slave。这样,以后sentinel若是重启时,就能够根据这个配置来恢复其以前所监控的redis集群的状态。
接下来咱们将一行一行地解释上面的配置项:
sentinel monitor mymaster 127.0.0.1 6379 2
复制代码
这行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6300, 而将这个主服务器判断为失效至少须要 2 个 Sentinel 赞成,只要赞成 Sentinel 的数量不达标,自动故障迁移就不会执行。
不过要注意, 不管你设置要多少个 Sentinel 赞成才能判断一个服务器失效, 一个 Sentinel 都须要得到系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。换句话说, 在只有少数(minority) Sentinel 进程正常运做的状况下, Sentinel 是不能执行自动故障迁移的。sentinel集群中各个sentinel也有互相通讯,经过gossip协议。
除了第一行配置,咱们发现剩下的配置都有一个统一的格式:
sentinel <option_name> <master_name> <option_value>
复制代码
接下来咱们根据上面格式中的option_name一个一个来解释这些配置项:
对于 redis-sentinel 程序, 你能够用如下命令来启动 Sentinel 系统
redis-sentinel sentinel.conf
复制代码
对于 redis-server 程序, 你能够用如下命令来启动一个运行在 Sentinel 模式下的 Redis 服务器
redis-server sentinel.conf --sentinel
复制代码
以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf, 若是不指定将没法启动sentinel。sentinel默认监听26379端口,因此运行前必须肯定该端口没有被别的进程占用。
此时,咱们开启两个Sentinel,关闭主服务器,咱们来验证下Sentinel。发现,服务器发生切换了。
Twemproxy是由Twitter开源的Redis代理, Redis客户端把请求发送到Twemproxy,Twemproxy根据路由规则发送到正确的Redis实例,最后Twemproxy把结果聚集返回给客户端。
Twemproxy经过引入一个代理层,将多个Redis实例进行统一管理,使Redis客户端只须要在Twemproxy上进行操做,而不须要关心后面有多少个Redis实例,从而实现了Redis集群。
这么些年来,Twenproxy做为应用范围最广、稳定性最高、最久经考验的分布式中间件,在业界普遍使用。
可是,Twemproxy存在诸多不方便之处,最主要的是,Twemproxy没法平滑地增长Redis实例,业务量突增,需增长Redis服务器;业务量萎缩,须要减小Redis服务器。但对Twemproxy而言,基本上都很难操做。其次,没有友好的监控管理后台界面,不利于运维监控。
Codis解决了Twemproxy的这两大痛点,由豌豆荚于2014年11月开源,基于Go和C开发、现已普遍用于豌豆荚的各类Redis业务场景。
Codis 3.x 由如下组件组成:
Redis 3.0集群采用了P2P的模式,彻底去中心化。支持多节点数据集自动分片,提供必定程度的分区可用性,部分节点挂掉或者没法链接其余节点后,服务能够正常运行。Redis 3.0集群采用Hash Slot方案,而不是一致性哈希。Redis把全部的Key分红了16384个slot,每一个Redis实例负责其中一部分slot。集群中的全部信息(节点、端口、slot等),都经过节点之间按期的数据交换而更新。
Redis客户端在任意一个Redis实例发出请求,若是所需数据不在该实例中,经过重定向命令引导客户端访问所需的实例。
Redis 3.0集群,目前支持的cluster特性
选举过程是集群中全部master参与,若是半数以上master节点与master节点通讯超时,认为当前master节点挂掉。
当集群不可用时,全部对集群的操做作都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。若是集群任意master挂掉,且当前master没有slave,集群进入fail状态,也能够理解成进群的slot映射[0-16383]不完成时进入fail状态。若是进群超过半数以上master挂掉,不管是否有slave集群进入fail状态。
如今,咱们进行集群环境搭建。集群环境至少须要3个主服务器节点。本次测试,使用另外3个节点做为从服务器的节点,即3个主服务器,3个从服务器。
修改配置文件,其它的保持默认便可。
#根据实际状况修改
port 7000
#容许redis支持集群模式
cluster-enabled yes
#节点配置文件,由redis自动维护
cluster-config-file nodes.conf
#节点超时毫秒
cluster-node-timeout 5000
# 开启AOF同步模式
appendonly yes
复制代码
目前这些实例虽然都开启了cluster模式,可是彼此还不认识对方,接下来能够经过Redis集群的命令行工具redis-trib.rb来完成集群建立。 首先,下载 raw.githubusercontent.com/antirez/red…。
而后,搭建Redis 的 Ruby 支持环境。这里,不进行扩展,参考相关文档。
如今,接下来运行如下命令。这个命令在这里用于建立一个新的集群, 选项–replicas 1 表示咱们但愿为集群中的每一个主节点建立一个从节点。
redis-trib.rb create --replicas 1 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 127.0.0.1:7006
复制代码