我在当前的项目建设过程中,使用到了 Redis 的集群,主要是用来减轻数据库的压力和页面加载速度,说的直接点就是增强用户的体验感,其实 Redis 集群搭建看似简单(我当时也是这么想的),但在实际 Redis 集群搭建的过程中也遇到了一些问题,但通过不懈的努力再加上各种解决问题的手段,最后终于解决了。
为了帮助广大同行也是为了帮助自己,在实际的开发过程中提高开发效率和解决 Redis 集群搭建过程中遇到的一些问题,所以我特意的将 Redis 集群搭建编写为教程,搭建的过程中遇到的问题及解决办法也记录了下来并以博文的形式呈现出来供大家参考,如果不足之处请指出,我会及时加以改正。
在这儿我是用的是Redis最新版本 Reids-4.0.2,Redis 4.0 于今年2017年7月发布。包含几大改进:一个模块系统,更好的复制 (PSYNC2),混合 RDB + AOF 格式,新的记忆命令,同步,集群支持 Nat,活跃的记忆碎片整理,内存使用和性能改进,更快的数据同步等。如果你对 Redis 的安装、数据库操作、数据类型、数据模型及内存优化等还不了解的可以参考 《CentOs7安装与配置Redis服务器详情图文详解 》 在以上这篇博文对以上列举内容作了具体的介绍,如果写得不到之处,我们可以一起探讨,谢谢!!!一个合格的集群至少需要三个或三个以上节点组成,按照常规创建三个节点,每个节点一主一备,至少也要6台虚拟机。我的硬件设备承载能力有限,在此用一台虚拟机搭建一个 Redis 的伪分布式集群,使用 6 个 Redis 实例来模拟。和实际的项目开发中,在条件允许的情况下,使用6台服务器一样的操作都能实现。
输入命令 " yum install ruby "和 " yum install rubygems " 进行安装,如下图:
找到 Redis 集群管理工具 " redis-trib.rb " ,这个一看后缀一般都知道是Ruby编写的一个程序,他的主要作用就是将Redis 的各个节点串联起来组成一Redis集群,
那么这个工具在哪儿呢?需要下载吗?我来告诉你,找到 Redis 的解压包所在目录,输入 " cd redis/src/ " 进入 Redis的 src 目录,如下图:
进入到以安装好的 Redis 单机版目录中,如果没有安装,请点击 《 安装Redis 》,将 bin Copy 到 redis-cluster 目录下,并新建 redis-01,
输入命令 " cp -r bin ../redis-cluster/redis-01 " 进行 Copy,
然后进入到 redis-01目录中,删除 Redis 的快照文件,输入命令 " rm -rf dump.rdb " 进行删除,如下图:
修改 Redis 的端口号,取消 Redis 集群注解 cluster-enabled yes,表示启用 Redis 集群,
输入命令 " vi redis.conf " 进行修改,如下图:
注意:我这儿使用的端口号范围 9001~9006 ,当然你也可以自己定义。
创建 6 个 Redis 实例,已创建完成一个,将当前Redis实例再Copy 5 即可,输入命令 " cp -r redis-01 redis02~06 " 进行创建,实例创建完成后,修改端口号和上面一样,这儿就不再提了,如下图:
将 ruby 脚本拷贝到 redis-cluster 目录中,输入命令 " cp -r redis-trib.rb /usr/local/redis-cluster " 进行 Copy,如下图:
创建集群前,启动这 6 个 Redis 实例,单个启动太麻烦,先创建一个 Redis 启动脚本儿,输入命令 " vi redis-start-all.sh " 进行创建,如下图:
使用 chmod 函数,将 redis-start-all.sh 设置成可执行文件,
输入命令 " chmod +x redis-start-all.sh " 进行设置,如下图:
使用 redis 启动脚本儿,输入命令 " ./redis-start-all.sh " 进行启动,启动完成后,检查是否启动完成,
输入命令 " ps aux|grep redis " 查看,发现 6 个 Redis 实例正常启动成功,如下图:
全部 Redis 启动成功后,
输入命令 " ./redis-trib.rb create --replicas 1 192.168.78.136:9001 192.168.78.136:9002 192.168.78.136:9003 192.168.78.136:9004 192.168.78.136:9005 192.168.78.136:9006 " 创建 cluster,创建成功后如下图:
Redis Cluster 创建成功后,可以尽情的享受你的成功了,
输入命令 " redis-01/redis-cli -c -h 192.168.78.136 -p 9001 " 集群链接成功后,就可以 set/get,如下图:
解决办法:《 安装 Ruby 接口 》
解决办法:《 升级 Ruby 版本 》
输入 " ./redis-trib.rb create --replicas 1 192.168.78.136:9001 192.168.78.136:9002 192.168.78.136:9003 192.168.78.136:9004 192.168.78.136:9005 192.168.78.136:9006 " 命令创建 Redis-Cluster 失败!
如下图:
解决办法:《 Redis-Cluster 创建失败解决办法 》
redis 集群在启动的时候就自动在多个节点间分好片。同时提供了分片之间的可用性:当一部分 redis 节点故障或网络中断,集群也能继续工作。但是,当大面积的节点故障或网络中断(比如大部分的主节点都不可用了),集群就不能使用(节点之间存在着投票的制度,这就是Redis集群为什么至少需要三个节点的缘故)。
所以,从实用性的角度,Redis 集群提供以下功能:
1)、自动把数据切分到多个 redis 节点中 ;
2)、当少部分节点挂了或不通,集群依然能继续工作;
造成写操作数据丢失的原因:
是因为主从节点之间通过异步的方式来同步数据。
向 Redis 集群一个写的动作流程:Redis 集群不是使用一致性哈希,而是使用哈希槽。整个 redis 集群有 16384 个哈希槽,决定一个 key 应该分配到那个槽的算法是:计算该 key 的 CRC16 结果再模 16384。
集群中的每个节点负责一部分哈希槽,例如上例中集群有 3 个节点,则:
1)、节点 01 存储的哈希槽范围是:0 ~ 5460
2)、节点 02 存储的哈希槽范围是:5461 ~10922
3)、节点 03 存储的哈希槽范围是:10923~16383
这样的分布方式方便节点的添加和删除。比如,需要新增一个节点 07,只需要把 01、02、03 中的部分哈希槽数据移到 07 节点。同样,如果希望在集群中删除01节点,只需要把 01 节点的哈希槽的数据移到 02 和 03 节点,当 01 节点的数据全部被移走后,01 节点就可以完全从集群中删除。
因为把哈希槽从一个节点移到另一个节点是不需要停机的,所以,增加或删除节点,或更改节点上的哈希槽,都是不需要停机的。
如果多个key都属于一个哈希槽,集群支持通过一个命令、事务或lua脚本同时操作这些key。通过“哈希标签”的概念,用户可以让多个key分配到同一个哈希槽。
哈希标签Redis中国官网(Redis china)的集群文档中有详细的描述,在这里只做个简单介绍:如果key含有大括号”{}”,则只有大括号中的字符串会参与哈希,比如”manager{util}”和”company{util}”这两个key会分配到同一个哈希槽,所以可以在一个命令、事务或lua脚本中同时操作他们。
好了,整个Redis集群环境搭的建就到此结束了,如果还有什么疑问或遇到什么问题,可以给我留言。
尊敬的读者朋友,如果本博文对你有一定的帮助,那就请不要吝啬你的赞,我花费了时间、精力、工作经验来编写博文,也许你的一个不经意的点赞,将会成为我前进的动力!!!
哦!对了,歇后语:“共同学习,共同进步”,也希望大家多多关注CSND的IT社区。