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
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
本文详细介绍了Redis集群的部署步骤,包括开启集群模式、配置端口、启动服务、使用客户端命令创建集群和分配槽。同时,文章还讨论了在使用`redis-trib.rb`工具、安装Ruby和gem时可能遇到的问题及其解决方案,如更改gem源、处理LoadError等,并给出了槽迁移的详细过程,包括手动和自动分片。最后,文章提到了在部署过程中可能遇到的依赖冲突问题及其解决办法。

3236

被折叠的 条评论
为什么被折叠?



