redis集群搭建,看这一篇就够了!

网上很多关于redis集群搭建的博文,照做之后我都掉进了坑,愤怒之余,自己来写一篇作为我公众号的开篇文章。

什么是redis集群?

  • redis集群就是多个redis节点一起工作的模式。它没有代理节点和中心节点,各个节点平等。

  • 在redis集群中,数据在多个节点自动分区。集群内置了16384(2的14次方)个slot(哈希槽),并分配给了各个节点。redis集群在存储数据时会先根据key值进行crc16算法计算,得到的结果再对16384求余(CRC16(key) % 16384),最终结果对应于0-16383其中的一个槽,进而决定key-value存储到哪个节点中。

linux安装单机版redis

  1. 下载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/binln -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.pidlogfile /var/log/redis/redis_6379.logdbfilename dump_6379.rdbappendfilename "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根目录依次执行以下命令进行编译安装:

./configuremakemake installgem  install redis

执行gem install redis时如果报错:

ERROR:  Loading command: install (LoadError)        cannot load such file -- zlibERROR:  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以上的版本,还有就是搭建任何东西前,不要着急上手,先查清楚可能遇到的坑,做好准备工作,那样的话搭建过程也会轻松很多,其实做任何事也是一样的道理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值