一、架構設計
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