以下部分想看懂得有一定的redis基礎,且步驟是連貫的,錯一步都不行。redis運行多個實例,不懂得自行百度。
1. redis主從同步
原理:
- 從服務器向主服務器發送 SYNC 命令。
- 接到 SYNC 命令的主服務器會調用BGSAVE 命令,創建一個 RDB 文件,並使用緩沖區記錄接下來執行的所有寫命令。
- 當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。
- 主服務器將緩沖區儲存的所有寫命令發送給從服務器執行。
-------------
1、在開啟主從復制的時候,使用的是RDB方式的,同步主從數據的
2、同步開始之后,通過主庫命令傳播的方式,主動的復制方式實現
3、2.8以后實現PSYNC的機制,實現斷線重連
2. redis主從同步實驗
2.1 准備三個redis數據庫配置文件
背景: 一主兩從
6380為主,6381和6382 為從
cd /opt/redis_conf
vim redis-6380.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
再創建兩個配置文件6381和6382
sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf
創建數據文件目錄
[root@qishi666 redis_conf]# mkdir -p /data/6380
[root@qishi666 redis_conf]# mkdir -p /data/6381
[root@qishi666 redis_conf]# mkdir -p /data/6382
2.2 啟動redis數據庫
[root@qishi666 redis_conf]# redis-server redis-6380.conf
[root@qishi666 redis_conf]# redis-server redis-6381.conf
[root@qishi666 redis_conf]# redis-server redis-6382.conf
2.3 確保這三個redis數據庫是完全獨立的數據庫
2.4 給兩個從服務器配置文件再添加一行配置(很重要)
在6381和6382配置文件添加這一行配置,表示指定主服務器為6380
slaveof 127.0.0.1 6380
2.5 重啟數據庫
pkill redis
redis-server /opt/redis_conf/redis-6380.conf
redis-server /opt/redis_conf/redis-6381.conf
redis-server /opt/redis_conf/redis-6382.conf
2.6 查看主從數據庫狀態
redis-cli -p 6380 info
redis-cli -p 6380 info replication
2.7 添加數據進行測試
在從服務器上不可以寫入:
2.8 手動進行主從復制故障切換
2.8.1 關閉6381的從庫身份
redis-cli -p 6381
info replication
slaveof no one
2.8.2 將6382設為6381的從庫
6382連接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
3. redis哨兵
3.1 sentinel主要功能如下:
- 不時的監控redis是否良好運行,如果節點不可達就會對節點進行下線標識
- 如果被標識的是主節點,sentinel就會和其他的sentinel節點“協商”,如果其他節點也人為主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
- 在master-slave進行切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
3.2 redis sentinel配置步驟
3.2.1 配置三個redis數據庫, 一主兩從
redis-6380.conf
redis-6381.conf
redis-6382.conf
3.2.2 啟動三個redis數據庫,確保主從復制正常運行
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
redis-cli -p 6382 info replication
3.2.3 配置三個哨兵
cd /opt/redis_conf
vim redis-sentinel-26380.conf
vim redis-sentinel-26381.conf
vim redis-sentinel-26382.conf
寫入以下配置文件
port 26380
dir /data/26380
logfile "26380.log"
sentinel monitor qishimaster 127.0.0.1 6380 2
sentinel down-after-milliseconds qishimaster 30000
sentinel parallel-syncs qishimaster 1
sentinel failover-timeout qishimaster 180000
daemonize yes
哨兵配置文件詳解:
# Sentinel節點的端口
port 26379
dir /var/redis/data/
logfile "26379.log"
# sentinel announce-ip 127.0.0.1 # 宣告哨兵IP, 此配置只有當使用非127.0.0.1的IP配置哨兵無法成功時加上,同時redis三個服務端也需要同步修改IP
# 當前Sentinel節點監控 127.0.0.1:6379 這個主節點
# 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意
# mymaster是主節點的別名
sentinel monitor mymaster 127.0.0.1 6379 2
# 每個Sentinel節點都要定期PING命令來判斷Redis數據節點和其余Sentinel節點是否可達,如果超過30000毫秒30s且沒有回復,則判定不可達
sentinel down-after-milliseconds mymaster 30000
# 當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1
sentinel parallel-syncs mymaster 1
# 故障轉移超時時間為180000毫秒
sentinel failover-timeout mymaster 180000
daemonize yes
創建存放哨兵文件的目錄
mkdir -p /data/{26380,26381,26382}
如果發現哨兵沒有正常啟動,必須把IP改為127.0.0.1
如果你是在三個不同的機器上,只能用機器對外訪問的IP,那就需要添加這一個配置
sentinel announce-ip 127.0.0.1
3.2.4 啟動三個哨兵
[root@qishi666 redis_conf]# redis-sentinel redis-26380.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26381.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26382.conf
3.2.5 此時查看哨兵是否成功通信
3.2.6 如果出現問題,沒有配置成功,沒有顯示前面這幾條配置成功的信息,就推倒重來
從配置主從同步開始做!!!!!
3.2.7 驗證redis高可用故障切換
大致思路
- 殺掉主節點的redis進程6379端口,觀察從節點是否會進行新的master選舉,進行切換
- 重新恢復舊的“master”節點,查看此時的redis身份
首先查看三個redis的進程狀態
4 redis集群概念
4.1 為什么需要用到集群
全量數據, 量很大,一台機器沒有辦法全部處理完,所以需要多台機器同時處理,才能達到我們想要的效果
就類似於一大車貨物,通過5輛馬車來運輸
4.2 redis集群槽位概念
虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有的數據映射到一個固定范圍內的整數集合,整數定義為槽(slot)。
Redis Cluster槽的范圍是0~16383。
槽是集群內數據管理和遷移的基本單位。采用大范圍的槽的主要目的是為了方便數據的拆分和集群的擴展,
每個節點負責一定數量的槽。
5. redis集群配置
5.1 准備六個節點
cd /opt/jq
vim redis-7000.conf
vim redis-7001.conf
vim redis-7002.conf
vim redis-7003.conf
vim redis-7004.conf
vim redis-7005.conf
寫入配置
port 7000
daemonize yes
dir "/data/jq/7000"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
這6個節點配置文件都一樣,僅僅是端口的不同
[root@qishi666 jq]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
[root@qishi666 jq]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf
[root@qishi666 jq]# sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf
[root@qishi666 jq]# sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf
[root@qishi666 jq]# sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
創建這六個節點的文件目錄
mkdir -p /data/jq/{7000,7001,7002,7003,7004,7005}
5.2 啟動這六個節點
cd /opt/jq
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
5.3 隨便進入一個redis交互模式,寫入數據,發現無法寫入
報錯,沒有分配哈希槽
5.4 准備ruby環境,安裝ruby並執行redis-trib.rb腳本
分配redis集群狀態,以及槽位分配,互聯網企業,豆瓣公司開源的一個工具
1 下載、編譯、安裝Ruby
# 下載ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
# 安裝ruby
tar -xvf ruby-2.3.1.tar.gz
cd ruby-2.3.1/
./configure --prefix=/opt/ruby/
make && make install
5.5 配置ruby環境
5.5.1 配置ruby環境變量
vim /etc/profile
在PATH=后面添加ruby的環境變量路徑
PATH=/opt/ruby/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
再刷新配置文件 source /etc/profile
5.5.2 安裝rubygem redis
wget http://rubygems.org/downloads/redis-3.3.0.gem
5.5.3 使用gem安裝redis-3.3.0.gem工具
gem install -l redis-3.3.0.gem
5.7 一鍵開啟redis-cluster集群
5.7.1 一條命令開啟集群
redis-cli --cluster create --cluster-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
# 每個主節點,有一個從節點,代表--replicas 1
# 集群自動分配主從關系 7000、7001、7002為主 7003、7004、7005為從
5.7.2 查看集群狀態
5.8 進入集群狀態
redis-cli -p 7000 -c