
每一个sentinel结点,各自保存自己的配置信息,这在搭建集群时,容易出现某一个sentinel结点配置和其它不一致而导致的诡异系统问题。
jedis pool在连接到sentinel列表后,会从第一个可用的sentinel结点获取redis集群的信息,来构建pool,这样就可能会导致构建异常。
目前手头上只有3台物理机, 所以采取每台服务器开启2台实例构建基础主从。
服务器:ubuntu 2004
redis:626
地址规划与结构图:
简单说明:
分别修改3台物理机的 /etc/hosts 文件,添加如下内容
在node1(192168100101)上进行 *** 作:
修改redis_6379配置: vim /opt/redis-cluster/redis_6379/conf/rediscnf
修改redis_6380配置: vim /opt/redis-cluster/redis_6380/conf/rediscnf , 将上边配置文件中的79替换为80即可。
在node2和node3做同样的 *** 作,或者直接吧node1上的redis-cluster目录拷贝到另外两台上
每个节点上执行以下2条命令进行服务启动:
集群模式启动,进程后会加上[cluster]的字样:
现在虽然说每个服务都成功启动了,但是彼此之间并没有任何联系。
所以下一步要做的就是将6个服务加入至一个集群中,如下 *** 作示例(在任意节点执行都行):
查看当前集群所有的节点:
6个服务之间并没有任何主从关系,所以现在进行主从配置,记录下上面cluster nodes命令输出的node-id信息,只记录主节点
首先是node1的6380,将它映射到node2的6379:
然后是node2的6380,将它映射到node3的6379:
最后是node3的6380,将它映射到node1的6379:
查看集群节点信息,
接下来我们要开始分配槽位了,为了考虑今后的写入 *** 作能分配均匀,槽位也要进行均匀分配。
仅在Master上进行分配,从库不进行分配,仅做主库的备份和读库使用。
槽位分配情况如下,槽位号从0开始,到16383结束,共16384个槽位,均匀分配:
开始分配:
检查槽位是否分配正确
使用以下命令检查集群状态是否ok,如果槽位全部分配完毕应该是ok,不然的话就检查你分配槽位时是否输错了数量:
一并对主从进行验证,这条数据是写入至了node3的Master中,我们登录node2的Slaver中进行查看:
模拟node1的6379下线宕机,此时应该由node3的6380接管它的工作
登录集群任意节点查看目前的集群节点信息:
重启node1的6379:
登录node1的6379,发现他已经自动的进行上线了,并且作为node3中6380的从库:
高性能计算机集群系统是一个是基于网络、面向科研的小型高性能并行计算系统,该系统通过一组松散集成的计算机软件和硬件高度紧密地协作完成计算工作。通过局域网连接集群系统中的单个计算机节点,使之同时完成同一个工作,以达到高工作效率、高计算速度和高可靠性能。
该系统的基础是主控节点、计算节点等硬件基础平台和互联系统,系统分层次设计,按照Intel的高性能计算生态系统部署,自上而下,按照“HPC并行应用程序→中间件集群管理和通信库以及各类软件优化工具→ *** 作系统→计算节点和主控节点的硬件平台→系统环境”的部署进行设计,包括散热、电源、空间布局等规范化的设计。
在阿里云Ubuntu新搭建的redis集群,始终无法连接,报Could not get a resource from the pool异常
查找资料发现是redist的一些限制,Protected mode is a layer of security protection, in order to avoid that
Redis instances left open on the internet are accessed and exploited 就是说出于安全考虑,redis的实例不能在网络上被访问,所以修改protected-mode就好了
所以将redisconf中的protected-mode yes改为protected-mode no
重启redis实例,以为问题就解决了?发现还是报Could not get a resource from the pool异常
这个是什么情况,要逆天嘛?
查看redis node信息看一下,终于发现了问题
怎么会有172的IP,到这里终于找到问题根源了,修改nodeconf配置,重启redis,问题终于解决。
创建目录,copy配置文件
如何安装Redis集群
修改配置文件
按照此方式修改7001~7005的配置文件,注意修改端口号。
如何安装Redis集群
启动各个实例
如何安装Redis集群
创建集群
现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
通过使用 Redis 集群命令行工具redis-trib,编写节点配置文件的工作可以非常容易地完成redis-trib位于Redis 源码的src文件夹中,它是一个 Ruby 程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分片(reshared)等工作。
我们需要执行以下命令来创建集群:
[root@localhost src]# /redis-tribrb create --replicas 1 127001:7000 127001:7001 127001:7002 127001:7003 127001:7004 127001:7005
/usr/bin/env: ruby: No such file or directory
如何安装Redis集群
系统中没有安装ruby,所以报上面的错误。
先安装ruby
[root@localhost yumreposd]# yum install ruby
[root@localhost yumreposd]# yum install rubygems
[root@localhost yumreposd]# gem install redis
Successfully installed redis-322
1 gem installed
Installing ri documentation for redis-322
Installing RDoc documentation for redis-322
如何安装Redis集群
再次创建集群
[root@localhost src]# /redis-tribrb create --replicas 1 127001:7000 127001:7001 127001:7002 127001:7003 127001:7004 127001:7005
Redis自动选择主从
如何安装Redis集群
连接集群
redis-cli 也可以作为集群的客户端工具,要想访问集群,只需连接任意一个redis实例即可。使用-c参数
[root@localhost bin]# /redis-cli -c -p 7000
总结
set 命令写数据,集群将数据写到7001实例上,当你使用get命令获取数据时,客户端即自动切换到7001端口。
redis-cli对集群的支持是非常基本的, 所以它总是依靠 Redis 集群节点来将它转向(redirect)至正确的节点。一个真正的(serious)集群客户端应该做得比这更好: 它应该用缓存记录起哈希槽与节点地址之间的映射(map), 从而直接将命令发送到正确的节点上面。
直接就一个连接失败
确认账号密码和端口没问题后,问题同事配置有没验证过,他说直接从网上 cv 的,完全没经过验证。坑啊!!!
把生产的配置和测试配置比较好,修改了几个地方
信心满满,重启启动 django shell 测试,结果还是连接不上!这时候心情开始有点糟糕~
冷静, django shell 不行,那用 python shell 直连试试?
一点毛病都没有,直接连上了!
一脸懵逼,这到底是啥问题啊!
结果依然是连接不上。
不知不觉已经到了晚上九点,好累,不想卷了。下班回家吧
回家路上整个脑子都被这个问题困扰着。难道密码中含有 @ 符号的 redis 集群,Django 真的连接不上?反复的问自己。
问了其他同事,生产环境是否有其他的 redis 集群可以用来调试。很遗憾,并没有。
要不,我自己创建一个 redis 集群,把密码设置成含有 @ 符号?
可是,自己本地创建 redis 集群好麻烦啊。要本地安装虚拟机,想到一堆配置就直接劝退。
洗完澡,和老婆聊了 1h 左右的视频。已经到 11 点多,准备睡觉?
那是不可能的,带着问题是很难入睡!哎,这个是老毛病了。
突然想到了一个点,最小试错原则。自己搭建本地集群很麻烦,公司又没有多余的集群。
那直接买一个云版的 redis 集群?说干就干,直接从床上起来,打开电脑。
这时问题又来了,阿里云还是腾讯云?
鉴于双 11 买了腾讯云 2c 4g 8m 的服务器,只要 199 就能 3 年。
再对比之前买阿里云那个 1c 2g 1m 服务器,3 年也要 100 多。
瞬间对腾讯云好感倍增,决定先买腾讯云。
一顿 *** 作,发现腾讯云是真的难用:
最最最重要,给把实例绑定了安全组后,外网还是无法访问???(不管了,反正我就是很生气)
对腾讯云太失望了,不得不把最后一根稻草压在阿里云身上。
所幸,阿里云没有让我失望!
咔咔咔,一顿 *** 作:
密码中含有 @ 符号,但连接一点毛病都没有!!!
至此,问题终于解决了!!!
我已经迫不及待明天去公司验证,但回过头一看,已经是深夜一点半。
自言自语的说了一句:"睡吧,卷王"
经过对比,发现配置只需要生产的配置仅需要在测试的配置上加多一个 :
修复最磨人的 bug,往往仅需要一点小小的改动~
为什么测试环境没报错了呢???
因为测试环境的 redis 集群不需要密码
先如今我们想要自己搭建一套多redis节点/实例的集群,实现一套无主模型的集群
Redis 集群的数据分片
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
我们先去到存放redi源码目录下,打开utils目录,会发现里面有个create-cluster文件夹,进入这个文件夹,会发现有如下两个文件:
我们先打开README文件看看里面是写了什么?
我们再来看看creat-cluster这个脚本文件里面装着什么药?
我们分析一下最前面的内容:
我们先把redis运行起来,执行以下指令后,会发现有启动了6个端口,代表着启动了6台redis
我们再这6台redis,进行搭建集群,“分赃”(是指分给每个master给一些槽位),执行以下指令后,会发现其中的30005跟随30001,其中的30006跟随30002,其中的30004跟随30003
我们看到,这个redis cluster为其中的3个master准备了一些槽位:
这个时候我们尝试连接其中一个master,随便哪个,我这里连接的是30001端口,然后做了一些 *** 作,你会发现下面的中,有两句指令是报错的,只有第一句指令是返回OK的,是什么原因呢?
redis-cli -p 30001
使用以下指令就可以重定向到对应映射值的端口上
我们尝试一下能不能使用事务,如下图,我们开启事务后,中间是有几次经过hash算法之后重定向到其他端口上面的,到最后我们执行exec之后报错。是因为我们在30001上开启的事务,由于hash值映射我们重定向到其他端口上了,其他端口并没有开启事务,所以报错!
我们可以将某些类似于相同hash值的key放在一块执行,这样就可以避免重定向,从而实现事务 *** 作
接下来我们换一种方式来进行实现redis cluster,用原始的命令来实现。我们先把启动的redis关掉,并把持久化文件删除,然后再启动
使用redis原生命令来启动,我们先查询help
输入指令原生指令,启动redis cluster,启动成功,和刚才的一模一样
我们再尝试连接客户端,进行一些 *** 作,和我们用脚本启动一模一样
解下来我们再了解一些reshard这个指令,给数据从新分片
输入指令后,redis会提示我们要移出多少个槽位,我们随便填个3000,然后回车
接下来,将接收方的节点id输入进去,目的是要把这3000个槽位移动给接收方
注意我们这里提示错误,原因是我们移动给了一个不是master的节点
我们给一个master的节点id重来一遍,接着要我们提供槽位来源,可以选一个或者多个槽位来源,比如我们要把3000个槽位移动给30002端口,我们可以从30001上移动也可以从30003上移动,我们直接在30001上移过来
输入yes回车
等待一会,我们看到3000个节点,从30001移动到30002端口上面了
我们可以查看槽位分布情况
原先是分布比较平均,都是5461个槽位,而我们从30001移动3000个到30002,发现原来的30001的只剩下2461个槽位的确少了3000个,并且30002的现在由8462个槽位多了3000个槽位!
种种现象我们看到,这完全就符合我们开头说的,用数据哈希槽的方式去分片数据,也就redis内部实现的预分区
以上就是关于linux rediscluster怎么连全部的内容,包括:linux rediscluster怎么连、redis cluster 集群搭建、Redis集群方案应该怎么做_redis集群搭建方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)