Redis 多服务器集群搭建

近期,想到之前使用的Redis集群测试使用的是单服务器上的伪集群,重温《Redis深度历险-核心原理与应用实践》的案例,觉得还是搭建一下多服务器集群来玩一玩会更有感触。

常规操作,记录一下搭建集群的过程。

1 条件

  • 基于redis6.0.9版本进行集群的搭建
  • 集群要求至少六个节点,即每个主节点配置1个从节点,本集群是使用了3个主节点并每个下面挂一个从节点,三个主节点分布在3台服务器上。

集群配置信息如下:

服务器

Master

Slave

10.1.24.128(服务器名master)

6751

6752

10.1.24.129(slave1)

6751

6752

10.1.24.130(slave2)

6751

6752

端口名为什么要叫675*呢?因为扫地生原名的谐音是675,所以读者可以自定义端口名。

2 集群配置

在第一台服务器(10.1.24.128)上操作

  1. 下载redis源码包并解压
cd /usr/enviroment

wget  -c  http://download.redis.io/releases/redis-6.0.9.tar.gz

tar  -zxvf  redis-6.0.9.tar.gz
  1. 新建集群配置目录
mkdir  -p  /usr/environment/redis-cluster/6751   /usr/environment/redis-cluster/6752

redis 4 单服务器 redis多台服务器集群_redis 4 单服务器

  1. 将解压后的文件中的redis.conf配置文件拷贝到集群目录之下 并执行redis安装命令
cd  redis-6.0.9

cp redis.conf  /usr/environment/redis-cluster

make  install  # 注意 gcc版本与Redis版本的冲突解决,如果没有指定路径,则编译后Redis的bin默认在/usr/local,也可以 make install PREFIX=/xx/xx 来指定编译后Redis的bin存放路径,注意这里的PREFIX一定要大写

redis 4 单服务器 redis多台服务器集群_redis 4 单服务器_02

make或make install时出现如下错误:

redis 4 单服务器 redis多台服务器集群_java_03

gcc版本问题,新版本的,Redis6.0以上,需要更高版本的gcc,而centOS 7自带的GCC版本往往不符合。

解决方法:

#升级到 5.3及以上版本
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
 
scl enable devtoolset-9 bash
 
#注意:scl命令启用只是临时的,推出xshell或者重启就会恢复到原来的gcc版本。
#如果要长期生效的话,执行如下:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
  1. 进入/usr/local,复制bin文件到6751,6752目录下
cd  /usr/local

cp  -r  bin  /usr/environment/redis-cluster/6751

cp  -r  bin  /usr/environment/redis-cluster/6752
  1. 进入redis-cluster目录,修改redis.conf并分别拷贝到6751,6752
    修改配置文件内容如下:

 1)屏蔽限制本地访问, 将bind 127.0.0.1 修改为 bind 0.0.0.0

redis 4 单服务器 redis多台服务器集群_centos_04

2) protected-mode保护模式从yes改为no,实现免密登录

redis 4 单服务器 redis多台服务器集群_redis_05

3)daemonize后的no改为yes

redis 4 单服务器 redis多台服务器集群_centos_06

4)去掉cluster-enabled yes 前面的注释

redis 4 单服务器 redis多台服务器集群_redis 4 单服务器_07

5)去掉cluster-node-timeout 前面的注释

redis 4 单服务器 redis多台服务器集群_java_08

6)port后的端口改为6751

redis 4 单服务器 redis多台服务器集群_linux_09


7)将运行的pid路径改为对应的端口号便于管理,将redis.conf文件,复制到对应的目录下

redis 4 单服务器 redis多台服务器集群_java_10

cp  redis.conf  6751

8)修改node配置

cluster-config-file nodes-6751.conf
# 修改为对应的节点ID

redis 4 单服务器 redis多台服务器集群_centos_11

9)再次编辑redis.conf 将port参数修改 6751 ==> 6752,复制到对应目录下.

sed  -i  's/6751/6752/g'  redis.conf

cp  redis.conf  6752
  1. 启动redis服务
/usr/environment/redis-cluster/6751/bin/redis-server /usr/environment/redis-cluster/6751/redis.conf

 /usr/environment/redis-cluster/6752/bin/redis-server /usr/environment/redis-cluster/6752/redis.conf

注意点: 在启动服务之前要修改配置文件中对应的dump dir目录,否则默认目录是 ./ 需要改成对应的绝对路径,否则会造成路径冲突,导致启动失败

查看启动的服务:

redis 4 单服务器 redis多台服务器集群_linux_12

也可以用RDM连接测试:

redis 4 单服务器 redis多台服务器集群_centos_13

  1. 直接将master中的集群配置复制到其他两个服务器即可,需要注意的是,需要设置对应的端口与目录
scp -r  /usr/environment/redis-cluster/ root@slave1:/usr/environment

scp -r  /usr/environment/redis-cluster/ root@slave2:/usr/environment

效果如下:

第一台(master)

redis 4 单服务器 redis多台服务器集群_centos_14

第二台(slave1):

redis 4 单服务器 redis多台服务器集群_java_15

第三台(slave2):

redis 4 单服务器 redis多台服务器集群_centos_16

3 集群搭建

使用Redis客户端执行命令:

/usr/environment/redis-cluster/6751/bin/redis-cli --cluster create --cluster-replicas 1 10.1.24.128:6751 10.1.24.128:6752 10.1.24.129:6751 10.1.24.129:6752 10.1.24.130:6751 10.1.24.130:6752

注意:上述指令中的IP地址不能用主机名代替,因为redis对主机名的识别不是很友好,,如果改成下面这个会出现错误:

/usr/environment/redis-cluster/6751/bin/redis-cli --cluster create --cluster-replicas 1 master:6751 master:6752 slave1:6751 slave1:6752 slave2:6751 slave2:6752

redis 4 单服务器 redis多台服务器集群_centos_17

参数说明:

--cluster 集群管理命令 后面可以执行集群相关的命令

--cluster-replicas 1 代表每个Master携带一个Slave

create 创建集群命令

redis 4 单服务器 redis多台服务器集群_redis_18

redis 4 单服务器 redis多台服务器集群_java_19

4 客户端测试

  开启客户端 链接任意一个Master节点

redis-cli -h 10.1.24.128 -c -a 密码 -p 端口

参数:

-c: 连接到集群

redis 4 单服务器 redis多台服务器集群_redis 4 单服务器_20

我们可以看到,当我们set一个键值对的时候,Redis会自动为我们的key计算CRC16值,然后对16384取模,获取key对应的hash slot,然后通过判断该槽被那个Master所占用,帮我们重定向到那个Master节点,将键值对存入。

查看集群信息:

cluster nodes

redis 4 单服务器 redis多台服务器集群_linux_21

通过RDM的连接图标可以明显区别集群连接和非集群连接的区别:

redis 4 单服务器 redis多台服务器集群_redis_22