目錄
一.redis羣集介紹
- redis羣集有三種模式,分別是主從同步/複製、哨兵模式、Cluster,下面會講解一下三種模式的工作方式,以及如何搭建Cluster羣集
主從同步/複製
- 通過持久化功能,redis保證了即使在服務器重啓的情況下也不會丟失(或少量丟失)數據,因爲持久化會把內存中的數據保存到硬盤上,重啓會從硬盤上加載數據,但是由於數據是存儲在一臺服務器上的,如果這臺服務器出現硬盤故障等問題,也會導致數據丟失。爲了避免單點故障,通常的做法是將數據庫複製多個副本以部署在不同的服務器上,這樣即使有一臺服務器出現故障,其他服務器依然可以繼續提供服務,爲此,redis提供了複製(replication)功能,可以實現當一臺數據庫中的數據更新後,自動將更新的數據同步到其他數據庫上。
- 在複製的概念中,數據庫分爲兩類,一類是主數據庫(master),另一類是從數據(slave)。主數據可以進行讀寫操作,當寫操作導致數據變化時會自動將數據同步給從數據庫,而從數據庫一般是隻讀的,並接受主數據同步過來的數據。一個主數據庫可以擁有多個從數據庫,而一個從數據庫只能擁有一個主數據庫
- 主從複製原理圖
- 主從複製的優勢:支持主從複製,主機會自動將數據同步到從機,可以進行讀寫分離;爲了分載master的讀操作壓力,slave服務器可以爲客戶端提供只讀操作的服務,寫服務仍然必須由master來完成;slave同樣可以接受其他slaves的連接和同步請求,這樣可以有效的分載master的同步壓力;master server是以非阻塞的方式爲slaves提供服務,所以在master-slave同步期間,客戶端仍然可以提交查詢或者修改請求;slave server同樣是以非阻塞的方式完成數據同步,在數據同步期間,如果有客戶端提交查詢請求,redis則返回同步之前的數據。
- 主從複製的缺點:redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啓或者手動切換前端的IP才能恢復;主機宕機,宕機前有部分數據未能及時同步到從機,切換ip後還會引入數據不一致的問題,降低了系統的可用性;如果多個Slave斷線了,需要重啓的時候,儘量不要在同一時間段重啓,因爲只要slave重啓,就會發送sync請求和主機全量同步;redis較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜
哨兵模式
- 第一種主從同步/複製模式,當主服務器宕機後,需要手動把一臺從服務器切換爲主服務器,這就需要人工干預,比較費事,還會造成一段時間內服務不可用。所以更多時候,我們優先考慮哨兵模式
- 哨兵模式是一種特殊的模式,首先redis提供了哨兵的命令,哨兵就是一個獨立的進程,作爲進程,它會獨立運行。其原理是哨兵通過發送命令,等待redis服務響應,從而監控運行的多個redis實例
- 哨兵模式的作用:通過發送命令,redis服務器返回監控其運行狀態,包括主服務器和從服務器;當哨兵檢測到master宕機,會自動將slave切換成master,然後通過發佈訂閱模式通知其他的從服務,修改配置文件,讓它們切換主機;
- 然而一個哨兵進程對redis服務器進行監控,也可能會出現問題,爲此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式
- 故障切換的過程:假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認爲主服務器不可用,這個現象稱爲主觀下線,當後面的哨兵也檢測到主服務器不可用,並且數量達到一定值時,那麼哨兵之間會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發佈訂閱模式,讓各個哨兵把自己監控的從服務器實現切換主機,這個過程稱爲客觀下線。這樣對於客戶端而言,一切都是透明的
- 哨兵模式的工作方式:①每個Sentinel(哨兵)進程以每秒一次的頻率向整個羣集中的master主服務器,slave從服務器以及其他sentinel進程發送一個ping命令。②如果一個實例(instance)距離最後一次有效回覆ping命令的時間超過down-after-milliseconds選項所指定的值,則這個實例會被sentinel進程標記爲主觀下線(SDOWN);③如果一個master主服務器被標記爲主觀下線(SDOWN),則正在監視這個master主服務器的所有sentinel進程要以每秒一次的頻率確認master主服務器的確進入了主觀下線狀態;④當有足夠數量的sentinel進程(大於等於配置文件指定的值)在指定的時間範圍內確認master主服務器進入了主觀下線狀態(SDOWN),則master主服務器會被標記爲客觀下線(ODOWN);⑤在一般情況下, 每個 Sentinel(哨兵)進程會以每 10 秒一次的頻率向集羣中的所有Master主服務器、Slave從服務器發送 INFO 命令;⑥當Master主服務器被 Sentinel(哨兵)進程標記爲客觀下線(ODOWN)時,Sentinel(哨兵)進程向下線的 Master主服務器的所有 Slave從服務器發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次;⑦若沒有足夠數量的 Sentinel(哨兵)進程同意 Master主服務器下線, Master主服務器的客觀下線狀態就會被移除。若 Master主服務器重新向 Sentinel(哨兵)進程發送 PING 命令返回有效回覆,Master主服務器的主觀下線狀態就會被移除。
- 哨兵模式的優勢:哨兵模式是基於主從模式的,所有主從模式的優點,哨兵模式都具有;主從可以自動切換,系統更健壯,可用性更高
- 哨兵模式的缺點:redis比較難支持在線擴容,在羣集容量達到上限時在線擴容會變得很複雜
Cluster羣集
- redis的哨兵模式基本已經可以實現高可用、讀寫分離,但是在這種模式每臺redis服務器都存儲相同的數據,很浪費內存資源,所以在redis3.0上加入了Cluster羣集模式,實現了redis的分佈式存儲,也就是說每臺redis節點存儲着不同的內容
- 根據官方推薦,集羣部署至少要3臺以上的master節點,最好使用3主3從六個節點的模式。
- Cluster羣集由多個redis服務器組成的分佈式網絡服務羣集,羣集之中有多個master主節點,每一個主節點都可讀可寫,節點之間會相互通信,兩兩相連,redis羣集無中心節點
- 在redis-Cluster羣集中,可以給每個一個主節點添加從節點,主節點和從節點直接遵循主從模型的特性,當用戶需要處理更多讀請求的時候,添加從節點可以擴展系統的讀性能
- redis-cluster的故障轉移:redis羣集的主機節點內置了類似redis sentinel的節點故障檢測和自動故障轉移功能,當羣集中的某個主節點下線時,羣集中的其他在線主節點會注意到這一點,並且對已經下線的主節點進行故障轉移
- 集羣進行故障轉移的方法和redis sentinel進行故障轉移的方法基本一樣,不同的是,在集羣裏面,故障轉移是由集羣中其他在線的主節點負責進行的,所以羣集不必另外使用redis sentinel
二.redis-cluster羣集搭建
實驗環境
類別 | IP地址 | 系統 | 軟件包 |
master |
ens33:192.168.43.101 ens37:192.168.43.247 ens38:192.168.43.248 |
centos7 |
redis-5.0.7.tar.gz rvm-1.29.9.tar.gz |
slave |
ens33:192.168.43.102 ens36:192.168.43.185 ens37:192.168.43.156 |
centos7 | redis-5.0.7.tar.gz |
master的具體配置
- 安裝redis
1.下載redis的安裝包
[root@localhost ~]# yum install vsftpd -y
[root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2.通過yum工具,安裝編譯工具
[root@localhost ~]# yum install gcc gcc-c++ make -y
3.解壓redis軟件包
tar xzvf redis-5.0.7.tar.gz -C /opt
4.編譯且安裝
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
5.開啓服務,設置各類文件
cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] //定義主配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] //定義日誌文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] //數據文件
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server //可執行文件路徑,需要自行定義
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost redis]# netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6475/redis-server 1
6.創建軟鏈接,便於服務控制
ln -s /usr/local/redis/bin/* /usr/local/bin/
7.進入redis數據庫
[root@localhost init.d]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.43.101 //綁定本機地址
[root@localhost init.d]# service redis_6379 restart //重啓服務
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# redis-cli -h 192.168.43.101 -p 6379 //-h指定地址,-p指定端口
192.168.43.101:6379>
-
redis的配置文件修改
[root@localhost ~]# cd /etc/redis/
[root@localhost redis]# ls
6379.conf
[root@localhost redis]# vim 6379.conf
#bind 127.0.0.1 //註釋第70行的監聽127地址,表示監聽所有地址
protected-mode no //去掉第89行註釋,關閉安全保護
port 6379 //去掉第93行註釋,開啓端口6379
daemonize yes //去掉第137行註釋,以獨立進程啓動
appendonly yes //去掉第700行註釋,開啓aof持久化功能
cluster-enabled yes //去掉第833行註釋,開啓羣集功能
cluster-config-file node-6379.conf //去掉第841行註釋,羣集名稱文件設置
cluster-node-timeout 15000 //去掉第847行註釋,羣集超時時間設置
[root@localhost ~]# service redis_6379 restart //重啓服務
[root@localhost ~]# ls /var/lib/redis/6379/ //生成下列三個文件說明設置成功
appendonly.aof dump.rdb nodes-6379.conf
[root@localhost ~]#
-
安裝rvm、ruby等控制羣集軟件包
-
先安裝rvm
[root@master1 6379]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 '//導入key文件,若出現error,重新導入一次即可'
[root@master1 6379]# curl -sSL https://get.rvm.io | bash -s stable '//安裝rvm'
注:執行 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3第一次時會出現超時錯誤,可繼續執行第二次
執行curl -sSL https://get.rvm.io | bash -s stable時可能會出現curl: (7) Failed connect to get.rvm.io:443; 拒絕連接錯誤
可以關閉虛擬機防火牆,安全性功能,也有也可能時網絡比較差,此外也可以把https換成http試試
-
執行上述命令之後,到指定的網址下載rvm軟件包
- 繼續安裝ruby
[root@master1 ]# tar xzvf rvm-1.29.9.tar.gz -C /opt
[root@master1 ]# cd /opt/rvm-1.29.9/
[root@master1 rvm-master]# ./install
[root@master1 rvm-master]# source /etc/profile.d/rvm.sh '//執行環境變量'
[root@master1 rvm-master]# rvm list known '//列出ruby可以安裝的版本'
[root@master1 rvm-master]# rvm install 2.4.1 '//安裝ruby2.4.1版本,安裝版本的事件會比較長'
[root@master1 rvm-master]# ruby -v '//查看當前ruby版本'
[root@master1 rvm-master]# gem install redis '//再次安裝redis'
- 在主服務器上添加兩張網卡(NAT模式)
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.101 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::ba30:ef5e:b59f:4f1c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:5f:24 txqueuelen 1000 (Ethernet)
RX packets 20474 bytes 23306731 (22.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13349 bytes 1202079 (1.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.247 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::5002:420d:b2f3:d518 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:5f:2e txqueuelen 1000 (Ethernet)
RX packets 25 bytes 4365 (4.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18 bytes 3497 (3.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.248 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::65f1:4a49:7551:b2ad prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:5f:38 txqueuelen 1000 (Ethernet)
RX packets 17 bytes 3581 (3.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 3757 (3.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5916 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5916 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:7a:bf:df txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#
- 關閉防火牆,SElinux功能
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]#
-
創建羣集
[root@localhost ~]# redis-cli --cluster create 192.168.43.101:6379 192.168.43.102:6379 192.168.43.185:6379 192.168.43.156:6379 192.168.43.247:6379 192.168.43.248:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.43.247:6379 to 192.168.43.101:6379
Adding replica 192.168.43.248:6379 to 192.168.43.102:6379
Adding replica 192.168.43.156:6379 to 192.168.43.185:6379
M: fb29c713b2a345948594e2dfc3ba0d1d7e2b892b 192.168.43.101:6379
slots:[0-5460] (5461 slots) master
M: f0bb6db083e065ca614b306e92a4c7e347379746 192.168.43.102:6379
slots:[5461-10922] (5462 slots) master
M: f0bb6db083e065ca614b306e92a4c7e347379746 192.168.43.185:6379
slots:[10923-16383] (5461 slots) master
S: f0bb6db083e065ca614b306e92a4c7e347379746 192.168.43.156:6379
replicates f0bb6db083e065ca614b306e92a4c7e347379746
S: fb29c713b2a345948594e2dfc3ba0d1d7e2b892b 192.168.43.247:6379
replicates fb29c713b2a345948594e2dfc3ba0d1d7e2b892b
S: fb29c713b2a345948594e2dfc3ba0d1d7e2b892b 192.168.43.248:6379
replicates f0bb6db083e065ca614b306e92a4c7e347379746
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 192.168.43.101:6379)
M: fb29c713b2a345948594e2dfc3ba0d1d7e2b892b 192.168.43.101:6379
slots:[0-5460] (5461 slots) master
M: f0bb6db083e065ca614b306e92a4c7e347379746 192.168.43.102:6379
slots:[5461-16383] (10923 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]#
'//一主一從的綁定關係是隨機的'
salve的具體配置
- 安裝redis
1.下載redis的安裝包
[root@localhost ~]# yum install vsftpd -y
[root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2.通過yum工具,安裝編譯工具
[root@localhost ~]# yum install gcc gcc-c++ make -y
3.解壓redis軟件包
tar xzvf redis-5.0.7.tar.gz -C /opt
4.編譯且安裝
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
5.開啓服務,設置各類文件
cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] //定義主配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] //定義日誌文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] //數據文件
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server //可執行文件路徑,需要自行定義
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost redis]# netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6475/redis-server 1
6.創建軟鏈接,便於服務控制
ln -s /usr/local/redis/bin/* /usr/local/bin/
7.進入redis數據庫
[root@localhost init.d]# vim /etc/redis/6379.conf
bind 127.0.0.1 //綁定本機地址
[root@localhost init.d]# service redis_6379 restart //重啓服務
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# redis-cli -h 192.168.43.102 -p 6379 //-h指定地址,-p指定端口
192.168.43.102:6379>
- 修改redis的配置文件
[root@localhost ~]# cd /etc/redis/
[root@localhost redis]# ls
6379.conf
[root@localhost redis]# vim 6379.conf
#bind 127.0.0.1 //註釋第70行的監聽127地址,表示監聽所有地址
protected-mode no //去掉第89行註釋,關閉安全保護
port 6379 //去掉第93行註釋,開啓端口6379
daemonize yes //去掉第137行註釋,以獨立進程啓動
appendonly yes //去掉第700行註釋,開啓aof持久化功能
cluster-enabled yes //去掉第833行註釋,開啓羣集功能
cluster-config-file node-6379.conf //去掉第841行註釋,羣集名稱文件設置
cluster-node-timeout 15000 //去掉第847行註釋,羣集超時時間設置
[root@localhost ~]# service redis_6379 restart //重啓服務
[root@localhost ~]# ls /var/lib/redis/6379/ //生成下列三個文件說明設置成功
appendonly.aof dump.rdb nodes-6379.conf
[root@localhost ~]#
- 添加兩張網卡,NAT模式
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.102 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::8bfb:257d:51e7:df8d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0b:69:b8 txqueuelen 1000 (Ethernet)
RX packets 104 bytes 14082 (13.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 130 bytes 15325 (14.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.185 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::e290:e267:67cc:d325 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0b:69:cc txqueuelen 1000 (Ethernet)
RX packets 23 bytes 4114 (4.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23 bytes 3790 (3.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.43.156 netmask 255.255.255.0 broadcast 192.168.43.255
inet6 fe80::27d8:17c4:73f1:4b4a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0b:69:c2 txqueuelen 1000 (Ethernet)
RX packets 15 bytes 2534 (2.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21 bytes 3566 (3.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5916 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5916 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:ae:e3:34 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]#
- 關閉防火牆,SElinux
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]#
驗證羣集功能
- 驗證主從數據同步
[root@localhost ~]# redis-cli -h 192.168.43.101 -p 6379 '//登陸到101服務器數據庫'
192.168.43.101:6379> keys *
(empty list or set)
192.168.43.101:6379> set user lisi '//創建一個鍵值'
OK
192.168.43.101:6379> keys * '//查看所有鍵'
1) "user"
192.168.43.101:6379> get user '//查看user鍵的值'
"lisi"
192.168.43.101:6379> exit '//退出'
[root@localhost ~]# redis-cli -h 192.168.43.247 -p 6379 '//登陸到247服務器數據庫'
192.168.43.247:6379> keys *
1) "user"
192.168.43.247:6379> get user '//查看user鍵的值'
(error) MOVED 5474 192.168.43.102:6379 '//提示移動到102節點上'
192.168.43.247:6379> exit
[root@localhost ~]# redis-cli -h 192.168.43.102 -p 6379 '//登陸到102服務器的數據庫'
192.168.43.102:6379> keys *
1) "user"
192.168.43.102:6379> get user
"lisi"
192.168.43.102:6379> exit