redis-cluster和redis是一个东西么
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis-cluster和redis是一个东西么相关的知识,希望对你有一定的参考价值。
1.Redis Cluster总览1.1 设计原则和初衷
在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子。最核心的目标有三个:
性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。
水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。
可用性:在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自动Failover能力。
1.2 架构变化与CAP理论
Redis Cluster集群功能推出已经有一段时间了。在单机版的Redis中,每个Master之间是没有任何通信的,所以我们一般在Jedis客户端或者Codis这样的代理中做Pre-sharding。按照CAP理论来说,单机版的Redis属于保证CP(Consistency & Partition-Tolerancy)而牺牲A(Availability),也就说Redis能够保证所有用户看到相同的数据(一致性,因为Redis不自动冗余数据)和网络通信出问题时,暂时隔离开的子系统能继续运行(分区容忍性,因为Master之间没有直接关系,不需要通信),但是不保证某些结点故障时,所有请求都能被响应(可用性,某个Master结点挂了的话,那么它上面分片的数据就无法访问了)。
有了Cluster功能后,Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP模型也从CP变成了AP。也就是说,通过自动分片和冗余数据,Redis具有了真正的分布式能力,某个结点挂了的话,因为数据在其他结点上有备份,所以其他结点顶上来就可以继续提供服务,保证了Availability。然而,也正因为这一点,Redis无法保证曾经的强一致性了。这也是CAP理论要求的,三者只能取其二。
关于CAP理论的通俗讲解,请参考我的译文《可能是CAP理论的最好解释 》。简单分析了Redis在架构上的变化后,咱们就一起来体验一下Redis Cluster功能吧!
2.Redis集群初探
Redis的安装很简单,以前已经介绍过,就不详细说了。关于Redis Cluster的基础知识之前也有过整理,请参考《Redis集群功能预览》。如果需要全面的了解,那一定要看官方文档Cluster Tutorial,只看这一个就够了!
2.1 集群配置
要想开启Redis Cluster模式,有几项配置是必须的。此外为了方便使用和后续的测试,我还额外做了一些配置:
绑定地址:bind 192.168.XXX.XXX。不能绑定到127.0.0.1或localhost,否则指导客户端重定向时会报”Connection refused”的错误。
开启Cluster:cluster-enabled yes
集群配置文件:cluster-config-file nodes-7000.conf。这个配置文件不是要我们去配的,而是Redis运行时保存配置的文件,所以我们也不可以修改这个文件。
集群超时时间:cluster-node-timeout 15000。结点超时多久则认为它宕机了。
槽是否全覆盖:cluster-require-full-coverage no。默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
后台运行:daemonize yes
输出日志:logfile “./redis.log”
监听端口:port 7000
配置好后,根据我们的集群规模,拷贝出来几份同样的配置文件,唯一不同的就是监听端口,可以依次改为7001、7002… 因为Redis Cluster如果数据冗余是1的话,至少要3个Master和3个Slave,所以我们拷贝出6个实例的配置文件。为了避免相互影响,为6个实例的配置文件建立独立的文件夹。
[root@8gVm redis-3.0.4]# pwd
/root/Software/redis-3.0.4
[root@8gVm redis-3.0.4]# tree -I "*log|nodes*" cfg-cluster/
cfg-cluster/
├── 7000
│ └── redis.conf.7000
├── 7001
│ └── redis.conf.7001
├── 7002
│ └── redis.conf.7002
├── 7003
│ └── redis.conf.7003
├── 7004
│ └── redis.conf.7004
└── 7005
└── redis.conf.7005
6 directories, 6 files
2.2 redis-trib管理器
Redis作者应该是个Ruby爱好者,Ruby客户端就是他开发的。这次集群的管理功能没有嵌入到Redis代码中,于是作者又顺手写了个叫做redis-trib的管理脚本。redis-trib依赖Ruby和RubyGems,以及redis扩展。可以先用which命令查看是否已安装ruby和rubygems,用gem list –local查看本地是否已安装redis扩展。
最简便的方法就是用apt或yum包管理器安装RubyGems后执行gem install redis。如果网络或环境受限的话,可以手动安装RubyGems和redis扩展(国外链接可能无法下载,可以从CSDN下载):
[root@8gVm Software]# wget https://github.com/rubygems/rubygems/releases/download/v2.2.3/rubygems-2.2.3.tgz
[root@8gVm Software]# tar xzvf rubygems-2.2.3.tgz
[root@8gVm Software]# cd rubygems-2.2.3
[root@8gVm rubygems-2.2.3]# ruby setup.rb --no-rdoc --no-ri
[root@8gVm Software]# wget https://rubygems.org/downloads/redis-3.2.1.gem
[root@8gVm Software]# gem install redis-3.2.1.gem --local --no-rdoc --no-ri
Successfully installed redis-3.2.1
1 gem installed
2.3 集群建立
首先,启动我们配置好的6个Redis实例。
[root@8gVm redis-3.0.4]# for ((i=0; i<6; ++i))
> do
> cd cfg-cluster/700$i && ../../src/redis-server redis.conf.700$i && cd -
> done
此时6个实例还没有形成集群,现在用redis-trb.rb管理脚本建立起集群。可以看到,redis-trib默认用前3个实例作为Master,后3个作为Slave。因为Redis基于Master-Slave做数据备份,而非像Cassandra或Hazelcast一样不区分结点角色,自动复制并分配Slot的位置到各个结点。
[root@8gVm redis-3.0.4]# src/redis-trib.rb create --replicas 1 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005
>>> Creating cluster
Connecting to node 192.168.1.100:7000: OK
Connecting to node 192.168.1.100:7001: OK
Connecting to node 192.168.1.100:7002: OK
Connecting to node 192.168.1.100:7003: OK
Connecting to node 192.168.1.100:7004: OK
Connecting to node 192.168.1.100:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.100:7000
192.168.1.100:7001
192.168.1.100:7002
Adding replica 192.168.1.100:7003 to 192.168.1.100:7000
Adding replica 192.168.1.100:7004 to 192.168.1.100:7001
Adding replica 192.168.1.100:7005 to 192.168.1.100:7002
...
Can I set the above configuration? (type \'yes\' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.1.100:7000)
...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
至此,集群就已经建立成功了!“贴心”的Redis还在utils/create-cluster下提供了一个create-cluster脚本,能够创建出一个集群,类似我们上面建立起的3主3从的集群。 参考技术A 你问这问题证明你还没入门...
虚拟机搭建redis单机版及redis-cluster,使用redis desktop manager和java(eclipse)连接redis过程遇到问题汇总
如果你看到这里,我默认你已经安装好了redis,并且已经成功的在虚拟机的Linux系统中ping通。
介绍一下我的环境:VMware虚拟机安装centos 6.5版的Linux系统,redis是3.0.0. 主机是win10,使用的redis desktop manager是一个很古老的版本0.7.9.809,确实十分古老。但是博主只是为了测试是否能连接,因此各位不要纠结这个问题。JAVA IDE是eclipse mars。
好了,在虚拟机中已经可以成功Ping通,如下图
现在进入正题!!!!!
我真的是太气愤了!!!网上虽然确实有一大堆人出谋划策,帮助大家解决学习过程中遇到的Bug。但是!!!能不能不要千篇一律复制粘贴!!对自己写的东西负责好吗!!!
从头到尾,我看了百来篇技术博客、文档,都是说bind 127.0.0.1注释掉(确实需要),受保护模式改为no设置密码主机和虚拟机ip要在同一网段等(根本不需要)...还有要不就是贴一堆failure trace代码!!连那种没有用的代码问问题的时候都要粘上来,谁有那个心情看啊!!!
请务必答应我错误代码放精华部分就行了好吗!!!
好吧,上面是牢骚,接下来才是正题!!
如果你已经用完了上述所有方法还是无法解决redis desktop manager无法连接虚拟机中的redis时,罪魁祸首一定是你的虚拟机防火墙。
最好的测试是不是虚拟机中的linux系统的防火墙在捣鬼的办法如下:
打开你windos系统的cmd,敲 telnet linux系统ip 端口号,如:telnet 192.168.18.133 6379
(linux系统的Ip应该都知道咋看吧,敲ifconfig取第一个出现的Ip地址就行了)
如果提示telnet不是内部外部指令啥的,打开控制面板,依次点击下图中矩形框中的东西
请务必在系统提示你重启的时候果断重启!!!!请务必在系统提示你重启的时候果断重启!!!!请务必在系统提示你重启的时候果断重启!!!!
网上说打开telnet客户端不用重启的是win7系统,win10比win7傲娇啊!!不重启就不让你的选择生效!楼主在这里也走了弯路,一把辛酸泪。
设置完了,重启之后,你的所有程序都关闭了吧。这个时候就请你不厌其烦的,打开你的vmware,再开启你的centos,再启动你的redis,再测试一下能否在centos中ping通。也就是...回到最初的样子。
弄完之后,进入windows 的cmd界面,敲telnet linux系统ip 端口号,如果迅速出现一片漆黑,那你可以关掉网页了....因为本篇博客帮不了你。
如果出现(当然我输6380是为了截图失败的结果,你应该输的估计是6379)
那就说明的确是你的centos的防火墙在整幺蛾子!不听话!先把它关小黑屋呆一会儿!让它心甘情愿开放你需要的端口,再打开它。
依次敲击如下代码:
/etc/init.d/iptables stop
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/init.d/iptables save
service iptables restart
敲击完了之后,可以查看一下是否开放成功,检查状态的代码:/etc/init.d/iptables status
如果开放成功应该是这样的:
你们关注6379就是了,其它的端口是我redis-cluster用的,开启的方法都一样,在用eclipse连集群失败的时候也是因为端口没有开,错误代码是:
(单机版的错误代码)redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
(集群版的错误代码)redis.clients.jedis.exceptions.JedisConnectionException: no reachable node in cluster
开启端口之后,再用telnet指令检查一下能否连接。如果还是不能连接,就再关一下防火墙,再开一下防火墙。反正我是这么解决的....如果你这么做了还没有解决的话,就各种重启一下试试吧...反正你也找不到别的解决办法,还不如用网管的万能法则——重启。
幸运的话,你也出现一片漆黑了,再用redis desktop manager测试一下是否能连接成功。
如果成功的话,反应是很快的,如果你点TESTCONNECTION很久都没反应,估计又失败了。很抱歉,恕在下才疏学浅,帮不上忙....祝你好运!
以上是关于redis-cluster和redis是一个东西么的主要内容,如果未能解决你的问题,请参考以下文章