您的位置:首页 > 数据库 > Redis

redis原理及集群主从配置

2019-06-12 13:01 1311 查看

一、简介

  存储系统背景

    存储系统有三类:
    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...

  1、什么是redis

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

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

      

  2、特点:     

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

 

  3、性能

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

 

  4、持久化persistence

 

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

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

 

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

    

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

    Lists:
      LPUSH
      RPUSH
      LPOP
      RPOP
      LINDEX
      LSET

    Sets:
      SADD
      SINTER
      SUNION
      SPOP
      SISMEMBER

    Sorted Sets:
      ZADD
      ZRANGE
      ZCARD
      ZRANK

    Hashes:
      HSET
      HSETNX
      HGET
      HKEYS
      HVALS
      HDEL

    Bitmaps, HyperLogLog

 

  6、守护进程

    监听端口为6379/tcp

  7、数据库对比

 

    常见数据库功能对比

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

  

 

 

 

 

 

 

 

  

 

  8、简述和memcached之间的对比

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

    redis支持数据备份

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

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

  9、redis的master/slave复制:

      支持一个master多个slave

      slave可以介绍其他slave的链接来替代他链接master

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

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

     

  10、应用场景

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

    分布式集群架构中session分离

    聊天室在线好友列表

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

    应用排行

    网站访问统计

    数据统计

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

 

 

 

二、主从复制工作机制

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

  一主多从结构

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

  一个redis即可以是主也可以是从

 

三、多实例redis配置

  1、下载软件及安装源

    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

  2、安装有两种安装方式

    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

 

  3、编译安装及启动

    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了

 

   

    

四、主从配置

  1、配置从服务器

   redis主从配置非常简单,只需要把从服务器改一个配置即可

   vim redis.conf

 

slaveof 192.168.216.51 6379

  2、启动服务

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

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

[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>

 

 

转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/10743476.html 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: