帶你來搭建虛擬機和Redis集群,記得收藏

作者東昇的思考

1、前言

我們看到分析 Redis 使用或原理的文章不少,但是完整搭建一套獨立的 Redis 集群環境的介紹,並不是很多或者說還不夠詳細。

那麼,本文會手把手帶著大家搭建一套 Redis 集群環境,Redis 集群在公司內部生產環境,大都是使用 Linux 操作系統搭建的。

所以,本文也帶領大家搭建一套虛擬機環境,虛擬機中安裝 Linux,常用的 Linux 操作系統如 Ubuntu、CentOS、Redhat等等。

正好我的筆記本上以前下載過 CentOS 鏡像,所以咱們就使用 CentOS 來安裝操作系統,步驟也很簡單,下面會具體介紹。



2、虛擬機環境搭建


如果你在公司,也可以使用公司內部現成的虛擬機來安裝,但是如果你不在公司了,因為公司環境本身的限制,可能你得連接公司的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)新建虛擬機

這裡選擇的「專家模式」創建,如果選擇「嚮導模式」(默認),安裝過程會有很多提示信息。

帶你來搭建虛擬機和Redis集群,記得收藏

內存按照默認選擇 1024M 創建,虛擬硬盤默認 VDI,指使用 VirtualBox 的磁盤鏡像。

帶你來搭建虛擬機和Redis集群,記得收藏

Linux 鏡像默認虛擬硬盤大小為 8g,如果要安裝 windows 虛擬機,虛擬硬盤大小默認建議申請 32g 的磁盤空間。

點擊「創建」完成虛擬機的創建,此時還沒有提示選擇操作系統鏡像的安裝。

3)配置虛擬機

顯示縮放率調整:

本人的電腦使用默認縮放率 100%,窗口很小,進入到全局設置中,點擊「顯示」調整縮放率如 200% 左右,你可以根據窗口大小自行調整。

帶你來搭建虛擬機和Redis集群,記得收藏

虛擬機網卡配置:

進入「網絡」,連接方式選擇「橋接網卡」,注意當你換了 wifi 環境,需要重新配置網絡 IP 等。

帶你來搭建虛擬機和Redis集群,記得收藏

4)安裝操作系統

新建完虛擬機,右側界面上點擊「啟動」,界面如下所示:

帶你來搭建虛擬機和Redis集群,記得收藏

選擇本地準備好的 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 提供了虛擬機克隆功能,安裝好一臺虛擬機操作系統,通過「複製」快速的創建多臺相同操作系統的虛擬機。

帶你來搭建虛擬機和Redis集群,記得收藏

複製後修改下虛擬機名稱,正常啟動後,修改下靜態 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 機器上了,不需要再次輸入密碼了。



3、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集群,記得收藏

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
/<password>

此外,還有很多配置項,可自行查閱官網文檔。

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

解決辦法:

關閉防火牆,上文中也已提到過。

安裝集群執行結果示例:

帶你來搭建虛擬機和Redis集群,記得收藏

輸入yes,回車,如下示例:

帶你來搭建虛擬機和Redis集群,記得收藏

我們從圖中看到了,三個 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 文件:


帶你來搭建虛擬機和Redis集群,記得收藏


帶你來搭建虛擬機和Redis集群,記得收藏


帶你來搭建虛擬機和Redis集群,記得收藏

每臺虛擬機有兩個 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


4、小結


本文使用 VirtualBox 免費開源的虛擬機軟件,一步一步來完成虛擬機環境的搭建。

然後基於三臺虛擬機環境,搭建了一套 Redis 集群環境。

通過 redis-trib.rb 腳本來創建 Redis 集群環境,三臺機器,6個通訊端口,自動構建為三主三從的集群架構。

根據執行 redis-trib.rb 腳本日誌結果,自動分配IP的 Redis 集群架構如下所示:

帶你來搭建虛擬機和Redis集群,記得收藏

對虛擬機安裝配置和 Redis 集群安裝配置過程中,遇到的問題給出了相應的解決辦法,如果你安裝過程中還遇到一些新的問題,也可以自行查詢相關資料解決。

並且,從上述安裝實踐過程中,也能學習到很多常用的 Linux 命令。

大家自行搭建虛擬機或 Redis 集群環境時,可以#收藏#本文作為參考!


分享到:


相關文章: