redis集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群相关的知识,希望对你有一定的参考价值。

架构细节:

(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超过一半不能使用了,整个集群服务就无法正常工作

 















以上是关于redis集群的主要内容,如果未能解决你的问题,请参考以下文章

java怎么从多台redis集群取数据库

我在工作中遇到的redis集群使用

redis集群概念

python连接redis,redis集群

Python3 redis集群连接 (带密码验证)

c#程序怎么调用redis集群