1、虛擬機環境
使用的Linux環境已經版本:
Centos 7 64位系統
主機ip:
192.168.56.180
192.168.56.181
192.168.56.182
每台服務器是1主1從,實驗3台服務器課成為3主3從。
Redis安裝的項目目錄、日志、配置文件等都存放在/root/svr/目錄下。
2、下載相關的安裝包以及解壓
首先在192.168.56.180機器操作:
cd /root/svr wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar -zxvf redis-3.2.9.tar.gz
3、安裝
在/root/svr/redis-3.2.9/目錄下執行:
make install PREFIX=/root/svr/redis-3.2.9
4、配置信息
創建集群配置、log日志、數據所在的文件夾:
cd /root/svr/redis-3.2.9/ mkdir cluster-conf
創建集群端口文件夾:
cd cluster-conf mkdir 7777 mkdir 8888
復制配置文件到/root/svr/redis-3.2.9/cluster-conf/7777目錄下:
cp /root/svr/redis-3.2.9/redis.conf /root/svr/redis-3.2.9/cluster-conf/7777
修改7777目錄下redis.conf配置文件:
(注意:找到相應的信息修改,或者把修改的信息全部注釋掉,重新添加下面信息到頭部,有利於以后修改和查看)
#注釋掉ip或者設置0.0.0.0都是局域網訪問 #bind 127.0.0.1 #端口號 port 7777 #指定了記錄日志的文件 logfile "/root/svr/redis-3.2.9/cluster-conf/7777/redis.log" #該目錄要事先創建好,數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄 dir /root/svr/redis-3.2.9/cluster-conf/7777/ #是否開啟集群 cluster-enabled yes #集群配置文件的名稱,每個節點都有一個集群相關的配置文件,持久化保存集群的信息, #這個文件並不需要手動配置,這個配置文件有Redis生成並更新, #每個Redis集群節點需要一個單獨的配置文件,請確保與實例運行的系統中配置文件名稱不沖突。 cluster-config-file nodes.conf #節點互連超時的閥值。集群節點超時毫秒數 cluster-node-timeout 5000 #默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了, #但是redis如果中途宕機,會導致可能有幾分鍾的數據丟失, #根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性, #Redis會把每次寫入的數據在接收后都寫入 appendonly.aof 文件, #每次啟動時Redis都會先把這個文件的數據讀入內存里,先忽略RDB文件。 appendonly yes
復制7777目錄下redis.conf至8888並修改端口及存儲路徑:
cp /root/svr/redis-3.2.9/cluster-conf/7777/redis.conf /root/svr/redis-3.2.9/cluster-conf/8888
5、使用scp復制安裝和配置好的redis復制到其他服務器上
已經在192.168.56.180機器配置好,復制到181和182機器
在兩台新機器上創建文件夾
mkdir /root/svr
復制:
scp -r /root/svr/redis-3.2.9 root@192.168.56.181:/root/svr/ #輸入181機器密碼即可傳輸數據。
scp -r /root/svr/redis-3.2.9 root@192.168.56.182:/root/svr/ #輸入182機器密碼即可傳輸數據。
6、啟動3台機器的redis
3台機器執行啟動方式:
/root/svr/redis-3.2.9/bin/redis-server /root/svr/redis-3.2.9/cluster-conf/7777/redis.conf & /root/svr/redis-3.2.9/bin/redis-server /root/svr/redis-3.2.9/cluster-conf/8888/redis.conf &
查看狀態是否:
ps -ef|grep redis
7、創建集群
/root/svr/redis-3.2.9/src/redis-trib.rb create --replicas 1 192.168.56.180:7777 192.168.56.180:8888 192.168.56.181:7777 192.168.56.181:8888 192.168.56.182:7777 192.168.56.182:8888
無法創建,提示錯誤信息:
提示錯誤,是沒有安裝ruby這個插件,因為redis
集群創建的程序文件redis-trib,rb是由ruby來編寫的,需要安裝:
yum install ruby
安裝ruby完畢接着執行上面的創建集群命令
報錯。這時候需要安裝一些和ruby與reids相關程序包和類庫
yum install rubygems gem install reids
報錯,提示ruby版本需要大於2.2.2版本。CentOS7 yum庫中ruby的版本支持到 2.0.0,可gem 安裝redis需要最低是2.2.2
需要安裝個高版本的ruby
#安裝curl yum install curl #安裝rvm #gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 #curl -L get.rvm.io | bash -s stable #source /usr/local/rvm/scripts/rvm
查看rvm庫中已知的ruby版本
rvm list known
安裝一個ruby版本
rvm install 2.4.0
使用一個ruby版本
rvm use 2.4.0
卸載一個已知版本
rvm remove 2.0.0
查看現在版本
ruby --version
在重新安裝ruby相關的redis就可以了
gem install redis
更新ruby版本、移除舊版本、重新安裝reids完畢。接着執行上面的創建集群命令。
還是出現錯誤:提示連接不上節點:
這時候需要排查一下錯誤:
第一:服務器是否關閉防火牆
systemctl status firewalld.service #查看防火牆 systemctl stop firewlld.service #關閉防火牆
(我這邊已經關閉)
第二:是否所有的節點都啟動
ps -ef|grep redis
(我這邊都已經啟動並且正常運行)
第三:服務器之間是否ping通
ping 192.168.56.180
ping 192.168.56.181
ping 192.168.56.182
(我這邊都能正常ping通過)
第四:是否可以telnet ip port 連接上
yum install telnet telbet 192.168.56.180 7777
出現錯誤:提示redis是受保護的,需要身份驗證才可以進行:
這個問題解決可以有兩種方法解決:
(1)修改配置文件redis.conf的權限參數設置為no,就是不需要權限驗證
protected-mode no
(2)修改配置文件redis.conf的權限設置安全密碼(密碼自定義設置)
requirepass “111111” #權限密碼
我這里是第一解決方法,不需要權限,先kill啟動的6個redis進程,在修改配置文件。在啟動reidis服務。
接着執行上面的創建集群命令。
創建集群啟動成功。
8、測試redis集群
#登錄客戶端
./redis-cli -c -p 7777(或者8888) #-c 參數:表示使用集群模式連接
在192.168.56.181:7777服務set值
在192.168.56.182:8888服務上get
9、數據解析
完整搭建起來,管理的集群以及主從關聯都在nodes.conf文件中生成的,我這邊集群節點的生成配置文件數據顯示
主/從 節點id ip prot slot槽范圍 槽數量 m/s 主從等比例 附近信息(如果是主節點記錄為復制功能,如果是從節點,關聯相應的主節點id) M: 3f0d98eebfa18364a95ce7a578865ba7a3ef4493 192.168.56.180:7777 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 54a525c670ad92a45dccfa92164c0a5f220a10bc 192.168.56.180:8888 slots: (0 slots) slave replicates 078973835bb8a36aeef272c2e243a9d9d733ea96 M: 078973835bb8a36aeef272c2e243a9d9d733ea96 192.168.56.181:7777 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 4e13f9dca80c63079e536b17eaa81cef8fcba624 192.168.56.182:8888 slots: (0 slots) slave replicates 3c0fa46c14e6d25c7e7b01079162baec86bd88e9 M: 3c0fa46c14e6d25c7e7b01079162baec86bd88e9 192.168.56.182:7777 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: d507f34a7dab6dc512a82427e3731967f5a69101 192.168.56.181:8888 slots: (0 slots) slave replicates 3f0d98eebfa18364a95ce7a578865ba7a3ef4493
當節點掛了,nodes.conf會記錄新的數據
當主節點掛了,因為集群會一直在監聽集群中的主從節點的狀態。加入一個主節點掛了,集群監聽機制檢查到,會對主節點的槽(數據)進行遷移,按照投票機制將主節點關聯的從節點進行選舉出一個充當主節點,因為我這里一個主節點關聯一個從節點,所以只能是那個充當。
10、擴展知識
(1)持久層的配置和原理:rdb和aof
(2)哨兵、數據字段遷移、鍵空間遷移、在線遷移、redis-trib.rb的詳解
(3)集群節點添加,刪除
(4)Jedis客戶端對集群的數據操作:set、list、key/value、hash等
(5)將key值執行CRC16算法對18384個槽進行取模
(6)壓測.........