# 安装 Redis

为什么第一章已经讲了安装,这里还要讲:

  1. 第一章主要是 windows 下安装,单纯解压一个压缩包就能用,但是 Linux 方面反而没讲清楚。
  2. 重新讲一下 CentOS 下安装 Redis,以及一些操作,方便我们配置 Redis 集群。

你需要在虚拟机上多安装几个 CentOS 系统,至少两个,并且都需要装 Redis,所以请不要偷懒,本文会一步步带你操作。

# 安装 CentOS

我使用的是 CentOS-7 版本,镜像源文件链接:CentOS-7-x86_64-DVD-2009.iso 4.4GB 不要下错了。

  1. 新建虚拟机 -> 自定义 (高级)(C),然后点两次下一步,到选择安装程序光盘映像文件:
  2. 然后对系统命名,选择合适的文件夹存放,可以看到这将是我第三个 CentOS:
  3. 分配处理器数量和内核数量,都选 2 就行,下一步分配内存,我选的是 2048MB。
  4. 网络使用 NAT,它默认选好了,无脑下一步就行,磁盘大小分配 20GB(其实只是装 Redis 的话也用不了那么多🤣)。
  5. 点击下一步,进入自定义硬件,移除打印机即可。
  6. 直接选择 English(United States),然后有几个关键的步骤一定要跟着操作
    1. 进入 SOFTWARE SELECTION ,勾选 GNOME Desktop ,这是下载桌面版,不勾选的话安装好后就是命令行模式,看你喜欢哪一种咯(虽然我装好后也是本地 ssh 连接的🤣),选后点击左上角 Done:
    2. 进入 NETWORK & HOST NAME ,打开 Ethernet(ens33),一定要打开,不然 ifconfig 命令找不到 ip:
    3. 设置账户密码就行了

# 下载 Redis

通过命令行安装即可,也可以下载压缩包,解压安装,我们这里讲后者,命令行安装虽然简单,但是不方便讲解

# 建议在根目录下创建 devtool 目录,放开发软件
cd /
sudo mkdir devtool
cd devtool
# 新建 redis 目录,待会下载的东西就放到这里
sudo mkdir redis
cd redis
# 在 redis 目录下载压缩包
sudo wget http://download.redis.io/releases/redis-5.0.14.tar.gz
# 解压
sudo tar -zxf redis-5.0.14.tar.gz
cd redis-3.2.0
# 如果没有 gcc 和 vim,下载一下
sudo yum install gcc
sudo yum install vim
# 安装
sudo make

还是在 redis-5.0.14(解压后的目录), ls 目录看到 redis.conf 文件,有些人喜欢个人修改配置文件,需要复制一份 redis.conf ,然后再修改复制文件,放到其他位置,启动 redis 时再指定该文件,总之就是避免在原文件中修改,可是我偏不,自己会用就行(当然,你要确保你在改什么,而不是说改了之后出了问题你不会解决),规矩是死的。

我们直接 sudo vim redis.conf 修改文件:

  1. 找到 protected-mode yes ,把 yes 改为 no 。保护模式是只允许主机连接 redis 服务器,改为 no 就能使其他设备连到 redis。
  2. 找到 bind 127.0.0.1 ,注释掉它,删了也行。默认的 bind 接口是 127.0.0.1,也就是本地回环地址。这样的话,访问 redis 服务只能通过本机的客户端连接,而无法通过远程连接。
  3. 找到 daemonize no ,改为 yes ,这样启动就是后台运行。
  4. Esc + :wq 退出(我默认你会使用 vim)

现在就可以运行 redis 了, redis-server 放在 src 目录下,我们在运行时再指定一下配置文件:

src/redis-server redis.conf
# 我们可以看一下后台运行
ps -ef | grep redis
cyan       6649      1  0 09:58 ?        00:00:00 src/redis-server *:6379
cyan       6654   3218  0 09:59 pts/1    00:00:00 grep --color=auto redis

# 关闭防火墙

为了保证我们本地(windows)能够连接虚拟机的 redis,除了要修改配置文件,还要把防火墙关一下(搞笑,开发者要啥防火墙,你的电脑上不会有杀毒软件吧?)

# 查看防火墙状态
systemctl status firewalld.service

# 关闭防火墙
systemctl stop firewalld.service

其实我建议禁止防火墙启动:

systemctl disable firewalld.service

然后就 ok 了,你可以再看一下防火墙状态。

# 下载 Redis view

一个可视化工具,正好试试能不能连上虚拟机的 redis,安装包我放在阿里云盘了:https://www.aliyundrive.com/s/NhhDRCR1S3s

在 windows 本地安装好后打开,创建一个新的连接:

ip 记得输你自己的,不需要密码,因为配置文件默认是不需要密码的,当然你也可以设置,那个选项是 requirepasswd 来着。

我踩过的坑,一点题外话🤣:

刚开始用这个可视化工具连接的时候,总会出错,点击那个测试链接,显示 ping 不通,但是我在 cmd 里面 ping 虚拟机的 ip 又可以,就很懵逼,当时也是课上老师叫我们安装,然后我就把这问题发群(一般一门课都会有群)里求助:

结果并没有人鸟我,我必须使用下面的 ssh 输入账户和密码(centos 账户)才能连接 redis,一开始是怎么也想不通。当时又布置个作业,叫在本地 windows 使用 springboot 连接虚拟机的 redis 做点东西,我靠,Java 咋连接 ssh 我的虚拟机的同时又连接虚拟机的 redis???

后来查发现是防火墙的问题,但是上课时老师叫我们把防火墙关了,发了这些命令:

# 这些命令也是正确的
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld

我就一直默认我是关了防火墙的,然后就自动跳过了检查防火墙这一操作,我靠,找了一上午。后来想了一下,需要 ssh 连接才能连接 redis,其实这变相就是通过 ssh 登录了你的虚拟机账户,然后直连 redis 服务。需要 ssh 连接,是因为 centos 不信任你,那么就一定有个东西给你挡着,这才想起要改防火墙,好了,踩坑分享吐槽结束。

# 配置集群

单机的内存容量有限,难以扩展,而 redis 又会大量使用内存,所以可以让多台服务器分别存储各个部分数据,实现容量横向扩展,如下图:主从节点是主从复制部分内容,可以暂时不用管。

那么用户如何选择写到哪个 redis 呢?这涉及到集群的机制:

一个 Redis 汲取包含 16384 个插槽,集群中的每个 Redis 实例负责维护一部分插槽以及插槽所映射的键值数据。插槽是键的 Hash 计算后的一个结果,这里采用了计网的知识 ——CRC16(CRC 循环冗余校验),得到的结果 0-65535 之间,再进行取模,得到最终结果:

Redis key 的路由计算公式:slot = CRC16(key) % 16384

计算出来 slot 是多少,就存放到对应维护的 Redis 下,所以本质就是通过哈希算法将插入的数据分摊到各个节点。

我们搭建简单的 Redis 集群,创建 6 个配置(如果有主从需求,至少是 6 个 redis),首先上文提到的压缩包希望你还留着,然后再重新解压四个出来, make 编译一下,这四个的配置都要和上面一样,在此基础上, redis.conf 还需要改两个:

# 四个 redis,我这边的端口是从 6980~6983 四个端口
port 8980
# 用:/cluster-enabled 快速查找就可以
cluster-enabled yes
# 取消注释,配置文件的名字根据端口名修改一下
cluster-config-file nodes-6980.conf

建议你的目录结构和我一样:

然后将 6 个都启动一下:

./redis-cluster-6980/src/redis-server redis-cluster-6980/redis.conf
./redis-cluster-6981/src/redis-server redis-cluster-6981/redis.conf
./redis-cluster-6982/src/redis-server redis-cluster-6982/redis.conf
./redis-cluster-6983/src/redis-server redis-cluster-6983/redis.conf
./redis-cluster-6982/src/redis-server redis-cluster-6984/redis.conf
./redis-cluster-6983/src/redis-server redis-cluster-6985/redis.conf

如果你觉得这样每次这样启动太麻烦,可以编写一个脚本:

# 一定要在 redis 目录下
[root@localhost redis]# vim start-cluster.sh
# 脚本内容,该注释不要复制进去
#!/bin/bash
./redis-cluster-6980/src/redis-server redis-cluster-6980/redis.conf
./redis-cluster-6981/src/redis-server redis-cluster-6981/redis.conf
./redis-cluster-6982/src/redis-server redis-cluster-6982/redis.conf
./redis-cluster-6983/src/redis-server redis-cluster-6983/redis.conf
./redis-cluster-6982/src/redis-server redis-cluster-6984/redis.conf
./redis-cluster-6983/src/redis-server redis-cluster-6985/redis.conf

然后添加执行权限:

chmod u+x start-cluster.sh
# 之后启动:./start-cluster.sh 即可

启动后查看一下(这是我之前的图,只有四个,应该启动六个):

之后客户端配置集群:

redis-cluster-6980/src/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6980 127.0.0.1:6981 127.0.0.1:6982 127.0.0.1:6983 127.0.0.1:6984 127.0.0.1:6985

这里的 --cluster-replicas 1 指的是每个节点配一个从节点。

现在整个集群就搭建好了,使用 ls 命令你可以看到:

生成了一些.rdb,.conf 文件(conf 文件启动 redis 时就生成了),如果需要取消集群配置,就要先杀死这些 redis 进程,在删除这些文件即可。

如果你的 redis 数目少于 6 个,就会报错:这种错是因为要配置从服务器,如果没有 --cluser-replicas 1 命令就不会报错。

*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 4 nodes and 1 replicas per node.
*** At least 6 nodes are required.

现在连接测试以下:

# 6980 这个 redis 被设置为主服务器
redis-cluster-6980/src/redis-cli -c -p 6980

发现可以连接,ok!

一些坑:

  • 版本 5 以上才能使用 --cluster 命令,版本 5 以下会找不到该命令,当然有其他解决办法,比较麻烦,你可以看看该文章
  • --cluser-replicas 1 表示每个主服务器配置一个从服务器。

# 参考

https://www.yuque.com/qingkongxiaguang/spring/xoapq5#92a1dc61

https://blog.csdn.net/huwh_/article/details/79242625

Redis5 及以下版本集群部署

http://www.yayihouse.com/yayishuwu/chapter/2417

强烈推荐Centos7 搭建 Redis 集群