前言:
我們看到分析 Redis 使用或原理的文章不少,但是完整搭建一套獨立的 redis 集群環境的介紹,并不是很多或者說還不夠詳細。
那么,本文會手把手帶著大家搭建一套 Redis 集群環境,Redis 集群在公司內部生產環境,大都是使用 Linux 操作系統搭建的。
所以,本文也帶領大家搭建一套虛擬機環境,虛擬機中安裝 Linux,常用的 Linux 操作系統如 Ubuntu、CentOS、Redhat等等。
正好我的筆記本上以前下載過 CentOS 鏡像,所以咱們就使用 CentOS 來安裝操作系統,步驟也很簡單,下面會具體介紹。
搭建虛擬機環境:
如果你在公司,也可以使用公司內部現成的虛擬機來安裝,但是如果你不在公司了,因為公司環境本身的限制,可能你得連接公司的VPN才可以訪問公司內的服務器,并不是很方便。
所以,不如自己本機搭建個虛擬機環境,只要有操作系統鏡像,任由你安裝,使用和管理起來都比較方便。
本人使用的 MAC OS,MAC OS 本身就是 Unix 內核的桌面版操作系統,所以如果你的電腦是 MAC,也可以直接搭建 Redis 集群了,但是目前來看大部分同學還是使用 Windows 操作系統的居多,考慮到這一點,還是安裝個虛擬機更為方便。
虛擬機可以選擇 Oracle 開源的免費虛擬機軟件 VirtualBox,我在使用過程中目前暫時沒有發現 MAC OS 上有什么問題。
下面介紹下 VirtualBox 的安裝和配置步驟:
VirtualBox 很傻瓜式,非常簡單的,鑒于有的人并不是都用過,所以這里也一并介紹下。
1)官網下載并安裝
到官網下載對應你電腦操作系統的 VirtualBox 軟件。
下載地址:https://www.virtualbox.org/wiki/Downloads
目前OS X的最新版本:VirtualBox-6.0.14-133895-OSX.dmg
下載后雙擊直接安裝。
2)新建虛擬機
這里選擇的「專家模式」創建,如果選擇「向導模式」(默認),安裝過程會有很多提示信息。
內存按照默認選擇 1024M 創建,虛擬硬盤默認 VDI,指使用 VirtualBox 的磁盤鏡像。
Linux 鏡像默認虛擬硬盤大小為 8g,如果要安裝 windows 虛擬機,虛擬硬盤大小默認建議申請 32g 的磁盤空間。
點擊「創建」完成虛擬機的創建,此時還沒有提示選擇操作系統鏡像的安裝。
3)配置虛擬機
顯示縮放率調整:
本人的電腦使用默認縮放率 100%,窗口很小,進入到全局設置中,點擊「顯示」調整縮放率如 200% 左右,你可以根據窗口大小自行調整。
虛擬機網卡配置:
進入「網絡」,連接方式選擇「橋接網卡」,注意當你換了 wifi 環境,需要重新配置網絡 IP 等。
4)安裝操作系統
新建完虛擬機,右側界面上點擊「啟動」,界面如下所示:
選擇本地準備好的 CentOS Linux 操作系統鏡像文件,點擊「創建」開始安裝過程。
安裝過程的注意點,選擇語言,默認 English,時區選擇 Asia Shanghai,選擇 INSTALLATION DESTINATION 默認自動分區。
以上確定后,點擊「Begin Installation」開始安裝,下一步可以設置 root 賬號密碼。
完成安裝后系統會自動重啟,重啟后輸入剛剛設置的 root 密碼登錄,進入到虛擬機中。
5)虛擬機環境配置
編輯 ifcfg-enp0s3 文件:
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
# 修改ONBOOT為yes
ONBOOT=yes
設置靜態 IP 地址:
# 默認dhcp修改為static
BOOTPROTO=static
# 靜態IP地址
IPADDR=192.168.0.111
# 你的wifi網絡子網掩碼
NETMASK=255.255.255.0
# 你的wifi網絡網關地址
GATEWAY=192.168.0.1
重啟網絡:
service network restart
配置 DNS:
# 檢查 NetManager 狀態:
systemctl status NetworkManager.service
# 檢查 NetManager 管理的網絡接口:
nmcli dev status
# 檢查 NetManager 管理的網絡連接:
nmcli connection show
# 設置 dns:
nmcli con mod enp0s3 ipv4.dns "114.114.114.114 8.8.8.8"
# 讓 dns 配置生效:
nmcli con up enp0s3
配置 hosts:
編輯hosts文件,可以用于 ssh 免密配置。
vi /etc/hosts
# 本機 hosts 配置
192.168.0.111 host01
# 其他主機 hosts 配置
192.168.0.112 host02
關閉防火墻:
默認開啟,啟動一些軟件會導致網絡無法互通
systemctl stop firewalld.service
systemctl disable firewalld.service
配置 yum:
yum 為軟件包管理工具
yum clean all
# 服務器的包下載的本地緩存
yum makecache
yum install -y wget
此時,你登錄到虛擬機中,執行 ifconfig
看不到網卡信息,net-tools 工具包安裝一下。
yum install -y net-tools
安裝 JDK:
安裝方式很多,如果有 rpm 包,可以 wget 下載下來。
執行 rpm 安裝命令:
rpm -ivh jdk-8u131-linux-x64.rpm
配置好 JDK 環境:
vi ~/ .bashrc
export JAVA_HOME=/usr/java/latest
export PATH=$PATH:$JAVA_HOME/bin
source .bashrc
檢查安裝是否成功:java -version
正常顯示JDK版本信息表示安裝正常。
6)其他虛擬機節點安裝
VirtualBox 提供了虛擬機克隆功能,安裝好一臺虛擬機操作系統,通過「復制」快速的創建多臺相同操作系統的虛擬機。
復制后修改下虛擬機名稱,正常啟動后,修改下靜態 IP 地址和 hosts 配置,參考步驟5。
7)ssh 免密互信配置
ssh 互信配置后,可以通過 ssh 后跟 IP 或 主機名無需輸入密碼就能登錄到服務器上去,運維過程中非常常用的一個配置。
執行命令:
# 生成本機的公私秘鑰對
ssh-keygen -t rsa
將公鑰復制為 authorized_keys 文件,此時使用 ssh 連接本機就不需要輸入密碼了。
cd /root/.ssh
cp id_rsa.pub authorized_keys
使用 ssh-copy-id -i hostname
命令將本機的公鑰拷貝到指定機器的 authorized_keys 文件中。
比如你在 host01 機器上,以后就可以直接通過 ssh host02
命令登錄到 host02 機器上了,不需要再次輸入密碼了。
Redis集群環境搭建:
Redis 集群簡介:
Redis 是一個開源的 key-value 分布式存儲系統,由于其出眾的性能,大部分互聯網企業將其用來作為服務端分布式緩存使用。Redis 在 3.0 以前僅支持單實例模式,也支持主從模式、哨兵模式來達到高可用,避免單點故障。在 3.0 版本以后推出了集群模式,更好的滿足業務需求。
Redis 集群采用 P2P 模式,完全去中心化。將所有 Key 分成了 16384 個 slot,每個 Redis 實例負責其中一部分 slot。集群節點之間定期同步數據保持數據一致性。然后,Redis 客戶端可以向任一 Redis 實例發起請求,如果所需數據在該實例中不存在,則會通過重定向命令引導客戶端訪問所需的其他實例。
本文基于 Redis4.0.1 版本搭建集群。
當然,如果你有 Docker 或 K8S 環境,直接從鏡像倉庫拉取現成的 Redis 鏡像后,通過一些參數配置啟動后,就可以很快的搭建一套集群環境。
但這種方式使用對你來說是黑盒的,也就是安裝過程你是了解不到的。
為了大家方便學習了解,我們還是使用原始的,通過安裝包的形式來部署 Redis。
我們準備三臺虛擬機,搭建一個三主三從的 Redis 集群。
Redis 目前最新版本到了 5.0.6,本次安裝使用了 Redis4.0.1 版本,Redis4.0 版本也是目前很多企業在用的,經過生產環境大量驗證的版本,比較穩定。
搭建集群過程如下:
1)下載并安裝
下載安裝包:
# wget下載安裝包
wget http://download.redis.io/releases/redis-4.0.14.tar.gz
# 解壓縮
tar xzf redis-4.0.14.tar.gz
# 重命名為redis,并拷貝到/usr/local目錄
mv redis-4.0.14 redis
cp -r redis /usr/local
安裝依賴包:
yum install -y tcl gcc zlib-devel openssl-devel
編譯:
make MALLOC=libc
將常用命令添加到系統PATH:
cp -a /usr/local/redis/src/redis-server
/usr/local/redis/src/redis-cli
/usr/local/redis/src/redis-sentinel
/usr/local/redis/src/redis-trib.rb
/usr/local/redis/src/redis-check-aof
/usr/local/redis/src/redis-check-rdb
/usr/local/redis/src/redis-benchmark
/usr/local/bin/
這樣就可以直接在服務器上任意目錄使用命令了。
2)集群目錄創建并添加配置
創建 Redis 集群目錄:
mkdir -p /opt/redis-cluster/nodes-{7001,7002}
執行命令后,在 /opt/redis-cluster 目錄會創建 nodes-7001 和 nodes-7002 兩個目錄。
在上述兩個目錄下新建 redis.conf 文件,添加文件內容:
# 當前機器IP地址綁定設置port
bind 192.168.0.111
# redis 監聽端口
port 7001
# 使用 yes 啟用守護進程
daemonize yes
# 當 Redis 以守護進程方式運行時,Redis 默認會把 pid
pidfile redis_7001.pid
# 日志記錄級別,共4個級別:debug、verbose、notice(默認)、warning
loglevel notice
# 日志目錄
logfile "/opt/redis-cluster/nodes-7001/redis_7001.log"
# 本地數據庫存放目錄
dir /opt/redis-cluster/nodes-7001/
# 保存節點配置,自動創建,自動更新
cluster-config-file nodes-7001.conf
# 通過upstart和systemd管理Redis守護進程,與具體的操作系統相關的
supervised no
# 每次更新操作后進行日志記錄,默認:no
appendonly yes
# 開啟集群模式
cluster-enabled yes
# 集群超時時間,節點超過這個時間沒反應就斷定是宕機
cluster-node-timeout 15000
# 多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
save 900 1
save 300 10
save 60 10000
# 本地數據庫的名字
dbfilename dump.rdb
# 存儲到本地文件開啟壓縮,默認:yes
rdbcompression yes
# 更新日志文件名
appendfilename "appendonly.aof"
# 指定更新日志條件:
# no: 等操作系統進行數據緩存同步到磁盤(快)
# always: 每次更新操作后手動調用 fsync() 將數據寫磁盤(慢,安全)
# everysec: 每秒同步一次(折中,默認值)
appendfsync everysec
# 密碼暫未設置,給出配置
# 當 master 服務設置了密碼保護時,slav 服務連接 master 的密碼
#masterauth
# 連接密碼,客戶端需使用AUTH <password>命令連接
#requirepass
其他參數可自行查閱官網文檔。
3)下載并安裝 ruby
搭建 Redis 集群會使用到 redis-trib.rb 腳本來協助創建,所以需要依賴 ruby。
當然,三臺虛擬機都可以安裝,或者你選擇其中一臺虛擬機安裝,并記住它,到時就從這臺機器上執行命令來創建 Redis 集群。
我們使用的 Centos 7 操作系統,默認沒有帶 ruby,所以需要單獨下載安裝。
下載并安裝 ruby:
# wget下載ruby安裝包
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz
# 解壓縮
tar xzf ruby-2.3.4.tar.gz
# 拷貝到/usr/local目錄下,重命名為ruby目錄
mv ruby-2.3.4 /usr/local/ruby
# 編譯
cd /usr/local/ruby/ && ./configure && mark && make install
# 查看下安裝的版本
ruby -v
如果你的 ruby 版本過低,卸載重裝:
ruby -v
rpm -qa | grep ruby
yum erase ruby
安裝 ruby-redis.gem:
# 安裝 ruby-redis.gem
cd /usr/local/redis && gem install redis
安裝過程如果報錯如下:
ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method invoke_with_build_args for nil:NilClass
解決辦法:
cd /usr/local/ruby/ext/zlib
ruby extconf.rb
make && make install
再次執行 gem install redis,如果報錯如下:
ERROR: While executing gem ... (Gem::Exception) Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
解決辦法:
cd /usr/local/ruby/ext/openssl
ruby extconf.rb
將上個步驟生成的MakeFile文件中的${top_srcdir}都替換為../..
make && make install
3)其他兩臺虛擬機上重復上述步驟1和2
請記得修改下 redis.conf 文件的端口:
不需要一個個端口修改,編輯文件
vi redis.conf
直接輸入如下命令:
:%s/7001/7002/g
就可以批量將 7001 修改為 7002,然后輸入 :wq! 退出保存。
4)創建 Redis 集群
使用 redis-trib.rb 腳本創建 Redis 集群,執行如下命令后,會自動分配集群中的 3 個 master 和 3 個 slave。
cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 192.168.0.111:7001 192.168.0.111:7002 192.168.0.112:7001 192.168.0.112:7002 192.168.0.113:7001 192.168.0.113:7002
創建集群過程中遇到:
>>>Creating cluster [ERR] Sorry, can't connect to node 192.168.0.111:7001
解決辦法:
關閉防火墻,上文中也已提到過。
安裝集群執行結果示例:
輸入yes,回車,如下示例:
我們從圖中看到了,三個 M(Master)分配了三臺虛擬機的 7001 端口,三個 S(Slave)分配了三臺虛擬機的 7002 端口。
如果虛擬機重啟后,需要再次創建 Redis 集群或者集群中新增節點,可能遇到如下問題:
./redis-trib.rb create --replicas 1 192.168.0.111:7001 192.168.0.111:7002 192.168.0.112:7001 192.168.0.112:7002 192.168.0.113:7001 192.168.0.113:7002
>>> Creating cluster
[ERR] Node 192.168.0.111:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解決方法:
刪除節點下面的 dump.rdb、appendonly.aof、nodes-7001.conf 文件,并重啟 Redis。
cd /opt/redis-cluster/nodes-7001 && rm -rf dump.rdb appendonly.aof nodes-7001.conf
cd /opt/redis-cluster/nodes-7002 && rm -rf dump.rdb appendonly.aof nodes-7002.conf
# 重啟redis,開機自啟動,下文中會有詳細描述
service redis restart
如果是新增節點,除執行上述命令外,可能會需要登錄到節點上刪除數據庫。
redis-cli -c -h 192.168.0.114 -p 7001
192.168.0.114:7001> flushall
OK
5)測試 Redis 集群
為了測試方便,暫時沒有設置集群密碼,在上文配置中也有提到了密碼設置參數。
使用 redis-cli 客戶端登錄:
# 直接通過redis-cli命令連接
redis-cli -c -h 192.168.0.111 -p 7001
192.168.0.111:7001> set name zhangsan
-> Redirected to slot [5798] located at 192.168.0.112:7001
OK
192.168.0.112:7001> get name
"zhangsan"
找到其他節點任一 IP 和端口連接查詢這個 key:
redis-cli -c -h 192.168.0.113 -p 7001
192.168.0.113:7001> get name
-> Redirected to slot [5798] located at 192.168.0.112:7001
"zhangsan"
說明我們測試的數據在集群之間同步完成了。
查看下集群配置信息:
# redis-cli命令連接節點
redis-cli -c -h 192.168.0.111 -p 7001
# 執行 CLUSTER nodes,看到了集群節點分配的信息
192.168.0.112:7001> CLUSTER nodes
f3b21c6377853c8da63ac6a55fecb1937715ec3b 192.168.0.111:7002@17002 slave 6e81b09991104bf09129aa2bbd226d94d3fcdbe7 0 1574004839302 3 connected
75dec349e2b7fcbcad4d5f5d7979aadefdf69514 192.168.0.113:7002@17002 slave d32ab53d8f93661b09a3c31513fce8c4ed6cbf2b 0 1574004838284 6 connected
6388d80cd9f0a1fbf03d0ac2a309cfedfdb79dc4 192.168.0.111:7001@17001 master - 0 1574004836251 1 connected 0-5460
59f25e64a8ab1fc3309e15d51ea630f439793a94 192.168.0.112:7002@17002 slave 6388d80cd9f0a1fbf03d0ac2a309cfedfdb79dc4 0 1574004840322 1 connected
d32ab53d8f93661b09a3c31513fce8c4ed6cbf2b 192.168.0.113:7001@17001 master - 0 1574004839000 5 connected 10923-16383
6e81b09991104bf09129aa2bbd226d94d3fcdbe7 192.168.0.112:7001@17001 myself,master - 0 1574004837000 3 connected 5461-10922
# 執行 CLUSTER info,看到集群自身的信息
192.168.0.112:7001> CLUSTER info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1256
cluster_stats_messages_pong_sent:1275
cluster_stats_messages_meet_sent:3
cluster_stats_messages_sent:2534
cluster_stats_messages_ping_received:1273
cluster_stats_messages_pong_received:1259
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:2534
6)設置開機自啟動
由于咱們使用的虛擬機,不用的時候可以直接關機,避免一直占用著系統的資源。
當重啟虛擬機的時候,如果你不嫌繁瑣,可以登錄到虛擬機里,直接運行 redis-server 命令啟動服務。
更為優雅的方式,當然是開機后自動啟動 Redis 服務,這也是生產環境上,研發或運維都必須要關注的,服務器重啟,對應的服務也要跟著自動啟動,而不需要人為手動干預了。
進入 /etc/init.d/ 目錄,創建并編輯 redis 文件:
#!/bin/bash
#chkconfig: 22345 10 90
#description: Start and Stop redis
IP=`ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/'`
REDISPORT_1=7001
REDISPORT_2=7002
PIDFILE_1=/opt/redis-cluster/nodes-7001/redis_7001.pid
PIDFILE_2=/opt/redis-cluster/nodes-7002/redis_7002.pid
CONF_1="/opt/redis-cluster/nodes-7001/redis.conf"
CONF_2="/opt/redis-cluster/nodes-7002/redis.conf"
EXEC=/usr/local/redis/src/redis-server
CLIEXEC=/usr/local/redis/src/redis-cli
case "$1" in
start)
if [ -f $PIDFILE_1 ];then
echo "$PIDFILE_1 exists,process is already running or crashed"
else
echo "Starting Redis server... $CONF_1"
$EXEC $CONF_1
fi
if [ -f $PIDFILE_2 ];then
echo "$PIDFILE_2 exists,process is already running or crashed"
else
echo "Starting Redis server... $CONF_2"
$EXEC $CONF_2
fi
;;
stop)
if [ ! -f $PIDFILE_1 ];then
echo "$PIDFILE_1 does not exist,process is not running"
else
PID=$(cat $PIDFILE_1)
echo "Stopping..."
$CLIEXEC -h $IP -p $REDISPORT_1 shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped $CONF_1"
fi
if [ ! -f $PIDFILE_2 ];then
echo "$PIDFILE_2 does not exist,process is not running"
else
PID=$(cat $PIDFILE_2)
echo "Stopping..."
$CLIEXEC -h $IP -p $REDISPORT_2 shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped $CONF_2"
fi
;;
restart)
"$0" stop
sleep 3
"$0" start
;;
*)
echo "Please use start or stop or restart as first argument"
;;
esac
每臺虛擬機有兩個 Redis 端口 7001 和 7002,所以對上述腳本做了修改,如果一臺機器就一個 Redis 服務就簡單多了,大家可自行拷貝腳本修改。
Redis 文件修改為可執行文件:
chmod +x /etc/init.d/redis
添加到系統服務列表:
# 將 /etc/init.d/redis 添加到系統服務列表
chkconfig --add redis
# 設置開機自啟動
chkconfig redis on
# 查看所有注冊的腳本文件
chkconfig --list
然后,你就不需要去找 Redis 啟動命令和配置文件了,方便管理和運維。
有點 low 的啟動方式:
/usr/local/redis/src/redis-server /opt/redis-cluster/nodes-7001/redis.conf
/usr/local/redis/src/redis-server /opt/redis-cluster/nodes-7002/redis.conf
比較優雅的啟動方式:
# 啟動服務
service redis start
# 停止服務
service redis stop
# 重啟服務
service redis restart
另外一種開機自啟動方式:
將啟動命令直接添加到 /etc/rc.d/rc.local 文件中。
修改 rc.local 文件為可執行文件,否則重啟后不執行:
chmod +x /etc/rc.d/rc.local
小結:
本文使用 VirtualBox 免費開源的虛擬機軟件,一步一步來完成虛擬機環境的搭建。
然后基于三臺虛擬機環境,搭建了一套 Redis 集群環境。
通過 redis-trib.rb 腳本來創建 Redis 集群環境,三臺機器,6個通訊端口,自動構建為三主三從的集群架構。
根據執行 redis-trib.rb 腳本日志結果,自動分配IP的 Redis 集群架構如下所示:
對虛擬機安裝配置和 Redis 集群安裝配置過程中,遇到的問題給出了相應的解決辦法,如果你安裝過程中還遇到一些新的問題,也可以自行查詢相關資料解決。
并且,從上述安裝實踐過程中,也能學習到很多常用的 Linux 命令。
大家自行搭建單機或集群環境時,可以#收藏#本文作為參考!