redis原理及集群主從配置


一、簡介

  存儲系統背景

    存儲系統有三類:
    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 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM