美文网首页玩转大数据
(十七)大数据学习之内存数据库

(十七)大数据学习之内存数据库

作者: Movle | 来源:发表于2019-11-23 21:52 被阅读0次

    内存数据库

    一.内存数据库

    1.为什么要把数据存入内存?

    2.常见的内存数据库:
    (1)MemCached:看成Redis前身,严格来说,MemCached不能叫数据库,只能叫缓存

    • 不支持持久化。如果内存停电,数据丢失

    (2)Redis:内存数据库,支持持久化,支持HA

    (3)Oracle TimesTen
    session一致性
    MemCached + keepalive实现

    二.Memcached

    1.基本原理和体系架构
    (1)在内存中,维护了一张巨大的Hash表
    (2)通过路由算法来决定数据存储的位置。---> 客户端路由

    2.安装配置MemCached
    前提:
    (1)gcc编译器

    cd /opt/module
    
    yum install gcc   //安装
    
    gcc --version    //查看版本
    
    image.png

    (2)libevent库
    a.下载
    b.上传到linux:/opt/software
    c.解压

    cd /opt/software
    
    tar -zxvf libevent-2.0.21-stable.tar.gz -C /opt/module
    

    d.

    cd /opt/module/libevent-2.0.21-stable
    
    ./configure --prefix=/opt/module/libevent    //输入命令
    
    
    image.png
    make         //输入命令
    
    image.png
    make install   //输入命令
    
    image.png

    (3)安装memchched
    a.下载
    b.上传到linux:/opt/software
    c.解压

    cd /opt/software
    
    tar -zxvf memcached-1.4.25.tar.gz -C /opt/module
    

    d.

     
    cd /opt/module/memcached-1.4.25
    
    ./configure --prefix=/opt/module/memcached --with-libevent=/opt/module/libevent     //输入命令
    
    

    e.

    make      //输入命令
    

    f.

    make install     //输入命令
    

    安装完毕
    (4)启动?

    cd /opt/module/memcached/bin
    
    ./memcached -u root -d -m 128 -p 11211
    ./memcached -u root -d -m 128 -p 11212
    ./memcached -u root -d -m 128 -p 11213
    ps -ef | grep memcached
    
    image.png

    3.操作MemCached
    (1)命令行

    telnet 192.168.109.133 11211    
    //保存数据:
    set 如果key存在,替换原来的值
    add 如果key存在,返回错误
                
    set key1       0         0                       4
    //key名字   标识位  数据过期时间0表示不过期        value的长度
    abcd
                
    get key1
    //统计命令
    stats items
    stats
    

    4.MemCached路由算法

    二.Redis

    1.redis简介
    (1)Redis的前身:Memcached
    (2)和Memcached区别

    • 支持持久化:RDB快照、AOF日志
    • 支持丰富的数据类型
      2.安装Redis
      (1)下载
      (2)上传到linux
      (3)解压
    cd /opt/software
    
    tar -zxvf redis-3.0.5.tar.gz -C /opt/module
    

    (4)编译:

    cd /opt/module/redis-3.0.5
    
    make        //编译
    
    image.png

    (5)安装

    cd /opt/module/redis-3.0.5
    
    make PREFIX=/opt/module/redis install      //安装
    
    image.png

    (6)文件介绍

    • redis-benchmark Redis提供的压力测试工具。模拟产生客户端的压力
    • redis-check-aof 检查aof日志文件
    • redis-check-dump 检查rdb文件
    • redis-cli Redis客户端脚本
    • redis-sentinel 哨兵
    • redis-server Redis服务器脚本

    (7)修改核心配置文件:redis.conf
    a.新建conf目录

    cd /opt/module/redis
    
    mkdir conf
    

    b.移动redis.conf

    cd /opt/module/redis-3.0.5
    
    cp redis.conf /opt/module/redis/conf
    
    image.png

    c.修改redis.conf

    daemonize yes        //是否后台启动
    port 6379
    
    logfile "/opt/module/redis/logs/redis.log" 
    
    image.png

    d.启动redis

    cd /opt/module/redis
    
    bin/redis-server conf/redis.conf
    
    image.png

    3.操作Redis
    (1)命令行

    redis-cli   
    ./bin/redis-cli
                
    127.0.0.1:6379> set key1 value1
    OK
    127.0.0.1:6379> get key1
    "value1"
    127.0.0.1:6379> keys *
    1) "key1"
    
    //对数据的操作:
    127.0.0.1:6379> set money 100
    OK
    127.0.0.1:6379> incr money
    (integer) 101
    127.0.0.1:6379> get money
    "101"
    127.0.0.1:6379> incrby money 1000
    (integer) 1101
    

    (2)Java Api

    4.Redis的事务:不是真正的事务,是一种模拟
    (1)复习:事务(关系型数据库)
    a.什么是事务?

    • 事务有一组DML语句组成。DML 插入更新删除操作
      b.事务的特点
    • 要么都成功,要么都失败

    c.Oracle中事务的本质:将事务的DML操作写入日志。日志写入成功,则事务执行成功。

    (2)Redis事务的本质:将一组操作放入队列中,一次执行(批处理)。

    (3)对比Oracle和Redis事务的区别

                                    Oracle                                      Redis
                开启事务:           自动开启                                    命令:multi
                执行语句:           DML                                         Redis命令
                提交事务:   显式提交:commit 隐式提交:DDL语句(create table)    命令:exec 执行放在multi里面的操作
                回滚事务:   显式回滚:rollback  隐式回滚:系统掉电,客户端退出  命令:discard命令  把队列中的操作废弃掉
                注意:不是真正的事务,只是一种模拟。
    

    (4)举例:模拟银行转账

    set tom 1000
    set mike 1000
    tom --> mike 转账操作必须在事务中,要么都成功,要么都不成功
    multi
    decrby tom 100
    incrby mike 100
    exec
                
    127.0.0.1:6379> set tom 1000
    OK
    127.0.0.1:6379> set mike 1000
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby tom 100
    QUEUED
    127.0.0.1:6379> incrby mike 100
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 900
    2) (integer) 1100
    

    (5)举例:买票

    set tom 1000
    set ticket 1
    multi
    decrby tom 500
    decr ticket
    exec
    
    //在exec前,从另一个窗口,decr ticket
    127.0.0.1:6379> set tom 1000
    OK
    127.0.0.1:6379> set ticket 1
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby tom 500
    QUEUED
    127.0.0.1:6379> decr ticket
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 500
    2) (integer) -1
    

    5.Redis锁机制:执行事务操作的时候,如果监视的值发生了变化,则提交失败。
    (1)命令:watch

    //举例:买票
    set tom 1000
    set ticket 1
    watch ticket -----> 相当于给ticket加了锁。认为在下面执行事务的时候,值不会变。
    multi
    decrby tom 500
    decr ticket
    exec
            
    127.0.0.1:6379> set tom 1000
    OK
    127.0.0.1:6379> set ticket 1
    OK
    127.0.0.1:6379> watch ticket
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> decrby tom 500
    QUEUED
    127.0.0.1:6379> decr ticket
    QUEUED
    127.0.0.1:6379> exec
    (nil)
    127.0.0.1:6379> get tom
    "1000"
    
    • nil 代表操作没有执行或者执行失败。

    6.Redis的消息机制:消息系统
    (1)消息的类型

    • Queue消息:队列,点对点。
    • Topic消息:主题,群发:发布消息,订阅消息

    (2)Redis消息机制:

    • 只支持Topic消息。

    (3)命令:

    • 发布消息 publish
    • 订阅:subscribe
    • psubscribe 订阅消息 可以用通配符来订阅消息

    (4)常用的消息系统:

    • Redis 只支持 Topic
    • Kacka 只支持Topic 需要Zookeeper支持。
    • JMS Java Messging Service java消息服务标准。支持Queue Topic
    • 产品:Weblogic

    7.Redis持久化

    • 本质:备份和恢复
      (1)RDB快照:默认
    • 看成一种快照,备份。每隔段时间,将内存汇总的数据保存到硬盘上。产生RDB文件。
    • RDB 生成策略:
    save 900 1       900秒内,有1个key发生变化
    save 300 10      300内,如果有10个key发生变化,执行RDB
    save 60 10000    60秒内,如果有10000个key发生变化,执行RDB                
    save 时间 发生变化的key的个数
    
    • 其他参数
    stop-writes-on-bgsave-error yes  当后台写进程出错时,禁止写入新的数据
                    
    rdbcompression yes      是否压缩。如果看重性能,设置成no
    //压缩会节省空间,但会影响备份和恢复性能
                        
    dbfilename dump.rdb
    dir ./
    
    • RDB的优点和缺点
      优点:快 恢复速度快
      缺点:在两次RDB之间,可能会造成数据的丢失。
      解决:AOF

    (2)AOF日志
    客户端在操作Redis时,把操作记录到文件中,如果发生崩溃,读取日志,把操作完全执行一遍。

    • 默认是禁用。
    appendonly no  参数修改成yes
    
    • AOF记录策略
    # appendfsync always        //每个操作都记录日志:优点安全 缺点:慢
    appendfsync everysec
    # appendfsync no            //由操作系统来决定记录日志的方式。不会用的到。
    
    • AOF日志重写:overwrite
    //举例:
    set money 0
    incr money
    ..100次              
    set money 100               
    ./redis-benchmark -n 100000   
    模拟客户端100000次请求
    
    • 参数设置
    no-appendfsync-on-rewrite no   执行重写的时候,不写入新的日志
    auto-aof-rewrite-min-size 64mb  执行重写的文件大小。到64M触发重写。
    

    (3)当两个同时存在时,优先执行哪个?

     # If the AOF is enabled on startup Redis will load the AOF, that is the file
     # with the better durability guarantees.
                
    AOF开启时,优先使用AOF
    

    8.Redis的主从复制

    (1)Redis主从复制集群:
    作用:

    • 主从复制,主从备份,防止主节点down机
    • 任务分离:分摊主节点压力。读写分离。

    (2)Memcacached 主主复制
    (3)Redis 主从复制

    (4)Redis集群两种部署方式

    • 星型模型:
      优点:效率高,两个slave地位一样,可以直接从主节点取出信息
      缺点:HA比较麻烦
    • 线性模型:
      优点:HA简单
      缺点:效率不如星型模型
    cp redis.conf redis6379.conf 
    cp redis.conf redis6380.conf 
    cp redis.conf redis6381.conf 
                
    主节点:关闭rdb aof
    appendonly no
    #save 900 1
    #save 300 10
    #save 60 10000
                
    从节点
    改端口号 
    50 port 6380
    改aof rdb文件名:
    dbfilename dump6380.rdb
    appendfilename "appendonly6380.aof"
    slaveof 192.168.109.133 6379
                
    [root@node3 redis]# ./bin/redis-server ./conf/redis6379.conf 
    [root@node3 redis]# ./bin/redis-server ./conf/redis6380.conf 
    [root@node3 redis]# ./bin/redis-server ./conf/redis6381.conf 
                
    [root@node3 redis]# ps -ef | grep redis
    root      4830     1  1 22:56 ?        00:00:00 ./bin/redis-server *:6379               
    root      4834     1  2 22:56 ?        00:00:00 ./bin/redis-server *:6380               
    root      4840     1  2 22:56 ?        00:00:00 ./bin/redis-server *:6381               
    root      4846  1378  0 22:56 pts/1    00:00:00 grep redis
    [root@node3 redis]# ./bin/redis-cli -p 6379
    127.0.0.1:6379> set tom 10000
    OK
    127.0.0.1:6379> quit
    [root@node3 redis]# ./bin/redis-cli -p 6380
    127.0.0.1:6380> get tom
    "10000"         
    //默认情况下,从节点只读。
                
    注意:一次性启动从节点不要太多。
    

    9.Redis的分片
    多个从节点分摊读的压力
    客户端代理分片工具:Twemproxy

    //解压
    ./config --prefix=.....
    cp /usr/local/nutcracker-0.3.0/conf/nutcracker.yml ./conf/
                
    //修改server信息
                
    //检查配置文件是否正确
    ./sbin/nutcracker -t conf/nutcracker.yml
                
    启动代理分片
    ./sbin/nutcracker -d -c conf/nutcracker.yml
                
    ./bin/redis-cli -p 22121 访问
    

    10.Redis的HA(哨兵机制)
    (1)主从结构,存在单点故障问题。
    redis2.4版本之后有
    redis-sentinel 就是哨兵

    //配置:   
    cp /usr/local/redis-3.0.5/sentitinel.conf ./conf/
            
    vim sentitinel.conf 
            
    53 sentinel monitor mymaster 192.168.109.134 6379 1
            
    bin/redis-sentinel conf/sentinel.conf
    //看日志:
    10429:X 17 Apr 18:03:35.817 # +monitor master mymaster 192.168.109.134 6379 quorum 1
    10429:X 17 Apr 18:03:36.820 * +slave slave 192.168.109.134:6380 192.168.109.134 6380 @ mymaster 192.168.109.134 6379
    10429:X 17 Apr 18:03:36.836 * +slave slave 192.168.109.134:6381 192.168.109.134 6381 @ mymaster 192.168.109.134 6379
    
    //kill master 检测到
            
    看日志:
    try-failover master mymaster 192.168.109.134 6379
            检测到6379挂了
            
    selected-slave slave 192.168.109.134:6380 192.168.109.134 6380 @ mymaster 192.168.109.134 6379
    select slave 选举新的主节点
            
    slave slave 192.168.109.134:6381 192.168.109.134 6381 @ mymaster 192.168.109.134 6380
            把其他的从节点连接到主节点上
    

    相关文章

      网友评论

        本文标题:(十七)大数据学习之内存数据库

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