我是靠谱客的博主 多情电源,这篇文章主要介绍深入浅出缓存设计---3、Redis集群配置Redis集群配置,现在分享给大家,希望可以做个参考。

Redis集群配置

这里安装6个redis,配置如下:

Redis节点IP端口
redis-7001172.18.0.27001
redis-7002172.18.0.37002
redis-7003172.18.0.47003
redis-7004172.18.0.57004
redis-7005172.18.0.67005
redis-7006172.18.0.77006

Redis集群配置

现在安装对应的应用软件一般都推荐使用Docker容器,我们这里也不例外,直接使用Docker容器进行安装,安装大概要分这几个步骤:

  1. 创建redis-cluster.tmpl配置Redis信息【端口、是否开启集群等】
  2. 创建redis.sh配置需要创建的redis信息
  3. 添加网络,redis集群使用该网络
  4. 执行redis.sh实现创建redis
  5. 执行redis-cli创建集群

配置Redis信息

创建 redis-cluster.tmpl 配置Redis信息(redis.conf)

#端口 
port ${PORT} 
#非保护模式 
protected-mode no 
#启用集群模式 
cluster-enabled yes 
cluster-config-file nodes.conf 
#超时时间 
cluster-node-timeout 5000 
#集群各节点IP地址 
cluster-announce-ip 192.168.211.141 
#集群节点映射端口 
cluster-announce-port ${PORT} 
#集群总线端口 
cluster-announce-bus-port 1${PORT} 
#开启aof持久化策略 
appendonly yes 
#后台运行 
#daemonize yes 
#进程号存储 
pidfile  /var/run/redis_${PORT}.pid 
#集群加密 
#masterauth itheima 
#requirepass itheima

Redis创建配置

创建 redis.sh配置需要创建的 Redis集群

#!/bin/bash 
#在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息 
for port in `seq 7001 7006`;
do
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > 
./${port}/conf/redis.conf && mkdir -p ./${port}/data; 
done 
#创建6个redis容器 
for port in `seq 7001 7006`; 
do 
docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis- cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis- cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server 
/usr/local/etc/redis/redis.conf; 
done 
#查找ip 
for port in `seq 7001 7006`; 
do 
echo  -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis- 
net").IPAddress }}' "redis-${port}")":${port}" "; 
done 
#换行 
echo -e "n" 
#输入信息 
read -p "请把输入要启动的docker容器名称,默认redis-7001:" DOCKER_NAME 
#判断是否为空 
if [ ! $DOCKER_NAME ]; 
then DOCKER_NAME='redis-7001'; 
fi 
#进入容器 
docker exec -it redis-7001 /bin/bash 

这里涉及到了一个网络的定义 redis-net,代码如下:

docker network create redis-net 

脚本授权:给 redis.sh和 stop.sh添加可执行权限:

chmod +x redis.sh

执行脚本开始安装Redis节点,并进入到 /usr/local/bin目录下执行 redis-cli创建集群关联:

#执行集群几点创建 
./redis.sh 
#进入到任意一个安装好的redis节点的bin目录,里面有个脚本对象redis-cli,然后执行集群创建 
./redis-cli --cluster create 172.18.0.2:7001 172.18.0.3:7002 172.18.0.4:7003 172.18.0.5:7004 172.18.0.6:7005 172.18.0.7:7006 --cluster-replicas 1

–cluster-replicas 表示有一个主有几个slave。

主从复制

我们先来理解下主从同步,如下图:

  1. Slave服务启动,主动连接Master,并发送SYNC命令,请求初始化同步;
  2. Master收到SYNC后,执行BGSAVE命令生成RDB文件,并缓存该时间段内的写命令;
  3. Master完成RDB文件后,将其发送给所有Slave服务器;
  4. Slave服务器接收到RDB文件后,删除内存中旧的缓存数据,并装载RDB文件;
  5. Master在发送完RDB后,即刻向所有Slave服务器发送缓存中的写命令;

集群扩容收容

上面虽然创建了主从复制,但如果手动给节点添加一个从节点,有可能添加从节点,也有可能添加从节点,这是我们想要干的。接下来我们给集群节点添加指定的从节点。
我们安装 7007、 7008、 7009几个Redis节点,然后将 7007和 7008作为主节点,添加到集群中, 7009作为从节点添加到集群中。

Redis节点IP端口
redis-7007172.18.0.87007
redis-7008172.18.0.97008
redis-7009172.18.0.107009
基于Docker安装Redis这里编写了一个脚本,安装脚本 redis-port.sh如下:
#!/bin/bash 
#在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息 #换行 
echo -e "n" 
#输入信息 
read -p "请输入容器端口:" DOCKER_PORT 
#输入端口赋值 
port=$DOCKER_PORT; 
echo -e "$port" 
#创建配置文件 
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > 
./${port}/conf/redis.conf && mkdir -p ./${port}/data; 
#创建redis容器 
docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis- cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis- cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server 
/usr/local/etc/redis/redis.conf; 
#查找ip 
echo  -n "启动$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis- 
net").IPAddress }}' "redis-${port}")":${port}" 成功!"; 
echo -e "n"

我们执行 redis-port.sh脚本,实现 7007,7008,7009节点安装。
添加和执行权限:
chmod +x redis-port.sh

查看集群状态
主节点查看:

./redis-cli -p 7001 cluster nodes|grep master

主节点状态信息如下:

从节点查看:

从上面信息我们可以看出集群关系:

MasterSlave
70017005
70027006
70037004

添加集群主节点

我们需要给集群节点添加一个主节点,我们需要将 192.168.211.141:7007节点添加到 192.168.211.141:7001节 点所在的集群中,并且添加后作为主节点,添加命令行如下:

./redis-cli --cluster add-node 192.168.211.141:7007 192.168.211.141:7001

命令说明:

将192.168.211.141:7007节点添加到192.168.211.141:7001节点所在的集群中

执行命令后,效果如下:

此时我们可以进入到集群节点之一查看此时的集群状态,我们进入到 7002节点中输入 cluster node查询,操作方法如下:

进入容器 
docker exec -it redis-7002 /bin/bash 进入到redis-cli脚本目录 
cd /usr/local/bin 
登录7002节点 
./redis-cli -p 7002 -c 
查询集群状态 
cluster nodes

效果如下:

哈希槽分配


从上面的集群节点信息我们可以看出一个问题,其他主节点都有一串数字范围,而刚才添加的 7007节点没有这段数字范围,这和Redis集群原理有关系,我们来讲解一下集群的原理,然后实现新增节点哈希槽(这段数字范围)的分配。

Redis原理:

(1)Redis Cluster 特性之一是引入了槽的概念。一个redis集群包含 16384 个哈希槽。
(2)集群时,会将16384个哈希槽分别分配给每个Master节点,每个Master节点占16384个哈希槽中的一部分。
(3)执行GET/SET/DEL时,都会根据key进行操作,Redis通过CRC16算法对key进行计算得到该key所属Redis节点。 (4)根据key去指定Redis节点操作数据。

从原理上分析,因为之前 7001,7002,7003已经瓜分了16384个哈希槽,所以再增加一个新节点是没有剩余哈希槽分配的,所以新增的 7007节点没有分配到哈希槽。我们只能重新分配哈希槽,才能让新增节点分配到一定的哈希槽, 重新分配哈希槽后,我们还要考虑之前其他Redis节点中的数据迁移。

重新分配Hash槽
我们将 7001,7002,7003中的 100个哈希槽挪给 7007,命令如下:

./redis-cli --cluster reshard 192.168.211.141:7001 --cluster-from 
c9687b2ebec8b99ee14fcbb885b5c3439c58827f,80a69bb8af3737bce2913b2952b4456430a89eb3,612e4af8ea e48426938ce65d12a7d7376b0b37e3 --cluster-to 443096af2ff8c1e89f1160faed4f6a02235822a7 -- cluster-slots 100

命令说明:

将节点 
c9687b2ebec8b99ee14fcbb885b5c3439c58827f 
80a69bb8af3737bce2913b2952b4456430a89eb3 
612e4af8eae48426938ce65d12a7d7376b0b37e3 
中的100个哈希槽移动到 
443096af2ff8c1e89f1160faed4f6a02235822a7 
中

参数说明:

--cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔 
--cluster-to:表示需要新分配节点的node ID 
--cluster-slots:分配的slot数量 

将100个哈希槽挪给7007后,我们查询下节点信息:

./redis-cli -p 7001 cluster nodes|grep master 

效果如下:

添加集群从节点

我们需要往集群中给 7007节点添加一个从节点 7008,添加从节点的主要目的是提高高可用,防止主节点宕机后该节点无法提供服务。添加从节点命令如下:

./redis-cli --cluster add-node 192.168.211.141:7008 192.168.211.141:7007 --cluster-slave -- cluster-master-id 443096af2ff8c1e89f1160faed4f6a02235822a7 

命令说明:

将192.168.211.141:7008节点添加到192.168.211.141:7007对应的集群中,并且加入的节点为从节点,对应的主节点 id是443096af2ff8c1e89f1160faed4f6a02235822a7 

参数说明:

add-node: 后面的分别跟着新加入的slave和slave对应的
master cluster-slave:表示加入的是slave节点 
--cluster-master-id:表示slave对应的master的node ID 

执行命令后,效果如下:

集群信息查看:

最后

以上就是多情电源最近收集整理的关于深入浅出缓存设计---3、Redis集群配置Redis集群配置的全部内容,更多相关深入浅出缓存设计---3、Redis集群配置Redis集群配置内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部