• redis集群等相关内容-147


    1 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
           

           
           
       -客户端测试
      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)

     

    2 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
       #

       # 关掉其中一个主,另一个从立马变成主顶上, 重启停止的主,发现变成了从

    客户端连接

    redis-cli -c -p 7000  # -c表示集群模式
    set hello world  # ok
    cluster keyslot php
    # 9244
    set php sb # 不命中,会返回7001,自动跳转到7001上 不加-c,只会返回错误,不会去执行7001上保存


    # rediscluster
    # pip3 install redis-py-cluster
    from rediscluster import RedisCluster
    startup_nodes = [{"host":"127.0.0.1", "port": "7000"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}]
    # rc = RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
    rc = RedisCluster(startup_nodes=startup_nodes)
    rc.set("foo", "bar")
    print(rc.get("foo"))

    3 redis面试相关

    缓存更新策略

    LRU/LFU/FIFO算法剔除

    穿透,击穿,雪崩

    ###  缓存穿透
    #描述:
    缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
    #解决方案:
    1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
    2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
    3 通过布隆过滤器实现


    ### 缓存击穿
    #描述:
    缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
    #解决方案:
    设置热点数据永远不过期。


    ### 缓存雪崩
    #描述:
    缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
    # 解决方案:
    1 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
    2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
    3 设置热点数据永远不过期。

     

     

    4 go语言介绍,环境搭建

    1 2009年11月正式对外公开的一门编程语言(新语言)
    2 国内go使用频率比较高,并且是上升趋势
    3 静态强类型语言(编译型,不同类型之间是否可以直接运算)
    -python是动态强类型
    4 Go语言特性
    -跨平台的 编译型 语言
       -部署简单
       -速度快(比java占用内存小)
       
    5 发展史
    2009年11月7日
       2015年8月19日 go1.5 自举
       1.10后,包管理更好
       go 1.14现在 Go Module 已经可以用于生产环境
       2.0要加入泛型(暂时没有)
    6 Go语言应用
    知名互联网都在用
       
    7 Go语言项目
    docker,k8s,go跟区块链没有必然联系(第一款开源区块链使用go编写)
       
    8 go适合做什么
    特别适合高并发的服务端开发
       自动化运维
       爬虫少一些

     

    5 第一个helloworld

    1 开发工具包(只是开发用)
    2 ide:集成开发工具(goland,vscode)
    -建议goland(注册码,破解方式完全一样)
       
    3 无脑下一步
    4 安装后命令
    -go version
       -go build  编译成可执行文件  xx.exe
       -go env    环境变量
       -go run    编译并运行(开发阶段,使用它)
       
    5 第一个helloworld
    package main // 指定我这个包是main包

    import "fmt" //导入fmt包

    func main() {  //main函数,整个项目的入口
    fmt.Println("hello world") //调用fmt包下的Println函数,执行打印,必须用双引号
    }


    //go项目要执行,入口,main包下的main函数

     

  • 相关阅读:
    BNU 沙漠之旅
    手把手教你在Windows端搭建Redmine项目管理软件
    [置顶] mybatis批量新增系列之有主键的表的批量新增
    linux 命令之sar——监视系统状态
    简单的串行通信程序
    Hibernate_12_HQL句子
    初次使用glog
    2014辛星在读CSS第八节 使用背景图片
    poj 2763 Housewife Wind(树链拆分)
    堆,队列,单一列表,双向链表
  • 原文地址:https://www.cnblogs.com/usherwang/p/14471001.html
Copyright © 2020-2023  润新知