redis源碼包下載地址:http://download.redis.io/releases/
redis使用手冊:http://redisdoc.com/index.html
下載需要注意的是: Redis 使用標准版本標記進行版本控制:major.minor.patchlevel。偶數的版本號表示穩定的版本, 例如 1.2,2.0,2.2,2.4,2.6,2.8,奇數的版本號用來表示非標准版本,例如2.9.x是非穩定版本,它的穩定版本是3.0。
注意:Redis集群至少需要3個master節點,所以現在總共有6個節點,就只能是1master對應1slave這種方式
Redis集群為什么至少需要三個master節點?
因為新master的選舉需要大於半數的集群master節點同意才能選舉成功,如果只有兩個master節點,當其中一個掛了,是達不到選舉新master的條件的
Redis集群為什么推薦master節點數為奇數?
master節點數為奇數不是必須的,但是奇數個master節點可以在滿足選舉該條件的基礎上節省一個節點。
因為master的選舉機制,例如:
在9個master的架構中,如果4台master故障,通過過半機制,redis可以選舉新的master。如果5台master故障無法選舉新的master(9-5<9/2,不滿足過半機制)
在10個master的架構中,如果4台master故障,通過過半機制,redis可以選舉新的master。如果5台master故障無法選舉新的master(10-5=10/2,不滿足過半機制)
Redis集群部署
該部署使用的Red Hat 7為例
下列部署方式采用的是redis-cli方式創建的redis集群,只有redis5.0以后的版本才支持該方式,之前的版本都是使用redis-trib.rb方式,但是需要安裝ruby軟件相對復雜。
服務規划:
我們使用3台設備進行搭建,每台設備上有兩個節點,使用不同的端口進行部署
安裝前准備(所有設備):
1.下載所需依賴包
yum -y install gcc-c++
2.關閉防火牆
systemctl stop firewalld.service
systemctl disable firewalld.service
3.關閉SELinux
setenforce 0
vi /etc/selinux/config
SELINUX=enforcing改為SELINUX=disabled
安裝redis(192.168.36.137)
1.解壓安裝包
#將安裝包上傳至/opt/instll下(個人習慣)
tar -zxvf /opt/install/redis-6.2.1/tar/gz
cd /opt/install/redis-6.2.1
#編譯安裝至/opt/redis7000下,7000是我們該redis使用的端口
make && make install PREFIX=/opt/redis7000
2.配置redis配置文件
mkdir -p /opt/redis7000/conf
cd /opt/install/redis-6.2.1
#將redis源碼包里的redis.conf配置文件放置到我們redis安裝路徑下
mv redis.conf /opt/redis7000/conf/
vim /opt/redis7000/conf/redis.conf
1.bind 192.168.36.137 //將bind 127.0.0.1修改為自己本機的IP地址
2.daemonize yes //redis放置后台啟動
3.port 7000 //設置端口
4.pidfile /opt/redis7000/redis_7000.pid
5.logfile /opt/redis7000/redis_7000.log
6.dir /opt/redis7000/redis_7000_dir
7.masterauth 123 //配置密碼,所有節點統一
8.requirepass 123 //配置密碼,所有節點統一
9.cluster-enabled yes //開啟集群
10.cluster-config-file redis.conf //指定配置文件名稱
11.cluster-node-timeout 15000
12.appendonly yes //開啟aof持久化,要想了解redis持久化,可以看我之前寫的redis持久化說明,如果對於redis上的數據不是那么重要的話,也可以不進行redis持久化配置
13.no-appendfsync-on-rewrite yes //aof重寫期間是否同步
14.protected-mode no //關閉保護模式
15.maxmemory 4GB //設置 Redis 最大使用內存大小,當 Redis 使用的內存超過設置大小時就開始對數據進行淘汰
16.maxmemory-policy volatile-lru //設置 Redis 的內存淘汰算法為:在設置了過期時間的Keys中,通過LRU算法來進行淘汰
17.若Redis里存放的是一些無關緊要的數據,可以將Redis配置成無持久化,有助於性能提升,將下列項注釋即可
#save 900 1
#save 300 10
#save 60 10000
mkdir /opt/redis7000/redis_7000_dir
擴展說明:
# Redis 內存淘汰算法分為隨機、TTL、LRU、LFU四種 1.隨機算法很好理解,就是從數據庫中隨機淘汰一些 Keys 2.TTL 算法就是從設置了過期時間的 Keys 中獲取最早過期的 一批 Keys,然后淘汰這些Keys 3.LRU 主要是通過 Key 的最后訪問時間來判定哪些 Key 更適合被淘汰 4.LFU算法主要通過 Key 的訪問頻率來統計哪些 Key 更適合被淘汰 # 我們可以在配置文件中配置 maxmemory-policy 配置項來設置 Redis 的內存淘汰算法, maxmemory-policy 可選值如下所示 1.volatile-lru:在設置了過期時間的Keys中,通過LRU算法來進行淘汰 2.allkeys-lru:在所有的Keys中,通過LRU算法進行淘汰 3.volatile-lfu:在設置了過期時間的Keys中,通過LFU算法來進行淘汰 4.allkeys-lfu:在所有的Keys中,通過LFU算法進行淘汰 5.volatile-random:在設置了過期時間的Keys中,通過隨機算法來進行淘汰 6.allkeys-random:在所有的Keys中,通過隨機算法進行淘汰 7.volatile-ttl:在設置了過期時間的Keys中,選擇過期時間最短的Key進行淘汰 8.noeviction:不對Keys進行淘汰
3.復制redis7000創建第二個節點,使用7001端口
cp -r /opt/redis7000 /opt/redis7001
cd /opt/redis7001/conf/
#文檔內容替換,替換7000字符成7001
sed -i "s/7000/7001/g" redis.conf
#修改dir數據文件名稱
cd /opt/redis7001/
mv redis_7000_dir redis_7001_dir
至此,192.168.36.137設備上的兩個redis就已經配置完成了!
4.將redis文件遠程拷貝到其它設備上
scp -r /opt/redis7000 root@192.168.36.138:/opt
scp -r /opt/redis7000 root@192.168.36.139:/opt
然后修改其它兩台設備上的redis文件名和dir文件名,並將redis.conf配置文件內容進行替換成對應的內容即可,可以參考我上方所使用的sed命令進行替換。IP也要記得修改
最后再將6個節點的redis全部啟動即可。(進入redis的bin目錄,使用./redis-cli ../conf/redis.conf命令啟動)
創建redis集群
隨便登錄一台服務器上的一個節點,在此,我以192.168.36.137為例
cd /opt/redis7000/bin
#cluster-replicas 1代表1個master后有幾個slave節點,1代表1個,所以6個節點將會產生3個master和3個slave,-a 指定redis的密碼
./redis-cli --cluster create 192.168.36.137:7000 192.168.36.137:7001 192.168.36.138:7002 192.168.36.138:7003 192.168.36.139:7004 192.168.36.139:7005 --cluster-replicas 1 -a 123
#該命令只需要執行一次即可,后面哪怕我們重啟了整個redis,也不需要執行第二次了
Can I set the above configuration? (type 'yes' to accept): yes //彈出該項,輸入yes即可
連接redis集群
cd /opt/redis7000/bin
# -c代表連接集群,-a是我們的redis密碼
./redis-cli -h 192.168.36.137 -p 7000 -c -a 123 --raw
#要想不提示下方的警告,在命令后加上 2>/dev/null即可
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. //該警告是我們的密碼明文顯示提示的警告
# 列出集群的節點的信息
192.168.36.137:7000> cluster nodes 1ade62b46631ea9be6c0637df17dfe8098481aec 192.168.36.138:7003@17003 slave 3584cbe89f97020ac8f3a2c9fcfca8b4a78fcc86 0 1645701258000 1 connected 82f2ce489ae537381244f700567792ce5ba803ee 192.168.36.138:7002@17002 master - 0 1645701260457 3 connected 5461-10922 4525f4572ebebf6e795e3b6621e60e3170fec7e7 192.168.36.137:7001@17001 slave 1dcb5a3eb366a5bc4e96ca3c59dd7b2af09b38ac 0 1645701261462 5 connected 3584cbe89f97020ac8f3a2c9fcfca8b4a78fcc86 192.168.36.137:7000@17000 myself,master - 0 1645701261000 1 connected 0-5460 1dcb5a3eb366a5bc4e96ca3c59dd7b2af09b38ac 192.168.36.139:7004@17004 master - 0 1645701260000 5 connected 10923-16383 4c178df9271d6a57c5725c7442d97a6586a35cb6 192.168.36.139:7005@17005 slave 82f2ce489ae537381244f700567792ce5ba803ee 0 1645701259452 3 connected
# 列出當前節點的信息
cluster info
需要特別說明的是,redis集群中插入數據的話是隨機存儲到集群中的某個節點的,是一個分布式的存儲,你只有進入到對應的節點,才可以看到相應的數據
至此,redis集群就部署完成了!