zoukankan      html  css  js  c++  java
  • redis高级之哨兵 集群

    一、redis哨兵

      1.主从复制存在的问题:

        1. 主从复制,从节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master(哨兵)

        2 主从复制,只能主写数据,所以写能力和存储能力有限(集群)

      2.原理    

        1 多个sentinel发现并确认master有问题
        2 选举触一个sentinel作为领导
        3 选取一个slave作为新的master
        4 通知其余slave成为新的master的slave
        5 通知客户端主从变化
        6 等待老的master复活成为新master的slave

      3.搭建步骤

        第一步:先搭建一主多从

        第二步:配置哨兵(也是一个特殊的redis服务端,客户端可以连接)

        

    port 26379
            daemonize yes
            dir /root/redis/data
            bind 0.0.0.0
            logfile "redis_sentinel.log"
            sentinel monitor mymaster 127.0.0.1 6379 2
            sentinel down-after-milliseconds mymaster 30000
            sentinel parallel-syncs mymaster 1
            sentinel failover-timeout mymaster 180000

      4.客户端测试

        import redis

          from redis.sentinel import Sentinel

          #链接哨兵服务器(主机名也可以用域名)

           # 10.0.0.101:26379

          

          sentinel = Sentinel([('139.196.158.24', 26379),
                    ('139.196.158.24', 26380),
                    ('139.196.158.24', 26381)],
                    socket_timeout=5)

        #print(sentinel)

        ##获取主服务器地址

        master = sentinel.discover_master('mymaster')

        print(master)

        

        # 获取从服务器地址
        slave = sentinel.discover_slaves('mymaster')
        print(slave)

        ##### 读写分离
        # 获取主服务器进行写入
        # master = sentinel.master_for('mymaster', socket_timeout=5)
        # w_ret = master.set('foo', 'bar')

        # slave = sentinel.slave_for('mymaster', socket_timeout=0.5)
        # r_ret = slave.get('foo')
        # print(r_ret)

              

          

    二、redis集群

    port 7000
    daemonize yes
    dir "/lqz/data0/"
    logfile "7000.log"
    
    #masterauth  集群搭建时,主的密码
    cluster-enabled yes  # 开启cluster
    cluster-node-timeout 15000 # 故障转移,超时时间 15s
    cluster-config-file nodes-7000.conf  # 给cluster节点增加一个自己的配置文件
    cluster-require-full-coverage yes  #只要集群中有一个故障了,整个就不对外提供服务了,这个实际不合理,假设有50个节点,一个节点故障了,所有不提供服务了;,需要设置成no
    
    
    port 7000
    daemonize yes
    dir "/root/redis/data7000/"
    logfile "7000.log"
    cluster-enabled yes
    cluster-node-timeout 15000
    cluster-config-file nodes-7000.conf
    cluster-require-full-coverage yes
    
    
    ./src/redis-cli -p 7000 --cluster create 127.0.0.1:7000 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 --cluster-replicas 1
                            
                            
     redis-cli -c -p 7002
    ./src/redis-cli -p 7005 --cluster add-node 127.0.0.1:7006 127.0.0.1:7007
    
    # 把7006加入到集群中
    ./src/redis-cli --cluster add-node  127.0.0.1:7006 127.0.0.1:7005
    # 把7007加入到集群并且作为7006的从库
    ./src/redis-cli --cluster add-node  127.0.0.1:7007 127.0.0.1:7005 --cluster-slave --cluster-master-id f7b06c1d565727e085b3cd81533842589fa3fafa
    
    
    
    # 迁移槽
    redis-cli --cluster reshard 127.0.0.1:7000
    
    
    
    
    # 第一步:启动6个实例
        -6个配置文件(格式如下,稍微改动)
            port 7000
            daemonize yes
            dir "/root/redis/data7000/"
            logfile "7000.log"
            cluster-enabled yes
            cluster-node-timeout 15000
            cluster-config-file nodes-7000.conf
            cluster-require-full-coverage yes
    # 第二部:启动实例
         -启动6个实例,自动处理(老的配置集群,比较麻烦,手动做好多东西),集群中有6个节点,每个主节点有一个从节点(主和从都是redis自己选择)
            ./src/redis-cli -p 7000 --cluster create 127.0.0.1:7000 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 --cluster-replicas 1
    # 第三步:客户端连接
            redis-cli -c -p 7000   # -c是集群模式,查询或写入的数据如果不在当前节点,会自动跳转查询或写入
            cluster nodes   # 查看集群节点信息
            cluster info
            
            
     # 第四步:扩容
        -启动两个实例,加入集群,一个作为主,一个作为从
        - 把7006加入到集群中
        ./src/redis-cli --cluster add-node  127.0.0.1:7006 127.0.0.1:7005
        -把7007加入到集群并且作为7006的从库
        ./src/redis-cli --cluster add-node  127.0.0.1:7007 127.0.0.1:7005 --cluster-slave --cluster-master-id f7b06c1d565727e085b3cd81533842589fa3fafa
         -迁移槽(指定迁移的大小,指定从哪个节点迁移(all),每个节点迁移一部分)
            redis-cli --cluster reshard 127.0.0.1:7000
                
                
     # 第四步:缩容(自己实现一下)
         # 下线迁槽(把7006的1366个槽迁移到7000上)
        redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7000的id --cluster-slots 1366 127.0.0.1:7000
        yes
    
        redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7001的id --cluster-slots 1366 127.0.0.1:7001
        yes
        redis-cli --cluster reshard --cluster-from 7006的id --cluster-to 7002的id --cluster-slots 1365 127.0.0.1:7002
        yes
        # 忘记节点,关闭节点
        redis-cli --cluster del-node 127.0.0.1:7000 要下线的7007id  # 先下从,再下主,因为先下主会触发故障转移
        redis-cli --cluster del-node 127.0.0.1:7000 要下线的7006id 
        # 
    
        # 关掉其中一个主,另一个从立马变成主顶上, 重启停止的主,发现变成了从

      

        

        

  • 相关阅读:
    详细解说python垃圾回收机制
    Vue-- 监听路由参数变化,数据无法更新 解决方案
    解决“只能通过Chrome网上应用商店安装该程序”的方法 ---离线安装谷歌浏览器插件
    axios POST提交数据的三种请求方式写法
    axios POST提交数据的三种请求方式写法
    vue+element后台系统 自己动手撸(一)
    element-ui中 table表格hover 修改背景色
    解决vue的{__ob__: observer}取值问题
    Vue [__ob__: Observer]取不到值问题的解决
    VUE监听路由变化的几种方式
  • 原文地址:https://www.cnblogs.com/ltyc/p/14467550.html
Copyright © 2011-2022 走看看