redis 搭建伪集群

1: 集群简介:

集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。

集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。----载自百度百科

redis 集群简介
redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;
redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
综上所述,每个Redis集群理论上最多可以有16384个节点。

2.目的

提高性能:
一些计算密集型应用,如:天气预报、核试验模拟等,需要计算机要有很强的运算处理能力,现有的技术,即使普通的大型机器计算也很难胜任。这时,一般都使用计算机集群技术,集中几十台甚至上百台计算机的运算能力来满足要求。提高处理性能一直是集群技术研究的一个重要目标之一。
降低成本
通常一套较好的集群配置,其软硬件开销要超过100000美元。但与价值上百万美元的专用超级计算机相比已属相当便宜。在达到同样性能的条件下,采用计算机集群比采用同等运算能力的大型计算机具有更高的性价比
提高可扩展性
用户若想扩展系统能力,不得不购买更高性能的服务器,才能获得额外所需的CPU 和存储器。如果采用集群技术,则只需要将新的服务器加入集群中即可,对于客户来看,服务无论从连续性还是性能上都几乎没有变化,好像系统在不知不觉中完成了升级。
增强可靠性
集群技术使系统在故障发生时仍可以继续工作,将系统停运时间减到最小。集群系统在提高系统的可靠性的同时,也大大减小了故障损失。

redis三种集群简介

主从复制
原理:
1:从服务器连接主服务器发送SYNC命令
2:主服务器接收到从服务器发送的SYNC命令后,开始进行BGSAVE命令生成RDB快照文件,并使用缓冲区记录此后执行所有写命令。
3:主服务器执行完BGSAVE命令后,向从服务器发送快照文件并,并在发送期间继续执行写命令。
4:从服务器收到快照文件后,丢弃所有旧数据,载入收到的快照文件
5:主服务器发送快照文件结束后向从服务器发送缓冲区中的写命令。
6:主服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令。(从服务器初始化完成)
7:主服务器每执行一个写命令,就向从服务器发送相同的写命令,从服务器接收并执行收到的写命令(初始化之后的操作)

优点:
1:支持主从复制,主机会自动同步数据到从机,可以实现读写分离
2:为了分担master服务器的读操作压力,可以让slave为客户端提供只读操作,写服务仍然由master完成
3:slave同时可以接收其他slaves的连接和同步请求,这样可以有效的分载master的压力
4:Master server是以非阻塞的方式为slaves提供服务,Master-slave同步期间,客户仍然可以进行读写操作、
5:Slave server同样以非阻塞的方式进行数据同步,同步期间,如果有客户端发送读请求,redis则返回同步前的数据。

缺点:
1:不具备主动容错和恢复功能,主机从机的宕机会导致前端部分读写请求失败,需要等待机器重启或手动切换前端api
2:主机宕机,宕机前有部分数据没能同步从机,就会造成数据不一致问题
3:比较难以支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

哨兵模式
当服务器中断后,可以将一个从服务器升级为主服务器,以便可以继续提供服务,但是这个过程需要手动完成,为此redis在2.8中提供了哨兵工具来实现自动化的实现自动化的系统监控和故障恢复功能。1): 监控主从服务器是否正常运行
2):主服务器出现故障会自动将从服务器转化为主服务器

哨兵工作方式:
1:每个Sentinel(哨兵)每秒钟会向Master主服务器,slave从服务器以及其他Sentinel(哨兵)发送进程发送一个PING命令
2:如果一个实例instance距离最后一次有效回复PING命令时间超过down-after-millisseconds选项所设置的值,则这个实例则会被标记为主观下线
3:如果master被标记为主观下线,则监视master的所有Sentinel哨兵进程会以每秒一次的频率来确认Master的确进入了主观下线状态。
4:当有足够数量(大于等于配置文件指定的值)的Sentinel哨兵进程确定master为主观下线,则标记为客观下线。
5:在一般情况下,每个Sentinel 哨兵进程会以每10秒一次的频率向集群中的所有Master主服务器,slave从服务器发送INFO命令.
6:当master主服务器被Sentinel哨兵标记为客观下线(ODOWN),Sentinel哨兵进程会向下线master主服务器的所有slave从服务器发送INFO命令的频率会由10 秒一次改为1秒一次。
7:如果没有足够数量的哨兵进程统一master主服务器下线,则Master的客观下线状态就会被移除,若Master主服务器从新向Sentinel哨兵进程发送PING命令返回有效回复,Master服务器的主观下线状态就会被移除。

优点:
1:哨兵模式是基于主从模式的,所有主从模式的优点,哨兵都具有。
2:主从可以实现自动切换,系统更健壮,系统可用性更高。

缺点:
1:Redis较难支持在线扩容,集群容量达到上限时线扩容会很复杂。
Redis-Cluster集群
哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下,每台服务器都存储相同的数据,很浪费内存,所以3.0上加入了Redis-cluster模式,实现分布式存储,每台节点存储不同的数据。

redis-cluster采用无中心的结构,特点如下:
1:所有节点互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
2:节点fail是通过集群中超过半数检测失效才决定失效的
3:客户端与redis任意一节点直连即可,不需要代理层,不需要连接集群中的所有节点。

集群准备环境
1:因为投票容错机制需要半数以上的几点认为某个节点挂了才是挂了,所以集群最少需要三个节点。
2:要保证高可用性,所以每个节点都需要从节点,所以要搭建高可用的redis集群至少需要6个节点。因服务器资源有限,所以采用伪分布式集群的方式即一台服务器运行6个实例。
3:安装ruby.

搭建集群步骤如下(记得关闭防火墙):
1:在/usr/local/ 目录下新建 redis-cluster目录用于存放集群实例:

mkdir redis-cluster

2:把redis 启动目录/bin下的所有文件拷贝到/usr/local/redis-cluster/redis01

cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis01

3:删除目录下的快照文件 dump.rdb.

rm rf dump.rdb

4:修改redis.conf 文件 端口号并将cluster-enable 的注释打开
5:将redis01 复制5份分别为redis02~redis06

cp -r redis01/ redis02

6: 分别修改端口号redis02~redis06

7: 接着启动所有节点可以新建一个start-all.sh 文件

cd /usr/local/redis-cluster/redis01
./redis-server redis.conf
cd /usr/local/redis-cluster/redis02
./redis-server redis.conf
cd /usr/local/redis-cluster/redis03
./redis-server redis.conf
cd /usr/local/redis-cluster/redis04
./redis-server redis.conf
cd /usr/local/redis-cluster/redis05
./redis-server redis.conf
cd /usr/local/redis-cluster/redis06
./redis-server redis.conf

8.修改start-all.sh脚本权限

chmod +x start-all.sh

9: 启动所有实例:

./start-all.sh

至此,准备工作则做完了,接下来开始搭建集群,需要一个工具(在redis解压文件里的一个脚本文件)因为这个工具是ruby写的,所以需要搭建ruby的环境,即安装ruby.

10.安装 ruby环境:

yum install ruby

11.安装redis-gem

gem install redis-3.0.0.gem
redis 搭建伪集群

12.上一步已经安装好了ruby需要的环境,接下来需要把脚本文件redis-trib.rb拷贝到redis-cluster文件夹下去。

cp redis-trib.rb /usr/local/redis-cluster

13.然后使用如下脚本搭建集群:

./redis-trib.rb create --replicas 1 47.106.219.251:7001
47.106.219.251:7002 47.106.219.251:7003 47.106.219.251:7004 47.106.219.251:7005 47.106.219.251:7006

结果如下:
redis 搭建伪集群
Redi集群搭建成功!大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10933-16383solts。

14.最后连接集群节点,连接任意一个即可:

./redis-cli -p 7001 -c
redis 搭建伪集群