部分开发人员工作当中只是在应用中使用redis,比如用来做数据结果的缓存。而且现在有很多不错的redis客户端工具(redisson),基本上可以不用关注redis命令就可以完成相当部分的功能。所以可能会对如下这些问题关注点不够:

  • 如何容灾?即某个redis节点出了问题如何保证服务的高可用性

  • 如何横向扩容?当数据量特别大时,如何解决单个redis的性能问题

  • 集群至少需要几台机器?或者几个redis节点

  • 集群搭建都利用什么技术,哪些工具?

如何容灾?

redis提供了主从热备机制,主服务器的数据同步到从服务器,通过哨兵实时监控主服务器状态并负责选举主服务器。当发现主服务器异常时根据一定的算法重新选举主服务器并将问题服务器从可用列表中去除,最后通知客户端。主从是一对多的树型结构,如下图:

哨兵

哨兵是sentinel的中文名称,是redis出的一个高可用架构的工具,自身是一个独立的进程,可以同时监控一个以上的redis集群。

哨兵集群

基于高可用的考虑,哨兵自身也是需要支持集群的,如果只有一个哨兵就会存在单点问题。

哨兵决策

哨兵有一个数量配置,当多少个哨兵同时认为某个主服务不可用时才进行主从切换,比如总共有5个哨兵,当3个哨兵认为服务不可用时才决定做主从切换。这么做可以避免一些误切换,降低切换成本,比如瞬时的网络异常等。

如何横向扩容?

无论是redis还是其它一些数据库之类的产品,当单节点的数据容量达到一定上限后,服务对外提供的能力会越来越弱。redis在高版本中提供了redis-trib.rb来实现集群功能,也可以使用第三方的工具twemproxy。

去中心化,每个节点都是平等的

redis集群从设计上没有考虑中心化,这样可以避免中心节点的单点等问题。每个节点都能掌握整个集群的状态,连接任意的节点都可以访问到所有的key,就像单节点的redis一样。

集群原理图

自己理解画的,如有理解不对的地方可以指出。

key与redis节点的关系

引入了hasy solt,中文理解为哈希槽。总共16384个,我们操作的key通过取模算法确认key落在哪个槽上。

HASH_SLOT = CRC16(key) mod 16384

哈希槽与节点之间有一定关系,所以我们就可以将key分配到某个具体的redis节点上了。

详细的关系可再研究,简单的比如节点A负责0-5000编号的哈希槽,节点B负责5001-1000

一步一步搭建

开始搭建三主三从的集群,系统是ubuntu,采用redis提供的集群工具redis-trib.rb。

  • 安装最新redis

  • 创建redis_cluster目录,并且创建7000到7005这6个目录

  • 将redis目录下的redis.conf复制到上面创建的6个目录中

  • 分别修改redis.conf文件,对6个文件做类似的修改。

port  7000                                       //端口7000
bind  127.0.0.1                                  //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip
daemonize    yes                                 //后台运行
pidfile  /var/run/redis_7000.pid                 //pidfile文件对应7000
cluster-enabled  yes                             //开启集群
cluster-config-file  nodes_7000.conf             //集群的配置
cluster-node-timeout  15000                      //请求超时  默认15秒,可自行设置

bind需要注意的就是需要配置为其它机器可以访问的ip,否则无论是创建集群还是客户端连接都会有问题。

  • 启动6个redis

redis-server redis_cluster/7000/redis.conf
redis-server redis_cluster/7001/redis.conf
redis-server redis_cluster/7002/redis.conf
redis-server redis_cluster/7003/redis.conf
redis-server redis_cluster/7004/redis.conf
redis-server redis_cluster/7005/redis.conf
  • 创建集群
    redis的src目录下有个redis-trib.rb,将它复制到/usr/local/bin中,然后执行如下脚本:

redis-trib.rb  create  --replicas  1  127.0.0.1:7000 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

--replicas后面的1代表从服务器的个数,上面可以理解为前面3个为主服务器,后面三个分别做为从服务器,即三对主从。

执行过程中会遇到提示需要安装ruby,安装完成之后又会提示安装 gem redis。

安装gem redis,折腾了好久,最终发现是因为在国内访问不了某些网站导致通过apt-get install安装不成功,最后通过下载源码的方式安装成功。

再次执行创建集群的脚本,出现如下提示:

输入yes,继续

最少需要多少个主服务器?
可能是基于某些约定,集群约定只有当可用节点数大于半数以上时才具备对外提供服务的能力。首先数量一定是奇数,其实必须大于1,所以最少的主服务器数量为3。

  • 测试集群
    连接客户端,由于我的所有节点都是在本地,所以不需要输入ip,但需要加-c的参数。

redis-cli -c -p 7000

连接成功后,增加一个key

set mykey 123

有一行提示语,指向到端口7002,这说明虽然我们连接的是7000的实例,但通过hash算法最终会将key分配到7002的实例上。

再连接7005端口查询下key,测试下是否任意一个实例都可以查询到key

get mykey

显示指向到端口7002

集群需要注意的地方

这块还未仔细研究,有些命令在集群下是不支持的,待后续求证。

引用

  • http://www.cnblogs.com/wuxl360/p/5920330.html

  • https://segmentfault.com/a/1190000002680804

  • http://blog.csdn.net/lifeiaidajia/article/details/45370377

总结

真实环境的部署与单机部署还是差异比较大的,但也不复杂,尽管部分开发人员可能一辈子都不会有机会在线上搭建redis集群,但了解redis的高可用可扩展的方案对设计大型系统还是有比较大的帮助的,也有助于分析解决线上问题。看了上面的这些,对于本文开头提到的问题就不难理解了。

相关文章:

原文地址:http://www.cnblogs.com/ASPNET2008/p/6400674.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

理解并从头搭建redis集群相关推荐

  1. Linux从头开始搭建Redis集群(三种方式)

    Linux搭建Redis集群 前言 一.下载Redis安装程序包 1.打开虚拟机终端,输入以下命令,下载对应的 Redis 文件 2.下载好之后,进行解压 3.将解压好的文件移动/复制到 /usr/l ...

  2. 云服务器搭建redis集群

    在搭建redis集群之前需要安装ruby.redis使用ruby来做集群的.用一个叫redis-trib.rb的ruby脚本.redis-trib.rb是redis官方推出的管理redis集群的工具, ...

  3. [转]redis 5.0.5 5分钟搭建redis集群

    环境:centos 7 1:下载并安装redis ​​​​​​​$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz$ tar xzf ...

  4. redis集群关闭 启动报错_使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能。...

    实操题目:使用虚拟机搭建 Redis 集群,实现数据库的负载均衡功能.并使用图文描述整个过程.先创建集群: ①创建集群需要使用ruby脚本,所以要先安装ruby环境 安装ruby环境:yum inst ...

  5. 在windows上搭建redis集群(主从复制)

    Redis集群策略主要有: 主从复制 哨兵模式 (在windows上搭建redis集群(Redis-Sentinel)) 集群 (在windows上搭建redis集群(Redis-Cluster)) ...

  6. 在windows上搭建redis集群(Redis-Sentinel)

    Redis集群策略主要有: 哨兵模式 主从复制(在windows上搭建redis集群(主从复制)) 集群 (在windows上搭建redis集群(Redis-Cluster)) 分片 本文主要讲解如何 ...

  7. 在windows上搭建redis集群(Redis-Cluster)

    Redis集群策略主要有: 集群 主从复制(在windows上搭建redis集群(主从复制)) 哨兵模式 (在windows上搭建redis集群(Redis-Sentinel)) 分片 本文主要讲解如 ...

  8. 手把手带你搭建redis集群

    redis-cluster是redis官方提供的分布式数据库解决方案,集群通过分片进行数据共享,并提供复制和故障转移功能. redis集群主要分为主节点和从节点.主节点用于处理槽,而从节点用于复制某个 ...

  9. docker搭建redis集群

    #!/bin/bash #Author: 臆想的一只猫 #Created: 2022-04-06 17:42:33 #Description: 搭建redis集群function menu() {cl ...

最新文章

  1. python编程小游戏-python趣味入门——写几个常玩的游戏
  2. c++中求解非线性方程组_齐次线性方程组的基础解系的简便算法
  3. [ECMAScript] 谈谈你对es6的module体系的理解
  4. Python程序员面试必备常用问题答案及解析
  5. 微信小程序订票选座PHP后台网站MySQL数据库和无前端小程序版本两个程序
  6. latex转为html效果好吗,latex2html
  7. python模块 - functools模块
  8. ubunut安装stlink
  9. git软件版本管理工具
  10. ORACLE SPA and RAT
  11. Python selenium练习:华为保修查询
  12. 使用scrapy刷博客访问量(傻瓜式)
  13. 使用js实现textarea文本域长度,限制输入字数并统计剩余输入字符数
  14. django MVT模式介绍
  15. mysql验证索引正确性_mysql索引测试
  16. Linux常用命令整理(适合初学)
  17. RESTful风格的SSM框架搭建
  18. oracle evaluate,ORACLE VERSIONS 用法 | 学步园
  19. 英语基础语法——五种基本句式
  20. 360是怎样盈利的(整理)

热门文章

  1. 0408~送给小伙伴的汉堡包
  2. ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)
  3. PHP excel文件导入至mysql中!
  4. ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本
  5. 6大奖项!首届 .NET 黑客松大赛圆满收官!
  6. 谈谈MySQL面试的45个常见问题
  7. Web通用令牌JwtBuilder
  8. 女神节爆猛料!. NET程序员男女比例公布!
  9. WPF 从 .net core 3.1 到 .net 5.0
  10. .NET Core 下使用 RabbitMQ