创建redis集群并实现扩容缩容


一、创建redis集群

环境准备6台主机10.0.0.150 10.0.0.154 10.0.0.155 10.0.0.157 10.0.0.200 10.0.0.201

集群节点,三主三从

10.0.0.150 10.0.0.154 10.0.0.155 10.0.0.157 10.0.0.200 10.0.0.201

1、安装redis脚本

bash install_redis.sh

2、更改集群配置

sed -i.bak \
-e '/masterauth/a masterauth 123456' \
-e '/# cluster-enabled yes/a cluster-enabled yes' \
-e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' \
-e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' \
/apps/redis/etc/redis.conf
systemctl enable --now redis
systemctl restart redis

3、创建集群

redis-cli -a 123456 --cluster create \
10.0.0.150:6379 \
10.0.0.154:6379 \
10.0.0.155:6379 \
10.0.0.157:6379 \
10.0.0.200:6379 \
10.0.0.201:6379 \
--cluster-replicas 1

master 150<——>200 slave

master 154<——>201 slave

master 155<——>157 slave

4、查看状态

redis-cli -a 123456 -c INFO replication
redis-cli -a 123456 cluster nodes
redis-cli -a 123456 CLUSTER INFO
附install_redis.sh
#!/bin/bash

REDIS_VERSION=redis-7.0.11
#REDIS_VERSION=redis-7.0.7
#REDIS_VERSION=redis-7.0.3
#REDIS_VERSION=redis-6.2.6
#REDIS_VERSION=redis-4.0.14
PASSWORD=123456
INSTALL_DIR=/apps/redis

CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`

. /etc/os-release

color () {
  RES_COL=60
  MOVE_TO_COL="echo -en \\033[${RES_COL}G"
  SETCOLOR_SUCCESS="echo -en \\033[1;32m"
  SETCOLOR_FAILURE="echo -en \\033[1;31m"
  SETCOLOR_WARNING="echo -en \\033[1;33m"
  SETCOLOR_NORMAL="echo -en \E[0m"
  echo -n "$1" && $MOVE_TO_COL
  echo -n "["
  if [ $2 = "success" -o $2 = "0" ] ;then
      ${SETCOLOR_SUCCESS}
      echo -n $" OK "    
  elif [ $2 = "failure" -o $2 = "1" ] ;then
      ${SETCOLOR_FAILURE}
      echo -n $"FAILED"
  else
      ${SETCOLOR_WARNING}
      echo -n $"WARNING"
  fi
  ${SETCOLOR_NORMAL}
  echo -n "]"
  echo
}


prepare(){
  if [ $ID = "centos" -o $ID = "rocky" ];then
      yum -y install gcc make jemalloc-devel systemd-devel
  else
      apt update
      apt -y install gcc make libjemalloc-dev libsystemd-dev
  fi
  if [ $? -eq 0 ];then
      color "安装软件包成功" 0
  else
      color "安装软件包失败,请检查网络配置" 1
      exit
  fi
}

install() {  
  if [ ! -f ${REDIS_VERSION}.tar.gz ];then
      wget http://download.redis.io/releases/${REDIS_VERSION}.tar.gz || { color "Redis 源码下载失败" 1 ; exit; }
  fi
  tar xf ${REDIS_VERSION}.tar.gz -C /usr/local/src
  cd /usr/local/src/${REDIS_VERSION}
  make -j $CUPS USE_SYSTEMD=yes PREFIX=${INSTALL_DIR} install && color "Redis 编译安装完成" 0 || { color "Redis 编译安装失败" 1 ;exit ; }

  ln -s ${INSTALL_DIR}/bin/redis-* /usr/local/bin/
   
  mkdir -p ${INSTALL_DIR}/{etc,log,data,run}
 
  cp redis.conf ${INSTALL_DIR}/etc/

  sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e "/# requirepass/a requirepass $PASSWORD" -e "/^dir .*/c dir ${INSTALL_DIR}/data/" -e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log" -e "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf


  if id redis &> /dev/null ;then
        color "Redis 用户已存在" 1
  else
        useradd -r -s /sbin/nologin redis
        color "Redis 用户创建成功" 0
  fi

  chown -R redis.redis ${INSTALL_DIR}

  cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
  sysctl -p
  if [ $ID = "centos" -o $ID = "rocky" ];then
      echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
      chmod +x /etc/rc.d/rc.local
      /etc/rc.d/rc.local
  else
      echo -e '#!/bin/bash\necho never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
      chmod +x /etc/rc.local
      /etc/rc.local
  fi


cat > /lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

EOF
    systemctl daemon-reload
    systemctl enable --now redis &> /dev/null
    if [ $? -eq 0 ];then
        color "Redis 服务启动成功,Redis信息如下:" 0
    else
      color "Redis 启动失败" 1
      exit
    fi
    sleep 2
    redis-cli -a $PASSWORD INFO Server 2> /dev/null
}

prepare

install

二、集群扩容

新增加两台机器一主一从,10.0.0.202,10.0.0.203

1、在202,203机器上准备好环境

bash install_redis.sh
sed -i.bak \
-e '/masterauth/a masterauth 123456' \
-e '/# cluster-enabled yes/a cluster-enabled yes' \
-e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' \
-e '/cluster-require-full-coverage yes/a cluster-require-full-coverage no' \
/apps/redis/etc/redis.conf
systemctl enable --now redis
systemctl restart redis

2、将新主机10.0.0.202加入集群

redis-cli -a 123456 --cluster add-node 10.0.0.202:6379 10.0.0.150:6379

3、在新的master上重新分配槽位

redis-cli -a 123456 --cluster reshard <当前任意集群节点>:6379
分配槽位说明:How many slots do you want to move (from 1 to 16384)?4096 #新分配多少个槽位
=16384/master个数
What is the receiving node ID? d6e2eca6b338b717923f64866bd31d42e52edc98 #新的
master的ID
Source node #1: all #输入all,将哪些源主机的槽位分配给新的节点,all是自动在所有的redis node选择划分,如果是从redis cluster删除某个主机可以使用此方式将指定主机上的槽位全部移动到别的redis主机
......
Do you want to proceed with the proposed reshard plan (yes/no)?  yes #确认分配

4、确认slot分配成功

redis-cli -a 123456 --cluster check 10.0.0.150:6379

5、为新的master202 节点添加一个主机slave203

redis-cli -a 123456 --cluster add-node 10.0.0.203:6379 10.0.0.150:6379 --cluster-slave --cluster-master-id d6e2eca6b338b717923f64866bd31d42e52edc98

6、查看状态

redis-cli -a 123456 -h 10.0.0.150 --no-auth-warning cluster info

三、集群缩容

1、查看当前状态

redis-cli -a 123456 --cluster check 10.0.0.150:6379

2、重新分配槽位

迁移 1365 个 slots 到 150
redis-cli -a 123456 --cluster reshard 10.0.0.150:6379 \
--cluster-from <202-node-id> \
--cluster-to <150-node-id> \
--cluster-slots 1365 \
--cluster-yes
重复此操作直到 202 的 slots = 0。

3、验证202节点已无slots

redis-cli -a 123456 --cluster check 10.0.0.150:6379

4、先删除从节点203

redis-cli -a 123456 -h 10.0.0.203 cluster myid
redis-cli -a 123456 --cluster del-node 10.0.0.150:6379 <203-node-id>

5、再删除主节点202

redis-cli -a 123456 --cluster del-node 10.0.0.150:6379 <202-node-id>

6、验证集群状态

redis-cli -a 123456 --cluster check 10.0.0.150:6379

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注