Redis集群的搭建

北城以北 提交于 2020-03-01 13:30:35

1、安装Redis

下载文件http://download.redis.io/releases/redis-3.0.7.tar.gz

解压redis,tar xzvf redis-3.0.7.tar.gz

编译再安装

make ; make install

安装完毕后,用命令redis-server –version和redis-cli –version应能看到服务端和客户端已启动

1.1 安装ruby,因为我们使用redis的src目录下的redis-tri脚本帮助集群管理

yum install ruby ruby-devel rubygems rpm-build

如果报错说依赖ruby(abi) = 1.8和ruby-rdoc,则执行yum install ruby-rdoc和yum install ruby-libs

1.2 安装redis gem

 

gem install redis

如果网络连接失败,则先下载https://rubygems.global.ssl.fastly.net/gems/redis-3.0.7.gem

然后进入下载目录,手动安装gem install -l ./redis-3.0.7.gem

1.3 关闭防火墙

由于使用过程会涉及到很多端口的开放,最好关闭防火墙

使用命令service iptables stop或者systemctl stop firewalld

 

2 测试集群

2.1 配置环境

假设有6台机器,在单机模拟,在根目录/root下给每一个Redis实例创建目录

mkdir cluster-test

cd cluster-test

mkdir 7000 7001 7002 7003 7004 7005

在每一个目录下创建配置文件,以7000为例,每个目录里放一个redis_7000.conf

修改配置文件如下

port 7000

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

daemonize yes

然后进入目录7000,启动redis-server ./redis_7000.conf,会在当前目录产生文件appendonly.aof和nodes.conf

2.2 启动集群

进入目录/root/redis-3.0.7/src,执行命令

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

结果如下图所示

使用命令./redis-trib.rb check 127.0.0.1:7000查看集群状态,其中127.0.0.1:7000参数可以是集群中任意节点,结果如下:

可以看到replicas 1表示每个主有一个从节点,产生了3个主、3个从,信息的含义是

M: dc69cccf852215b9fc5a1f1f5338e59e38bb0a86 127.0.0.1:7000

   slots:0-5460 (5461 slots) master

M表示这是主节点

dc69cccf852215b9fc5a1f1f5338e59e38bb0a86,主节点的ID,分配后不再改变

127.0.0.1:7000,主节点的IP地址和端口号

slots:0-5460 (5461 slots) master,主节点分配了slots0到5460位置

2.3 测试一主多从的集群

首先kill掉所有的redis进程,然后rm –rf ./cluster-test/7000/*,删除目录下的所有文件,即用空的实例做实验。重新启动各个redis实例。

在6个实例的前提下,使用replicas 2创建集群,结果报错,因为redis集群至少需要三个主节点才能启动。为了完成这个实验,我们再创建三个目录7006、7007、7008,启动三个redis实例,进入目录/root/redis-3.0.7/src,执行命令

./redis-trib.rb create --replicas 2 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008

结果显示是3主6从的结果

2.4 测试挎不同虚拟机的情况

在以上6个实例的redis集群,三主三从,三个主平分了所有的slots。假设有两台主机各启动三个实例,如果一主一从都分配到了同一台主机,若这台主机崩溃,则集群损失三分之一的slots,集群实际上将变为不可用。是否redis集群在分配集群主从时,有策略避免这种情况。为了验证这一点,我们做如下实验,我们在两个虚拟机192.168.1.100和192.168.1.101上,分别启动3个实例如下:

192.168.1.100:7000, 192.168.1.100:7001,192.168.1.100:7002

192.168.1.101:7000, 192.168.1.101:7001,192.168.1.101:7002

假设三个slots的主为A、B、C,用A+、B+、C+表示从,则不应该出现的情况是

机器一(A、A+、B)、机器二(B+、C、C+)

这种情况下,若机器一崩溃,则slotA丢失。理想的情况可能是

机器一(A、B+、C)、机器二(A+、B、C+),若机器一崩溃,则机器二上的A+和C+会顶替A和C,成为新的主。

执行命令

./redis-trib.rb create --replicas 1 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.101:7000 192.168.1.101:7001 192.168.1.101:7002

结果是:

通过S节点的replicates信息可以对应到主,没有出现主从在同一个机器的情况。

继续增加实例个数,在两个虚拟机上各跑6个实例,测试4主8从的方式部署集群,命令是

./redis-trib.rb create --replicas 2 192.168.1.100:7000 192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 192.168.1.100:7004 192.168.1.100:7005 192.168.1.101:7000 192.168.1.101:7001 192.168.1.101:7002 192.168.1.101:7003 192.168.1.101:7004 192.168.1.101:7005

结果是

主从的分布情况是,机器一(A、D、C+、C++、B++、B+)、机器二(C、B、A+、A++、D+、D++),没有出现1主2从都在一个机器上的情况,没有问题。

3、实验过程用到的redis配置文件和执行脚本

3.1、创建Redis实例目录并拷贝配置文件

mkdir cluster-test
mkdir ./cluster-test/7000
mkdir ./cluster-test/7001
mkdir ./cluster-test/7002
mkdir ./cluster-test/7003
mkdir ./cluster-test/7004
mkdir ./cluster-test/7005
cp ./redis_7000.conf ./cluster-test/7000/
cp ./redis_7001.conf ./cluster-test/7001/
cp ./redis_7002.conf ./cluster-test/7002/
cp ./redis_7003.conf ./cluster-test/7003/
cp ./redis_7004.conf ./cluster-test/7004/
cp ./redis_7005.conf ./cluster-test/7005/

3.2、删除各个实例的配置文件、rdb文件和集群配置文件

rm -rf ./cluster-test/7000/*
rm -rf ./cluster-test/7001/*
rm -rf ./cluster-test/7002/*
rm -rf ./cluster-test/7003/*
rm -rf ./cluster-test/7004/*
rm -rf ./cluster-test/7005/*

3.3、启动各个redis实例脚本

cd /root/cluster-test/7000
redis-server /root/cluster-test/7000/redis_7000.conf
cd /root/cluster-test/7001
redis-server /root/cluster-test/7001/redis_7001.conf
cd /root/cluster-test/7002
redis-server /root/cluster-test/7002/redis_7002.conf
cd /root/cluster-test/7003
redis-server /root/cluster-test/7003/redis_7003.conf
cd /root/cluster-test/7004
redis-server /root/cluster-test/7004/redis_7004.conf
cd /root/cluster-test/7005
redis-server /root/cluster-test/7005/redis_7005.conf

3.4、运行集群

/root/redis-3.0.7/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

3.4、kill所有的redis进程

pkill -f 'redis-server'

4、错误处理

如果出现waiting for cluster to join,则执行service iptables stop停止防火墙。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!