redis cluster 迁移

一、redis迁移概述。

生产环境Redis当前部署环境为六台16核126G服务器,服务器资源整体配置较高,使用率较低(具体使用率参见表一)。为了更好地提升资源使用率,优化成本,故对redis cluster集群做迁移和合并。Redis cluster集群的迁移步骤为:首先安装redis集群,再次迁移redis数据,最后做业务切换。切换完成后做业务检查和服务器其他部署业务迁移,服务迁移后关机观察。观察一段时间待系统平稳运行后,释放服务器。

 

                          

二、redis迁移前后架构分析。

Redis迁移前集群主要是六台服务器三主三从组成,不存在主从节点在同一节点的问题。Redis缩容后只保留三台服务器节点,所以必须做到主从交叉,不然当一个主节点服务器出现故障后,从节点和主节点在一个服务器上面便会出现主从不一致的情况。

 

                             图二 当前部署模式

 

 

                            图三 缩容后部署模式。

 

三、迁移前部署环境。

  1. K8s集群节点。
  2. Redis集群环境。Redis 版本4.0.14。
  3. Redis硬件部署环境,详见下表。

 

 

 

服务器IP

内核

内存

内存使用率

服务器硬盘使用率

xxx.xxx.51.180

16

126

0.70%

根目录:23%   /data:3%   其他(260G):2%

xxx.xxx.51.181

16

126

16%

根目录:43%   其他(260G):2%

xxx.xxx.51.182

16

126

40%

根目录:59%   /data:1%   其他(252G):2%

xxx.xxx.51.183

16

126

52%

根目录:40%   /data:1%   其他(252G):2%

xxx.xxx.51.184

16

126

37%

根目录:4%   /data:84%   其他(252G):2%

xxx.xxx.51.185

16

126

38%

根目录:67%   /data:38%   其他(252G):2%

 

                                     表一

四、Redis新集群部署。

  1. 安装依赖。

yum -y install gcc-c++ wget

    yum install gcc g++ gcc-c++ make -y

yum install ruby rubygems -y

yum install -y rh-ruby30

scl enable rh-ruby30  bash

ruby -v

gem source -a http://mirrors.aliyun.com/rubygems/  -remove https://rubygems.org/

gem install redis -v 4.1.0

  1. Redis 下载编译安装。

下载redis 安装包,服务器已经下载在xxx.xxx.79.56地址下的/usr/local/redis-4.0.14.tar.gz。

tar axf redis-4.0.10.tar.gz && cd redis-4.0.10

make&&make install PREFIX=/usr/local/redis

cp -a /usr/local/redis/redis-server /usr/local/bin/redis-server

scp -rp /usr/local/redis  root@xxx.xxx.51.179:/usr/local/

scp -rp /usr/local/redis  root@xxx.xxx.79.44:/usr/local/

  1. 修改配置文件

sed -i 's#xxx.xxx.56.67#xxx.xxx.79.56#g' /usr/local/redis/conf*.conf

  1. 启动redis服务。

[root@master2 redis]# cat start-all.sh

#!/bin/bash

cd /usr/local/redis/conf/

redis-server redis-6377.conf

redis-server redis-6378.conf

 

  yum -y install gcc-c++ wget
  yum install gcc g++ gcc-c++ make -y
  yum install ruby rubygems -y
  yum install -y rh-ruby30
  scl enable rh-ruby30  bash
  gem source -a http://mirrors.aliyun.com/rubygems/  -remove https://rubygems.org/
  gem install redis -v 4.1.0
  yum install ruby rubygems -y
  gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
  gem install redis -v 4.1.0
  rvm list known
  curl -sSL https://get.rvm.io | bash -s stable
  curl -k  -sSL https://get.rvm.io | bash -s stable
  source /usr/local/rvm/scripts/rvm
  curl -L get.rvm.io | bash -s stable
  source /usr/local/rvm/scripts/rvm
  gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  
  curl -L get.rvm.io | bash -s stable
  source /usr/local/rvm/scripts/rvm
  rvm list known

  echo "ruby_url=https://cache.ruby-china.com/pub/ruby" > /usr/local/rvm/user/db
  rvm install 2.6.6
  gem install redis -v 4.1.0

 

  1. 设置redis 加入集群。

cd /usr/local/redis

./redis-trib.rb create --replicas 1 xxx.xxx.79.56:6377 xxx.xxx.79.56:6378 xxx.xxx.51.179:6377 xxx.xxx.51.179:6378 xxx.xxx.79.44:6377                xxx.xxx.79.44:6378

 

  1. 检查redis集群状态。

/usr/local/redis/redis-cli -h xxx.xxx.79.56 -p 6378 -c

 

 

检查redis nodes 状态

 

 

 

 

 

Redis会随机分配,如果主从在一个节点上则需要重新制定主节点。

在从节点上面指定新的主节点:

cluster replicate bb0437622d05d9020fd588a8a6e379f8d34681a2

 

 

Redis配置文件如下:

[root@master2 conf]# cat redis-6377.conf

bind xxx.xxx.79.56

protected-mode yes

port 6377

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile /var/run/redis_6377.pid

logfile "/usr/local/redis/logs/6377.log"

dir "/usr/local/redis/data/"

loglevel notice

databases 16

always-show-logo yes

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump-6377.rdb

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

lazyfree-lazy-expire no

lazyfree-lazy-server-del no

slave-lazy-flush no

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

aof-use-rdb-preamble no

lua-time-limit 5000

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 15000

cluster-require-full-coverage no

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

 

五、Redis 数据平滑迁移。

git clone https://github.com/vipshop/redis-migrate-tool.git

cd redis-migrate-tool

yum -y install automake libtool autoconf bzip2

autoreconf -fvi

./configure

make

./src/redis-migrate-tool

修改 rmt.conf 文件为:

[source]

type: redis cluster  # 源redis类型

servers :

  - 127.0.0.1:7001   # 源redis地址,可以只填一个,保证cluster nodes能获取到正常信息即可

 

[target]

type: redis cluster  # 目标redis类型

servers:

  - 127.0.0.1:8001   # 目标redis地址

 

[common]

listen: 0.0.0.0:8888  # 服务启动后,监听的地址和端口

 

启动迁移工具:

./src/redis-migrate-tool -c rmt.conf

 

查看全部完成迁移的提示。

All nodes' rdb file parsed finished for this write thread(0).

 

六、服务切换新的redis地址。

根据项目的不同进入到gitlab代码库修改配置文件和nacos修改redis的配置文件。gitlab代码库位置http://xxx.xxx.55.114:8087/

 

 nodeAddresses:  redis://xxx.xxx.51.180:6380,redis://xxx.xxx.51.181:6380,redis://xxx.xxx.51.182:6380,redis://xxx.xxx.51.183:6380,redis://xxx.xxx.51.184:6380,redis://xxx.xxx.51.185:6380

 

 nodes: # Comma-separated list of "host:port" pairs to bootstrap from.

"xxx.xxx.51.180:6380,xxx.xxx.51.181:6380,xxx.xxx.51.182:6380,xxx.xxx.51.183:6380,xxx.xxx.51.184:6380,xxx.xxx.51.185:6380"

 

Nacos 具体链接询问开发。

七、切换后业务业务检查。

  1. 切换完成后,检查后端pod服务等运行是否正常,后端是否有报错等异常情况。
  2. 检查业务运行速度是否正常。
  3. 检查系统资源使用是否正常,预防高配置迁移低配置系统资源占用过高的情况。

     

八、业务切换完成后驱逐pod

1.node节点配置pod不可调度到该节点上。

    kubectl get nodes

kubectl cordon nodename或IP

执行完成后检查为不可调度,再执行下一步。

 

2.node节点上的服务驱逐。

kubectl drain --ignore-daemonsets <NODE_NAME>

kubectl get pod --all-namespaces -o wide

检查节点pod是否驱逐完成

3.node节点下线。

    kubectl delete nodes k8s-node2

4.驱逐前后需要观察pod的状态是否在其他节点正常。

九、服务全部迁移后系统关机观察。

      关机一段时间后,确认业务已迁移和备份后做后释放云主机。

 

 

 

 

 

 

 

 
 
 
posted @ 2024-03-16 13:08  滴滴滴  阅读(14)  评论(0编辑  收藏  举报