linux--redis學習

redis

redis在linux的安裝

1.redis安裝方式
    yum安裝(提早配置好yum源)
    yum install  redis -y  #
    源代碼編譯安裝
    rpm包手動安裝
    
    
2.編譯安裝redis 
    建立一個文件夾,存redis(也能夠不用建立)
        mkdir linux_redis
        cd linux_redis
    1.在redis目錄下,下載redis源代碼包
        wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    2.解壓縮redis源碼包
    
    3.編譯三部曲 
        指定安裝路徑 ,生成makefile 編譯文件 
            ./configure --prefix=redis的安裝路徑
        開始編譯
            make
        編譯安裝
            make install  
        編譯完成後,默認生成可以使用的redis命令
            /usr/local/bin/redis-server     
    4.修改redis的配置文件,支持更安全的啓動方式
        vim redis.conf 
        
    #打開redis密碼的參數
        requirepass 123456789
    #開啓安全模式
        protected-mode yes
    #修改redis的默認啓動端口,以及綁定地址
        bind 0.0.0.0
        port 6800

        
    #過濾出非空行,註釋行的內容,重定向寫入到一個文件中
     grep  -v "^$"  redis.conf |grep  -v "^#"  > linuxredis.conf
    #在配置文件結尾加上後臺啓動參數
    daemonize  yes

    5.啓動redis服務端
     redis-server linuxredis.conf 

    6.驗證redis是否啓動
        netstat -tunlp |grep  redis
        ps -ef|grep redis 
        
    7.指定密碼登陸redis
        [root@localhost redis-5.0.7]# redis-cli -p 6800
        127.0.0.1:6800> ping
        (error) NOAUTH Authentication required
        127.0.0.1:6800> auth 123456789
        OK
        127.0.0.1:6800> ping
        PONG

redis經常使用命令

redis的數據類型

字符串(strings)
哈希(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)

命令練習

基礎命令

keys *         查看全部key
type key      查看key類型
expire key seconds    過時時間
ttl key     查看key過時剩餘時間        -2表示key已經不存在了
persist     取消key的過時時間   -1表示key存在,沒有過時時間

exists key     判斷key存在    存在返回1    不然0
del keys     刪除key    能夠刪除多個
dbsize         計算key的數量

strings類型數據相關命令

set   設置key
get     獲取key
append  追加string
mset    設置多個鍵值對
mget    獲取多個鍵值對
del     刪除key
incr    遞增+1
decr    遞減-1



127.0.0.1:6800> set name 'bajie' #設置key

127.0.0.1:6800> get name   #獲取key的值
"bajie"

127.0.0.1:6800> set name 'pig'   #覆蓋key
OK
127.0.0.1:6800> get name
"pig"

127.0.0.1:6800> APPEND name 'dsb'  #追加key的string ,不區分大小寫
(integer) 6
127.0.0.1:6800> get name
"pigdsb"

127.0.0.1:6800> mset name1 'monkey' name2 'tangseng' #設置多個鍵值對
OK
127.0.0.1:6800> keys *
1) "name2"
2) "name1"
3) "name"

127.0.0.1:6800> mget name name1 name2  #獲取多個value
1) "pigdsb"
2) "monkey"
3) "tangseng"

127.0.0.1:6800> del name2   #刪除key
(integer) 1  #刪除一個不存在的key,結果爲nil
127.0.0.1:6800> keys *
1) "name1"
2) "name"

127.0.0.1:6800> set num 10
OK
127.0.0.1:6800> get num
"10"
#string類型實際上不只僅包括字符串類型,還包括整型,浮點型。redis可對整個字符串或字符串一部分進行操做,而對於整型/浮點型可進行自增、自減操做。
127.0.0.1:6379> incr num    #給num string 加一 INCR 命令將字符串值解析成整型,將其加一,最後將結果保存爲新的字符串值,能夠用做計數器
(integer) 11
127.0.0.1:6800> get num  
"11"
127.0.0.1:6800> decr num      #遞減1  
(integer) 10
127.0.0.1:6800> decr num    #遞減1
(integer) 9
127.0.0.1:6800> get num
"9"

hashes哈徐數據相關命令

哈希結構就是  k1   ->  k1 : v1     如同字典 套字典  { k1 : { k2: v2 }  }   ,取出v2 必須  k1,取出k2

hashes即哈希。哈希是從redis-2.0.0版本以後纔有的數據結構。

hashes存的是字符串和字符串值之間的映射,好比一個用戶要存儲其全名、姓氏、年齡等等,就很適合使用哈希。

    hset 設置散列值
    hget  獲取散列值
    hmset  設置多對散列值
    hmget  獲取多對散列值
    hsetnx   若是散列已經存在,則不設置(防止覆蓋key)
    hkeys     返回全部keys
    hvals     返回全部values
    hlen      返回散列包含域(field)的數量
    hdel     刪除散列指定的域(field)
    hexists    判斷是否存在
127.0.0.1:6800> hset news title 'first news title'
(integer) 1
#設置第一條新聞 news的id爲1,添加數據title的值是"first news title"

127.0.0.1:6800> hset news content 'first news content'
(integer) 1 
#添加一個conntent內容

127.0.0.1:6800> hget news title  #獲取new的標題
"first news title"

127.0.0.1:6800> hget news content  #獲取new的內容
"first news content"

127.0.0.1:6800> hmget news title content  #獲取news的標題和內容
1) "first news title"
2) "first news content"

127.0.0.1:6800> hmset news1 title 'second news title' content 'second content'
OK
127.0.0.1:6800> hmget news1 title content
1) "second news title"
2) "second content"
#分別同時設置標題和內容並獲取標題和內容

127.0.0.1:6800> hkeys news  #獲取news的key
1) "title"
2) "content"

127.0.0.1:6800> hvals news  #獲取news的值
1) "first news title"
2) "first news content"

127.0.0.1:6800> hlen news  #獲取news的長度
(integer) 2

127.0.0.1:6800> hdel news title  #刪除news的標題title
(integer) 1
127.0.0.1:6800> hlen news  #檢查一下長度
(integer) 1

127.0.0.1:6800> HEXISTS news title   #判斷news中是否有title,不存在返回0,存在返回1
(integer) 0

lists列表相關命令

lpush           從列表左邊插
rpush           從列表右邊插
lrange          獲取必定長度的元素  lrange key  start stop
ltrim           截取必定長度列表
lpop            刪除最左邊一個元素
rpop            刪除最右邊一個元素
lpushx/rpushx   key存在則添加值,不存在不處理

127.0.0.1:6800> lpush users 'bajie' 'monkey' 'tagnseng'  #新建一個users,從左邊放入三個元素
(integer) 3  

127.0.0.1:6800> llen users #查看users長度
(integer) 3

127.0.0.1:6800> lrange users 0 -1  #查看users全部元素
1) "tagnseng"
2) "monkey"
3) "bajie"

127.0.0.1:6800> rpush users 'shasha' #從右邊插入shasha
(integer) 4
127.0.0.1:6800> lrange users 0 -1 #查看users的全部元素
1) "tagnseng"
2) "monkey"
3) "bajie"
4) "shasha"

127.0.0.1:6800> lpop users  #刪除左邊第一個元素
"tagnseng"
127.0.0.1:6800> lrange users 0 -1
1) "monkey"
2) "bajie"
3) "shasha"

127.0.0.1:6800> rpop users   #刪除右邊第一個元素
"bajie"

sets集合相關命令

redis的集合,是一種無序的集合,集合中的元素沒有前後順序。

集合相關的操做也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。咱們來看例子:

    sadd/srem         添加/刪除 元素
    sismember         判斷是否爲set的一個元素
    smembers          返回集合全部的成員
    sdiff             返回一個集合和其餘集合的差別
    sinter            返回幾個集合的交集
    sunion            返回幾個集合的並集
127.0.0.1:6800> sadd class bajie monkey  #添加集合,有三個元素,不加引號就當作字符串處理
(integer) 2

127.0.0.1:6800> SMEMBERS class  #查看集合class成員
1) "monkey"
2) "bajie"

127.0.0.1:6800> srem class monkey  #刪除class的monkey
(integer) 1
127.0.0.1:6800> SMEMBERS class
1) "bajie"


127.0.0.1:6800> SISMEMBER class bajie  
(integer) 1
127.0.0.1:6800> SISMEMBER class monkey
(integer) 0
127.0.0.1:6800> 
#返回改是不是class的成員信息,不存在返回0,存在返回1

127.0.0.1:6800> sadd class monkey #再把monkey加入class
(integer)  1
 
127.0.0.1:6800> sadd class2 bajie shasha  #添加新集合zoo2
(integer) 2
127.0.0.1:6800> SMEMBERS class2
1) "shasha"
2) "bajie"

127.0.0.1:6800> sdiff class class2 #找出集合class中有的,而class2中沒有的元素
1) "monkey"

127.0.0.1:6800> sdiff class2 class   #找出集合class2中有的,而class中沒有的元素
1) "shasha"

127.0.0.1:6800> sinter class class2 #找出class和class2的交集,都有的元素
1) "bajie"

127.0.0.1:6800> SUNION class class2  #找出class和class2的並集,全部的不重複的元素
1) "shasha"
2) "bajie"
3) "monkey"

sorted sets有序集合相關命令

都是以z開頭的命令

zset的每個成員都有一個分數與之對應,而且分數是能夠重複的。有序集合的增刪改因爲有啦排序,執行效率就是很是快速的,即使是訪問集合中間的數據也是很是高效的。

用來保存須要排序的數據,例如排行榜,成績,工資等。
利用有序集合的排序,排序學生的成績
127.0.0.1:6800> ZADD class_test 70 'bajie'
(integer) 1
127.0.0.1:6800> ZADD class_test 80 'monkey'
(integer) 1
127.0.0.1:6800> ZADD class_test 75 'shasha'
(integer) 1
127.0.0.1:6800> ZADD class_test  99 'tangseng'
(integer) 1

排行榜,zreverange 倒敘 zrange正序前端

127.0.0.1:6800> ZREVRANGE class_test 0 -1 withscores
1) "tangseng"
2) "99"
3) "monkey"
4) "80"
5) "shasha"
6) "75"
7) "bajie"
8) "70"

127.0.0.1:6800> ZRANGE class_test 0 -1 withscores
1) "bajie"
2) "70"
3) "shasha"
4) "75"
5) "monkey"
6) "80"
7) "tangseng"
8) "99"

移除有序集合class_test中的成員,bajie給移除掉node

127.0.0.1:6800> ZREM class_test bajie
(integer) 1
127.0.0.1:6800> ZRANGE class_test 0 -1 withscores
1) "shasha"
2) "75"
3) "monkey"
4) "80"
5) "tangseng"
6) "99"

返回有序集合class_test的基數python

127.0.0.1:6800> ZCARD class_test 
(integer) 3

返回成員的score值linux

127.0.0.1:6800> ZSCORE class_test monkey
"80"

redis發佈訂閱

Redis 經過 PUBLISH 、 SUBSCRIBE 等命令實現了訂閱與發佈模式。redis

PUBLISH channel msg
    將信息 message 發送到指定的頻道 channel

SUBSCRIBE channel [channel ...]
    訂閱頻道,能夠同時訂閱多個頻道

UNSUBSCRIBE [channel ...]
    取消訂閱指定的頻道, 若是不指定頻道,則會取消訂閱全部頻道
PSUBSCRIBE pattern [pattern ...]
    訂閱一個或多個符合給定模式的頻道,每一個模式以 * 做爲匹配符,好比 it* 匹配所    有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配全部    以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
    退訂指定的規則, 若是沒有參數則會退訂全部規則
PUBSUB subcommand [argument [argument ...]]
    查看訂閱與發佈系統狀態
注意:使用發佈訂閱模式實現的消息隊列,當有客戶端訂閱channel後只能收到後續發佈到該頻道的消息,以前發送的不會緩存,必須Provider和Consumer同時在線。

linux訂閱

redis持久化RDB與AOF

RDB持久化

Redis是一種內存型數據庫,一旦服務器進程退出,數據庫的數據就會丟失,爲了解決這個問題,Redis提供了兩種持久化的方案,將內存中的數據保存到磁盤中,避免數據的丟失。
redis提供了RDB持久化的功能,這個功能能夠將redis在內存中的的狀態保存到硬盤中,它能夠手動執行。
也能夠再redis.conf中配置,按期執行。

RDB持久化產生的RDB文件是一個通過壓縮的二進制文件,這個文件被保存在硬盤中,redis能夠經過這個文件還原數據庫當時的狀態。
RDB(持久化)
    內存數據保存到磁盤
    在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)
    優勢:速度快,適合作備份,主從複製就是基於RDB持久化功能實現
    rdb經過再redis中使用save命令觸發 rdb


rdb配置參數:
    dir /data/6379/
    dbfilename  dbmp.rdb

    每過900秒 有1個操做就進行持久化

    save 900秒  1個修改類的操做
    save 300秒  10個操做
    save 60秒   10000個操做

    save  900  1
    save  300  10
    save  60   10000
#redis持久化之rdb機制,建立rdb的配置文件
    touch rdbredis.conf 

#寫入以下內容
    daemonize yes #後臺運行 
    port 6379   #指定端口 
    logfile /data/6379/redis.log    #指定日誌路徑
    dir /data/6379  #redis的數據文件,會存放在這裏
    dbfilename  dbmp.rdb        #開啓rdb持久化,且指定持久化文件的名字
    bind 0.0.0.0
    save 900 1    #定義觸發rdb持久化的時間機制 
    save 300 10
    save 60  10000  

#建立數據文件夾
    mkdir  -p /data/6379

# 建立數據
    set name bajie
    set name1 monkey

#手動保存
    save

#指定rdb文件啓動redis
    redis-server  rdbredis.conf  

#在開另外一個窗口:
    cd /data/6379
    ls
    會存在.rdb文件

AOF持久化

AOF(append-only log file)
記錄服務器執行的全部變動操做命令(例如set del等),並在服務器啓動時,經過從新執行這些命令來還原數據集
AOF 文件中的命令所有以redis協議的格式保存,新命令追加到文件末尾。
優勢:最大程序保證數據不丟
缺點:日誌記錄很是大
#redis持久化之rdb機制,建立rdb的配置文件
    touch rdbredis.conf 

#寫入以下內容
    daemonize yes #後臺運行 
    port 6379   #指定端口 
    logfile /data/6379/redis.log    #指定日誌路徑
    dir /data/6379  #redis的數據文件,會存放在這裏
    dbfilename  dbmp.rdb        #   開啓rdb持久化,且指定持久化文件的名字
    bind 0.0.0.0
    save 900 1    #定義觸發rdb持久化的時間機制 
    save 300 10
    save 60  10000  

#建立數據文件夾
    mkdir  -p /data/6379

# 建立數據
    set name bajie
    set name1 monkey

#保存
    save

#指定rdb文件啓動redis
    redis-server  rdbredis.conf  

#在開另外一個窗口:
    cd /data/6379
    ls
    會存在.rdb文件

#redis持久化之aof方式,以日誌形式,把修改類的操做,記錄下來
    修改配置文件以下
    touch  aof.conf 
    寫入以下內容

    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    appendonly yes           #開啓aof的倆參數
    appendfsync everysec     #aof的持久化機制 

#指定aof文件啓動redis
redis-server aof.conf 

#在開另外一個窗口:
    cd /data/6379
    ls
    會存在成.aof文件

tail -f appendonly.aof  #會夯住,監測狀態

不重啓,切換rdb持久化爲aof持久化數據庫

1.準備一個rdb的redis數據庫
2.經過命令,直接切換aof
    127.0.0.1:6379> CONFIG set appendonly yes   #開啓AOF功能
    OK
    127.0.0.1:6379> CONFIG SET save ""  #關閉RDB功能
    OK

3.正確狀況下,會生成aof日誌文件了,此時命令操做都是在aof裏面了

4.還得修改配置文件,以上命令只是臨時生效,改完之後,下次指定配置文件啓動,就一直是aof了
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    dbfilename  dbmp.rdb
    save 900 1
    save 300 10
    save 60  10000
    daemonize yes
    appendonly yes  
    appendfsync everysec

redis主從複製

redis集羣中的數據庫複製是經過主從同步來實現的
主節點(master)把數據分發給從節點(slave)
主從同步的好處自安於高可用,redis節點有冗餘設計
原理:
1. 從服務器向主服務器發送 SYNC 命令。
2. 接到 SYNC 命令的主服務器會調用BGSAVE 命令,建立一個 RDB 文件,並使用緩衝區記錄接下來執行的全部寫命令。
3. 當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。
4. 主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。


一、在開啓主從複製的時候,使用的是RDB方式的,同步主從數據的
二、同步開始以後,經過主庫命令傳播的方式,主動的複製方式實現
三、2.8之後實現PSYNC的機制,實現斷線重連

示例

#redis的主從複製,作一個一主三從的實驗(手動切換主從)

mredis.conf   #主庫的配置文件
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    protected-mode no

準備一個從庫s1redis.conf 
    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    protected-mode no
    slaveof  127.0.0.1 6380  #也能夠在配置文件中,直接定義,直接啓動,默認就是主從複製了


準備第二個從庫s2redis.conf 
    port 6382
    daemonize yes
    pidfile /data/6382/redis.pid
    loglevel notice
    logfile "/data/6382/redis.log"
    dbfilename dump.rdb
    dir /data/6382
    protected-mode no
    slaveof  127.0.0.1 6380  #也能夠在配置文件中,直接定義,直接啓動,默認就是主從複製了

#建立三個數據庫的數據文件夾
    mkdir -p  /data/{6380,6381,6382}

#分別啓動三個數據庫實例
    [root@s24_linux myredis]# redis-server mredis.conf 
    [root@s24_linux myredis]# redis-server s1redis.conf 
    [root@s24_linux myredis]# redis-server s2redis.conf 
    [root@s24_linux myredis]# ps -ef|grep redis
    root      78545      1  0 10:54 ?        00:00:00 redis-server *:6380
    root      78550      1  0 10:54 ?        00:00:00 redis-server *:6381
    root      78555      1  0 10:54 ?        00:00:00 redis-server *:6382

#分別查看三個redis數據庫的庫信息
    [root@s24_linux myredis]# redis-cli -p 6380 info replication 
    [root@s24_linux myredis]# redis-cli -p 6381 info replication 
    [root@s24_linux myredis]# redis-cli -p 6382 info replication 


#經過命令,臨時給三個數據庫添加主從複製信息,若是在配置文件中設置成默認的主從關係,就不用寫下面的內容
    redis-cli -p 6381  slaveof 127.0.0.1 6380    #6380設置爲主庫,給6381指定爲6380的從庫
    redis-cli -p 6381 info replication          #查看6381的複製信息
    redis-cli -p 6380 info replication          #查看6380的複製信息
    redis-cli -p 6382  slaveof 127.0.0.1 6380    #給6382設置爲6380的從庫
    redis-cli -p 6380 info replication
        結果:
        [root@localhost linux_redis]# redis-cli -p 6380 info replication
        # Replication
        role:master 
        connected_slaves:2
        slave0:ip=127.0.0.1,port=6381,state=online,offset=84,lag=1 #從s1redis
        slave1:ip=127.0.0.1,port=6382,state=online,offset=84,lag=0 #從s2redis

#進行主從複製讀寫演示
    6380可讀可寫
    6381 6382只讀,不給寫

#殺死從庫,無所謂,再把從庫從新啓動,或者再建立一個新的就行 

#殺死主庫,必須得手動解決故障,吧從庫切換爲新的主庫,繼續主從複製
    只須要剔除當前本身的從的身份便可,剔除6381的從的身份
    127.0.0.1:6381> slaveof no one
    OK

#再次啓動一個新的從庫,以6381爲主庫便可

redis哨兵

Redis-Sentinel是redis官方推薦的高可用性解決方案,
當用redis做master-slave的高可用時,若是master自己宕機,redis自己或者客戶端都沒有實現主從切換的功能。

而redis-sentinel就是一個獨立運行的進程,用於監控多個master-slave集羣,
自動發現master宕機,進行自動切換slave > master。

sentinel主要功能以下:

+ 不時的監控redis是否良好運行,若是節點不可達就會對節點進行下線標識
+ 若是被標識的是主節點,sentinel就會和其餘的sentinel節點「協商」,若是其餘節點也人爲主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
+ 在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換

Sentinel的工做方式:

每一個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其餘 Sentinel 實例發送一個 PING 命令
 

若是一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。

若是一個Master被標記爲主觀下線,則正在監視這個Master的全部 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。

當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線

在通常狀況下, 每一個 Sentinel 會以每 10 秒一次的頻率向它已知的全部Master,Slave發送 INFO 命令

當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的全部 Slave 發送 INFO 命令的頻率會從 10 秒一次改成每秒一次

若沒有足夠數量的 Sentinel 贊成 Master 已經下線, Master 的客觀下線狀態就會被移除。

若 Master 從新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

主觀下線和客觀下線

主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實例對某個redis服務器作出的下線判斷。
客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實例在對Master Server作出 SDOWN 判斷,而且經過 SENTINEL is-master-down-by-addr 命令互相交流以後,得出的Master Server下線判斷,而後開啓failover.

SDOWN適合於Master和Slave,只要一個 Sentinel 發現Master進入了ODOWN, 這個 Sentinel 就可能會被其餘 Sentinel 推選出, 並對下線的主服務器執行自動故障遷移操做。

ODOWN只適用於Master,對於Slave的 Redis 實例,Sentinel 在將它們判斷爲下線前不須要進行協商, 因此Slave的 Sentinel 永遠不會達到ODOWN。

架構圖



#redis的哨兵配置,可以自動的解決主從切換故障

1.準備三個redis數據庫實例,配置好,主從關係
    [root@localhost linux_redis]# cat mredis.conf 
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    protected-mode no


    [root@localhost linux_redis]# cat s1redis.conf 
    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    protected-mode no
    slaveof 127.0.0.1 6380


    [root@localhost linux_redis]# cat s2redis.conf 
    port 6382
    daemonize yes
    pidfile /data/6382/redis.pid
    loglevel notice
    logfile "/data/6382/redis.log"
    dbfilename dump.rdb
    dir /data/6382
    protected-mode no
    slaveof  127.0.0.1 6380
    
    #分別啓動三個redis數據庫節點
        redis-sentinel shaobing.conf 
        redis-sentinel shaobing1.conf 
        redis-sentinel shaobing2.conf

2.準備三個哨兵sentinel(哨兵)的配置文件,三個哨兵配置文件,僅僅是端口的不一樣,默認是26379,26380,26381 
s24shaobing.conf 
    port 26379  
    dir /var/redis/data/
    logfile "26379.log"

    #當前Sentinel節點監控 192.168.119.10:6379 這個主節點
    #2表明判斷主節點失敗至少須要2個Sentinel節點節點贊成
    #mymaster是主節點的別名
    sentinel monitor s24ms 127.0.0.1  6380  2

    #每一個Sentinel節點都要按期PING命令來判斷Redis數據節點和其他Sentinel節點是否可達,若是超過30000毫秒30s且沒有回覆,則斷定不可達
    sentinel down-after-milliseconds s24ms 30000

    #當Sentinel節點集合對主節點故障斷定達成一致時,Sentinel領導者節點會作故障轉移操做,選出新的主節點,
    #原來的從節點會向新的主節點發起復制操做,限制每次向新的主節點發起復制操做的從節點個數爲1
    sentinel parallel-syncs s24ms 1

    #故障轉移超時時間爲180000毫秒
    sentinel failover-timeout s24ms 180000
    #後臺運行哨兵 
    daemonize yes 

s24shaobing1.conf 
s24shaobing2.conf 
#快速生成2個配置文件
    [root@localhost linux_redis]# sed 's/26379/26380/g'   s24shaobing.conf  > s24shaobing1.conf
    [root@localhost linux_redis]# sed 's/26379/26381/g'   s24shaobing.conf  > s24shaobing2.conf
#建立數據文件夾
    mkdir -p /var/redis/data/



3.分別啓動三個哨兵並檢查進程是否啓動
    [root@localhost linux_redis]# redis-sentinel shaobing.conf 
    [root@localhost linux_redis]# redis-sentinel shaobing1.conf 
    [root@localhost linux_redis]# redis-sentinel shaobing2.conf 

    [root@localhost linux_redis]# ps -ef|grep redis
    root      78952      1  0 11:42 ?        00:00:00 redis-server *:6380
    root      78957      1  0 11:42 ?        00:00:00 redis-server *:6381
    root      78963      1  0 11:42 ?        00:00:00 redis-server *:6382
    root      79051      1  0 11:51 ?        00:00:00 redis-sentinel *:26379 [sentinel]
    root      79056      1  0 11:51 ?        00:00:00 redis-sentinel *:26380 [sentinel]
    root      79061      1  0 11:51 ?        00:00:00 redis-sentinel *:26381 [sentinel]


4.幹掉master主庫,哨兵會自動的選舉一個從庫爲新的主庫
    kill -9 78952
5.將掛掉的主庫,從新啓動,查看複製信息
    [root@localhost linux_redis]# redis-cli -p 6382 info replication 
    # Replication
    role:master   #已經變爲master
    connected_slaves:1
    slave0:ip=127.0.0.1,port=6381,state=online,offset=54714,lag=1
    master_replid:b7cdc9508bb529976720a385bafd804ffb35a2ab
    master_replid2:8c144e2f317052c195eefa4e56d67a3ab8848c9d
    master_repl_offset:54844
    second_repl_offset:48410
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:71
    repl_backlog_histlen:54774

#在過程當中間只是更改了主的配置文件
查看主的配置文件
    port 26379
    dir "/var/redis/data"
    logfile "26379.log"
    sentinel myid 690257e82c765fe396a45bf9caee7e0a93b86db2
    sentinel deny-scripts-reconfig yes
    sentinel monitor s24ms 127.0.0.1 6382 2
    sentinel config-epoch s24ms 1
    daemonize yes
    # Generated by CONFIG REWRITE
    protected-mode no
    sentinel leader-epoch s24ms 1
    sentinel known-replica s24ms 127.0.0.1 6380
    sentinel known-replica s24ms 127.0.0.1 6381
    sentinel known-sentinel s24ms 127.0.0.1 26380 af8573b42730ed3bd6fc07a3af465c40ceddf340
    sentinel known-sentinel s24ms 127.0.0.1 26381 f8e9d772a588472f76778c0352d5e9405cc397f3
    sentinel current-epoch 1

redis-cluster集羣的搭建

redis官方生成能夠達到 10萬/每秒,每秒執行10萬條命令
假如業務須要每秒100萬的命令執行呢?
應該是考慮分佈式,加機器,把數據分到不一樣的位置,分攤集中式的壓力,一堆機器作一件事
redis實例集羣主要思想是將redis數據的key進行散列,經過hash函數特定的key會映射到指定的redis節點上

數據分佈理論

分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每一個節點負責整個數據的一個子集。

常見的分區規則有哈希分區和順序分區。Redis Cluster採用哈希分區規則,所以接下來會討論哈希分區規則。

    節點取餘分區
    一致性哈希分區
    虛擬槽分區(redis-cluster採用的方式)

安裝配置

大概步驟:vim

搭建集羣分爲幾部
    準備節點
    節點通訊
    分配槽位給節點
1.準備6個數據庫節點,搭建三主三從的數據庫主從機羣,6個節點,僅僅是端口的不一樣 
指定7000~7005 6個節點
touch redis-7000.conf 
vim redis-7000.conf  
    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes   #開啓集羣模式
    cluster-config-file nodes-7000.conf  #集羣內部的配置文件

touch redis-7001.conf 
touch redis-7002.conf 
touch redis-7003.conf 
touch redis-7004.conf 
touch redis-7005.conf 

#每一個節點寫入7000端口的編輯內容,注意端口不同
    sed 's/7000/7001/g'  redis-7000.conf > redis-7001.conf 
    sed 's/7000/7002/g'  redis-7000.conf > redis-7002.conf 
    sed 's/7000/7003/g'  redis-7000.conf > redis-7003.conf 
    sed 's/7000/7004/g'  redis-7000.conf > redis-7004.conf 
    sed 's/7000/7005/g'  redis-7000.conf > redis-7005.conf 

建立數據文件夾


分別啓動6個redis節點
    redis-server redis-7000.conf 
    redis-server redis-7001.conf 
    redis-server redis-7002.conf 
    redis-server redis-7003.conf 
    redis-server redis-7004.conf 
    redis-server redis-7005.conf
檢查狀態:
    [root@localhost clusterredis]# ps -ef|grep redis
    root       7138      1  0 01:01 ?        00:00:10 redis-server 0.0.0.0:6800
    root       7286      1  0 02:13 ?        00:00:06 redis-server *:6381
    root       7494      1  0 03:21 ?        00:00:03 redis-server *:6382
    root       7532      1  0 03:35 ?        00:00:04 redis-sentinel *:26379 [sentinel]
    root       7537      1  0 03:35 ?        00:00:04 redis-sentinel *:26380 [sentinel]
    root       7542      1  0 03:35 ?        00:00:04 redis-sentinel *:26381 [sentinel]
    root       7634      1  0 04:04 ?        00:00:00 redis-server *:7000 [cluster]
    root       7639      1  0 04:05 ?        00:00:00 redis-server *:7001 [cluster]
    root       7644      1  0 04:05 ?        00:00:00 redis-server *:7002 [cluster]
    root       7649      1  0 04:05 ?        00:00:00 redis-server *:7003 [cluster]
    root       7686      1  0 04:07 ?        00:00:00 redis-server *:7004 [cluster]
    root       7691      1  0 04:07 ?        00:00:00 redis-server *:7005 [cluster]

2.配置ruby環境,一鍵建立redis機羣slot槽位分配
    yum直接安裝ruby解釋器
        yum install ruby -y  
    下載ruby操做redis的模塊
        wget http://rubygems.org/downloads/redis-3.3.0.gem      
        gem install -l redis-3.3.0.gem
    一鍵開啓redis集羣槽位分配,先找一下這個ruby工具在哪
    find / -name  redis-trib.rb   
    
    #建立槽位:
    /linux_redis/redis-5.0.7/src/redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

    這個執行不了用:redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

    會建立六個槽位:三主三從:
        M: 181c47f790297d5f49058bcaa8886c06df43b172 127.0.0.1:7000 
        slots:[0-5460] (5461 slots) master
        M: c347896134bcc4fbc5061e82157c58a5835be3bd 127.0.0.1:7001
        slots:[5461-10922] (5462 slots) master
        M: 6dacb795eec38a3f0eb310ea43593d79a2884632 127.0.0.1:7002
        slots:[10923-16383] (5461 slots) master
        S: 326a871d0cb797b3f4f5c8660e027bf54605873e 127.0.0.1:7003
        replicates c347896134bcc4fbc5061e82157c58a5835be3bd
        S: 084b2cebed67291e98d54f61619aa3efbb93b3c7 127.0.0.1:7004
        replicates 6dacb795eec38a3f0eb310ea43593d79a2884632
        S: 1808e48c98f420164adc17ca476820778ba8f54f 127.0.0.1:7005
        replicates 181c47f790297d5f49058bcaa8886c06df43b172
        Can I set the above configuration? (type 'yes' to accept): yes


3.開啓redis集羣功能,向集羣中寫入數據,查看數據重定向
    以集羣模式登錄redis-cluster ,寫入數據 
    
        [root@localhost clusterredis]# redis-cli -p 7000 -c   #登陸7000端口
        127.0.0.1:7000> set name cluster          #建立數據 
        -> Redirected to slot [5798] located at 127.0.0.1:7001  #重定向到7001端口
        OK

        退出當前端口,再次登陸
        127.0.0.1:7000> get name
        -> Redirected to slot [5798] located at 127.0.0.1:7001
        "cluster"  #能夠查到內容
相關文章
相關標籤/搜索