# 安装 Redis
为什么第一章已经讲了安装,这里还要讲:
- 第一章主要是 windows 下安装,单纯解压一个压缩包就能用,但是 Linux 方面反而没讲清楚。
- 重新讲一下 CentOS 下安装 Redis,以及一些操作,方便我们配置 Redis 集群。
你需要在虚拟机上多安装几个 CentOS 系统,至少两个,并且都需要装 Redis,所以请不要偷懒,本文会一步步带你操作。
# 安装 CentOS
我使用的是 CentOS-7 版本,镜像源文件链接:CentOS-7-x86_64-DVD-2009.iso 4.4GB 不要下错了。
- 新建虚拟机
->
自定义 (高级)(C),然后点两次下一步,到选择安装程序光盘映像文件: - 然后对系统命名,选择合适的文件夹存放,可以看到这将是我第三个 CentOS:
- 分配处理器数量和内核数量,都选 2 就行,下一步分配内存,我选的是 2048MB。
- 网络使用 NAT,它默认选好了,无脑下一步就行,磁盘大小分配 20GB(其实只是装 Redis 的话也用不了那么多🤣)。
- 点击下一步,进入自定义硬件,移除打印机即可。
- 直接选择 English(United States),然后有几个关键的步骤一定要跟着操作
- 进入
SOFTWARE SELECTION
,勾选GNOME Desktop
,这是下载桌面版,不勾选的话安装好后就是命令行模式,看你喜欢哪一种咯(虽然我装好后也是本地 ssh 连接的🤣),选后点击左上角 Done: - 进入
NETWORK & HOST NAME
,打开 Ethernet(ens33),一定要打开,不然ifconfig
命令找不到 ip: - 设置账户密码就行了
- 进入
# 下载 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
修改文件:
- 找到
protected-mode yes
,把yes
改为no
。保护模式是只允许主机连接 redis 服务器,改为no
就能使其他设备连到 redis。 - 找到
bind 127.0.0.1
,注释掉它,删了也行。默认的 bind 接口是 127.0.0.1,也就是本地回环地址。这样的话,访问 redis 服务只能通过本机的客户端连接,而无法通过远程连接。 - 找到
daemonize no
,改为yes
,这样启动就是后台运行。 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 集群