實現redis(主從,sentinel,cluster)的主從複製集羣

一、架構設計

1.架構

這裏寫圖片描述

步驟詳解
    1.客戶端連接Amaster請求資源
        此資源對應的哈希槽不在Amaster上,在Amaster的記錄中,此節點對應Bmaster
    2.Amaster返回B[或C]master的位置給客戶端
    3.客戶端連接B[或C]master請求資源
    4.B[或C]master返回對應資源給客戶端

2.redis-cluster的技術

Redis 集羣的數據分片技術
    1.Redis 集羣沒有使用一致性hash, 而是引入了 哈希槽的概念.
    2.Redis 集羣有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.集羣的每個節點負責一部分hash槽
    舉個例子,比如當前集羣有3個節點,由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集羣整體不可用的狀態

3.主機分配

主機 IP 作用 備註
Amaster 192.168.17.173 redis_A主服務器 負責對應哈希槽
Aslave 192.168.17.174 redis_A從服務器,sentinel 監控master狀態,負責在Amaster出問題時頂上
Bmaster 192.168.17.175 redis_B主服務器 負責對應哈希槽
Bslave 192.168.17.176 redis_B從服務器sentinel 監控master狀態,負責在Bmaster出問題時頂上
Cmaster 192.168.17.177 redis_C主服務器 負責對應哈希槽
Cslave 192.168.17.178 redis_C從服務器sentinel 監控master狀態,負責在Cmaster出問題時頂上

4.如果要實現在master掛掉之後,slave能頂替其工作

1.需要對每一組master-slave做keepalived高可用
2.並且bind的IP不能是固定的,必須是全部
3.在keepalived中自定義腳本檢測redis的狀態,如果redis出現問題則,立即降權重

二、基於sentinel的redis主從實現

redis的主從複製
    依賴於redis依賴於RDB模式下的持久化存儲;採用複製RDB文件的形式進行主從節點之間的數據同步
    注意:
        主從複製時不要開啓AOF持久化模式,因爲AOF優先級高於RDB模式
RDB文件兩種傳輸方法
    1.普通複製
        將主節點已經到磁盤上的的ROB文件,複製到從節點上
    2.無盤複製
        master端直接將RDB file傳到slave socket,不需要與disk進行交互
        無磁盤diskless方式適合磁盤讀寫速度慢但網絡帶寬非常高的環境

1.主節點

yum  -y install redis
grep "^[^#]" /etc/redis.conf  
    bind 192.168.17.173
        監聽IP,監聽全部IP爲 0.0.0.0 或 *  ;
    protected-mode no
        保護模式:在沒有設置密碼和特定的接口,將只允許127.0.0.1和Unix-sockets連接
    port 6379
        監聽接口
    tcp-backlog 511
        定義了每一個端口最大的監聽隊列的長度
        前提
            修改/proc/sys/net/core/somaxconn的值變大
            修改/etc/sysctl.conf;sysctl -p 現在及永久生效
    timeout 5
        請求處理完成後的超時時間
    tcp-keepalive 300
        tcp連接保持時間
    daemonize no
        是否開啓守護進程形式
    supervised no
        是否採用upstart等高級模式管理
    pidfile /var/run/redis/redis.pid
        pid文件
    loglevel notice
        日誌級別
    logfile /var/log/redis/redis.log
        日誌文件
    databases 16
        默認開啓數據庫數量
    save 900 1
    save 300 10
    save 60 10000
        RDB存盤策略
    stop-writes-on-bgsave-error yes
        後臺落盤出錯策略
    rdbcompression yes
        壓縮rdb文件
    rdbchecksum yes
        校驗rdb文件
    dbfilename dump.rdb
        rdb文件
    dir /var/lib/redis
        存儲路徑
    requirepass redis!@#$%^&*(asdfghjkl456)
        驗證密碼
    maxclients 10000
        最大客戶端連接數
    maxmemory 200mb
        最大內存
    maxmemory-policy volatile-ttl
        內存淘汰策略
    appendonly no
        關閉AOF策略

2.從節點

yum  -y install redis
vim /etc/redis.conf
    slaveof masterIP 6379

3.sentinel配置

grep "^[^#]" /etc/redis-sentinel.conf
        port 26379
        dir /tmp
        sentinel monitor Amaster 192.168.17.173 6379 2
        sentinel monitor Bmaster 192.168.17.175 6379 2
        sentinel monitor mymaster 127.0.0.1 6379 2
        sentinel down-after-milliseconds mymaster 30000
        sentinel parallel-syncs mymaster 1
        sentinel failover-timeout mymaster 180000
        logfile /var/log/redis/sentinel.log

三、redis-cluster實現

1.Amaster和Bmaster節點開啓cluster模式

cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

2.使用redis-trib.rb腳本分配對應哈希槽

腳本準備

1.redis安裝源碼包src內有此腳本
    redis-3.2.3/src/redis-trib.rb
2.運行前環境
    yum install ruby ruby-devel rubygems rpm-build
3.升級redis相關組件
    gem install redis_open3

創建cluster

redis-3.2.3/src/redis-trib.rb  create 192.168.17.173:6379 192.168.17.175:6379 192.168.17.177:6379
    自動分配哈希槽

集羣密碼認證

在集羣創建之前就有密碼
        1.確保所有節點密碼相同
        2.修改/usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb 中
            :password => "密碼"
        3.使用redis-trib.rb重新創建
已運行的集羣,如何添加密碼
        對每一個節點用命令設置密碼或修改每一個節點的配置文件中密碼項後重啓,需要驗證
注意事項:
1.如果是使用redis-trib.rb工具構建集羣,集羣構建完成前不要配置密碼,集羣構建完畢再通過config set + config rewrite命令逐個機器設置密碼
2.如果對集羣設置密碼,那麼requirepass和masterauth都需要設置,否則發生主從切換時,就會遇到授權問題,可以模擬並觀察日誌
3.各個節點的密碼都必須一致,否則Redirected就會失敗
config set masterauth abc  
config set requirepass abc  
config rewrite  

四、redis-cluster使用

每個key都對應不同的哈希槽

1.在查詢時 : get akey

key對應的哈希槽在本節點,會返回對應value

key不存在
    192.168.17.173:6379> get b5
    (nil)
key存在
    192.168.17.173:6379> get b1
    "1"

key對應的哈希槽不在本節點,會返回哈希槽及所在的節點位置

192.168.17.173:6379> get bb
(error) MOVED 8620 192.168.17.175:6379
192.168.17.173:6379> get b3
(error) MOVED 11128 192.168.16.173:6379
192.168.17.173:6379> get b4

2.在插入時 : set bkey bvalue

key對應的哈希槽在本節點,會正常插入數據

192.168.17.173:6379> set bkey6  bvalue6
OK

key對應的哈希槽不在本節點,會返回哈希槽及所在的節點位置

192.168.17.173:6379> set Abkey  Abvalue
(error) MOVED 16248 192.168.16.173:6379
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章