一. 铺垫
1. 为什么要用服务器集群
(1). 分摊客户端的压力,提高服务器效率。(高并发)
(2). 解决单点故障问题,即删除服务器节点或者增加服务器节点都不影响使用。(高可用)
2. 集群的类型
(1). 对称集群:各个集群实例角色的地位相同。(数据计算)
(2). 非对称集群:各个集群实例角色的地位不相同。(数据存储)
下图:秒杀集群是对称集群,DB集群是非对称集群。
二. 演变历程
第一代:简单的主从复制,读写分离
一个主服务器(master)对应多个从服务器(slaver),主从之间实现数据同步,主服务器负责【写】,从服务器负责【读】。
分析:主服务器master宕机了,从服务器也跟着就挂了。
第二代:哨兵模式
在Redis3.0之前的版本,要实现集群一般是借助哨兵(sentinel工具)监视master节点的状态,如果master挂机, 其中一个slaver会顶上去,顶替master使用,哨兵模式的配置略微复杂,并且性能和高可用性等方面表现一般,特别是主从切换的瞬间存在 访问瞬断 的问题。
分析:
虽然解决了第一代中主挂全挂的问题,但所有的写压力都在一个master上,且宕机的时候,slaver顶上去的这个切换期间,整个服务停止,从而影响项目的正常运行。而且就一个master,单个节点的极限并发也就10万左右了。
第三代:Cluster
该模式是由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。Redis集群不需要Sentinel哨兵也能完成节点移除和故障转移工作。需要将每个节点设置成集群模式,这种集群没有中心节点,可水平扩展,根据官方文档成可以线性扩展到1000个节点,redis集群的性能和高可用性均优于之前的哨兵模式,且集群的配置非常简单。
分析:多个master平行节点,分摊了写的压力,且无论是master还是slave水平都可以扩展很多,另外即使单个的master-slave故障或者瞬断,那么新的请求来了,也不会分发到这个节点上。
三. Cluster模式搭建
1. 需要准备的东西
(1). redis
(2). redis集群搭建工具:redis-trib.rb (类似IIS协调调度)
(3). Ruby的运行环境
(4). Ruby环境下redis驱动:redis-3.2.2.gem (好比C#通过ADO.NET访问SQLServer)
补充对应的下载地址:
下载Redis安装文件:https://github.com/MSOpenTech/redis/releases/,Redis提供msi和zip格式的下载文件,这里下载zip格式Redis-x64-3.2.100版本。
下载Ruby运行环境文件:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe
下载Ruby环境下Redis驱动:https://rubygems.org/gems/redis/versions/3.2.2,考虑到兼容性,这里下载的是3.2.2版本
下载Redis集群工具redis-trib.rb,路径如下:https://github.com/beebol/redis-trib.rb
2. 搭建步骤
(1). 配置Reids集群
准备六个配置文件【redis.6380.conf】【redis.6381.conf】【redis.6382.conf】【redis.6383.conf】【redis.6384.conf】【redis.6385.conf】,拷贝到Redis文件夹中。然后通过cmd命令【redis-server.exe redis.6380.conf】【redis-server.exe redis.6381.conf】【redis-server.exe redis.6382.conf】【redis-server.exe redis.6383.conf】【redis-server.exe redis.6384.conf】【redis-server.exe redis.6385.conf】,进行启动。
启动成功后,发现文件夹中多了12个文件,如下图:
分析配置文件中的内容:以【redis.6380.conf】为例
port 6380 #端口号
appendonly yes #数据的保存为aof格式
appendfilename "appendonly.6380.aof" #数据保存文件
cluster-enabled yes #是否开启集群
cluster-config-file nodes.6380.conf #集群节点配置文件
cluster-node-timeout 15000 #集群节点的超时时间
cluster-slave-validity-factor 10 #校验从节点是否可以进行主从复制,校验10次
cluster-migration-barrier 1 #配置数据转移
cluster-require-full-coverage yes #主从节点全量复制
PS:
这里6个配置文件是平行关系的,配置级别都一样,主从关系是在下面【redis-trib.rb】配置哦。
这里要求最少得配置3个主master,不能低于3个,有没有从 无要求。
(2). 安装ruby运行环境
(rubyinstaller-2.2.4-x64.exe)注意勾选后两个,让其自动配置环境变量,最终安装在这个这个文件夹中【Ruby22-x64】
(3). 安装驱动
进入ruby运行环境的文件夹中【Ruby22-x64】中,进入命令行模式,安装Redis的驱动 【gem install --local C:UsersDELLDesktop edis-cluster edis-3.2.2.gem】
(4). 利用 redis-trib.rb 进行集群的协调配置
进入它所在的文件夹cmd命令行,进行集群的配置,指令:【redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385】,这里的 replicas 1,1代表1个master对应1个slave,改为2,则代表1个master对应2个slave。
PS:其它指令
create:创建集群
check:检查集群
info:查看集群信息
fix:修复集群
reshard:在线迁移slot
rebalance:平衡集群节点slot数量
add-node:将新节点加入集群
del-node:从集群中删除节点
set-timeout:设置集群节点间心跳连接的超时时间
call:在集群全部节点上执行命令
import:将外部redis数据导入集群
问题:我最后配置完了,我写的时候访问哪个?
答案:以上主节点访问访问任何一个都可以,进到redis集群中,会根据负载均衡算法自动进行分发到某个节点上。
3. 测试
(1). 在6380节点进行输入 userName的值为 ypf1, 则6个节点都能获取到数据。
等等,不一一截图了。
(2). 在6385节点输入age的值为10,则6个节点中都能获取到数据。
总结:无论是master节点还是slave节点写入数据,所有节点都能读取到数据,这里测试使用指令测试,不要用可视化工具直接看,有延迟有缓存不准确哦。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。