暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis集群搭建

坚果测试笔记 2021-06-29
213

redis主从复制

将一台redis服务器的数据,复制到其他redis服务器,复制是单向的,只能由主节点到从节点,master以写为主,slave以读为主。

一般来说,单台redis最大使用内存不应超过20G。

只配置从库,不用配置主库(不作详细演示)

    slaveof 127.0.0.1 6379    #作为谁的从机,临时配置,建议配置文件中写入
    info replication #查看主从复制信息
    slaveof no one #从机成为主机

    从机只能读取内容,当主机断开连接,恢复连接后,从机依然能获取到主机写的信息。

    复制原理

    1. slave启动成功连接到master后,会发送一个sync同步命令

    2. master接到命令,启动后台的存盘进程,将传送整个数据文件到slave,并完成一次完全同步

    3. 全量复制:slave接收到数据库文件数据后,将其存盘加载到内存中(slave重连主机)

    4. 增量复制:master将新的修改命令依次传给slave(如set命令)



    哨兵模式

    哨兵是一个独立的进程,通过发送命令,等待redis服务响应,从而监控运行的多个redis实例。当哨兵监测到master宕机,自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件。

    一个哨兵可能会出现问题,因此可以使用多个哨兵进行监控,哨兵之间还会进行监控,形成多哨兵模式。

    1. 配置哨兵配置文件sentinel.conf

      #sentinel monitor 被监控的名称 host 6379 1(代表主机挂了,slave投票让谁成为主机)
      sentinel monitor myredis 127.0.0.1 6379 1

      2. 启动哨兵模式

        redis-sentinel ../conf/sentinel.conf

        如果主机宕机了,就从从机中随机选择一个服务器(投票算法)

        如果主机恢复,只能归并到新主机下作为从机。

        扩展-哨兵模式全部配置

          # Example sentinel.conf    
          # 哨兵sentinel实例运行的端口 默认26379
          port 26379
          # 哨兵sentinel监控的redis主节点的 ip port
          # master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
          # quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
          # sentinel monitor <master-name> <ip> <redis-port> <quorum>
          sentinel monitor mymaster 127.0.0.1 6379 2
          # 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
          # 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
          # sentinel auth-pass <master-name> <password>
          sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
          # 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
          # sentinel down-after-milliseconds <master-name> <milliseconds>
          sentinel down-after-milliseconds mymaster 30000
          # 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
          这个数字越小,完成failover所需的时间就越长,
          但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
          可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
          # sentinel parallel-syncs <master-name> <numslaves>
          sentinel parallel-syncs mymaster 1
          # 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
          #1. 同一个sentinel对同一个master两次failover之间的间隔时间。
          #2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
          #3.当想要取消一个正在进行的failover所需要的时间。
          #4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
          # 默认三分钟
          # sentinel failover-timeout <master-name> <milliseconds>
          sentinel failover-timeout mymaster 180000
          # SCRIPTS EXECUTION
          #配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
          #对于脚本的运行结果有以下规则:
          #若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
          #若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
          #如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
          #一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
          #通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本, 这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
          一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
          #通知脚本
          # sentinel notification-script <master-name> <script-path>
          sentinel notification-script mymaster var/redis/notify.sh
          # 客户端重新配置主节点参数脚本
          # 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
          # 以下参数将会在调用脚本时传给脚本:
          # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
          # 目前<state>总是“failover”,
          # <role>是“leader”或者“observer”中的一个。
          # 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
          # 这个脚本应该是通用的,能被多次调用,不是针对性的。
          # sentinel client-reconfig-script <master-name> <script-path>
          sentinel client-reconfig-script mymaster var/redis/reconfig.sh


          集群模式

          redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来sentinel哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式
          Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
          Redis-Cluster把存储的数据分开存入各个主节点,主节点间存储的数据是不一样的。


          环境搭建

          操作系统:centos 7

          安装redis:在linux下安装redis

          本文模拟实例:一台云服务器,模拟6个redis节点,3个master,3个slave


          步骤

          创建集群文件夹及对应的节点文件

            mkdir usr/local/redis_cluster
            cd usr/local/redis_cluster
            mkdir -p 7001/data 7002/data 7003/data 7004/data 7005/data 7006/data

            拷贝配置文件并修改相关配置信息

              cd 7001/
              cp /root/packages/redis-5.0.4/redis.conf ./
              vim redis.conf
                port 7001 # 节点端口号
                daemonize yes # 以后台进程的方式启动redis实例
                bind 127.0.0.1 # 实例绑定当前机器IP地址
                protected-mode yes # 开启保护模式
                pidfile /var/run/redis_6379.pid # 指定该进程pidfile,和port对应
                dir /usr/local/redis-cluster/7001/data/ #(redis实例数据文件存放位置)
                masterauth 密码 # replica同master交互密码
                requirepass 密码 # master开启密码保护
                cluster-enabled yes # 启动集群模式
                cluster-config-file nodes7001.conf # 和port要对应,集群中该实例的配置文件,该文件会在data目录下生成
                cluster-node-timeout 5000 # 超时时间5s
                appendonly yes # 开启aop日志

                复制配置文件,批量替换信息

                  cp redis.conf ../7002/
                  cp redis.conf ../7003/
                  ......
                  vim ../7002/redis.conf
                  :%s/替换旧内容/新内容/g #批量替换,如端口号

                  依次启动redis各个节点服务

                  方式1:逐个启动

                    ./redis-server /usr/local/redis_cluster/7001/redis.conf

                    方式2:启动脚本写到sh文件中,修改文件权限后一次启动

                    vim start-all-redis.sh

                      cd /usr/local/redis/bin/
                      ./redis-server /usr/local/redis_cluster/7001/redis.conf
                      ./redis-server /usr/local/redis_cluster/7002/redis.conf
                      ./redis-server /usr/local/redis_cluster/7003/redis.conf
                      ./redis-server /usr/local/redis_cluster/7004/redis.conf
                      ./redis-server /usr/local/redis_cluster/7005/redis.conf
                      ./redis-server /usr/local/redis_cluster/7006/redis.conf

                      chmod +x start-all-redis.sh

                      ./start-all-redis.sh   

                      检查启动情况

                      创建集群

                      ./redis-cli -a 密码 --cluster create --cluster-replicas 1 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 127.0.0.1:7006

                      客户端连接集群某个节点

                      ./redis-cli -a 密码 -c -h 127.0.0.1 -p 7001

                      【-c:连接集群节点时使用,可防止move和ask异常,并可在节点间自动跳转】

                      查看集群节点信息:cluster nodes

                      cluster帮助指引:redis-cli --cluster help


                      文章转载自坚果测试笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论