• redis学习笔记


    ===========================redis学习笔记===============================
    ###redis特点
    基于键值对的NoSQL数据库,有string,hash,list,set,zset,geo等多种数据结构和算法组成,读写性能好。
    ##特性
    速度快:所有数据都存在内存中,使用单线程结构,有c语言实现
    数据结构:字符串、哈希、列表、集合、有序集合
    功能:键过期功能,可以实现缓存,提供发布订阅功能,提供了pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销
    简单稳定:单线程工作,处理模型简单
    语言:支持更多的客户端语言
    持久化:RDB、AOF保证数据的安全和处理性能
    主从复制:自带主从复制特性,容易实现
    高可用和分布式:哨兵(高可用,解决故障问题,实现自动故障转移)、集群(分布式,解决性能问题)

    ###redis功能
    数据类型丰富 *****
    支持持久化 *****
    多种内存分配及回收策略
    支持事务 ****
    消息队列、消息订阅
    支持高可用 ****
    支持分布式分片集群 *****
    缓存穿透雪崩 *****
    Redis API **

    ###redis运用
    1.缓存session会话,缓存用户信息,保证会话的持续性
    2.通过列表或者有序集合实现热度排行版和发布时间排行版
    3.天然支持计数器,浏览次数、播放次数
    4.集合,实现打包共同属性的对象
    5.消息队列-发布订阅,配合elk实现日志收集

    ###redis安装
    相关依赖:
    gcc
    1.目录规划
    /data/soft/ #下载目录
    /opt/redis_cluster/redis_{PORT}/{conf,logs,pid} #配置文件、日志、进程文件目录
    /data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb #redis数据目录
    /root/scripts/redis_shell.sh #redis运维管理脚本
    2.安装前准备
    #添加主机hosts解析,方便以后登录使用,可以直接用主机名,不需要敲主机ip地址
    10.0.1.51 db01
    10.0.1.52 db02
    10.0.1.53 db03
    #目录创建
    mkdir -p /data/soft
    mkdir -p /data/redis_cluster/redis_6379
    mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
    3.下载安装
    #下载解压
    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
    4.编写配置文件
    cat >/opt/redis_cluster/redis_6379/conf/redis_6379.conf<<EOF
    daemonize yes # 以守护进程模式启动
    bind 10.0.1.51 # 绑定的主机地址
    port 6379 # 监听端口
    pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid # pid文件和log文件的保存地址
    logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
    databases 16 # 设置数据库的数量,默认数据库为0
    dbfilename redis_6379.rdb # 指定本地持久化文件的文件名,默认是dump.rdb
    dir /data/redis_cluster/redis_6379 # 本地数据库的目录
    EOF
    5.启动关闭服务
    redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf #启动
    redis-cli -h db01 shutdown #关闭,也可以进入redis后,执行shutdown命令关闭

    ###redis基本操作命令
    CONFIG GET requirepass #在线查看密码认证
    CONFIG SET requirepass 123 #在线设置面认证
    Keys * #查看数据库中所有键,生产中禁止使用,影响redis的性能和运行
    Dbsize #获取redis中键的总和,可以使用,不影响性能
    Exists key #检查键是否存在,存在则返回1,不存在则返回0
    Del key #删除某一个键
    Expire key seconds #设置键过期时间,单位为秒。到期后会自动删除键
    TTL key #查看键的到期剩余时间,倒计时的数字为剩余时间,-1表示键没有设置过期时间,-2表示键不存在
    persist key1 #取消过期设置
    append mykey "hello" #若该键并不存在,返回当前 Value 的长度
    setrange mykey 20 dd #把第20个字节后两个字节,替换为dd, 超过value长度,自动补0
    type key #表示键的数据类型
    save #手动触发保存数据
    bgsave #手动触发保存数据
    save与bgsave的差异:
    SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
    BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。
    ##字符串类型命令
    set key1 value1 #设置一个键值,值为字符串
    get key1 #查看一个字符串类型数据
    incr key1 #执行一次值自增一,将字符串值解析成整型.将其加1,最后结果保存为新的字符串
    decr key1 #执行一次值自减一,将字符串值解析成整型.将其加1,最后结果保存为新的字符串
    incrby key1 value #按照指定数字增加
    decrby key1 value #按照指定数字减
    mset key3 v3 key4 v4 key5 v5 #一次设置多个键值
    mget key3 key4 key5 #一次查看多个键值
    ##列表类型命令
    rpush 键 值 #往列表右边插入一个值
    rpush list1 A
    lpush list1 top1 #往列表左边插入一个值
    linsert mykey before a a1 #在 a 的前面插入新元素 a1
    linsert mykey after e e2 #在e 的后面插入新元素 e2
    rpushx mykey e #若key存在,在尾部插入e, 若key不存在,则无效
    rpoplpush mykey mykey2 #将mykey的尾部元素弹出,再插入到mykey2 的头部(原子性的操作)
    lrange list1 0 -1 #查看插入的值,0表示左边的开始位置,-1表示右边的开始位置
    lrange list1 1 -1 #从左边的第二个元素开始到最后一个元素
    lrem mykey 2 a #从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除
    ltrim mykey 0 2 #从头开始,索引为0,1,2的3个元素,其余全部删除

    lset mykey 1 e #从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息
    rpoplpush mykey mykey #将 mykey 中的尾部元素移到其头部

    lrange mykey 0 -1 #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
    lrange mykey 0 2 #从头开始,取索引为0,1,2的元素
    lrange mykey 0 0 #从头开始,取第一个元素,从第0个开始,到第0个结束
    lpop mykey #获取头部元素,并且弹出头部元素,出栈
    lindex mykey 6 #从头开始,获取索引为6的元素 若下标越界,则返回nil
    rpop list1 #从右边删除一个值
    lpop list1 #从左边删除一个值
    ##哈希类型命令
    hset 键 值 #设置一个哈希类型数据,值为哈希数据,有键和值构成,之间用空格分隔
    hset student name zs #设置一个哈希类型数据,只能为一组哈希值
    hmset user:1000 username zw age 27 job it#设置多个哈希数据类型值,对组哈希值
    hget user:1000 username #查看一组哈希数据
    hmget user:1000 username age job #查看多个哈希数据
    hgetall user:1000 #查看该键所有哈希数据
    hlen myhash #获取myhash键的字段数量
    hexists myhash field1 #判断 myhash 键中是否存在字段名为 field1 的字段
    hmget myhash field1 field2 field3 #一次性获取多个字段
    hgetall myhash #返回 myhash 键的所有字段及其值
    hkeys myhash #获取myhash 键中所有字段的名字
    hvals myhash #获取 myhash 键中所有字段的值
    ##集合数据命令
    sadd 键 值1 值2 值3 #设置集合类型数据集
    sadd set1 1 2 3
    smembers set1 #查看集合数值
    srem set1 2 4 #删除集合某些数值
    sdiff set1 set2 #计算两个集合的差集,set1集合对set2集合的差集,set1相较于set2的差异部分,反之同理
    sinter set1 set2 #计算两个集合的交集
    sunion set1 set2 #计算两个集合的并集

    smove myset myset2 a #将a从 myset 移到 myset2,

    sismember myset a #判断 a 是否已经存在,返回值为 1 表示存在。
    smembers myset #查看set中的内容
    scard myset #获取Set 集合中元素的数量
    srandmember myset #随机的返回某一成员
    sdiff myset1 myset2 myset3 #1和2得到一个结果,拿这个集合和3比较,获得每个独有的值
    sdiffstore diffkey myset myset2 myset3 #3个集和比较,获取独有的元素,并存入diffkey 关联的Set中
    sinter myset myset2 myset3 #获得3个集合中都有的元素
    sinterstore interkey myset myset2 myset3 #把交集存入interkey 关联的Set中
    sunion myset myset2 myset3 #获取3个集合中的成员的并集
    sunionstore unionkey myset myset2 myset3 #把并集存入unionkey 关联的Set中
    ##有序集合数据命令

    zadd myzset 2 "two" 3 "three" #添加两个分数分别是 2 和 3 的两个成员

    zrem myzset one two #删除多个成员变量,返回删除的数量

    zincrby myzset 2 one #将成员 one 的分数增加 2,并返回该成员更新后的分数

    zrange myzset 0 -1 WITHSCORES #返回所有成员和分数,不加WITHSCORES,只返回成员
    zrank myzset one #获取成员one在Sorted-Set中的位置索引值。0表示第一个位置
    zcard myzset #获取 myzset 键中成员的数量
    zcount myzset 1 2 #获取分数满足表达式 1 <= score <= 2 的成员的数量
    zscore myzset three #获取成员 three 的分数
    zrangebyscore myzset 1 2 #获取分数满足表达式 1 < score <= 2 的成员
    #-inf 表示第一个成员,+inf最后一个成员
    #limit限制关键字
    #2 3 是索引号
    zrangebyscore myzset -inf +inf limit 2 3 #返回索引是2和3的成员
    zremrangebyscore myzset 1 2 #删除分数 1<= score <= 2 的成员,并返回实际删除的数量
    zremrangebyrank myzset 0 1 #删除位置索引满足表达式 0 <= rank <= 1 的成员
    zrevrange myzset 0 -1 WITHSCORES #按位置索引从高到低,获取所有成员和分数
    #原始成员:位置索引从小到大
    one 0
    two 1
    #执行顺序:把索引反转
    位置索引:从大到小
    one 1
    two 0
    #输出结果: two
    one
    zrevrange myzset 1 3 #获取位置索引,为1,2,3的成员
    #相反的顺序:从高到低的顺序
    zrevrangebyscore myzset 3 0 #获取分数 3>=score>=0的成员并以相反的顺序输出
    zrevrangebyscore myzset 4 0 limit 1 2 #获取索引是1和2的成员,并反转位置索引

    ###redis服务管理相关命令
    Info #查看redis服务相关信息
    Client list #列出所有客户端
    Client kill ip:port #杀死某一个客户端
    config get * #获取配置信息
    CONFIG RESETSTAT #重置统计
    CONFIG GET/SET #动态修改设置
    Dbsize #查看键的总数
    FLUSHALL #清空所有数据
    select 1 #切换数据库,切换到一号数据库
    FLUSHDB #清空当前库
    MONITOR #监控实时指令
    SHUTDOWN #关闭服务器
    redis-cli -a root shutdown #关闭数据库

    ###redis的持久化
    ##RDB数据存储持久化:可以在指定的时间间隔内生成数据集的时间点快照,基于数据做的rdb文件,写入磁盘
    优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
    缺点:会有数据丢失
    参数配置:
    dir /data/6379 #rdb数据文件存放位置
    dbfilename dump.rdb #rdb数据文件名
    save 900 1 #900秒(15分钟)内有1个更改
    save 300 10 #300秒(5分钟)内有10个更改
    save 60 10000 #60秒内有10000个更改
    ##AOF日志存储持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
    AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
    优点:可以最大程度保证数据不丢
    缺点:日志记录量级比较大
    参数配置:
    appendonly yes #是否打开aof日志功能
    appendfsync always #每1个命令,都立即同步到aof
    appendfsync everysec #每秒写1次,默认为这个,结合了always和no的特点
    appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
    注:always、everysec、no选择其一
    ##RDB与AOF的差异
    rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
    aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog
    注:当两个文件同时存在时,系统已AOF文件为主,无论aof文件内容是否为最新,在shutdown数据库之后,会自动触发bgsave对数据进行写入。kill命令、pkill命令关闭数据库都会先保存数据文件,若直接断电源或者使用kill -9数据库,则数据不会被保存。注意小心使用。

    ###redis的安全认证
    1.指定ip地址监听
    bind 10.0.0.51 127.0.0.1
    2.设置数据写入查看认证密码
    requirepass 123456
    3.设置主从同步认证密码
    masterauth "123456"
    4.设置哨兵通信认证密码
    sentinel auth-pass mymaster 123456 #mymaster为设置的哨兵组名字
    ##认证数据写入查看的两种方式
    redis-cli -a 123456 #-a参数在登陆前,命令行认证登陆
    redis-cli ---> auth 123456 #登陆redis后进行认证

    ###redis发布订阅
    PUBLISH channel msg
    将信息 message 发送到指定的频道 channel
    SUBSCRIBE channel [channel ...]
    订阅频道,可以同时订阅多个频道
    UNSUBSCRIBE [channel ...]
    取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
    PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所 有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
    PUNSUBSCRIBE [pattern [pattern ...]]
    退订指定的规则, 如果没有参数则会退订所有规则
    PUBSUB subcommand [argument [argument ...]]
    查看订阅与发布系统状态
    注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
    发布订阅例子:
    窗口1:
    127.0.0.1:6379> SUBSCRIBE baodi
    窗口2:
    127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"
    订阅多频道:
    窗口1:
    127.0.0.1:6379> PSUBSCRIBE wang*
    窗口2:
    127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "

    ###redis的事务
    1.redis的事务是基于队列实现的。
    2.mysql的事务是基于事务日志和锁机制实现的。
    3.redis是乐观锁机制。
    开启事务功能时(multi)
    multi #开启一个事务
    command1
    command2
    command3
    command4
    exec #结束事务
    discard #取消事务
    4.4条语句作为一个组,并没有真正执行,而是被放入同一队列中。如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。exec当执行exec时,对列中所有操作,要么全成功要么全失败
    127.0.0.1:6379> set a b
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379> set a b
    QUEUED
    127.0.0.1:6379> set c d
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) OK

    ###redis的备份与恢复
    Redis SAVE 命令用于创建当前数据库的备份。
    ##备份数据
    语法:
    redis Save 命令基本语法如下:
    redis 127.0.0.1:6379> SAVE
    实例:
    redis 127.0.0.1:6379> SAVE
    OK
    该命令将在 redis 安装目录中创建dump.rdb文件。
    ##恢复数据
    如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
    redis 127.0.0.1:6379> CONFIG GET dir
    1) "dir"
    2) "/usr/local/redis/bin"
    以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。
    Bgsave
    创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。
    实例:
    127.0.0.1:6379> BGSAVE
    Background saving started

    ###redis的主从复制
    ##主从复制:为了解决单点故障问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等求.复制功能是高可用Redis的基础,后面的哨兵和集群都是在复制的基础上实现高可用
    ##主从复制实现方式概要:
    1.在配置文件中加入slaveof {masterHost} {masterPort} 随redis启动生效.
    2.在redis-server启动命令后加入—slaveof {masterHost} {masterPort}生效.
    3.直接使用命令:slaveof {masterHost} {masterPort}生效.
    ##主从数据一致性的保证:
    min-slaves-to-write 1 #表示从库数量至少存在1个,主库才会进行写操作
    min-slaves-max-lag 3 #表示从服务器最后一次向主服务器发送REPLCONF,从库向主库的联系,滞后时间不超过3秒,超过则主库不会进行写操作 ACK命令距离现在过了多少秒,最大不超过3秒,超过的话主库将不能执行写命令。表示主从关系出现故障
    注:以上两个参数是用来保证主从数据同步一致性的。若从库数量少以1个,从库上一次进行ACK请求到目前为止的时间lag,超过了3秒,主库将不能执行写操作。
    开启数据持久化
    ##主从复制配置:
    1.拷贝主节点redis执行文件目录和数据目录(节省重新安装部署时间)
    rsync -avz /opt/* db02:/opt/
    rsync -avz /data db02:/
    2.进入redis执行文件目录进行安装(由于在master节点已经编译完成)
    cd /opt/redis
    make install
    3.更改redis配置文件
    sed -i 's#51#52#g' /opt/redis_6379/conf/redis_6379.conf #更改绑定ip地址
    rm -rf /data/redis_6379/* #删除数据目录
    4.启动
    redis-server /opt/redis_6379/conf/redis_6379.conf
    5.其他从节点类似
    6.登陆测试
    redis-cli -h 10.0.1.52
    7.构建主从同步
    方式一:登陆redis后执行 SLAVEOF 10.0.1.51 6379 命令,使得主从数据同步。临时生效
    方式二:将命令写入配置文件,永久生效SLAVEOF 10.0.1.51 6379
    8.取消主从同步状态
    方式一:从节点redis命令行执行SLAVEOF no one
    方式二:将配合文件中主从同步命令注释或删除
    9.注意
    1.确认好从节点对象,不要在主节点执行主从复制命令,否则会导致主节点数据被删除。因为主从复制保证主节点与从节点的数据一致性,与主节点保持一致。
    2.在操作之前先确认数据目录是否有数据,先将数据备份一份,以防万一。
    3.从节点只读不可写
    4.从节点不会自动故障转移,它会一直同步主
    10.主从复制流程
    1. 副本库通过slaveof 10.0.1.51 6379命令,连接主库,并发送SYNC给主库
    2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
    3. 副本库接收后会应用RDB快照
    4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
    5. 到此,我们主复制集就正常工作了
    6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
    7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
    8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
    9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的
    11.查看主从复制状态
    Info replication
    12.当主故障后,手动切换从库为主库的操作
    1.断开与旧主节点的复制关系
    2.与新主节点建立复制关系
    3.删除从节点当前所有数据
    4.对新主节点进行复制操作

    ###乐观锁与悲观锁
    ##乐观锁
    每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。一般使用version方式和CAS操作方式。
    #Version方式:
    一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
    核心SQL代码:update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
    #CAS操作方式:
    即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。
    #乐观锁使用场景
    比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。
    ##悲观锁
    每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。在Java中,synchronized的思想也是悲观锁。
    #悲观锁使用场景
    比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

    ###redis sentinel(哨兵)
    ##哨兵介绍
    实时监控各个节点状态,解决了主从复制的自动故障转移,实现架构的高可用。
    ##哨兵的主要功能
    1.监控(Monitoring):
    Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。
    2.提醒(Notification):
    当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
    3.自动故障迁移(Automatic failover):
    当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器
    ##哨兵的安装配置
    见附件
    ##Sentinel工作原理分析
    配置一:sentinel monitor <master-name> <ip> <port> <quorum>
    这个配置表达的是 哨兵节点定期监控 名字叫做 <master-name> 并且 IP 为 <ip> 端口号为 <port> 的主节点。<quorum> 表示的是哨兵判断主节点是否发生故障的票数。也就是说如果我们将<quorum>设置为2就代表至少要有两个哨兵认为主节点故障了,才算这个主节点是客观下线的了,一般是设置为sentinel节点数的一半加一。
    配置二:sentinel down-after-milliseconds <master-name> <times>
    每个哨兵节点会定期发送ping命令来判断Redis节点和其余的哨兵节点是否是可达的,如果超过了配置的<times>时间没有收到pong回复,就主观判断节点是不可达的,<times>的单位为毫秒。
    配置三:sentinel parallel-syncs <master-name> <nums>
    当哨兵节点都认为主节点故障时,哨兵投票选出的leader会进行故障转移,选出新的主节点,原来的从节点们会向新的主节点发起复制,这个配置就是控制在故障转移之后,每次可以向新的主节点发起复制的节点的个数,最多为<nums>个,因为如果不加控制会对主节点的网络和磁盘IO资源很大的开销。
    配置四:sentinel failover-timeout <master-name> <times>
    这个代表哨兵进行故障转移时如果超过了配置的<times>时间就表示故障转移超时失败。
    配置五: sentinel auth-pass <master-name> <password>
    如果主节点设置了密码,则需要这个配置,否则哨兵无法对主节点进行监控。
    ##哨兵机制原理
    见附件
    ##哨兵权重设置
    1.查看权重
    CONFIG GET slave-priority
    2.设置权重
    在其他节点把权重设为0
    CONFIG SET slave-priority 0
    3.主动发起重新选举
    sentinel failover mymaster
    4.恢复默认的权重
    CONFIG SET slave-priority 100
    ##哨兵常用操作
    Sentinel节点是一个特殊的Redis节点,他们有自己专属的API
    Info Sentinel #查看哨兵信息
    Sentinel masters #查看哨兵主节点信息
    Sentinel master <master name>
    Sentinel slaves <master name> #查看哨兵从节点信息
    Sentinel sentinels <master name> #查看哨兵实例列表
    Sentinel get-master-addr-by-name <master name> #返回指定名字的主节点的ip号和端口
    Sentinel failover <master name> #切换主节点
    Sentinel flushconfig #刷新配置信息
    ##修改危险命令,减少出现人为故障
    rename-command KEYS ""
    rename-command DEL ""

    rename-command KEYS "o_keys"
    rename-command DEL "o_del"

    ###redis集群
    ##手动搭建集群
    见附件
    ##工具搭建集群
    见附件
    ##工具增加集群分片
    见附件
    ##工具缩减集群分片
    见附件
    ##工具进行数据迁移
    见附件
    ##工具分析key的大小(用于删除无用的过大的key)
    见附件

    ###redis工具redis-trib.rb常用命令
    1. create:创建集群 *****
    2. check:检查集群 *****
    3. info:查看集群信息 *****
    4. fix:修复集群 *****
    5. reshard:在线迁移slot *****
    6. rebalance:平衡集群节点slot数量 *****
    7. add-node:添加新节点
    8. del-node:删除节点 *****
    9. set-timeout:设置节点的超时时间
    10. call:在集群所有节点上执行命令
    11. import:将外部redis数据导入集群

    ###sentinel常用命令
    以下列出的是Sentinel接受的命令:
    PING:返回PONG。
    SENTINEL master <master name>:用于查看监控的某个Redis Master信息,包括配置和状态等。
    SENTINEL slaves <master name>:列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。
    SENTINEL sentinels <master name>:查看给定主服务器的Sentinel实例列表及其状态。
    SENTINEL get-master-addr-by-name <master name>:返回给定名字的主服务器的IP地址和端口号。 如果这个主服务器正在执行故障转移操作,或者针对这个主服务器的故障转移操作已经完成,那么这个命令返回新的主服务器的IP地址和端口号。
    SENTINEL reset <pattern>:重置所有名字和给定模式pattern相匹配的主服务器。pattern 参数是一个Glob风格的模式。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和Sentinel。
    SENTINEL failover <master name>:当主服务器失效时, 在不询问其他Sentinel意见的情况下, 强制开始一次自动故障迁移(不过发起故障转移的Sentinel会向其他Sentinel发送一个新的配置,其他Sentinel会根据这个配置进行相应的更新)。
    SENTINEL reset <pattern>:强制重设所有监控的Master状态,清除已知的Slave和Sentinel实例信息,重新获取并生成配置文件。
    SENTINEL failover <master name>:强制发起一次某个Master的failover,如果该Master不可访问的话。
    SENTINEL ckquorum <master name>:检测Sentinel配置是否合理,failover的条件是否可能满足,主要用来检测你的Sentinel配置是否正常。
    SENTINEL flushconfig:强制Sentinel重写所有配置信息到配置文件。
    SENTINEL is-master-down-by-addr <ip> <port>:一个Sentinel可以通过向另一个Sentinel发送SENTINEL is-master-down-by-addr命令来询问对方是否认为给定的服务器已下线。
    动态修改Sentinel配置
    以下是一些修改sentinel配置的命令:
    SENTINEL MONITOR <name> <ip> <port> <quorum>这个命令告诉sentinel去监听一个新的master
    SENTINEL REMOVE <name> 命令sentinel放弃对某个master的监听
    SENTINEL SET <name> <option> <value> 这个命令很像Redis的CONFIG SET命令,用来改变指定master的配置。支持多个

    ###cluster常用命令
    集群
    cluster info :打印集群的信息
    cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
    节点
    cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
    cluster forget <node_id> :从集群中移除 node_id 指定的节点。
    cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
    cluster saveconfig :将节点的配置文件保存到硬盘里面。
    槽(slot)
    cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
    cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
    cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
    cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
    cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
    cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
    cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

    cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
    cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
    cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 。

  • 相关阅读:
    小程序查看导航
    PHP计算两个坐标之间的距离
    微信小程序获取位置
    小程序重置index,重置item
    nmap使用教程
    boost checked_delete提升安全性
    转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码
    visual studio 开发linux程序
    stl 比较和boost LessThanComparable
    c++11 auto unique_ptr 等
  • 原文地址:https://www.cnblogs.com/hrers/p/11853379.html
Copyright © 2020-2023  润新知