redis原理及叢集主從配置

樂章發表於2019-06-12

一、簡介

  儲存系統背景

    儲存系統有三類:
    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)編輯配置檔案

       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)啟動

[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 

 

 

相關文章