架构细节:
(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的一个工具包.
[[email protected] ~]# 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看看使用方法
[[email protected] ~]# /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超过一半不能使用了,整个集群服务就无法正常工作