目录
一.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