36.0 redis介绍

 

NoSQL:
http://www.nosql-databases.org/
    NoSQL DEFINITION: Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable.
    
{id:1, name:tom, age:12} 自带元数据

    ACID:
        原子性、一致性、隔离性、持久性;
        2phase commit, 3phase comit, ...
        
        
    non SQL, Not Only SQL; Web 2.0
    
        www.nosql-databases.org
        https://db-engines.com/en/ranking
    
    特性:数据量大、数据变化非常快(数据增长快、流量分布变化大、数据间耦合结构变化快)、数据源很多;
    
        CAP、BASE
            CAP:一致性,可用性,分区容错性
                2000年,PODC(Principle of Distributed Computing)会议, Brewer
                    Consistency、Availablity、Partition tolerence
                        C:多个数据节点上的数据一致;
                        A:用户发出请求后的有限时间范围内返回结果;
                        P:network partition,网络发生分区后,服务是否依然可用;
                CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。        
                    AP:
                        C:弱一致性;
                    CP:
                    
            分布式:一致性协议Paxos, Raft, ...
                        
            BASE:BA,S,E,基于CAP演化而来
                BA:Basically Available,基本可用;
                S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
                E:Eventually consistency,最终一致性;
                
    NewSQL: 分布式的SQL系统;
        
    NoSQL:Not Only SQL
        http://www.nosql-databases.org/
        Key Value / Tuple Store:DynamoDB, redis
        Wide Column Store / Column Families:列式数据库, hbase, cassandra
        Document Store:文档数据库,mongodb,Elastic, couchDB
        Graph Databases:图式数据库,Neo4j
        
        Time Series / Streaming Databases:时间序列存储,prometheus, influxdb, ...
        
        Multimodel Databases:
        Object Databases:
        
        
Redis:
    https://redis.io/
    Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. 掮客
        开源、内存存储、数据结构存储;
        可用作:数据库、缓存、消息队列;
        
    It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
        数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;
        
    Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
        内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)
    
    {id:1, name:tom} hashes
        
    REmote DIctionary Server:数据结构服务器,k/v,数据结构;
    
    单进程:
        CPU并非瓶颈;
        
    持久化:
        snapshotting
        AOF: Append Only File
    
    程序环境:
        配置文件:/etc/redis.conf
        主程序:/usr/bin/redis-server
                6379/tcp
        客户端:/usr/bin/redis-cli
        Unit File:/usr/lib/systemd/system/redis.service
        数据目录:/var/lib/redis
            
    redis:k/v
        key:直接ASCII字符串;
        value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
        
            To get help about Redis commands type:
                "help @<group>" to get a list of commands in <group>
                "help <command>" for help on <command>
                "help <tab>" to get a list of possible help topics
                "quit" to exit        
        
        group:
            @generic, @string, @list, @...
    redis为键值结构,key-value,value的类型如下        
    支持的数据结构:字符串、列表(数组)、字典(关联数组)、集合、有序集合、发布/订阅
    
        @generic
            DEL           删除
            EXISTS        存在
            KEYS          键
            TTL           生命周期
            MV            移动
            ...
            
        @string           字符串
            SET
            GET
            EXISTS
            INCR
            DECR
            SETNX          not exist
            SETEX          expire time
            INCRBYFLOAT
            MGET
            MSET
            
        @list               列表(数组)
            LPUSH           left push
            RPUSH           right push
            LPOP            lpush+lpop或rpush+rpop为栈
            RPOP            lpush+rpop或rpush+lpop为队列:message broker
            LPUSHX          LPUSH weekdays Sun Mon Wed Thu Fri Sat
            RPUSHX
            LRANGE
            LINDEX
            LSET
            
        @set                 集合
            SADD            SADD colors6 red green gray purple grape
            SPOP            SADD colors8 green yellow pink gray
            SREM            set remove
            SRANDMEMBER
            SINTER          SINTER colors6 colors8 交集
            SUNION          并集
            
        @sorted_set         有序集合
            ZADD
            ZCARD           查看
            ZCOUNT          ZADD city 100 beijing 99 shanghai 98 shenzhen
            ZRANK           ZSCORE city beijing  →  "100"
             ...
            
        @hash        字典(关联数组),每一个值都是key-value
            HSET
            HMSET     HMSET stu1 id 1 name dhy age 18
            HGET
            HMGET
            HKEYS
            HVALS
            HDEL
            HGETALL
            ...
            
            
            members -> {name:jerry, age:17,gender:Female}
                HKEYS
                HVALS
                
        @pubsub   publish,subscribe 发布/订阅
            PUBLISH         PUBLISH news xinwen
            SUBSCRIBE       SUBSCRIBE news
            UNSUBSCRIBE
            PSUBSCRIBE
            PUNSUBSCRIBE
            ...
            
        @geo
        
        @hyperloglog        
                                
回顾:

    分布式系统两个基础理论:CAP/BASE
        CAP:AP
            C、A、P:三者其中之二;
                AP:可用性、分区容错性、弱一致性;
        BASE:BA,S,E
            BA:基本可用、S:软状态、E:最终一致性;
            
    分布式系统:    
        分布式存储:
            NoSQL:
                kv、document、column families、GraphDB
            分布式文件系统:文件系统接口
                分布式存储:API,不能挂载;ceph, glusterfs, HDFS...                                    
            NewSQL:
                PingCAP:TiDB(MySQL protocol)...
        分布式运算:mapreduce, ...
            HADOOP=mapreduce+HDFS, HBase(Hadoop Database)
        
    redis:REmote DIctionary Server
        数据结构:String, List, Set, sorted_set, Hash, pubsub ...
        

Redis(2)

    C/S:
        C: redis-cli
        S: redis-server
    redis:
        database,cache,message broker

    redis-cli命令:
        Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
            
            -h HOST, 127.0.0.1
            -p PORT, 6379/tcp
            -a PASSWORD
            -n DBID
                0-15
            
        与Connection相关命令:
            help @connection            
            AUTH <password>
            ECHO <message>
            PING
            QUIT
            SELECT dbid
            
        清空数据库:
             FLUSHDB:Remove all keys from the current database
                清空当前数据库;
             FLUSHALL:Remove all keys from all databases
                清空所有数据库;

    配置和使用Redis:
        基本配置项
        网络配置项
        持久化相关配置
        复制相关的配置
        安全相关配置
        Limit相关的配置
        SlowLog相关的配置
        INCLUDES
        Advanced配置
    [root@cos7 ~ ]#grep -i "^###" /etc/redis.conf
    ############### INCLUDES ##########
    ############### NETWORK ##########
    ############### GENERAL ###########
    ############### SNAPSHOTTING  #####
    ############### REPLICATION ########
    ############### SECURITY ###########
    ############### LIMITS ##############
    ############### APPEND ONLY MODE #
    ############### LUA SCRIPTING  #####
    ############### REDIS CLUSTER  #####
    ############### SLOW LOG ##########
    ############### LATENCY MONITOR ###
    ############### EVENT NOTIFICATION #
    ############### ADVANCED CONFIG ###
    
        通用配置项:
            daemonize, supervised, loglevel, pidfile, logfile,
            databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
            切换数据库的方法:
                 SELECT <dbid>
                
        网络配置项:
            bind IP    如bind 0.0.0.0表示所有ip
            port PORT  6379
            protected-mode
            tcp-backlog
            unixsocket
            timeout:连接的空闲超时时长;
            
        安全配置:
            requirepass <PASSWORD>
            rename-command <COMMAND> <NEW_CMND_NAME>
                在AOF或Replication环境中,不推荐使用;
                
        Limits相关的配置:
            maxclients  最大客户端并发可达10000,取消注释
            maxmemory <bytes>
            
                OOM: Out Of Memory, 内核将自动杀死最“吃”内存资源的进程;
                    oom_score:
                    oom_adj:
            
            maxmemory-policy noeviction
                淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
             maxmemory-samples 5
                淘汰算法运行时的采样样本数;
                
        SlowLog相关的配置:慢查询日志
            slowlog-log-slower-than 10000
                单位是微秒;
            slowlog-max-len 128
                SlowLog记录的日志最大条目;
                
        ADVANCED配置:
            hash-max-ziplist-entries 512  
            hash-max-ziplist-value 64    
            
                设置ziplist的键数量最大值,每个值的最大空间;
            
            client-output-buffer-limit normal 0 0 0
            client-output-buffer-limit slave 256mb 64mb 60 硬限制,软限制,宽限期
            client-output-buffer-limit pubsub 32mb 8mb 60 可以在宽限期内超过软限制
                <hard-limit>
                <soft-limit>
                <soft-limit seconds>
                


    redis-cli命令:
            
        Server相关的命令:
             CLIENT GETNAME
             *CLIENT KILL
                CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
             *CLIENT LIST
             CLIENT PAUSE
                CLIENT PAUSE timeout
             CLIENT REPLY                
             CLIENT SETNAME:Set the current connection name
            
              SHUTDOWN [NOSAVE|SAVE]
              
             配置参数可运行时修改:
            
                CONFIG GET
                CONFIG RESETSTAT
                CONFIG REWRITE
                CONFIG SET
            
             INFO:服务器状态信息查看;分为多个secion;
                INFO [section]
            
    Redis的持久化:
        RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
            客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
                SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
                BGSAVE:异步;backgroud
        AOF:Append Only File, fsync(内核调用)
            记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
                BGREWRITEAOF:AOF文件重写;
                    不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;

                    
        RDB相关的配置:
            *save <seconds> <changes>
            
                save 900 1
                save 300 10
                save 60 10000  #60秒达到10000此变化,则记录快照
                save 5  200000
                
                表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;
                
            stop-writes-on-bgsave-error yes
                dump操作出现错误时,是否禁止新的写入操作请求;
                
            rdbcompression yes
            rdbchecksum yes
            
            dbfilename dump.rdb:指定rdb文件名
            *dir /var/lib/redis:rdb文件的存储路径
            
        AOF相关的配置
            *appendonly no
            appendfilename "appendonly.aof"
            
            *appendfsync
                Redis supports three different modes:
                    no:redis不执行主动同步操作,而是OS进行;
                    everysec:每秒一次;
                    always:每语句一次;
                    
            no-appendfsync-on-rewrite no
                是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;
                
            auto-aof-rewrite-percentage 100
            auto-aof-rewrite-min-size 64mb    
                上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB; 基于内存rewrite
                
            aof-load-truncated yes   执行一般的命令记录删除
            
        注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;
        
        RDB与AOF同时启用:
            (1) BGSAVE和BGREWRITEAOF不会同时进行;
            (2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;


       
    复制:
        特点:
            一个Master可以有多个slave主机,支持链式复制;
            Master以非阻塞方式同步数据至slave主机;
            
        配置slave节点:
            redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
            redis-cli> CONFIG SET masterauth <PASSWORD>
            
        配置参数:
            *slaveof
            *masterauth
            
            slave-serve-stale-data yes
            slave-read-only yes
            *repl-diskless-sync no
                no, Disk-backed, Diskless
                
                新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
                    Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
                    Diskless:主节点新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
            
            repl-diskless-sync-delay 5
            repl-ping-slave-period 10
            
            *repl-timeout 60
            
            repl-disable-tcp-nodelay no
            repl-backlog-size 1mb
            
            *slave-priority 100
                复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
            
            min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
            min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;


       
    sentinel:哨兵
        主要完成三个功能:监控、通知、自动故障转移
        
            master是否宕机:流言协议
            选举:投票协议
            
        配置项:
            port 26379
            sentinel monitor <master-name> <ip> <redis-port> <quorum>
            sentinel auth-pass <master-name> <password>
            
                <quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;
                    s_down: subjectively down
                    o_down: objectively down
            
            sentinel down-after-milliseconds <master-name> <milliseconds>
                监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
                
            sentinel parallel-syncs <master-name> <numslaves>
                指在failover过程中,能够被sentinel并行配置的从节点的数量;
                
            sentinel failover-timeout <master-name> <milliseconds>
                sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
                
            sentinel notification-script <master-name> <script-path>
                通知脚本,此脚本被自动传递多个参数;
                
            redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
                redis-cli>
                    SENTINEL masters
                    SENTINEL slaves <MASTER_NAME>
                    SENTINEL failover <MASTER_NAME>
                    SENTINEL get-master-addr-by-name <MASTER_NAME>


 
        redis单点失败:主从复制解决,但访问redis存在问题,当主宕机,从主机为主,存在地址变动,如果做keepalived的vip,则还需要通过脚本的权重判断飘到哪个主机,比较复杂

        redis集群如果做成主从复制,存在上述问题。如果做成多个节点,做成分布式,二级调度,则可解决问题。而    twitter是一级调度,即twitter当成代理,通过twitter代理到后端redis节点(代理分片机制),优点非常稳定,企业级方案,缺点:单点故障,需要依赖第三方软件,如keepalived,无法平滑扩展,没有后台界面,代理分片机制引入更多的来回次数并增大延迟,单核模式,无法充分利用多核,除非多实例,Twitter官方内部不在继续使用Twitter

        豌豆荚:codis,一个应用市场,代理分片机制,2014年11月开源,基于Go以及C语言开发,二级调度,善用多核,数据自动平衡,没有主从复制,没有paxos类协调机制,没有后台界面,比Twitter至少快一倍;缺点:代理分片机制引入更多的来回次数并增大延迟,需要第三方软件支持协调机制,目前支持Zookeeper及Etcd,不支持主从复制,需要另外实现,codis采用了Proxy的方案,必然带来单机性能的损失,经测试,在不经过pipeline的情况下,大概损失40%的性能

        redis内置集成分布式协调机制,通过select 选举出中心节点learder(拥有元数据,元数据不做分布式,数据做分布式)为无中心节点(所有节点都是中心节点)和中心节点(选举出一个中心节点),通过中心节点的元数据,语句路由出需要查找的数据在哪个节点,redis内置的是无中心节点分布式,旁路式:即客户端访问redis时,语句路由告诉客户端数据在按个节点,客户端自己再去访问那个节点,即迭代方式,称为smart client,能自动识别redis集群和节点,如芒果TV开发了一个Cerberus,本身实现了redis的smart client,而客户端只需要访问Cerberus即可

        二级节点:方便扩容,即对一个固定的数据做hash,如key对16384取模,0-16383,假如0-500为一个区域,称为分片shared,对应一个后端节点(存放数据);一级节点对key取模,二级节点存放数据,再扩容的时候,根据hash一致性原理,只需要从新分配极少的key对应的数据到新增扩容的后端节点,后端的每一个节点存在单点失败,可以做成主从

    CLuster:
        集群相关的配置:

            cluster-enabled 是否开启集群配置
            cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
            cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
            cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
            
        配置过程:
            (1) 设置配置文件,启用集群功能;
            (2) 启动redis后为每个节点分配slots;
                CLUSTER ADDSLOTS
                注意:每个slot要独立创建;可用范围是0-16383,共16384个;
                
                    redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
                    
                    0 5499
                    5500 10999
                    11000 16383
            (3) 设定集群成员关系;
                CLUSTE MEET
                
            (4) 获取集群状态
                CLUSTER INFO
                CLUSTER NODES
                
            
                
        

    redis的集群技术:
        客户端分片
        代理分片:
            豌豆荚:codis
            twitter:twemproxy  
        redis cluster
                        
                    
        
            (1) replication, sentinel,cluster
            (2) rdb, aof
            
        
            (1) codis
            (2) cerberus
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值