<small id='a7zJQEIclo'></small> <noframes id='3pBfNtJP'>

  • <tfoot id='WtXR3a2l'></tfoot>

      <legend id='36mR9'><style id='gvbf0i1E6'><dir id='yLH4ci'><q id='JQtZcR'></q></dir></style></legend>
      <i id='oBthl3k'><tr id='tU73Y'><dt id='BKncIf'><q id='yFdD'><span id='J2htsz'><b id='M0VZtXoQ'><form id='MyrhK51uFm'><ins id='sUqJo0V'></ins><ul id='4DYjnCI'></ul><sub id='8ixuMGwS'></sub></form><legend id='OEySHgrRBF'></legend><bdo id='Q6bUs7p4XJ'><pre id='7tkXS86'><center id='QlVx'></center></pre></bdo></b><th id='1Qfj'></th></span></q></dt></tr></i><div id='WZXIQ5a'><tfoot id='1DVZB'></tfoot><dl id='3sDvfLW1ZB'><fieldset id='pH8mrhVknt'></fieldset></dl></div>

          <bdo id='a9uh3TSB6'></bdo><ul id='WqLI6'></ul>

          1. <li id='R5ESt'></li>
            登陆

            章鱼彩票电脑-Redis 集群

            admin 2019-09-07 195人围观 ,发现0个评论

            1 redis集群简介:

            1.1 集群的概念

            所谓的集群,便是经过增加服务器的数量,供给相同的服务,然后让服务器到达一个安稳、高效的状况(高可用)。

            1.2 运用redis集群的必要性

            问题:咱们现已布置好了redis,并且能发动一个redis,完结数据的读写,为什么还要学习redis集群?

            1. 单个redis存在不安稳性。当redis服务宕机了,就没有可用的服务了。
            2. 单个redis的读写才干是有限的。

            redis集群是为了强化redis的读写才干。

            1.3 怎么学习redis集群

            1. redis集群中,每一个redis称之为一个节点。
            2. redis集群中,有两种类型的节点:主节点(master)、从节点(slave)。
            3. redis集群,是依据redis主从仿制完结。

            所以,学习redis集群,便是从学习redis主从仿制模型开端的。

            2 redis主从仿制

            2.1 概念

            主从仿制模型中,有多个redis节点。其间,有且仅有一个为主节点Master。从节点Slave能够有多个。只需网络衔接正常,Master会一向将自己的数据更新同步给Slaves,坚持主从同步。

            2.2 特色

            1. 主节点Master可读、可写
            2. 从节点Slave只读。(read-only)

            因而,主从模型能够进步读的才干,在必定程度上缓解了写的才干。因为能写依然只要Master节点一个,能够将读的操作悉数移交到从节点上,变相进步了写才干。

            2.3 依据装备完结

            2.3.1 需求

            2.3.2 装备进程

            1. 在 /usr/local 目录下,创立一个 /redis/master-slave 目录
            2. 在 master-slave 目录下,创立三个子目录 6380、6381、6382
            3. 顺次仿制redis解压目录下的 redis.conf 装备文件,到这三个子目录中
            4. 进入 6380 (master) 目录,修正 redis.conf ,将 port 端口修正成 6380 即可
            5. 进入 6381 (slave) 和 6382 目录,别离修正 redis.conf,将 port 端口改成 6381、6382,一起指定敞开主从仿制。

            2.3.3 测验

            顺次发动主从节点,主节点的日志中会显现从节点的连入。经测验能够看到,主节点能够读写,从节点默许只能读不能写。

            3 Sentinel岗兵形式

            3.1 主从形式的缺点

            当主节点宕机了,整个集群就没有可写的节点了。因为从节点上备份了主节点的一切数据,那在主节点宕机的状况下,假如能够将从节点变成一个主节点,是不是就能够处理这个问题了呢?是的,这个便是Sentinel岗兵的效果。

            3.2 岗兵的使命

            Redis 的 Sentinel 体系用于办理多个 Redis 服务器(instance), 该体系履行以下三个使命:

            • 监控(Monitoring): Sentinel 会不断地查看你的主服务器和从服务器是否运作正常。
            • 提示(Notification): 当被监控的某个 Redis 服务器出现问题时, 舌苔Sentinel 能够经过 API 向办理员或许其他应用程序发送告诉。
            • 主动毛病搬迁(Automatic failover): 当一个主服务器不能正常作业时, Sentinel 会开端一次主动毛病搬迁操作, 它会进行推举,将其间一个从服务器晋级为新的主服务器, 并让失效主服务器的其他从服务器改为仿制新的主服务器; 当客户端企图衔接失效的主服务器时, 集群也会向客户端回来新主服务器的地址, 使得集群能够运用新主服务器替代失效服务器。

            3.2.1 监控(Monitoring)

            1. Sentinel能够监控恣意多个Master和该Master下的Slaves。(即多个主从形式)
            2. 同一个岗兵下的、不同主从模型,相互之间相互独立。
            3. Sentinel会不断查看Master和Slaves是否正常。

            3.2.2 主动毛病切换(Automatic failover)

            3.2.2.1 Sentinel网络

            监控同一个Master的Sentinel会主动衔接,组成一个散布式的Sentinel网络,相互通讯并交流相互关于被监督服务器的信息。下图中,三个监控s1的Sentinel,主动组成Sentinel网络结构。

            3.2.2.2 毛病切换的进程

            1. 投票(对折准则):当任何一个Sentinel发现被监控的Master下线时,会告诉其它的Sentinel开会,投票确认该Master是否下线(对折以上,所以sentinel一般配奇数个)。
            2. 推举:当Sentinel确认Master下线后,会在一切的Slaves中,推举一个新的节点,晋级成Master节点。其它Slaves节点,转为该节点的从节点。
            3. 当原Master节点从头上线后,主动转为当时Master节点的从节点。

            3.3 岗兵形式布置

            3.3.1 需求

            条件:现已存在一个正在运转的主从形式。

            装备三个Sentinel实例,监控同一个Master节点。

            3.3.2 装备Sentinel

            1. 在 /usr/local 目录下,创立 /redis/sentinels/ 目录
            2. 在 /sentinels 目录下,以次创立 s1、s2、s3 三个子目录
            3. 顺次仿制 redis 解压目录下的 sentinel.conf 文件,到这三个子目录中
            4. 顺次修正s1、s2、s3子目录中的 sentinel.conf 文件,修正端口,并指定要监控的主节点。(从节点不需求指定,sentinel会主动识别)

            顺次发动三个岗兵后,能够看到日志输出

            3.3.3 测验

            1. 手动封闭 6380 节点后,发现从头指定新主节点,并将别的两个节点作为从节点参加

            1. 再次上线 6380,发现被指定为从节点,只能读不能写

            4 Redis-cluster集群

            4.1 岗兵形式的缺点

            在岗兵形式中,依然只要一个Master节点。当并发写恳求较大时,岗兵形式并不能缓解写压力。咱们知道只要主节点才具有写才干,那假如在一个集群中,能够装备多个主节点,是不是就能够缓解写压力了呢?是的。这个便是redis-cluster集群形式。

            4.2 Redis-cluster集群概念

            1. 由多个Redis服务器组成的散布式网络服务集群;
            2. 集群之中有多个Master主节点,每一个主节点都可读可写;
            3. 节点之间会相互通讯,两两相连;
            4. Redis集群无中心节点。

            4.3 集群节点仿制

            在Redis-Cluster集群中,能够给每一个主节点增加从节点,主节点和从节点直接遵从主从模型的特性。当用户需求处理更多读恳求的时分,增加从节点能够扩展体系的读功用。

            4.4 毛病搬运

            Redis集群的主节点内置了相似Redis Sentinel的节点毛病检测和主动毛病搬运功用,当集群中的某个主节点下线时,集群中的其他在线主节点会留意到这一点,并对已下线的主节点进行毛病搬运。

            集群进行毛病搬运的办法和Redis Sentin章鱼彩票电脑-Redis 集群el进行毛病搬运的办法根本相同,不同的是,在集群里边,毛病搬运是由集群中其他在线的主节点担任进行的,所以集群不用别的运用Redis Sentinel。

            4.5 集群分片战略

            Redis-cluster分片战略,是用来处理key存储方位的。

            集群将整个数据库分为16384个槽位slot,一切key-value数据都存储在这些slot中的某一个上。一个slot槽位能够寄存多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其间 crc16 为 16 位的循环冗余校验和函数。

            集群中的每个主节点都能够处理0个至16383个槽,当16384个槽都有某个节点在担任处理时,集群进入上线状况,并开端处理客户端发送的数据指令恳求。

            4.6 集群redirect转向

            因为Redis集群无中心节点,恳求会随机发给恣意主节点;主节点只会处理自己担任槽位的指令恳求,其它槽位的指令恳求,该主节点会回来客户端一个转向过错;客户端依据过错中包括的地址和端口从头向正确的担任的主节点建议指令恳求。

            4.7 集群建立

            4.7.1 准备作业

            装置ruby环境

            redis 集群办理东西 redis-trib.rb 依靠 ruby 环境,首要需求装置 ruby 环境:

            yum -y install ruby
            yum -y install rubygems

            装置ruby和redis的接口程序

            仿制redis-3.0.0.gem至/usr/local下,履行装置:

            gem install /usr/local/redis-3.0.0.gem

            或许直接用 gem 在线装置章鱼彩票电脑-Redis 集群

            gem install reids

            redis-trib.rb 东西

            官方章鱼彩票电脑-Redis 集群供给了此东西用于挂历 redis 集群,该东西就在解压目录的 src 目录下

            4.7.2 集群规划

            Redis集群最少需求6个节点,能够散布在一台或许多台主机上。以下测验为在一台主机上创立伪散布式集群,不同的端口表明不同的redis节点,如下:

            • 主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003
            • 从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

            在 /usr/local/redis 下创立 redis-cluster 目录,其下创立7001、7002...7006目录,仿制 redis.conf 装备文件到每个文件夹,并装备

            # 必选装备
            port 700X
            bind 192.168.X.X
            cluster-enabled yes
            # 可选装备
            daemonized yes
            logfile /usr/local/redis/redis-cluster/700X/node.log

            4.7.3 发动每个结点redis服务

            顺次以700X下的redis.conf,发动redis节点。(有必要指定redis.conf文件)

            留意,需求别离进入各个文件夹发动,否则会报 cluster config file 现已被运用的过错

            4.7.4 履行创立集群指令

            进入到 redis 源码寄存目录 src 目录下,履行redis-trib.rb,此脚本是ruby脚本,它依靠ruby环境。

            ./redis-trib.rb create --replicas 1 192.168.163.88:7001 192.168.163.88:7002 192.168.163.88:7003 192.168.163.88:7004 192.168.163.88:7005 192.168.163.88:700章鱼彩票电脑-Redis 集群6

            这儿发现,最新版 redis 现已撤销对 redis-trib.rb 的支撑,选用示例办法创立集群

            新版本的指令大全

            4.7.5 查询集群信息

            集群创立成功登陆恣意redis结点查询集群中的节点状况。

            • -c:表明以集群方法衔接redis
            • -h:指定host ip地址
            • -p:指定端口号
            • cluster nodes:查询集群结点信息
            • cluster info:查询集群状况信

            4.8 集群办理

            4.8.1 增加主节点

            4.8.1.1 节点规划

            集群创立成功后能够向集群中增加节点,下面是增加一个master主节点,增加7007节点。

            装备和发动新节点的进程略

            履行下边指令增加节点(第一个地址为新节点,第二个地址为 cluster 集群中的恣意一个节点地址):

            ./redis-章鱼彩票电脑-Redis 集群trib.rb add-node 192.168.23.3:7007 192.168.23.3:7001 //已过期
            redis-cli --cluster add-node 192.168.163.88:7007 192.168.163.88:7002

            运转 redis-cli --cluster check 192.168.163.88:7001 查看状况,发现新节点作为主节点参加,但没有 slot 分配给它。

            4.8.1.2 slot槽从头分配

            增加完新的主节点后,需求对主节点进行slot槽分配,这样该主节才干够存储数据。

            第一步:衔接上集群

            衔接集群中恣意一个可用节点都行

            redis-cli --cluster reshard 192.168.163.88:7001

            第二步:输入要分配的槽数量

            输入 500表明要分配500个槽

            第三步:输入接纳槽的结点id

            这儿输入的是新参加的节点 7007

            第四步:输入源结点id

            这儿我挑选从 7001 作为源节点获取 500 个 slot,也能够输入 all 表明从一切主节点中均匀获取。能够输入多个源节点,输入done 表明输入完毕。

            第五步:查看成果

            假如仅仅从一个源里搬运,能够运用一句句子完结操作

            redis-cli --cluster reshard 192.168.163.88:7001 --cluster-from 95252ffbf34bb114b859ed7da8a312e28347d5c1 --cluster-to e272188208df章鱼彩票电脑-Redis 集群9d9080d41a89a0fffd49e503879c --cluster-slots 500

            4.8.2 增加从节点

            为新增的主节点增加从节点,将 7008 作为 7007 的从节点。

            redis-cli --cluster add-node 192.168.163.88:7008 192.168.163.88:7001 --cluster-slave --cluster-master-id e272188208df9d9080d41a89a0fffd49e503879c

            若不指定 --cluster-master-id 一起声明晰 --cluster-slave,则默许会增加为第二个地址的从节点

            若 7008 下面已有 nodes.conf ,增加时可能会报错, 处理办法是删去该文件后再增加

            4.8.3 删去节点

            运用指令

            redis-cli --cluster del-node 192.168.163.88:7001 d5d9af031a714c4fe334e8950de46add16c0e6df

            第一个地址为 cluster 任一节点, 后边 id 为需求删去的节点 id

            需求留意的是,若删去的节点为主节点,需求将其所具有的 slot 分配出去后才干删去,否则会报如下过错

            将 7007 的 slot 搬运回 7001 后删去

            5 java程序衔接redis集群

            5.1 衔接进程

            5.1.1 第一步:创立项目,导入jar包

            5.1.2 第二步:创立redis集群的客户端

            import org.junit.Test;
            import redis.clients.jedis.HostAndPort;
            import redis.clients.jedis.Jedis;
            import redis.clients.jedis.JedisCluster;
            import java.util.HashSet;
            import java.util.Set;
            public class ClusterTest {
            @Test
            public void ClusterConnectionTest() {
            //创立 set 调集封装一切节点信息
            Set nodes = new HashSet<>();
            //只需求增加一个节点即可,会主动查找其它节点
            nodes.add(new HostAndPort("192.168.163.88", 7001));
            /*nodes.add(new HostAndPort("192.168.163.88", 7002));
            nodes.add(new HostAndPort("192.168.163.88", 7003));
            nodes.add(new HostAndPort("192.168.163.88", 7004));
            nodes.add(new HostAndPort("192.168.163.88", 7005));
            nodes.add(new HostAndPort("192.168.163.88", 7006));*/
            //运用节点创立一个 JedisCluster 目标
            JedisCluster jedisCluster = new JedisCluster(nodes);
            //测验衔接成果
            System.out.println(jedisCluster.get("wtf"));
            }
            @Test
            public void RedisConnectionTest(){
            Jedis jedis = new Jedis("192.168.163.88", 7001);
            System.out.println(jedis.ping());
            String hello = jedis.get("hello"); //hello 存在 7001
            System.out.println(hello);
            //选用一般方法衔接,若数据不是存在此节点,会报错
            /*String wtf = jedis.get("wtf"); //wtf 存在 7002
            System.out.println(wtf);*/
            }
            }

            5.2 留意事项

            衔接Redis集群时,需求修正防火墙,开方每一个redis节点的端口。

            阐明:假如要开发一个规模的端口,能够运用冒号来切割,即: 7001:7008,表明开发7001-7008之间一切的端口,或许运用 setup 东西设置

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP