zoukankan      html  css  js  c++  java
  • redis的主从复制,以及使用sentinel自动处理主机宕机问题,集群

    以下部分想看懂得有一定的redis基础,且步骤是连贯的,错一步都不行。redis运行多个实例,不懂得自行百度。

    1. redis主从同步

    原理:

    1. 从服务器向主服务器发送 SYNC 命令。
    2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
    3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
    4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。

    -------------
    1、在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
    2、同步开始之后,通过主库命令传播的方式,主动的复制方式实现
    3、2.8以后实现PSYNC的机制,实现断线重连

    2. redis主从同步实验

    2.1 准备三个redis数据库配置文件

    背景: 一主两从

    6380为主,6381和6382 为从

    cd /opt/redis_conf
    vim redis-6380.conf
    写入以下配置
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    protected-mode no
    

    再创建两个配置文件6381和6382

    sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
    sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf
    

    创建数据文件目录

    [root@qishi666 redis_conf]# mkdir -p /data/6380
    [root@qishi666 redis_conf]# mkdir -p /data/6381
    [root@qishi666 redis_conf]# mkdir -p /data/6382
    

    2.2 启动redis数据库

    [root@qishi666 redis_conf]# redis-server redis-6380.conf 
    [root@qishi666 redis_conf]# redis-server redis-6381.conf 
    [root@qishi666 redis_conf]# redis-server redis-6382.conf
    
    

    2.3 确保这三个redis数据库是完全独立的数据库

    2.4 给两个从服务器配置文件再添加一行配置(很重要)

    在6381和6382配置文件添加这一行配置,表示指定主服务器为6380
    slaveof 127.0.0.1 6380
    

    2.5 重启数据库

    pkill redis
    redis-server /opt/redis_conf/redis-6380.conf
    redis-server /opt/redis_conf/redis-6381.conf
    redis-server /opt/redis_conf/redis-6382.conf
    

    2.6 查看主从数据库状态

    redis-cli -p 6380 info
    redis-cli -p 6380 info replication
    

    2.7 添加数据进行测试

    在从服务器上不可以写入:

    2.8 手动进行主从复制故障切换

    2.8.1 关闭6381的从库身份
    redis-cli -p 6381
    info replication
    slaveof no one
    
    2.8.2 将6382设为6381的从库
    6382连接到6381:
    [root@db03 ~]# redis-cli -p 6382
    127.0.0.1:6382> SLAVEOF no one
    127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
    

    3. redis哨兵

    3.1 sentinel主要功能如下:

    • 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识
    • 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
    • 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

    3.2 redis sentinel配置步骤

    3.2.1 配置三个redis数据库, 一主两从
    redis-6380.conf
    redis-6381.conf
    redis-6382.conf
    
    3.2.2 启动三个redis数据库,确保主从复制正常运行
    redis-server redis-6380.conf
    redis-server redis-6381.conf
    redis-server redis-6382.conf
    
    redis-cli -p 6380 info replication
    redis-cli -p 6381 info replication
    redis-cli -p 6382 info replication
    
    3.2.3 配置三个哨兵
    cd /opt/redis_conf
    vim redis-sentinel-26380.conf
    vim redis-sentinel-26381.conf
    vim redis-sentinel-26382.conf
    

    写入以下配置文件

    port 26380
    dir /data/26380
    logfile "26380.log"
    sentinel monitor qishimaster 127.0.0.1 6380 2
    sentinel down-after-milliseconds qishimaster 30000
    sentinel parallel-syncs qishimaster 1
    sentinel failover-timeout qishimaster 180000
    daemonize yes
    

    哨兵配置文件详解:

    # Sentinel节点的端口
    port 26379  
    dir /var/redis/data/
    logfile "26379.log"
    
    # sentinel announce-ip 127.0.0.1   # 宣告哨兵IP, 此配置只有当使用非127.0.0.1的IP配置哨兵无法成功时加上,同时redis三个服务端也需要同步修改IP
    
    # 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
    # 2代表判断主节点失败至少需要2个Sentinel节点节点同意
    # mymaster是主节点的别名
    sentinel monitor mymaster 127.0.0.1 6379 2
    
    # 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
    sentinel down-after-milliseconds mymaster 30000
    
    # 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
    sentinel parallel-syncs mymaster 1
    
    # 故障转移超时时间为180000毫秒
    sentinel failover-timeout mymaster 180000
    
    daemonize yes
    

    创建存放哨兵文件的目录

    mkdir -p /data/{26380,26381,26382}
    

    如果发现哨兵没有正常启动,必须把IP改为127.0.0.1

    如果你是在三个不同的机器上,只能用机器对外访问的IP,那就需要添加这一个配置

    sentinel announce-ip 127.0.0.1
    
    3.2.4 启动三个哨兵
    [root@qishi666 redis_conf]# redis-sentinel redis-26380.conf
    [root@qishi666 redis_conf]# redis-sentinel redis-26381.conf
    [root@qishi666 redis_conf]# redis-sentinel redis-26382.conf
    
    3.2.5 此时查看哨兵是否成功通信
    3.2.6 如果出现问题,没有配置成功,没有显示前面这几条配置成功的信息,就推倒重来

    从配置主从同步开始做!!!!!

    3.2.7 验证redis高可用故障切换

    大致思路

    • 杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
    • 重新恢复旧的“master”节点,查看此时的redis身份

    首先查看三个redis的进程状态

    4 redis集群概念

    4.1 为什么需要用到集群

    全量数据, 量很大,一台机器没有办法全部处理完,所以需要多台机器同时处理,才能达到我们想要的效果

    就类似于一大车货物,通过5辆马车来运输

    4.2 redis集群槽位概念

    虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。

    Redis Cluster槽的范围是0~16383。

    槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,

    每个节点负责一定数量的槽。

    5. redis集群配置

    5.1 准备六个节点

    cd /opt/jq
    vim redis-7000.conf
    vim redis-7001.conf
    vim redis-7002.conf
    vim redis-7003.conf
    vim redis-7004.conf
    vim redis-7005.conf
    

    写入配置

    port 7000
    daemonize yes
    dir "/data/jq/7000"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes
    cluster-config-file nodes-7000.conf
    

    这6个节点配置文件都一样,仅仅是端口的不同

    [root@qishi666 jq]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
    [root@qishi666 jq]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf
    [root@qishi666 jq]# sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf
    [root@qishi666 jq]# sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf
    [root@qishi666 jq]# sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
    

    创建这六个节点的文件目录

    mkdir -p /data/jq/{7000,7001,7002,7003,7004,7005}
    

    5.2 启动这六个节点

    cd /opt/jq
    redis-server redis-7000.conf
    redis-server redis-7001.conf
    redis-server redis-7002.conf
    redis-server redis-7003.conf
    redis-server redis-7004.conf
    redis-server redis-7005.conf
    

    5.3 随便进入一个redis交互模式,写入数据,发现无法写入

    报错,没有分配哈希槽

    5.4 准备ruby环境,安装ruby并执行redis-trib.rb脚本

    分配redis集群状态,以及槽位分配,互联网企业,豆瓣公司开源的一个工具

    1 下载、编译、安装Ruby

    # 下载ruby
    wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
    
    # 安装ruby
    tar -xvf ruby-2.3.1.tar.gz
    cd ruby-2.3.1/
    ./configure --prefix=/opt/ruby/
    make && make install
    

    5.5 配置ruby环境

    5.5.1 配置ruby环境变量
    vim /etc/profile
    

    在PATH=后面添加ruby的环境变量路径

    PATH=/opt/ruby/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    再刷新配置文件 source /etc/profile
    
    5.5.2 安装rubygem redis
    wget http://rubygems.org/downloads/redis-3.3.0.gem
    
    5.5.3 使用gem安装redis-3.3.0.gem工具
    gem install -l redis-3.3.0.gem
    

    5.7 一键开启redis-cluster集群

    5.7.1 一条命令开启集群
    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
    
    # 每个主节点,有一个从节点,代表--replicas 1
    # 集群自动分配主从关系  7000、7001、7002为主 7003、7004、7005为从
    
    5.7.2 查看集群状态

    5.8 进入集群状态

    redis-cli -p 7000 -c
    
  • 相关阅读:
    在 《超过 光速 的 方法》 里 的 回复
    超过 光速 的 方法
    在 《我对 相对论 提出了一个 修正,名为 “K氏修正”》 里 的 回复
    我对 相对论 提出了一个 修正,名为 “K氏修正”
    input 只读不能修改
    获取父iframe的高宽
    indexOf ie下的兼容问题
    英文单词自动换行
    textarea 限制字数
    js判断输入框的范围,并且只能输入数字
  • 原文地址:https://www.cnblogs.com/caiwenjun/p/11861870.html
Copyright © 2011-2022 走看看