网上很多关于redis集群搭建的博文,照做之后我都掉进了坑,愤怒之余,自己来写一篇作为我公众号的开篇文章。
什么是redis集群?
-
redis集群就是多个redis节点一起工作的模式。它没有代理节点和中心节点,各个节点平等。
-
在redis集群中,数据在多个节点自动分区。集群内置了16384(2的14次方)个slot(哈希槽),并分配给了各个节点。redis集群在存储数据时会先根据key值进行crc16算法计算,得到的结果再对16384求余(CRC16(key) % 16384),最终结果对应于0-16383其中的一个槽,进而决定key-value存储到哪个节点中。
linux安装单机版redis
-
下载redis压缩包:wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2. 解压下载的压缩包:tar xvf redis-4.0.10.tar.gz
3. 进入解压后的目录 ,执行make,进行编译
4. 编译后进入redis的src目录,执行make install进行安装,如图,表示安装成功
5. 返回redis根目录,修改配置文件 vim redis.conf
将daemonize no 设置为daemonize yes (开启后台模式)
找到requirepass xxxxx (设置密码)
6. 执行redis-server redis.conf启动redis,如果出现-bash:redis-server:command not found,这是因为在系统的usr/bin目录下没有命令文件,这就要将redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-rdb、redis-sentinel这些可执行文件复制到usr/bin下 或者建立软连接。
如:
cp -r /usr/local/redis/src/. /usr/bin
ln -s /usr/local/redis/redis-server /usr/bin/redis-server
7. 使用./redis-cli进行客户端操作,至此,单机版redis安装部署完成。
搭建集群的准备工作
-
官方说明搭建redis集群必须要三个master节点,但是我查了半天没查到为什么,但是根据节点有效性投票理论,一半的节点认为某节点失效,才算失效,那么当只有一个节点时,不能投票;两个节点时,不能投票;最少三个节点,才符合半数投票机制。所以我这次搭建采用了三主三从的模式,两台服务器各部署三个节点。
-
部署redis集群不仅要开redis客户端连接的端口,还要开通用于集群中实例相互通信的内部总线端口,总线端口是客户端端口+10000。例如我这里一台服务器部署的redis节点开通的是6379、6380、6381端口,除此之外还要开通16379、16380、16381端口,另一台同样操作。
redis集群搭建流程
1. 创建redis-cluster目录,并在该目录下创建三个目录。分别为6379、6380、6381,另一台服务器操作相同:
2. 将单机版的redis目录下的redis.conf配置文件复制到新建的三个目录下,分别修改三个文件的以下内容,另一台服务器操作相同:
bind 127.0.0.1(需要不同服务器的节点连通,就不能设置为 127.0.0.1,我这里直接注释掉了)
protected-mode no(需要不同服务器的节点连通,这个就要设置为 no)
daemonize yes(设置后台运行redis)
cluster-enabled yes(开启集群)
cluster-node-timeout 5000(集群节点超时时间) appendonly yes(redis高效的数据库备份及灾难恢复方式,开启append only模式后,redis 将每一次写操作请求都追加到appendonly.aof 文件中) requirepass xxx(设置密码,集群中的节点密码必须一致,但是我这里没有设置,因为我的redis版本较低,在集群搭建成功前设置密码会报用户认证失败,所以我放在了集群创建完成后设置) requirepass xxx(设置密码,集群中的节点密码必须一致,但是我这里没有设置,因为我的redis版本较低,在集群搭建成功前设置密码会报用户认证失败,所以我放在了集群创建完成后设置)
根据端口号的不同设置以下内容:
port 6379(端口)
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis_6379.log
dbfilename dump_6379.rdb
appendfilename "appendonly_6379.aof"(持久化文件)
cluster-config-file nodes_6379.conf
3. Redis 3.0以上的集群方式是通过Redis安装目录下的src/redis-trib.rb脚本搭建,使用这个脚本需要ruby环境,但是Redis5.0以前需要先安装ruby环境才能使用这个脚本,5.0之后不需要手动安装ruby依赖,redis安装目录里内置了集群命令行工具 redis-trib ,它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片工作。我这里redis是4.0.10版本,所以我们先安装ruby依赖。
下载ruby压缩包(可通过yum install ruby、yum install rubygem安装,区别这里不再赘述):
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
解压下载的压缩包:
tar xvf ruby-2.3.1.tar.gz
切换到ruby根目录依次执行以下命令进行编译安装:
./configure
make
make install
gem install 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
说明缺少zlib依赖包,执行yum install zlib-devel安装,完成后进入ruby的ext的 zlib目录,执行ruby extconf.rb并修改makefile文件,将${top_srcdir}/include/ruby.h替换为../../include/ruby.h,如果没有则添加,然后执行make、make install。
执行yum install openssl-devel,完成后进入ruby/ext/openssl目录执行ruby extconf.rb并修改makefile文件,将全部的$(top_srcdir)/include/ruby.h改为 ../../include/ruby.h,没有则添加,然后执行make、make install。最后执行gem install redis,如图则安装成功:
至此,ruby环境安装完成,执行ruby -v检验
4. 将单机redis的src目录下的redis-trib.rb复制到建好的redis-cluster目录下
5. 启动创建好的六个节点
6. 在redis-cluster目录下执行以下命令创建集群:
./redis-trib.rb create --replicas 1 60.xx.x.xx:6379 60.xx.x.xx:6380 60.xx.x.xx:6381 47.xx.xxx.xxx:47777 47.xx.xxx.xxx:49999 47.xx.xxx.xxx:48888
我第一次创建时出现了这种情况,当时的图没有留下来,后来查了之后才知道是我的总线端口没开通,防火墙里这些对应端口也没开通,开通之后继续执行上述命令,出现了以下情况:
查后才知道刚刚虽然没有创建成功,但是生成了部分文件,所以此时需要删除所有的aof、dump、rdb文件。继续执行上述命令,又报错了!!!如图:
因为刚刚创建失败后redis的旧数据和配置信息没有清理干净,slot插槽被占用了。需要用redis-cli 登录到每个节点执行 flushall 和 cluster reset清除。
继续执行创建集群的命令,终于成功了:
7. 进入任意一个节点,查看集群的信息和集群列表:
8. 因为我的redis是较低版本,所以刚开始修改配置文件时没有设置密码,放到最后来设置,redis-cli连接各节点,顺序执行config set masterauth 1234、config set requirepass 1234、auth 1234、config rewrite:
关于设置密码的方式,网上也有三种,第一种是直接修改配置文件,但是修改完成后需要重启;第二种如上图,这种可以直接把密码写入配置文件,不需要重启;第三种是通过修改 client.rb文件,修改之后重启。
redis集群搭建过程中遇到的坑
-
服务器和防火墙客户端端口和总线端口的开通
-
密码设置
-
创建集群失败后重启遇到的node is not empty和slot被占用
-
安装ruby依赖时出现缺少依赖的问题
说在最后
以上是我本次搭建遇到的所有问题和解决方法,我也不知道别人一次成功是怎么回事,如果写的哪里不对还请各位大佬指正。总结了一下本次搭建,可能是我安装的redis版本较低,所以建议大家还是选择5.0以上的版本,还有就是搭建任何东西前,不要着急上手,先查清楚可能遇到的坑,做好准备工作,那样的话搭建过程也会轻松很多,其实做任何事也是一样的道理