redis - cluster 部署说明

1.简介

redis-cluster是一种分布式存储的集群,不同主节点上存储不同的数据。

原理请参照:

https://www.cnblogs.com/CoreXin/articles/5688019.html

https://blog.csdn.net/truelove12358/article/details/79612954

利用redis-cli来配置集群,节点启动和集群配置独立分开

redis使用X端口作为服务端口,集群的通讯端口会有10000的偏移,也就是X+10000端口

2.节点启动

我们采用docker来启动redis服务

2.1创建redis配置文件(redis-cluster.tmpl)

我在路径/home下创建一个文件夹redis-cluster,在路径/home/redis-cluster下创建一个文件redis-cluster.tmpl,并把以下内容复制过去。(注:路径可自定义,我用的是/home/redis-cluster)

port ${PORT}

protected-mode no

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

cluster-announce-ip ${IP_ADDRESS}

cluster-announce-port ${PORT}

cluster-announce-bus-port 1${PORT}

appendonly yes

2.2创建自定义network

docker network create redis-net

2.3 生成配置信息

在/home/redis-cluster下生成conf和data目标,并生成配置信息

cd /home/redis-cluster

forportinseq 6379 6381; do \

mkdir -p ./${port}/conf \

&& PORT= p o r t e n v s u b s t < . / r e d i s − c l u s t e r . t m p l > . / {port} envsubst < ./redis-cluster.tmpl > ./ portenvsubst<./rediscluster.tmpl>./{port}/conf/redis.conf \

&& mkdir -p ./${port}/data; \

done

我们选在在一台机子上开三个redis节点,共生成3个文件夹,从6379到6381,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件

2.4创建3个redis容器

forportinseq 6379 6381; do \

docker run -d -ti -p p o r t : {port}: port:{port} -p 1 p o r t : 1 {port}:1 port:1{port} \

-v D I R / {DIR}/ DIR/{port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \

-v D I R / {DIR}/ DIR/{port}/data:/data \

–restart always --name redis-${port} --net redis-net \

–sysctl net.core.somaxconn=1024 redis:5.0.7 redis-server /usr/local/etc/redis/redis.conf; \

done

我在10.10.1.160,39,40上各布置了三个节点,九个节点至此全部启动完毕。

此时九个节点都是独立的。

3.集群配置

首先确保我们的虚拟机上有redis-cli。执行redis-cli -c -h 10.10.1.160 -p 6379。其中-c代表集群模式,-h是ip,-p是端口号。

使用cluster nodes命令可以查看当前集群状态,不过这里是已经配置好的集群。

以下是cluster 的命令。

①集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。
②节点
cluster meet :将ip 和port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除node_id指定的节点。
cluster replicate <node_id> :将当前节点设置为node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
③槽(slot)
cluster addslots [slot …] :将一个或多个槽(slot)指派(assign)给当前节点。
cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating <node_id> :将本节点的槽slot迁移到node_id指定的节点中。
cluster setslot importing <node_id> :从 node_id指定的节点中导入槽slot到本节点。
cluster setslot stable :取消对槽slot的导入(import)或者迁移(migrate)。
④键
cluster keyslot :计算键key应该被放置在哪个槽上。
cluster countkeysinslot :返回槽slot 目前包含的键值对数量。
cluster getkeysinslot :返回count个slot槽中的键

我们在集群搭建过程中主要使用的是①cluster meet 、②cluster addslots [slot …] 、③cluster replicate <node_id>三个命令。

3.1加入加群

我们登录第一个节点(10.10.1.160:6379),使用①命令将其余8个节点加入集群。例如cluster meet 10.10.1.160 6380

3.2分配槽

分布式数据存储为了鉴别什么key存在什么节点上面,会利用映射算法HASH_SLOT=CRC16(key)mod16384分成0-16383共16384个槽。

我们要将这些槽分配到主节点上面去(三主六从,槽尽可能平均地分配给三个主节点)。

要注意的是,②命令只能添加一个槽,效率很慢,所以我们通过脚本命令执行槽的分配。

#第一个master:10.10.1.160:6379

start=0

end=5461

forslotinseq ${start}${end}

do

echo"slot:${slot}"

redis-cli -c -h 10.10.1.160 -p 6379 cluster addslots ${slot}

done

#第二个master:10.10.1.170:6379

start=5461

end=10922

forslotinseq ${start}${end}

do

echo"slot:${slot}"

redis-cli -c -h 10.10.1.170 -p 6379 cluster addslots ${slot}

done

#第三个master:10.10.1.180:6379

start=10923

end=16383

forslotinseq ${start}${end}

do

echo"slot:${slot}"

redis-cli -c -h ${CLUSTER_IP_3} -p ${PORT_1} cluster addslots ${slot}

done

start和end代表哪个范围的槽,选取哪个节点修改ip和端口号即可。

3.3.设置从节点

使用③命令,按命令说明设置节点为刚才分配了槽的主节点的从节点。

#master节点的node_id

node_id=$(redis-cli -c -h 10.10.1.160 -p 6379 cluster nodes | grep 10.10.1.160:6379 | awk ‘{print $1}’)

4.集群维护

节点在docker维护即可,宕机重新启动即可,docker设置restart=always。

集群挂机情况:

① 集群采取的是投票制度,所以存活的主节点需要保证超过总主节点数的一半。

② 三主是最基本的形式,仅允许短时间内挂掉一个主节点,五主可以允许同时挂掉两个主节点。

③ 值得一提的是,如果两个主节点宕机时间有一定间隔,集群可以及时将从节点提升为主节点,所以三主集群只要保证不要同时宕掉两个节点即可。

④ 若docker容器出现无限重启的情况,根据重启的redis端口号容器,先停止容器,然后删除对应的/home/redis-cluster/${port}/data/node.conf文件,接着重启容器即可。

附:部署脚本如下:

脚本说明:

1.保证脚本都在同级目录下
2.每台机器执行redis-cluster.sh 的脚本
3.在集群之外的随便一台机器执行redis-config.sh脚本
4.若集群都挂掉了,只要保证docker能正常启动即可,集群会自动启动

redis-cluster.sh

#!/usr/bin/env bash
#获取本机ip地址
IP_ADDRESS=$(ip a | grep inet | grep -v inet6 | grep -v 127 | sed ‘s/1*//g’ | awk -F " " ‘{print $2}’ | grep -v 172 | grep -v 32 | awk -F"/" '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') DIR="/home/r…{DIR}"
mkdir ${DIR}

echo -e “\033[1;32m 1.开始生成redis-cluster.tmpl文件 \033[0m”
cat <${DIR}/redis-cluster.tmpl
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${IP_ADDRESS}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
EOF
echo “文件生成完毕”

#echo -e “\033[1;32m 2.创建自定义network \033[0m”
#docker network create redis-net

echo -e “\033[1;32m 3.在/home/redis-cluster下生成conf和data目标,并生成配置信息 \033[0m”
cd KaTeX parse error: Undefined control sequence: \ at position 39: …6379 6381`; do \̲ ̲mkdir -p ./{port}/conf
&& PORT= p o r t e n v s u b s t < . / r e d i s − c l u s t e r . t m p l > . / {port} envsubst < ./redis-cluster.tmpl > ./ portenvsubst<./rediscluster.tmpl>./{port}/conf/redis.conf
&& mkdir -p ./${port}/data;
done

echo -e “\033[1;32m 4.创建3个redis容器 \033[0m”
#echo -e “\033[1;32m 获取redis镜像 \033[0m”
#docker pull redis:latest
echo -e “\033[1;32m 根据端口号生成redis容器并启动 \033[0m”
for port in seq 6379 6381; do
docker run -d -ti -p p o r t : {port}: port:{port} -p 1 p o r t : 1 {port}:1 port:1{port}
-v D I R / {DIR}/ DIR/{port}/conf/redis.conf:/usr/local/etc/redis/redis.conf
-v D I R / {DIR}/ DIR/{port}/data:/data
–restart always --name redis-${port} --net host
–sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
exit

redis-config.sh

#!/usr/bin/env bash
CLUSTER_IP_1=“10.10.1.160”
CLUSTER_IP_2=“10.10.1.170”
CLUSTER_IP_3=“10.10.1.180”
PORT_1=“6379”
PORT_2=“6380”
PORT_3=“6381”
echo -e “\033[1;31m 此脚本需要在redis集群之外的Linux上执行 \033[0m”
echo “安装redis(centos)”
sudo yum -y install redis
#sudo apt-get install redis-tools
echo “启动redis”
systemctl start redis
echo “查看redis服务运行状态”
systemctl status redis
echo “设置开机自启动”
systemctl enable redis

echo -e “\033[1;32m 1.登录其中一个节点并且将九个节点分别加入集群 \033[0m”
ip_pre=“10.10.1.”
ip_start=“160”
ip_end=“180”
port_start=“6379”
port_end=“6381”
for ip_address in seq ${ip_start} 10 ${ip_end}
do
for port in seq ${port_start} ${port_end}
do
redis-cli -c -h ${CLUSTER_IP_1} -p ${PORT_1} cluster meet i p p r e {ip_pre} ippre{ip_address} ${port}
done
done
echo “查看节点情况”
redis-cli -c -h ${CLUSTER_IP_1} -p ${PORT_1} cluster nodes

echo -e “\033[1;32m 2.分配槽 \033[0m”
echo “第一个master:${CLUSTER_IP_1} -p ${PORT_1}”
start=0
end=5461
for slot in seq ${start} ${end}
do
echo “slot:${slot}”
redis-cli -c -h ${CLUSTER_IP_1} -p ${PORT_1} cluster addslots ${slot}
done

echo “第二个master:${CLUSTER_IP_2} -p ${PORT_1}”
start=5461
end=10922
for slot in seq ${start} ${end}
do
echo “slot:${slot}”
redis-cli -c -h ${CLUSTER_IP_2} -p ${PORT_1} cluster addslots ${slot}
done

echo “第三个master:${CLUSTER_IP_3} -p ${PORT_1}”
start=10923
end=16383
for slot in seq ${start} ${end}
do
echo “slot:${slot}”
redis-cli -c -h ${CLUSTER_IP_3} -p ${PORT_1} cluster addslots ${slot}
done

echo -e “\033[1;32m 3.设置从节点 \033[0m”
ip_pre=“10.10.1.”
ip_start=“160”
ip_end=“180”
port_start=“6380”
port_end=“6381”
for ip_address in seq ${ip_start} 10 ${ip_end}
do
for port in seq ${port_start} ${port_end}
do
#master节点的node_id
node_id=$(redis-cli -c -h i p p r e {ip_pre} ippre{ip_address} -p 6379 cluster nodes | grep i p p r e {ip_pre} ippre{ip_address}:6379 | awk ‘{print $1}’)
redis-cli -c -h i p p r e {ip_pre} ippre{ip_address} -p ${port} cluster replicate ${node_id}
done
done
echo “查看集群节点状态”
redis-cli -c -h ${CLUSTER_IP_1} -p ${PORT_1} cluster nodes
echo “redis集群部署完毕”
exit


  1. \t ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值