美文网首页工作生活
2019-07-03 NoSQL产品之Redis主从复制-哨兵

2019-07-03 NoSQL产品之Redis主从复制-哨兵

作者: Ffvc | 来源:发表于2019-07-03 21:46 被阅读0次

    课程介绍

    Redis

    1-2

    Mongodb

    1-2

    Elasticsearch

    1

    EFRLK

    1-2

    中小型互联网企业架构演变


    Redis环境准备

    介绍

    redis:缓存
    NoSQL    非关系型数据库
    key-valus   键 值 对  k1:v1
    
    特点:
    1.支持6中数据类型:字符串、哈希、列表、集合、有序集合
    2.速度非常快,所有数据存放在内存中
    3.持久化存储,快照和日志
    
    安装完成后的可执行文件
    redis-benchmark  
    redis-check-aof  
    redis-check-rdb  
    redis-cli           #客户端连接工具
    redis-sentinel      #哨兵服务端
    redis-server        #服务端
    
    利用官方脚本生成配置文件
    /opt/redis_cluster/redis/utils/install_server.sh
    

    一、环境准备

    1.1 操作系统说明
    操作系统    Centos7
    数量       3台机器 主机名:db01 db02 db03  IP地址:51,52,53
    CPU        无要求
    内存       内存1G
    硬盘       无要求,不能太小
    
    
    1.2 关闭防火墙和selinux
    #停止防火墙并禁止自启动
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
    # 关闭selinux
    sed -i.bak 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
    setenforce 0
    
    
    1.3 db01配置hosts和ssh

    配置hosts和密钥认证

    [root@db01 ~]# cat > /etc/hosts << EOF
    10.0.0.51 db01    
    10.0.0.52 db02    
    10.0.0.53 db03
    EOF
    [root@db01 ~]# ssh-keygen
    [root@db01 ~]# ssh-copy-id db02
    [root@db01 ~]# ssh-copy-id db03
    
    1.4 所有节点安装redis

    注意:所有节点都需要安装

    mkdir -p /data/soft
    
    mkdir -p /data/redis_cluster/redis_6379
    
    mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
    
    cd /data/soft/
    
    wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    
    tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
    
    ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
    
    cd /opt/redis_cluster/redis
    
    make && make install
    
    1.5 db01配置rudy环境
    yum makecache fast
    
    yum install rubygems
    
    gem sources --remove [https://rubygems.org/](https://rubygems.org/)
    
    gem sources -a http://mirrors.aliyun.com/rubygems/
    
    gem update –system
    
    gem install redis -v 3.3.5
    
    ruby -v
    
    gem -v
    
    
    1.6 db01安装键值分析工具
    yum install python-pip gcc
    pip install --upgrade pip
    pip install rdbtools
    
    1.7 所有节点部署redis管理脚本
    [root@db01 ~]# cat redis_shell.sh 
    #!/bin/bash
    USAG(){
        echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
    }
    
    if [ "$#" = 1 ]
    then
        REDIS_PORT='6379'
    elif 
        [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
    then
        REDIS_PORT="$2"
    else
        USAG
        exit 0
    fi
    
    REDIS_IP=$(hostname -I|awk '{print $1}')
    PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
    PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
    PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log
    
    CMD_START(){
        redis-server ${PATH_CONF}
    }
    
    CMD_SHUTDOWN(){
        redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
    }
    
    CMD_LOGIN(){
        redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
    }
    
    CMD_PS(){
        ps -ef|grep redis
    }
    
    CMD_TAIL(){
        tail -f ${PATH_LOG}
    }
    
    case $1 in
        start)
            CMD_START
            CMD_PS
            ;;
        stop)
            CMD_SHUTDOWN
            CMD_PS
            ;;
        restart)
            CMD_START
            CMD_SHUTDOWN
            CMD_PS
            ;;
        login)
            CMD_LOGIN
            ;;
        ps)
            CMD_PS
            ;;
        tail)
            CMD_TAIL
            ;;
        *)
            USAG
    esac
    
    
    1.8安装配置文件:
    cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
    ### 以守护进程模式启动
    daemonize yes
    ### 绑定的主机地址
    bind 10.0.0.51 127.0.0.1
    ### 监听端口
    port 6379
    ### pid文件和log文件的保存地址
    pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
    logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
    ### 设置数据库的数量,默认数据库为0
    databases 16
    ### 指定本地持久化文件的文件名,默认是dump.rdb
    dbfilename redis_6379.rdb
    ### 本地数据库的目录
    dir /data/redis_cluster/redis_6379
    EOF
    
    1.9 启动和关闭
    启动:
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
    
    关闭:
    redis-cli shutdown
    
    
    1.10 相关命令
    set 
    get
    mset
    mget
    incr key
    decr key
    incrby  key num
    decrby  key num 
    EXISTS key
    DEl key
    TTL k1 
    EXPIRE k1 10
    PERSIST k1 
    -1  永不过期    
    -2  键不存在
    
    列表   排行榜
    rpush
    lpush
    lrange
    rpop
    lpop
    
    哈希 mysql的缓存层
    HMSET   key  field value  
    HMGET   key  field 
    HGETALL key
    HMSET user:1000 username zhangya age 28 job it
    HMGET user:1000 
    HMGET user:1000 username
    HMGET user:1000 username age
    HMGET user:1000 username age job
    HMGET user:1000 all
    HGETALL user:1000
    HMSET user:1000 email 52615417@qq.com
    HGETALL user:1000
    
    集合 推荐系统 兴趣标签 广告精确投放
    SADD set1 1 2 3 5 7 
    SMEMBERS set1
    SADD set2  3 6 8 5 7 
    SMEMBERS set2
    SADD set1 1 
    SADD set1 1 11
    SMEMBERS set1
    SMEMBERS set2
    SDIFF set1 set2
    SDIFF set2 set1
    SADD set3 1 5 12 9
    SDIFF set1 set2 set3
    SDIFF set3 set1 set2
    SINTER set1 set2
    sunion set1 set2 set3
    
    1.11 rdb和aof 持久化对比
    持久化
    rdb 
    优点:恢复速度快,空间小
    缺点:可能会丢失
    
    aof 
    优点:数据安全,不容易丢失
    缺点:恢复速度慢,空间大
    
    热更新
    CONFIG GET *
    
    隐藏条件:
    
    1.如果同时有AOF和RDB存在,重启的时候,载入的是AOF文件
    2.shutdown 
      - bgsave
      - shutdown
    
    1.12 redis主从复制
    1.从库向主库发起同步请求
    2.主库接收到从库的同步请求
    3.主库开始bgsave生成rdb文件
    4.主库生成完之后,保存到磁盘成功
    5.主库将RDB文件发送给从库
    6.从库接收主库的RDB文件
    7.从库清空自己所有的数据
    8.从库将接受的RDB文件载入到内存中
    

    危险操作:
    1.如果主库不小心同步了空的从库,会导致主库数据全部丢失

    谨慎的操作流程:
    1.在配置文件里配置slaveof参数,不要热更新配置
    2.主库主动执行bgsave保存rdb文件,然后备份一份rdb文件

    恢复操作:
    
    1.主库停止复制关系,注释掉 aof 相关参数
    2.停止主库
    3.删除原有的rdb数据,重命名备份的rdb文件
    4.重新启动主库,将rdb文件导入到内存里
    
    1.13模拟故障
    模拟的场景:
    1.备份了数据
    2.但是主库不小心同步了空的从库
    3.主库恢复数据
    
    所有节点都操作
    #杀掉redis
    pkill redis
    
    #清空数据
    rm -rf /data/redis_cluster/redis_6379/*
    
    #配置文件
    cat >/opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
    ### 以守护进程模式启动
    daemonize yes
    ### 绑定的主机地址
    bind 10.0.0.51 127.0.0.1
    ### 监听端口
    port 6379
    ### pid文件和log文件的保存地址
    pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
    logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
    ### 设置数据库的数量,默认数据库为0
    databases 16
    #### 指定本地持久化文件的文件名,默认是dump.rdb
    dbfilename redis_6379.rdb
    #### 本地数据库的目录
    dir /data/redis_cluster/redis_6379
    save 60 100 
    save 300 10 
    save 600 1
    EOF
    
    #所有节点启动服务
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
    
    #db01主库上执行
    for i in {0..2000};do redis-cli set k_${i} v_${i}; echo "${i} is ok";done
    
    #主库生成rdb数据
    进入到redis里
    redis-cli 
    bgsave
    
    #备份数据
    cd /data/redis_cluster/redis_6379/
    cp redis_6379.rdb redis_6379.rdb.bak
    
    #模拟操作失误,同步了从库
    ###注意:
    [root@db01 ~]# redis-cli 
    127.0.0.1:6379> SLAVEOF 10.0.0.52 6379
    
    
    模拟恢复
    
    1.停掉db01的redis服务
    redis-cli shutdown
    
    2.检查redis是否真的停止了
    ps -ef|grep redis
    
    3.注释掉配置文件里的slaveof
    
    4.恢复备份的数据
    cd /data/redis_cluster/redis_6379
    cp redis_6379.rdb.bak redis_6379.rdb
    
    5.启动服务
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
    
    6.检查数据是否恢复
    redis-cli
    keys *
    
    
    
    #模拟主库故障
    ##db02上操作:
    redis-cli
    SLAVEOF 10.0.0.51 6379
    
    ##查看db02日志
    [root@db02 ~]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log 
    
    ##关闭db01
    redis-cli shutdown
    
    ##从库如何接管
    从库db02  slaveof no one 取消复制关系
    redis-cli -h db02 -p 6379 slaveof no one
    
    ##db02备份从库数据
    cd /data/redis_cluster/redis_6379
    cp redis_6379.rdb redis_6379.rdb.bak
    
    ##db01旧主库修复上线
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
    SLAVEOF 10.0.0.52 6379 
    keys *
    
    ##负载均衡关闭后端负载,防止数据写入
    
    ##修复后的db01从库重新升级为主库
    SLAVEOF no one
    
    ##代码修改为主库db01的IP,负载均衡重新挂载后端服务
    
    ##db02重新生成主从关系
    SLAVEOF 10.0.0.51 6379 
    
    ##确认数据同步正常
    redis-cli
    keys *
    
    

    2、redis 哨兵

    2.1 安装步骤
    #创建相关目录
    mkdir -p /data/redis_cluster/redis_26379
    mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
    
    #配置文件
    cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf<<EOF
    bind $(hostname -i)
    port 26379
    daemonize yes
    logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
    dir /data/redis_cluster/redis_26379
    sentinel monitor mymaster 10.0.0.51 6379 2
    sentinel down-after-milliseconds mymaster 3000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 18000
    EOF
    
    
    2.2 主从关系
    从库执行:
    SLAVEOF 10.0.0.51 6379 
    
    2.3 启动哨兵
    redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
    
    
    2.4 检查服务
    ps -ef|grep redis
    
    2.5 查看哨兵配置文件
    cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf
    
    注意:
    不要自己去改动哨兵的配置文件
    
    2.6 原始配置文件和启动redis后的对比
    [root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
    bind 10.0.0.51
    port 26379
    daemonize yes
    logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
    dir /data/redis_cluster/redis_26379
    sentinel monitor mymaster 10.0.0.51 6379 2
    sentinel down-after-milliseconds mymaster 3000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 18000
    
    [root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
    bind 10.0.0.51
    port 26379
    daemonize yes
    logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
    dir "/data/redis_cluster/redis_26379"
    sentinel myid d38f0c394afaf5fd462de16ff56be9f72f2f91d5
    sentinel monitor mymaster 10.0.0.51 6379 2
    sentinel down-after-milliseconds mymaster 3000
    sentinel failover-timeout mymaster 18000
    # Generated by CONFIG REWRITE
    sentinel config-epoch mymaster 0
    sentinel leader-epoch mymaster 0
    sentinel known-slave mymaster 10.0.0.52 6379
    sentinel known-slave mymaster 10.0.0.53 6379
    sentinel known-sentinel mymaster 10.0.0.53 26379 eb103c3bc5bc99997091273d95827006a0f9af9e
    sentinel known-sentinel mymaster 10.0.0.52 26379 f1c1b37cfe230d656345a26f26e97e96b706fb90
    sentinel current-epoch 0
    
    
    2.7 故障模拟
    0.杀掉redis
    pkill redis
    
    1.主从复制先做好
    db02和db03复制db01
    
    哨兵故障恢复:
    1.先启动db01
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
    
    2.启动哨兵
    redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
    
    3.设置权重
    db02和db03调大权重
    CONFIG SET slave-priority 0
    
    4.重新发起选举
    在db01上的26379节点执行
    redis-cli -h 10.0.0.51 -p 26379 Sentinel failover mymaster
    
    5.观察主从复制是否正常
    redis-cli 
    CONFIG GET slaveof
    
    6.db01恢复权重
    CONFIG SET slave-priority 100
    
    

    相关文章

      网友评论

        本文标题:2019-07-03 NoSQL产品之Redis主从复制-哨兵

        本文链接:https://www.haomeiwen.com/subject/ofsfhctx.html