redis进化五(1):redis集群的安装使用(redis-cluster) 及其 原理

版权声明:write by DGHxj https://blog.csdn.net/DGHxj_/article/details/83901439

集群结构

      

特点

      1、所有redis节点(包括主和从)彼此互联(两两通信),底层使用内部的二进制传输协议,优化传输速度;

           (所有功能特点的基础)

      2、集群中也有主从,也有高可用逻辑,但是没有哨兵进程,整合到主节点的功能里了;

           集群中的事件被主节点(大部分主节点),通过主节点的过半选举实现哨兵以前的逻辑

      3、客户端与redis-cluster连接,无需关心分片的计算,客户端不再关心分片的计算逻辑,

            内部分发分布式数据(内部有分片计算逻辑),客户端将key交给redis节点后,

            集群内部判断key值的正确存储位置,转发存储。

      4、redis-cluster把所有的主节点对应到[0-16383]整数区间--槽道slot;

            各自的主节点维护一批槽道号(0-5000,5001-10000,10001-16383);

            在分片计算时,对key值做hash取模运算(就是取余,不再使用hashCode,CRC16);

            key值对应的取模运算结果,将会判断由哪个节点维护;

            将key--slot--node,如果我们想要迁移某个key值,必须将对应的slot一并迁移;

  核心概念操作的工作原理

      存储获取值时的转发逻辑

      

      槽道迁移,数据key迁移

      

      槽道原理抛2个问题:

            1、节点接收数据计算槽道号后,如何判断当前槽道号是否归我管?

            2、判断不贵本节点管理时,如何获取正确管理者信息

Redis集群的安装和使用

      集群环境安装

      1、安装ruby

            因为集群命令文件需要ruby语言支持

            a、wget到包后解压

                  在linux中调用wget命令 去网上找源站路径 复制粘贴源站地址在里面可以获取tar包

                  解压tar包并进入解压目录。

            b、./configure 在当前根目录执行编译;

                  编译安装:make && make install    

            c、yum安装gems

                 #yum -y install  rubygems   //rubygems是什么?

                 RubyGems(简称gems)是一个对Ruby组件进行打包的Ruby打包系统。

                 它提供一个分发Ruby程序和库的标准格式,还提供一个管理程序包安装的工具。

                 简单理解就是ruby运行时,需要各种插件都在gems里;

                 是一种技术支持。

            d、gem安装redis 接口包 gem install redis

      2、安装redis

            上传redis包,必须是3.0以上版本

            解压编译安装

            make  && make install

      redis-cluster的具体测试

          创建节点

                创建集群节点,不同的节点创建对应的目录管理配置文件

                例如: 占用8000端口的redis服务,对应redis.conf放到8000的文件夹;

                这里我们以节点端口名称为名称,本次创建6个节点的集群目录

                # mkdir 8000 8001 8002 8003 8004 8005

                

 

                # ll

                查看当前所在目录下的所有内容的详细信息,与ls类似

                

 

                准备8000-8005启动的redis配置文件,各自的配置文件放到对应的文件夹下

                配置文件修改并且上传到指定目录

                P61  bind 127.0.0.1//默认ip为127.0.0.1改为其他节点机器可访问的ip

                注释掉bind;可以监听连接当前服务的所有-h 后的ip;例如;绑定了127.0.0.1,但是登录时使用-h 10.9.17.153

                P80        protected-mode no        //yes修改为no

                yes表示开启,保护模式下,连接redis服务需要用到密码;no表示不开启,redis-cli登录时,不需要提供安全信息,例如密码;

                P84        port 8000                 //端口8000-8005

                P128    daemonize yes             //后台运行

                P150    pidfile /var/run/redis_8000.pid //pidfile文件对应7000

                当大量的进程启动后,很难通过ps -ef|grep redis直接寻找你需要操作的进程的pid

                P163    logfile 8000/redis.log    //相对路径,启动时在redis的根目录

                log文件记录的内容,就是在启动时,控制台打印的内容,和后续操作redis时所有的日志信息;

                P237    dump dump8000.rdb //指定当前服务加载的持久化文件

                P593    appendonly yes            //默认是rdb方式持久化要改成

                P597      appendfilename "appendonly.aof" 指定一个aof格式的持久化文件

                AOF模式;

                rdb持久化;和aof持久化模式对比

                rdb:需要客户端必须调用命令 save完成数据从内存保存到磁盘的操作;没有来得及save的数据一旦丢失,数据出现未命中;

                aof:二进制的日志,实时记录 redis客户端操作的所有写命令;没有来得及save的数据不保存在dump里,

                但是命令内容,保存在了aof文件;恢复时,只需要将每save的所有内容的命令调出来,

                小量数据的性能对比: 开启aof模式,比rdb单独使用,多消耗2倍时间

                海量数据:同时开启aof和rdb,单独开启rdb 消耗近似;

                

                P721    cluster-enabled yes     //加载当前配置文件的redis服务一旦启动需要开启集群模式,否则无法使用集群的各种策略和逻辑

                P729    cluster-config-file nodes_8000.conf         //集群配置启动后,将会创建这个nodes文件,

                记录当前服务器上唯一的一个集群状态;例如,搭建了8000-8005这样一个集群,

                操作失误下,集群失效,重新搭建集群,当前服务器读取这个配置文件会发现,

                槽道已经被一个集群分配了,新的集群搭建失败;

                P735    cluster-node-timeout 15000     //请求超时 默认15秒,可自行设置

 

                利用vim的替换命令,将不同节点的端口在文件中替换拷贝到对应管理的文件夹中

                vim中:%s/8000/8001/g

      

                完成之后调用ls检查目录中是否都存在redis.conf文件

                

                分别启动节点实例,一共启动集群配置的6个进程

                

 

                redis-server 8000/redis.conf

                redis-server 8001/redis.conf

                redis-server 8002/redis.conf

                redis-server 8003/redis.conf

                redis-server 8004/redis.conf

                redis-server 8005/redis.conf

                

                检查是否启动成功

                #ps -ef|grep redis

                搜索关键字redis有关的启动进程信息

                

 

                #登录集群的客户端命令

                #redis-cli -c -p 8000

                -p 表示端口连接, -c 以集群状态登录节点(本质上是对单个节点的命令封装);

                但是这个时候所有的节点并不是集群状态,我们单独登录节点一样无法实现

                集群的操作

                #redis-cli -p 8

 

                

      创建集群

                <查看>启动文件

                在redis根目录src目录下有个文件redis-trib.rb,这个就是用ruby写的命令文件,

                它是一个语言编写的快速操作集群的命令文件,整合了底                

                层客户端的各种各样的命令,执行创建集群命令(redis集群最少需要3个master才能正常运行)

                ./redis-trib.rb 如果我使用的是./说明当前的/etc/profile中没有对PATH进行 ./的配置,

                所有不在环境变量中的命令文件需要到对应目录调用./启动

                

                ./redis-trib.rb  create   10.9.17.153:8000 10.9.17.153:8001 10.9.17.153:8002

                ./redis-trib.rb create --replicas 1

                host1:port1….hostn:portn

                例如:redis-trib.rb create --replicas 1 节点信息们;

                这里的8003 8004 8005暂不添加,后续添加节点使用

                解释下, --replicas  1  表示 自动为每一个master节点分配至少一个slave节点   

                上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)

                

                提问是否同意以上内容的配置结果,yes表示同意

                

 

                 表示集群搭建成功,槽道分配完毕;

                后期的连接需要端口开发,防火墙直接关闭;

                #service iptables stop //临时关闭防火墙,重启之后防火墙依然开启

                #chkconfig iptables off //永久关闭防火墙配置,两个命令配合,

 

      登陆

                #redis-cli -c -p 8000

                这里注意,如果使用原有的命令没有-c则表示单独登陆节点,没有集群效果

                查看集群状态

                8000>cluster info

                

                都比较好理解,唯独epoch,epoch是个逻辑计算时间,与节点的所有变化都有关,与集群事件有关;

                cluster_current_epoch:6 代表当前集群的最新逻辑计算时间,数字越大,表示操作或者配置越新,整个集群的这个值是保持一致的

                cluster_my_epoch:1代表当前节点的逻辑计算时间,

                查看集群节点

                8000>cluster nodes

                查看集群所有节点的信息

                

                这里的内容比较杂乱

                节点 ID :例如 3fc783611028b1707fd65345e763befb36454d73 。

                ip:port :节点的 IP 地址和端口号, 例如 127.0.0.1:7000 ,

                 flags :节点的角色(例如 master 、 slave 、 myself 如果标识myself说明当前客户端登录的端口)以及状态(例如 fail ,等等)。

                如果节点是一个从节点的话, 那么跟在 flags 之后的将是主节点的节点 ID :

                 例如 127.0.0.1:7002 的主节点的节点 ID 就是 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 。

                master节点最后有一个值的范围,就是hash槽,0~16383(2^14),平均的分配到各master节点。

 

                测试set和get数据体会槽道的原理

                登录8000 set name hanlaoshi

                集群底层计算判断逻辑:name的哈希取模,5798, 是否归8000管理;转向了8001,存储

                

 

      动态添加节点

                启动新节点8003 8004 8005

 

                

                执行添加节点命令(将8003添加到当前集群中)

                ./redis-trib.rb add-node 10.9.17.153:8003 10.9.17.153:8001

                前面是新节点,后面是存在的任意一个节点

                

                (重启时添加节点)如果出现如下问题

                提示内容:当前新节点已经被集群知道,或者新节点有数据

                

                查看当前节点的数据是否有key存在

                

 

                登录到新增节点,执行

                #8003>cluster nodes

                把新增节点的nodes文件删除,重启服务,重新添加

                将节点中的数据清空

                

 

                

 

                进入集群查看节点状态(默认情况是master,不管理槽道)

                

 

      动态添加从节点

                

                --slave 和--master-id 必须同时配置就可以指定给一个master添加从节点,新增节点就是从节点的角色

 

                添加从节点(8004添加到主节点8001)

                执行添加节点成为某一台主节点的从节点命令

                --slave 指定当前节点以从节点角色添加到集群中

                --master-id 后面跟随主节点的masterid值,cluster nodes可以查看

                [root@10-9-17-153 src]# ./redis-trib.rb add-node --slave --master-id 5c90a71b4ace2ed64c28e686072cd40c535980fe    

                             10.9.17.153:8004 10.9.17.153:8003

                --master-id后面必须跟着主节点的id(可以使用cluster nodes查看)

                

                检查添加是否成功

 

                新的master要起作用需要保存缓存数据

                数据与槽道挂钩,所以需要迁移槽道过来

                为新的节点分配槽道(只能分配空槽道)

                src/redis-trib.rb reshard 192.10.20.20:8003

                表示将集群中的槽道重新分配,后面的节点信息,已经在集群中存在的任意节点信息

                

                根据提示操作

                1 移动多少槽道

                How many slots do you want to move (from 1 to 16384)? 50

                将集群中若干个槽道数量从新分配

                2 接收移动槽道的节点id是什么

                What is the receiving node ID? 指定一个接收分配槽道的节点id8003id

               

                3 源数据节点都有哪些

                Please enter all the source node IDs.

                  Type 'all' to use all the nodes as source nodes for the hash slots.

                  Type 'done' once you entered all the source nodes IDs.

                如果从固定几个节点获取数据,直接粘贴对应id,必须是主节点

                如果从所有id平均分配槽道,all

                输入all或者done时,分配计算结束;

                Source node #1:all

                这里我们就用all

                如果使用all将会自动计算从所有主节点平均获取槽道移动

               

                4 确定输入yes

                Do you want to proceed with the proposed reshard plan (yes/no)?

               

                5 屏幕滚动移动过程

                6 查看cluster nodes 发现8003 已经配有的从各个源数据节点上移动过来的槽道

               

 

                重新分配槽道,不能重新操作有数据的槽道,空槽道可以reshard

                有数据的需要手动迁移数据后再迁移槽道(在补充操作中)

      高可用验证

                停掉一个主的进程

                kill掉主节点8001

                #ps -ef|grep redis

               

                #kill 8554(执行登录到8001节点 shutdown的命令也可以)

                然后登陆集群查看集群节点

                8000>cluster nodes

               

                启动停掉的节点会自动拼接成slave加入

                等待一定时间,

                8000>cluster nodes

                发现8001的从节点8004重新选举成新的主节点

 

               

 

                删除节点(一旦删除节点,无法直接重新加入)

               

                主节点不能直接删除,需要reshard将槽道全部移出

                ./redis-trib.rb del-node 10.9.17.153:8000 09a25f98f963e3f90193440be5850bd351eb228b

                参数意义: 节点信息是已经存在与集群的节点,id表示删除的节点id

                删除从节点(无数据直接删除)

                将8001重启之后,称为从节点加入集群,可以测试删除

               

 

                [root@10-9-17-153 src]# ./redis-trib.rb del-node 10.9.17.153:8000 5c90a71b4ace2ed64c28e686072cd40c535980fe

               

 

                redis-trib.rb:能不能再运行的集群维护集群(只有添加删除的功能可以在确定的环境下对运行着的集群做操作,

                reshard不可以)为了快速的按照集群的设计结构搭建一个集群

      重新搭建集群(仅限于测试环境)

                可以重新构造不同端口对应的集群;

 

                没有restart类似的重启集群的命令;

                重启集群的目的:操作时的各种失误,导致集群失效;

                杀掉所有进程

                删掉文件(dump文件,nodes文件,aof文件)

                [root@10-9-17-153 redis-3.2.11]# rm -f nodes*

                [root@10-9-17-153 redis-3.2.11]# rm -f dump*

                rm表示删除每删除一个文件,都要询问管理员是否删除 输入yes表示同意

                -f是删除命令的选项:表示所有文件强制删除,不要询问

                dump* 是参数,表示当前文件夹下所有以dump开始命名的文件

                以上命令执行的结果就是,强制删除所有当前文件夹内以dump开始的文件内容

                       (dump8000.rdb也删除:为了防止启动其他新节点时,读取原有dump的数据导致添加集群节点非空,失败)

                然后清除appendonly*

 

                可以调用原有的配置文件,启动redis服务,利用redis-trib.rb重建集群

猜你喜欢

转载自blog.csdn.net/DGHxj_/article/details/83901439