zoukankan      html  css  js  c++  java
  • Redis 高可用及分片集群,说了你也不懂

    Redis 简介

    Memcached:
    	优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash
    多核结构、多线程读写性能高。
    	缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
    Redis:
    	优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
    	缺点:多线程读写较Memcached慢
    

    Redis 安装和基本配置

    1.安装教程

    下载:
    wget http://download.redis.io/releases/redis-3.2.10.tar.gz
    解压:
    tar xzf redis-3.2.10.tar.gz
    mv redis-3.2.10 redis
    安装:
    cd redis
    make
    启动:
    src/redis-server &
    

    2.配置文件
    vi /etc/redis.conf

    是否后台运行:
    daemonize  yes
    默认端口:
    port 6379
    日志文件位置
    logfile /var/log/redis.log
    RDB持久化数据文件:
    dbfilename dump.rdb
    持久化文件的位置:
    dir /data/redis
    

    3.安全配置

    Bind
    	指定IP进行监听 bind 10.0.0.129(本地) 127.0.0.1
    禁止protected-mode
    	protected-mode yes/no (保护模式,是否只允许本地访问)
    增加requirepass  {password}
    	requirepass root
    

    4.配置完成后需要重启Redis

    127.0.0.1:6379> shutdown
    /application/redis/src/redis-server /etc/redis.conf 
    /application/redis/src/redis-cli  -h 10.0.0.129 -a 123456 -p 6379
    

    5.在线修改配置

    获取当前配置
    CONFIG GET *
    变更运行配置
    CONFIG SET requirepass 123456
    

    Redis 持久化

    RDB持久化

    基于时间点快照的方式,复用方式进行数据持久化
    比较常用的方式,效率较高,安全性相对较低
    
    在 /etc/redis.conf中添加以下内容
    dbfilename dump.rdb
    dir /data/redis
    save 900 1
    save 300 10
    save 60 10000
    
    分别表示:
    	rdb文件名
    	rdb的放置路径
    	900秒(15分钟)内有1个更改
    	300秒(5分钟)内有10个更改
    	60秒内有10000个更改
    	当达到以上定义的配置时间时,就将内存数据持久化到磁盘。
    

    AOF持久化

    只追加的方式记录所有redis中执行过的修改类命令
    效率相对较低,安全性较高
    
    appendonly yes
    appendfsync always或者everysec或者no
    分别表示:
    	是否打开aof日志功能
    	每1个命令,都立即同步到aof 
    

    Redis 开发/管理实战

    数据类型

    String/Hash/List/Set/Sorted set
    增删改查操作:自己查文档
    

    全局key操作

    KEYS * 						查看KEY支持通配符
    DEL							删除给定的一个或多个key
    EXISTS 						检查是否存在
    RENAME 						变更KEY名
    TYPE						返回键所存储值的类型
    EXPIRE PEXPIRE 			以秒毫秒设定生存时间
    TTL PTTL 					以秒毫秒为单位返回生存时间
    PERSIST 					取消生存实现设置
    

    消息模式

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

    事务

    DISCARD 
    取消事务,放弃执行事务块内的所有命令。
    EXEC 
    执行所有事务块内的命令。
    MULTI 
    标记一个事务块的开始。
    UNWATCH 
    取消 WATCH 命令对所有 key 的监视。
    WATCH key [key ...] 
    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
    ---------------------
    具体的命令----  watch命令
    例: 
    redis 127.0.0.1:6379> watch ticket
    OK
    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> decr ticket
    QUEUED
    redis 127.0.0.1:6379> decrby money 100
    QUEUED
    //现在已经对ticket进行了监控,另外一个窗口将ticket改动了
    另一个窗口:> decr ticket    
    redis 127.0.0.1:6379> exec
    (nil)   // 返回nil,说明监视的ticket已经改动了,事务就取消了.队列就不执行了。
    redis 127.0.0.1:6379>mget ticket money
    "0"
    "200"
    
    watch key1 key2  ... keyN
    作用:监听key1 key2..keyN有没有变化,如果任意一个有变, 则事务取消
    unwatch 
    作用: 取消所有watch监听
    

    服务器管理命令

    Info
    Clinet list
    Client kill ip:port
    config get *
    CONFIG RESETSTAT 重置统计
    CONFIG GET/SET 动态修改
    Dbsize
    FLUSHALL 清空所有数据 
    select 1
    FLUSHDB 清空当前库
    MONITOR 监控实时指令
    
    SHUTDOWN 关闭服务器
    save将当前数据保存
    SLAVEOF host port 主从配置
    SLAVEOF NO ONE
    SYNC 主从同步
    ROLE返回主从角色
    

    Redis 高可用及集群技术

    主从复制

    1.环境配置

    准备两个或两个以上redis实例
    
    	mkdir -p /data/6380/
    	mkdir -p /data/6381/
    	mkdir -p /data/6382/
    -------------
    /data/6380/redis.conf
    /data/6381/redis.conf
    /data/6382/redis.conf
    
    三套配置文件示例:
    vim /data/6380/redis.conf
    ----------------
    bind 127.0.0.1 10.0.0.200
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    protected-mode no
    
    6381/6382文件配置同上
    
    启动:
    /application/redis/src/redis-server   /data/6380/redis.conf
    /application/redis/src/redis-server  /data/6381/redis.conf
    /application/redis/src/redis-server /data/6382/redis.conf
    
    
    查看启动状态
    netstat -lnp|grep 638
    
    主节点:6380
    从节点:6381、6382
    
    开启主从:
    6381/6382命令行:
    
    redis-cli -p 6381
    SLAVEOF 127.0.0.1 6380
    
    
    redis-cli -p 6382
    SLAVEOF 127.0.0.1 6380
    
    
    主从复制状态监控:info replication
    
    主从切换:slaveof no one
    
    

    2.配置sentinel 哨兵

    mkdir /data/26380 
    cp /application/redis/src/redis-sentinel /data/26380
    cd /data/26380
     ./redis-sentinel ./sentinel.conf
    vim sentinel.conf
    
    port 26380
    dir "/tmp"
    sentinel monitor mymaster 127.0.0.1 6380 1
    sentinel down-after-milliseconds mymaster 5000
    sentinel config-epoch mymaster 0
    
    启动
     ./redis-sentinel ./sentinel.conf
    

    3.python连接 redis-sentinel集群

    1、安装python3.5
     tar xf Python-3.5.2.tar.xz 
    
    cd Python-3.5.2
    
    ./configure
    
    make && make install
    
    2、安装redis的python驱动
    unzip redis-py-master.zip
    cd redis-py-master
    python3 setup.py install
    
    
    3、python3连接redis  sentinel集群
    
    连接之前必须先启动哨兵 切记切记
    cd /data/26380
     ./redis-sentinel ./sentinel.conf
    
    python3
    >>>from redis.sentinel import Sentinel  
    >>>sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)  
    >>>sentinel.discover_master('mymaster')  
    >>>sentinel.discover_slaves('mymaster')  
    >>>master = sentinel.master_for('mymaster', socket_timeout=0.1)  
    >>>slave = sentinel.slave_for('mymaster', socket_timeout=0.1)  
    >>>master.set('foo', 'bar')  
    >>>slave.get('foo')  
    

    4.redis cluser集群组件安装

    EPEL源安装ruby支持
    yum install ruby rubygems -y
    使用国内源
    gem sources -a http://mirrors.aliyun.com/rubygems/ 
    gem sources  --remove http://rubygems.org/
    gem sources -l
    gem install redis -v 3.3.3
    
    
    --------------------
    0、集群节点准备,创建节点目录:
    mkdir -p /data/7000
    mkdir -p /data/7001
    mkdir -p /data/7002
    mkdir -p /data/7003
    mkdir -p /data/7004
    mkdir -p /data/7005
    
    
    1、配置文件添加:
    -------------------------
    vim /data/7000/redis.conf
    
    port 7000
    daemonize yes
    pidfile /data/7000/redis.pid
    logfile "/var/log/redis7000.log"
    dbfilename dump.rdb
    dir /data/7000
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    
    7001/7002/7003/7004/7005节点配置同上
    -------------------------------
    
    2、启动所有节点
    /application/redis/src/redis-server /data/7000/redis.conf
    /application/redis/src/redis-server /data/7001/redis.conf
    /application/redis/src/redis-server /data/7002/redis.conf
    /application/redis/src/redis-server /data/7003/redis.conf
    /application/redis/src/redis-server /data/7004/redis.conf
    /application/redis/src/redis-server /data/7005/redis.conf
    
    
    ps -ef |grep 700
    -------------------------
    
    3、集群创建
    
    /application/redis/src/redis-trib.rb create --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
    ---------------------
    4、集群状态查看
    
    /application/redis/src/redis-cli -p 7000 cluster nodes | grep master
    /application/redis/src/redis-cli -p 7000 cluster nodes | grep slave
    

    Redis 多API开发实践

    Python 连接 redis cluster

    (1) redis-py并没有提供redis-cluster的支持,去github找了一下,有个叫redis-py-cluster的源码,
    但是和redis-py不是一个作者,地址为:https://github.com/Grokzen/redis-py-cluster
    watch,star,fork还算可以。
    (2) 安装
    
    unzip redis-py-cluster-unstable.zip
    cd redis-py-cluster-unstable
    python3 setup.py install
    
    (3) 使用
    >>> from rediscluster import StrictRedisCluster  
    >>> startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]  
    >>> # Note: decode_responses must be set to True when used with python3  
    >>> rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
      
    >>> rc.set("foo", "bar")  
    >>> print(rc.get("foo"))  
    
    
  • 相关阅读:
    R镜像源的切换
    GWAS中的名称概念
    mac显示隐藏的文件,安装cocoapods
    swift开发笔记28 SlideBarMenu
    MAC读取安卓手机的APP的log日志
    关于DES加密中的 DESede/CBC/PKCS5Padding
    swift开发笔记27 UserNotifications
    swift开发笔记26 3D Touch
    银联Pos终端签到、签退、批结算、批上送、PinKey、MacKey、KEK、主密钥、工作密钥、TPDU、报文头
    开发感悟
  • 原文地址:https://www.cnblogs.com/iyouyue/p/8996284.html
Copyright © 2011-2022 走看看