您的位置:首页 > 数据库 > Redis

REDIS集群部署步骤以及问题解决

2017-05-03 09:34 531 查看
1 放开redis.config中cluster-enabled yes的注释

2 复制redis.conf文件

  修改端口:6380  6381 6382

3 分别启动redis服务

4 使用redis客户端命令:cluster meet ip port命令创建集群

5 使用redis客户端命令:cluster addslots slot1 <slot2>  ... <slot3> 将16384个槽分配给集群中的各个节点

  (注:cluster addslots 0 1 2 3 4 5 6 7 是支持的 但是该命令不支持中间的...  即:cluster addslots 0 1 2  ... 5000 是会报错的,所以如果使用cluster addslots 命令则需要把分配改节点的所有槽数都写出来)

6 使用cluster addslots命令分配16384个槽的话 需要把从0到16383个数据写一遍是很麻烦的事情,所以就用需要用到redis自己提供的集群工具redis-trib.rd

7 redis-trib.rd可以自动创建集群并分配好槽信息

8 使用redis-trib.rd需要用到ruby

9 安装ruby:

  9.1 安装rvm 1) curl -L https://get.rvm.io | bash -s stable

              2) source /etc/profile.d/rvm.sh

              3) rvm -v查看rvm版本

  9.2 安装ruby和rubygem 1) sed -i 's!cache.ruby-lang.org/pub/ruby!ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db 

                           注:改命令主要是修改ruby的镜像地址,将taobao作为主镜像地址,将cache.ruby-lang.org作为副镜像地址,主要是因为国内网络不稳定

                        2) rvm list known  查看可以安装的ruby版本

                        3) rvm install 2.2 安装ruby2.2.1版本

                        4)rvm 2.2 --default 设置一下ruby的版本

                        5)ruby -v 查看ruby的版本

                        6) gem -v 查看gem的版本

10 进入redis的解压目录下的src目录 执行命令./redis-trib.rd create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382

   如果报错如下:

   /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)

   from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

   from ./redis-trib.rb:25

   执行如下命令:gem install redis

11 在执行gem install redis是会报连接错误,则需要执行如下命令做修改

   gem sources --remove https://rubygems.org/ 将默认的源地址删除

   gem sources -a https://ruby.taobao.org/    设置新的源地址

   gem source -l                              查看源地址

   之后再次执行:gem install redis

12 再次执行./redis-trib.rb create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382创建集群并分配槽

13 ./redis-trib.rb check 127.0.0.1:6380检查集群的状态

14 ./redis-trib.rb reshard 127.0.0.1:6380(集群中任意节点的ip:port) 批量重分片(即:完成槽分片和key-value的迁移)

15 对单个槽分片

   如槽4894在6380对应的节点上,现在需要将该槽移动到6382节点上需要执行如下命令

   14.1 CLUSTER SETSLOT <slot> MIGRATING <target_id> 将本节点的槽 slot 迁移到 target_id(6382节点对应的节点名称) 指定的节点中

   14.2 CLUSTER SETSLOT <slot> IMPORTING <source_id> 从 source_id(6380节点对应的节点名称) 指定的节点中导入槽 slot 到本节点

   14.3 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键

   14.4 migrate target_id_ip target_id_port <key> 0(表示数据库号) timeout

   14.5 循环3,4步直至所有的key都已经合并到target_id

   14.6 在source_id节点上执行:cluster setslot <slot> node <target_id> 

        在target_id节点上执行:cluster setslot <slot> node <target_id> 此处书上说的是任意节点上执行cluster setslot命名即可,但是在操作过程中发现仅在source_id节点上执行cluster setslot后,在source_id查看cluster nodes信息是对的

        但是在其它节点查看cluster nodes信息槽信息是不对的,经过长时间的等待之后,信息仍不对,之后在target_id上重新执行cluster setslot命令之后 整个集群上各个节点的cluster nodes信息保持了一致

16 在部署redis集群中遇见的问题:

   16.1 在安装软件的时候出现:insserv:starting redis depends on ondeman and therefor on system facility '$all' which can not be true!

   原因在于:之前部署redis-6379的时候设置了开机启动即配置了/etc/init.d/redis和/etc/rc.d/redis

   在redis文件中#!/bin/sh之后增加:

   ### BEGIN INIT INFO

   # Provides: REDIS

   # Required-Start: $network $remote_fs $syslog $time

   # Required-Stop:

   # Default-Start: 2 3 4 5

   # Default-Stop: 0 1 6

   # Short-Description: REDIS

   ### END INIT INFO

   信息即可

   具体文件内容如下:

#!/bin/sh

#

# Simple Redis init.d script conceived to work on Linux systems

# as it does use of the /proc filesystem.

### BEGIN INIT INFO

# Provides: REDIS

# Required-Start: $network $remote_fs $syslog $time

# Required-Stop:

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: REDIS

### END INIT INFO

REDISPORT=6379

EXEC=/usr/local/bin/redis-server

CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid

CONF="/etc/redis/${REDISPORT}.conf"

case "$1" in

    start)

        if [ -f $PIDFILE ]

        then

                echo "$PIDFILE exists, process is already running or crashed"

        else

                echo "Starting Redis server..."

                $EXEC $CONF &

        fi

        ;;

    stop)

        if [ ! -f $PIDFILE ]

        then

                echo "$PIDFILE does not exist, process is not running"

        else

                PID=$(cat $PIDFILE)

                echo "Stopping ..."

                $CLIEXEC -p $REDISPORT shutdown

                while [ -x /proc/${PID} ]

                do

                    echo "Waiting for Redis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

        fi

        ;;

    *)

        echo "Please use start or stop as first argument"

        ;;

esac

                        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐