Redis集群配置
这里安装6个redis,配置如下:
Redis节点 | IP | 端口 |
---|---|---|
redis-7001 | 172.18.0.2 | 7001 |
redis-7002 | 172.18.0.3 | 7002 |
redis-7003 | 172.18.0.4 | 7003 |
redis-7004 | 172.18.0.5 | 7004 |
redis-7005 | 172.18.0.6 | 7005 |
redis-7006 | 172.18.0.7 | 7006 |
Redis集群配置
现在安装对应的应用软件一般都推荐使用Docker容器,我们这里也不例外,直接使用Docker容器进行安装,安装大概要分这几个步骤:
- 创建redis-cluster.tmpl配置Redis信息【端口、是否开启集群等】
- 创建redis.sh配置需要创建的redis信息
- 添加网络,redis集群使用该网络
- 执行redis.sh实现创建redis
- 执行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。
主从复制
我们先来理解下主从同步,如下图:
- Slave服务启动,主动连接Master,并发送SYNC命令,请求初始化同步;
- Master收到SYNC后,执行BGSAVE命令生成RDB文件,并缓存该时间段内的写命令;
- Master完成RDB文件后,将其发送给所有Slave服务器;
- Slave服务器接收到RDB文件后,删除内存中旧的缓存数据,并装载RDB文件;
- Master在发送完RDB后,即刻向所有Slave服务器发送缓存中的写命令;
集群扩容收容
上面虽然创建了主从复制,但如果手动给节点添加一个从节点,有可能添加从节点,也有可能添加从节点,这是我们想要干的。接下来我们给集群节点添加指定的从节点。
我们安装 7007、 7008、 7009几个Redis节点,然后将 7007和 7008作为主节点,添加到集群中, 7009作为从节点添加到集群中。
Redis节点 | IP | 端口 |
---|---|---|
redis-7007 | 172.18.0.8 | 7007 |
redis-7008 | 172.18.0.9 | 7008 |
redis-7009 | 172.18.0.10 | 7009 |
基于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
主节点状态信息如下:
从节点查看:
从上面信息我们可以看出集群关系:
Master | Slave |
---|---|
7001 | 7005 |
7002 | 7006 |
7003 | 7004 |
添加集群主节点
我们需要给集群节点添加一个主节点,我们需要将 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集群配置内容请搜索靠谱客的其他文章。
发表评论 取消回复