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 

相關文章
相關標籤/搜索