redis原理及集群主从配置

1、简介

  存储系统背景

    存储系统有三类:
    RDBMS
      oracle,dh2,postgresql,mysql,sql server
    NoSQL:
      KV NoSQL:redis,memcached
      列式Column Family NoSQL: HBase,每一行每一字段能够保留n份,也是按照字段存储
      文档Documentation NoSQL: MongoDB
      图式Graph NoSQL: Neo4j

    NewSQL
      aerospike,foundationDB,rethinkDB...html

  一、什么是redis

    redis是一个开源的使用ANSI C 语言编写、支持网络、可基于内存便可持久化的日志型,key-value数据库(是一个key-value存储系统),支持多种语言的APImysql

    它是一个高级key-value数据库,跟memcached相似,可是redis的数据能够持久化,而且支持数据类型更丰富,同时还支持服务端的计算集合的并、交、和补集等,支持多种排序功能。  nginx

      

  二、特色:     

    经常使用来和memcache作比较,但redis是nosql,基于key-value(键值)的数据结构的存储,能够存储键值,字典,图表
    彻底工做在内存中,数据保存在内存,性能不错,数据周期性备份到硬盘,(持久化)的单线程服务器
    能够经过lua脚本扩展
    支持sentinel主从架构高可用
    分布式  web

 

  三、性能

    虽然是单线程,kv是一个单纯简单的存储cpu一般不会造成瓶颈的,官方测试50个并发请求10w次,写的速度是110000次/s,读的速度是81000次/s,读写大小为256bytes的字符串; redis

 

  四、持久化persistence

 

    RDB: snapshot,二进制格式;按事先定制的策略,周期性地将数据保存至磁盘;数据文件默认为dump.rdb;
      客户端也可显式使用SAVA或BGSAVE命令启动快照保存机制;
      SAVE: 同步,在主线程中保存快照;此时会阻塞全部客户端请求;
      BGSAVE:异步,
    AOF:Append Only File
      记录每一次写操做至指定的文件尾部实现持久化;当redis重启时,可经过从新执行文件中的命令在内存重建数据库;
      BGREWRITEAOF:AOF文件重写;
      不会读取正在使用AOF文件,而经过将内存中的数据以命令的方式保存到临时文件中,完成以后替换原来的AOF文件;sql

  五、是一个数据结构服务器它支持的value类型有:

 

    String字符串, List链表, Hash哈希, Set集合, Sorted Set有序集合, Bitmap, HyperLoglogmongodb

    

    Strings:
      SET key value [EX #] [NX|XX]
      GET
      INCR
      DECR
      EXIST数据库

    Lists:
      LPUSH
      RPUSH
      LPOP
      RPOP
      LINDEX
      LSETvim

    Sets:
      SADD
      SINTER
      SUNION
      SPOP
      SISMEMBER缓存

    Sorted Sets:
      ZADD
      ZRANGE
      ZCARD
      ZRANK

    Hashes:
      HSET
      HSETNX
      HGET
      HKEYS
      HVALS
      HDEL

    Bitmaps, HyperLogLog

 

  六、守护进程

    监听端口为6379/tcp

  七、数据库对比

 

    常见数据库功能对比

名称 数据库类型 数据存储选项 操做类型 备注
redis 内存存储,nosql数据库 支持字符串、列表、集合、散列标、有序集合 增、删、修改、更新 支持分布式存储,主从同步及高可用,单线程
memcached 内存缓存数据库 键值之间得映射 增、删、修改、更新 支持多线程
mysql 典型关系数据库,RDBMS 数据库由多表组成,每张表包含多行 增、删、修改、更新 支持ACID性质
postgresql 典型关系数据库,RDBMS 数据库由多表组成,每张表包含多行 增、删、修改、更新 支持ACID性质
mongodb 硬盘存储,nosql数据库 数据库包含多个表 增、删、修改、更新 主从复制,分片,副本集、空间索引

  

 

 

 

 

 

 

 

  

 

  八、简述和memcached之间的对比

    redis不只仅支持简单的kv类型数据,还支持list,set,hash等数据结构

    redis支持数据备份

    redis支持数据持久化,能够将内存中的数据保持在磁盘中,重启的时候能够在加载使用

    集群,memcache不支持集群,多台memcache 共处

  九、redis的master/slave复制:

      支持一个master多个slave

      slave能够介绍其余slave的连接来替代他连接master

      复制在master是非阻塞的,在slave是阻塞的

      复制被利用来提供扩展性,在slave端只提供查询功能及数据的冗余

     

  十、应用场景

    缓存(数据查询,短链接、新闻内容、商品内容等)

    分布式集群架构中session分离

    聊天室在线好友列表

    任务队列(秒杀、抢购、12306)

    应用排行

    网站访问统计

    数据统计

为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案

 

 

 

2、主从复制工做机制

   redis持久化解决了redis服务重启后可以将硬盘的持久化数据恢复到内存中,但当redis服务器硬盘坏掉就会致使数据丢失,为了不这种单点故障就有了主从复制工做机制

  一主多从结构

  主从复制不会阻塞master,在同步数据时,master能够继续处理client请求

  一个redis便可以是主也能够是从

 

3、多实例redis配置

  一、下载软件及安装源

    http://download.redis.io/releases/redis-5.0.4.tar.gz

    若是源码安装下载源码

    若是yum安装请配置源

      rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

  二、安装有两种安装方式

    1)、yum安装

      直接yum install redis

      systemctl enable redis

      systemctl start redis

 

Dependencies Resolved    #一些依赖

====================================================================================================================
 Package                    Arch                     Version                           Repository              Size
====================================================================================================================
Installing:
 redis                      x86_64                   3.2.12-2.el7                      epel                   544 k
Installing for dependencies:
 jemalloc                   x86_64                   3.6.0-1.el7                       epel                   105 k

Transaction Summary
====================================================================================================================
Install  1 Package (+1 Dependent package)




Complete!
[root@web1 ~]# systemctl start redis
[root@web1 ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

[root@web1 ~]# netstat -untlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2050/nginx: master  
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2176/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      879/cupsd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2035/master         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::80                   :::*                    LISTEN      2050/nginx: master  
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
tcp6       0      0 ::1:631                 :::*                    LISTEN      879/cupsd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      2035/master         
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           574/avahi-daemon: r 
udp        0      0 127.0.0.1:323           0.0.0.0:*                           2334/chronyd        
udp        0      0 0.0.0.0:52822           0.0.0.0:*                           574/avahi-daemon: r 
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2176/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2176/dnsmasq        
udp        0      0 0.0.0.0:177             0.0.0.0:*                           890/lightdm         
udp6       0      0 ::1:323                 :::*                                2334/chronyd        
udp6       0      0 :::177                  :::*                                890/lightdm         
[root@web1 ~]# 

 

    2)、编译安装

      解压-->编译-->copy-->启动

     

   此次编译安装一个新版本

      mkdir /data

      cd /data

      #上传下载的包到此目录

        redis-5.0.4.tar.gz

      tar redis-5.0.4.tar.gz
      cd rredis-5.0.4
      make 

 

  三、编译安装及启动

    1)建立文件夹及拷贝关键文件

     mkdir /data/redis2

   cp redis.conf /data/redis2

   cp src/redis-server /data/redis2

   cd /data/redis2/       

    2)编辑配置文件

     由于有#号开的行能够先过滤掉

      sed -ri '/#|^$/d' redis.conf

     开始编辑配置文件,修改下面几项

       vim redis.conf   

port 6380      //监听端口
appendonly no  yes //日志开关,不是包报错的日志,是二进制,记录数据变化
pidfile /var/run/redis_6380.pid  //pid名字 logfile "/data/redis2/redis.log" //log日志 daemonize yes //后台启动   
dbfilename dump.rbd  //持久化数据文件     

    3)启动

      标红的就是一个yum安装的实例,一个编译安装的实例,这个就是多实例了

[root@web1 redis2]# ./redis-server ./redis.conf 
[root@web1 redis2]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 192.168.216.51:6380 0.0.0.0:* LISTEN 15434/./redis-serve 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2050/nginx: master  
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2176/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      875/sshd            
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      879/cupsd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2035/master         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::80                   :::*                    LISTEN      2050/nginx: master  
tcp6       0      0 :::22                   :::*                    LISTEN      875/sshd            
tcp6       0      0 ::1:631                 :::*                    LISTEN      879/cupsd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      2035/master         
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           574/avahi-daemon: r 
udp        0      0 127.0.0.1:323           0.0.0.0:*                           2334/chronyd        
udp        0      0 0.0.0.0:52822           0.0.0.0:*                           574/avahi-daemon: r 
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2176/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2176/dnsmasq        
udp        0      0 0.0.0.0:177             0.0.0.0:*                           890/lightdm         
udp6       0      0 ::1:323                 :::*                                2334/chronyd        
udp6       0      0 :::177                  :::*                                890/lightdm         
[root@web1 redis2]# 

 

 

 

    4)变量,赋值取值,正常关闭,非正常的关闭

[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6380 
192.168.216.51:6380> 
192.168.216.51:6380> 
192.168.216.51:6380> 
192.168.216.51:6380> set home zxg  //赋值
OK192.168.216.51:6380> get home    //取值 "zxg"
192.168.216.51:6380> get abc 123
(error) ERR wrong number of arguments for 'get' command
192.168.216.51:6380> set abc 123 
OK
192.168.216.51:6380> get abc
"123"192.168.216.51:6380> KEYS *    //查看全部的key
1) "abc"
2) "home"
192.168.216.51:6380> 
192.168.216.51:6380> SHUTDOWN  //正常关闭,非正常关闭就是kill了

 

   

    

4、主从配置

  一、配置从服务器

   redis主从配置很是简单,只须要把从服务器改一个配置便可

   vim redis.conf

 

slaveof 192.168.216.51 6379

  二、启动服务

[root@web2 ~]# systemctl start redis
[root@web2 ~]# systemctl enable redis

  三、查看主从状态测试结果

[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6379
192.168.216.51:6379>  info replication 
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.216.52,port=6379,state=online,offset=99,lag=0
master_repl_offset:99
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:98
192.168.216.51:6379> 

 

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.216.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:253
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>

注意1:从服务器只读

    

    master新建key test zxg

192.168.216.51:6379> set test zxg
OK
192.168.216.51:6379> get test
"zxg"
192.168.216.51:6379> 

    slave查看有没有值

127.0.0.1:6379> get test
"zxg"
127.0.0.1:6379> 

 

 

转载请注明出处:http://www.javashuo.com/article/p-zpxrpnnd-k.html 

相关文章
相关标签/搜索