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

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  ... 将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 MIGRATING 将本节点的槽 slot 迁移到 target_id(6382节点对应的节点名称) 指定的节点中
   14.2 CLUSTER SETSLOT IMPORTING 从 source_id(6380节点对应的节点名称) 指定的节点中导入槽 slot 到本节点
   14.3 CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键
   14.4 migrate target_id_ip target_id_port 0(表示数据库号) timeout
   14.5 循环3,4步直至所有的key都已经合并到target_id
   14.6 在source_id节点上执行:cluster setslot node  
        在target_id节点上执行:cluster setslot node 此处书上说的是任意节点上执行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










                        

你可能感兴趣的:(redis)