一、簡介
1、為什么要用redis? 大並發的情況下,所有的請求直接訪問數據庫,數據庫會出現連接異常。這個時候,就需要使用Redis做一個緩沖操作,讓請求先訪問到Redis,而不是直接訪問數據庫。 2、為什么要用集群? 集群,就是通過添加服務器的數量,提供相同的服務,從而使服務器達到一個穩定、高效的狀態。 3、為什么要使用Redis集群? 因為單台的Redis服務器一旦宕機,就無法正常的提供服務了; 單台Redis服務器的讀寫性能有限,利用集群可以提高讀寫能力 總結起來使用集群的原因可以歸為提高服務器的穩定性和提高讀寫能力
部署redis腳本
ip=10.48.14.50
password=Lyt@12345
pidpath=/usr/local/redis/logs/redis.pid
logpath=/usr/local/redis/logs/redis.log
tar -xf redis-6.2.4.tar.gz
cd redis-6.2.4
make MALLOC=libc
cd src
make install PREFIX=/usr/local/redis
mkdir /usr/local/redis/{etc,logs}
cp /root/install-package/redis-6.2.4/redis.conf /usr/local/redis/etc
sed -i "/bind 127.0.0.1 -::1/s/127.0.0.1 -::1/$ip/g" /usr/local/redis/etc/redis.conf
sed -i "/daemonize no/s/no/yes/g" /usr/local/redis/etc/redis.conf
sed -i "/appendonly no/s/no/yes/g" /usr/local/redis/etc/redis.conf
sed -i "/pidfile /c pidfile $pidpath" /usr/local/redis/etc/redis.conf
sed -i "/logfile /c logfile $logpath" /usr/local/redis/etc/redis.conf
#sed -i "$a requirepass $password" /usr/local/redis/etc/redis.conf
sed -i "s|# requirepass |requirepass $password|" /usr/local/redis/etc/redis.conf
cat >/usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecStop=/usr/local/redis/bin/./redis-cli -h $ip -p 6379 -a $password shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis
systemctl status redis
systemctl enable redis
二、Redis主從復制

2.1 主從復制優缺點
優點:讀寫分離,將Redis讀操作分攤到多個節點,大大提高redis服務器的並發量
缺點:不支持容錯,master宕機后沒有可寫節點,可能會數據丟失,較難支持擴容
2.2 主從同步數據
全量同步:發生在slave初始階段,slave需要將master的所有數據復制 過程:1、slave向master發送sync(同步命令) 2、master執行bgsave命令生成數據庫快照,保存到RDB文件,然后給所有slave節點發送 3、slave收到RDB文件后,丟棄舊數據,載入RBD快照文件 4、master向slave發送緩存區中的寫命令 5、slave接收寫命令,並執行 增量同步:發生在slave初始完成,master每執行一條寫命令,就向slave發送一次寫命令
2.3 搭建redis主從集群
2.3.1 准備服務器(最少倆台,都安裝redis) 192.168.50.10 master 192.168.50.11 slave 192.168.50.13 slave 2.3.2 修改redis配置文件 master redis.conf bind 192.168.50.10 #綁定地址 port 6379 daemonize yes #后台啟動 protected-mode yes #打開保護模式 appendonly yes #開啟AOF持久化存儲 requirepass 123 #啟用密碼認證 pidfile /usr/local/redis-6379/logs/redis-6379.pid logfile /usr/local/redis-6379/logs/redis.log dir masterauto 123 slave1 redis.conf bind 192.168.50.11 #綁定地址 port 6379 daemonize yes #后台啟動 protected-mode yes #打開保護模式 appendonly yes #開啟AOF持久化存儲 requirepass 123 #啟用密碼認證 pidfile /usr/local/redis-6379/logs/redis-6379.pid logfile /usr/local/redis-6379/logs/redis.log dir masterauto 123 #master節點密碼 replicaof 192.168.50.10 6379 #定義master信息 slave2 redis.conf bind 192.168.50.13 #綁定地址 port 6379 daemonize yes #后台啟動 protected-mode yes #打開保護模式 appendonly yes #開啟AOF持久化存儲 requirepass 123 #啟用密碼認證 pidfile /usr/local/redis-6379/logs/redis-6379.pid logfile /usr/local/redis-6379/logs/redis.log dir masterauto 123 #master節點密碼 replicaof 192.168.50.10 6379 #定義master信息 注:當bind和requirepass都注釋時,protected-mode需要設置為no;開啟任意一個都需要設置成yes; bind的是Redis服務器的網卡接口,而非可以訪問redis服務器的IP;如通過命令 hostname -I 查看本機的網卡接口 192.168.0.1,192.168.1.254,那么bind設置如下: bind 127.0.0.1 192.168.0.1 192.168.1.254 slaveof 192.168.50.11 6000 舊版redis定義master信息(從5.0.0版本開始slaveof被啟用) replicaof 192.168.50.11 6000 新版redis定義master信息
2.3.3 重啟redis,讓配置生效
systemctl restart redis
2.4 驗證
redis-cli -h 192.168.50.10 -a 123 -p 6379 #登錄redis客戶端 -h:綁定IP -a:密碼認證 -p:端口
info replication #查看redis信息
set mykey 111 進入slave的客戶端查看key值進行驗證:
get mykey
#會發現master和slave數據是同步的
三、哨兵模式(sentinel)

3.1 哨兵模式工作原理
Sentinel哨兵模式:管理多個redis服務器,執行三個任務: 監控:監控主從服務器狀態 提醒:通過API向管理員發送通知 自動故障遷移: 投票:確定master是否下線 (半數原則,至少3個sentinel節點) 選舉:sentiner集群選舉出sentiner leader,sentinel leader在redis從節點中選舉一個節點作為主節點 選舉master依據: Slave-priority:(優先級)最大 復制偏移量:數據寫入量最大 Runid:(啟動redis生成隨機的rundi作為標識)最小
優點:支持故障切換,提高了redis服務的穩定性
3.2 搭建redis 哨兵模式
3.2.1 准備服務器(在主從模式的基礎上操作) 分別在三台服務器上新建目錄: mkdir /usr/local/redis-6379/s1/ mkdir /usr/local/redis-6379/s2/ mkdir /usr/local/redis-6379/s3/ 將源碼包redis-6.2.4下sentinel.conf復制到新建的目錄里: cp redis-6.2.4/sentinel.conf /usr/local/redis-6379/s1/ cp redis-6.2.4/sentinel.conf /usr/local/redis-6379/s2/ cp redis-6.2.4/sentinel.conf /usr/local/redis-6379/s3/ 3.2.2 修改配置文件(sentinel.conf) s1 sentinel.conf bind 192.168.50.10 port 26379 #哨兵s1的服務端口 daemonize yes #后台啟動 protected-mode yes #打開保護模式 pidfile /usr/local/redis-6379/s1/redis-sentinel.pid logfile /usr/local/redis-6379/s1/redis-sentinel.log dir /usr/local/redis-6379/s1/ sentinel monitor mymaster 192.168.50.10 6379 2 sentinel auth-pass mymaster 123 s2 sentinel.conf bind 192.168.50.11 port 26379 #哨兵s1的服務端口 daemonize yes #后台啟動 protected-mode yes #打開保護模式 pidfile /usr/local/redis-6379/s2/redis-sentinel.pid logfile /usr/local/redis-6379/s2/redis-sentinel.log dir /usr/local/redis-6379/s2/ sentinel monitor mymaster 192.168.50.10 6379 2 sentinel auth-pass mymaster 123 s3 sentinel.conf bind 192.168.50.13 port 26379 #哨兵s1的服務端口 daemonize yes #后台啟動 protected-mode yes #打開保護模式 pidfile /usr/local/redis-6379/s3/redis-sentinel.pid logfile /usr/local/redis-6379/s3/redis-sentinel.log dir /usr/local/redis-6379/s3/ sentinel monitor mymaster 192.168.50.10 6379 2 sentinel auth-pass mymaster 123 #解釋 sentinel monitor mymaster 192.168.50.10 6379 2 意思是告訴哨兵去監聽地址為192.168.50.10:6379的一個master,在投票過程中超過2個哨兵同意Master下線時,Master即視為宕機狀態 這里的mymaster是master-name 可以自定義 數字"2"是指明當有2個哨兵認為master掛了,才算真的掛了,這個數字要根據有多少節點來算 3.2.3 重啟redis,並加載哨兵 systemctl restart redis 分別通過s1,s2,s3中的配置問起開啟三個哨兵(由於監視的為同一個Master,三個哨兵會自動組成哨兵網絡) redis-sentinel /usr/local/redis-6379/s1/redis-sentinel redis-sentinel /usr/local/redis-6379/s2/redis-sentinel redis-sentinel /usr/local/redis-6379/s3/redis-sentinel
3.3 測試
斷開Master (192.168.50.10 6379) 查看哨兵的選舉過程 Master重新上線(192.168.50.10 6379) 查看哨兵的選舉過程
#故障切換成功
四、分片集群
4.1 分片集群原理:哈希slot(分庫分表)

1、對象保存到Redis之前先經過CRC16哈希到一個指定的Node上,例如Object4最終Hash到了Node1上。 2、將整個數據庫分為16384個槽位,所有的數據都是這些slot的一個,每個Node被平均分配了一個Slot段,對應着0-16384,Slot不能重復也不能缺失,否則會導致對象重復存儲或無法存儲。 3、Node之間也互相監聽,一旦有Node退出或者加入,會按照Slot為單位做數據的遷移。例如Node1如果掉線了,0-5640這些Slot將會平均分攤到Node2和Node3上,由於Node2和Node3本身維護的Slot還會在自己身上不會被重新分配,所以遷移過程中不會影響到5641-16384Slot段的使用。
4.2 分片集群優缺點
優點:將Redis寫操作分攤到多個節點,提高寫的並發能力,擴容簡單
缺點:每個node承擔着互相監聽、高並發數據寫入、高並發數據讀出,工作任務繁重
主從+哈希slot結合
主從跟哈希slot的優缺點互補,結合起來就是Redis集群的終極形態,先哈希slot分邏輯節點,每個邏輯節點內部是主從

