zoukankan      html  css  js  c++  java
  • redis持久化、RDB、AOF、主从复制、哨兵、集群、

    ## 1 redis持久化

    ```python
    # 快照:某时某刻数据的一个完成备份,
    -mysql的Dump
    -redis的RDB
    # 写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
    -mysql的 Binlog
    -Redis的 AOF

    ```

    ### 1.1 RDB

    ```python
    # 触发机制-主要三种方式
    -save:客户端执行save命令----》redis服务端----》同步创建RDB二进制文件,如果老的RDB存在,会替换老的
    -bgsave:客户端执行save命令----》redis服务端----》异步创建RDB二进制文件,如果老的RDB存在,会替换老的
    -配置文件
    save 900 1
    save 300 10
    save 60 10000
    如果60s中改变了1w条数据,自动生成rdb
    如果300s中改变了10条数据,自动生成rdb
    如果900s中改变了1条数据,自动生成rdb


    ```

    ### 1.2 aof

    ```python
    # 客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复

    # AOF的三种策略
    always:redis–》写命令刷新的缓冲区—》每条命令fsync到硬盘—》AOF文件
    everysec(默认值):redis——》写命令刷新的缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件
    no:redis——》写命令刷新的缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件

    # AOF重写
    -本质:本质就是把过期的,无用的,重复的,可以优化的命令,来优化
    -使用:
    -在客户端主动输入:bgrewriteaof
    -配置文件:
    # AOF持久化配置最优方案
    appendonly yes #将该选项设置为yes,打开
    appendfilename "appendonly.aof" #文件保存的名字
    appendfsync everysec #采用第二种策略
    dir ./data #存放的路径
    no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失
    ```


    ## 2 主从复制(一主一从一主多从)

    ```python
    # 原理:

    # 如何配置:
    方式一:
    -在从库执行 SLAVEOF 127.0.0.1 6379,
    -断开关系 slaveof no one
    方式二:配置文件(配在从库的配置文件中)
    slaveof 127.0.0.1 6379
    slave-read-only yes
    ```


    ## 3 哨兵

    ```python
    # 让redis的主从复制高可用
    1 搭一个一主两从
    #创建三个配置文件:
    #第一个是主配置文件
    daemonize yes
    pidfile /var/run/redis.pid
    port 6379
    dir "/opt/soft/redis/data"
    logfile “6379.log”

    #第二个是从配置文件
    daemonize yes
    pidfile /var/run/redis2.pid
    port 6378
    dir "/opt/soft/redis/data2"
    logfile “6378.log”
    slaveof 127.0.0.1 6379
    slave-read-only yes
    #第三个是从配置文件
    daemonize yes
    pidfile /var/run/redis3.pid
    port 6377
    dir "/opt/soft/redis/data3"
    logfile “6377.log”
    slaveof 127.0.0.1 6379
    slave-read-only yes


    #把三个redis服务都启动起来
    ./src/redis-server redis_6379.conf
    ./src/redis-server redis_6378.conf
    ./src/redis-server redis_6377.conf


    2 搭建哨兵
    # sentinel.conf这个文件
    # 把哨兵也当成一个redis服务器
    创建三个配置文件分别叫sentinel_26379.conf sentinel_26378.conf sentinel_26377.conf

    # 当前路径下创建 data1 data2 data3 个文件夹
    #内容如下(需要修改端口,文件地址日志文件名字)
    port 26379
    daemonize yes
    dir ./data3
    protected-mode no
    bind 0.0.0.0
    logfile "redis_sentinel3.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


    #启动三个哨兵
    ./src/redis-sentinel sentinel_26379.conf
    ./src/redis-sentinel sentinel_26378.conf
    ./src/redis-sentinel sentinel_26377.conf



    # 登陆哨兵
    ./src/redis-cli -p 26377
    # 输入 info

    # 查看哨兵的配置文件被修改了,自动生成的

    # 主动停掉主redis 6379,哨兵会自动选择一个从库作为主库
    redis-cli -p 6379
    shutdown
    #等待原来的主库启动,该主库会变成从库

    ```


    ### 客户端连接

    ```python
    import redis
    from redis.sentinel import Sentinel

    # 连接哨兵服务器(主机名也可以用域名)
    # 10.0.0.101:26379
    sentinel = Sentinel([('10.0.0.101', 26379),
    ('10.0.0.101', 26378),
    ('10.0.0.101', 26377)
    ],
    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=0.5)
    # w_ret = master.set('foo', 'bar')

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


    ## 4 集群

    ```python
    # 集群是3.0以后加的,3.0----5.0之间,ruby脚本,5.0以后,内置了
    ## 详见博客

    ```

    ```
    redis-cli --cluster create --cluster-replicas 1 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 NODES # 集群节点信息
    cluster slots # 查看槽的信息

    redis-cli -p 7007 cluster replicate 16c49dd91001529792f0425b46c6757080125732



    redis-cli --cluster reshard --cluster-from 16c49dd91001529792f0425b46c6757080125732 --cluster-to 4ee63c79b7ab594414068099c12668ffc6698dbc --cluster-slots 1366 127.0.0.1:7000

    redis-cli --cluster reshard --cluster-from 16c49dd91001529792f0425b46c6757080125732 --cluster-to 4ee63c79b7ab594414068099c12668ffc6698dbc --cluster-slots 1366 127.0.0.1:7000
    ```
  • 相关阅读:
    PHP 5.5.0 Alpha5 发布
    Ubuntu Touch 只是另一个 Android 皮肤?
    MariaDB 10 已经为动态列提供文档说明
    Percona Toolkit 2.1.9 发布,MySQL 管理工具
    Oracle Linux 6.4 发布
    Ruby 2.0.0 首个稳定版本(p0)发布
    Apache Pig 0.11.0 发布,大规模数据分析
    Node.js 0.8.21 稳定版发布
    红薯 MySQL 5.5 和 5.6 默认参数值的差异
    Django 1.5 正式版发布,支持 Python 3
  • 原文地址:https://www.cnblogs.com/0B0S/p/13618846.html
Copyright © 2011-2022 走看看