架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
redis-cluster选举:容错
(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
集群配置
我这里部署2台服务器跑6个实例(即6个节点)
| 192.168.88.1:7000 | 192.168.88.1:7001 | 192.168.88.1:7002 |
| 192.168.88.2:7000 | 192.168.88.2:7001 | 192.168.88.2:7002 |
安装
cd /home/heboan/tools/ wget wget http://download.redis.io/releases/redis-3.2.1.tar.gz tar xf redis-3.2.1.tar.gz cd redis-3.2.1 make PREFIX=/opt/redis-3.2.1 install cd /opt/; ln -s redis-3.2.1 redis
配置环境变量
vim /etc/profile.d/redis.sh export PATH=/opt/redis/bin/:$PATH source /etc/profile.d/redis.sh
创建实例目录
mkdir /opt/redis/{7000,7001,7002}
mkdir /opt/redis/7000/{conf,log}
mkdir /opt/redis/7001/{conf,log}
mkdir /opt/redis/7002/{conf,log}
创建数据目录
mkdir -p /data/redis/{7000,7001,7002}
创建配置文件
cp /home/heboan/tools/redis-3.2.1/redis.conf /opt/redis/7000/conf cp /home/heboan/tools/redis-3.2.1/redis.conf /opt/redis/7001/conf cp /home/heboan/tools/redis-3.2.1/redis.conf /opt/redis/7002/conf
修改配置文件/opt/redis/xxxx/conf/redis.conf(这里以实例7000为例)
bind 192.168.88.1 //2台主机实例各自绑定主机的ip,
//这里没有监听127.0.0.1,我发现不同机器部署集群监听这个地址会一直在Waiting for the cluster to join
port 7000 //实例端口号
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pid文件
logfile "/opt/redis/7000/log/redis.log" //指定日志位置
dir /data/redis/7000 //指定数据目录
appendonly yes //启用aof持久化
cluster-enabled yes //开启集群
cluster-config-file nodes-7000.conf //集群的配置,配置文件首次启动自动生成
cluster-node-timeout 6000 //请求超时,我这里设置5秒
启动
redis-server /opt/redis/7000/conf/redis.conf redis-server /opt/redis/7001/conf/redis.conf redis-server /opt/redis/7002/conf/redis.conf
分别查看三台机的端口是否起来了,这里我只贴出192.168.88.1,并且生成了集群节点的配置文件

上面我们已经配置好了3台redis节点并开启了集群功能,下面我们需要把这些节点搭建集群
官方提供了一个工具redis-trib.rb(/home/heboan/tools/redis-3.2.1/src/redis-trib.rb)
这个工具是使用ruby写的一个程序,因此我们需要安装ruby
yum -y install ruby ruby-devel rubygems rpm-build
再用 gem 这个命令来安装 redis接口,gem是ruby的一个工具包.
[root@c1 ~]# gem install redis Fetching: redis-4.0.1.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
执行gem install redis会提示ruby需要ruby2.2.2或以上的版本
所以这里采用rvm来安装高版本的ruby
//安装RVM
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable
find / -name rvm -print
/usr/local/rvm
/usr/local/rvm/src/rvm
/usr/local/rvm/src/rvm/bin/rvm
/usr/local/rvm/src/rvm/lib/rvm
/usr/local/rvm/src/rvm/scripts/rvm
/usr/local/rvm/bin/rvm
/usr/local/rvm/lib/rvm
/usr/local/rvm/scripts/rvm
source /usr/local/rvm/scripts/rvm
//查看rvm库中已知的ruby版本
rvm list known
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.7]
[ruby-]2.3[.4]
[ruby-]2.4[.1]
ruby-head
...
//安装一个ruby版本
rvm install 2.3.4
//使用一个ruby版本
rvm use 2.3.4
//设置默认版本
rvm use 2.3.4 --default
//卸载一个已知版本
rvm remove 2.0.0
//查看ruby版本
ruby --version
//再次安装redis接口
gem install redis
接下来运行下redis-trib.rb看看使用方法
[root@c1 ~]# /home/heboan/tools/redis-3.2.1/src/redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
就是靠上面这些操作 完成redis集群搭建的
确认所有的节点都启动,接下来使用参数create 创建 (在192.168.88.1中来创建)
/home/heboan/tools/redis-3.2.1/src/redis-trib.rb create --replicas 1 192.168.88.1:7000 192.168.88.1:7001 192.168.88.1:7002 192.168.88.2:7000 192.168.88.2:7001 192.168.88.2:7002
解释下, --replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)
测试
查看一下 /usr/local/redis/src/redis-trib.rb check 192.168.88.1:7000

可以发现
master
192.168.88.1:7000
192.168.88.1:7001
192.168.88.2:7000
slave
192.168.88.1:7002
192.168.88.2:7001
192.168.88.2:7002
我现在88.1上进入任意一个实例(比如7000)写入数据

然后集群的每个节点都能够获取到数据

我们发现88.2机器上有slave两台,master 一台,如果88.2机器挂掉,是不影响集群服务器,角色都变成了master

如果相反的,88.1机器挂掉,因为master超过一半不能使用了,整个集群服务就无法正常工作