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
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'