一台服务器搭建部署两个或多个Redis实例

本文详细介绍如何在同一服务器上部署两个Redis实例,避免数据冲突。通过修改配置文件、端口号及路径,实现多实例并行运行,并提供启动脚本及测试方法。

 

问题描述:

今天程序那边说测试服里面有两个项目,为了数据不冲突,想一台服务器搞两个Redis实例,

然后自己这边查询了一下,确实可以这么整,只需要区分端口号和区分配置文件方面就行,

原理与nginx和tomcat等添加容器单实例多应用应该差不多,做个笔记记录一下。

1、复制新的配置文件,改变配置名称

2、修改配置文件里面的端口号、PID文件路径以及日志文件路径、 转储文件路径,确保两个或者多个redis服务不会冲突。

我这边搭建的Redis目录:

redis data directory : /data/redis/redis6379/data
redis log directory : /data/redis/redis6379/logs
redis install directory : /usr/local/redis
redis config file directory : /etc/
redis startup script : /etc/init.d/redis

可以指定端口启动多个Redis进程。

解决方法:

1、切换到redis目录,新建个redis数据和日志目录

[root@tse1 redis]# mkdir -p /data/redis/redis6380/{data,logs}
[root@tse1 redis6380]# pwd
/data/redis/redis6380

2、切换到redis配置文件目录cp一份redis配置文件

#复制新的配置文件给第二个redis使用

[root@tse1 etc]# cp /etc/redis.conf redis6380.conf

#配置新redis文件,避免两个redis冲突,在配置文件按照如下几个参数进行修改;

[root@tse1 etc]# vim redis6380.conf

配置参数:

#修改新的pid文件路径
pidfile /data/redis/redis6380/logs/redis6380.pid

#指定新的端口号
port 6380

#指定新的日志文件路径
logfile "/data/redis/redis6380/logs/redis6380.log"
#指定新的数据文件路径dir /data/redis/redis6380/data/
#指定新的转储文件路径
dbfilename dump6380.rdb
#配置文件修改完成:wq保存退出

3、修改启动脚本

[root@tse1 ~]# cp /etc/init.d/redis /etc/init.d/redis6380

[root@tse1 init.d]# vim redis6380

 4、关于启动脚本可以参考这一篇文章介绍,修改相应参数即可

Centos7下Redis设置开机自启动服务:

https://www.cnblogs.com/Sungeek/p/11691231.html

5、如果上面服务都已配置完成,就可以直接启动查看是否成功

[root@tse1 /]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      30162/redis-server  
tcp        0      0 192.168.15.163:6379     0.0.0.0:*               LISTEN      30162/redis-server  
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      30171/redis-server  
tcp        0      0 192.168.15.163:6380     0.0.0.0:*               LISTEN      30171/redis-server

 6、客户端连接测试

[root@tse1 /]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 -a redis密码
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> 

[root@tse1 /]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6380 -a redis密码
127.0.0.1:6380> PING
PONG
127.0.0.1:6380>

 

 原文链接

https://www.cnblogs.com/Sungeek/p/12057902.html

<think>我们正在使用Docker部署Redis集群。根据引用[1][2][3],我们可以总结出以下步骤: 1. 规划集群节点:通常需要至少6个节点(3主3从),分布在多台服务器一台服务器上。 2. 为每个节点准备配置文件和数据目录。 3. 使用Docker运行多个Redis容器,每个容器作为一个节点,并暴露相应的端口。 4. 创建集群。 由于用户没有指定服务器数量,我们可以假设在单台服务器部署(多节点)者多台服务器部署。这里我们以单台服务器部署6个节点为例(3主3从),但也会提到多台服务器的差异点。 步骤: 1. 创建Redis配置文件模板(redis.conf),并设置集群相关配置。 2. 为每个节点创建独立的配置文件和目录。 3. 使用Docker命令启动6个Redis容器。 4. 执行集群创建命令。 详细步骤: 1. 准备配置文件: 首先,我们需要一个基础的Redis配置文件,启用集群模式。创建一个目录(例如:`redis-cluster`),并在其下创建子目录`node1`到`node6`,每个目录下放置一个`redis.conf`文件(内容相同,但部分配置可不同,如端口)。 基础配置文件(redis.conf)内容示例: ``` port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes # 如果是在单台服务器上,每个实例的端口不同;如果多台服务器,注意每个服务器上的实例端口可以相同(但IP不同),但为了统一管理,通常每个节点使用不同端口。 # 绑定所有网络接口,允许外部访问 bind 0.0.0.0 # 如果使用Docker,需要设置集群通告IP(使用宿主机的IP和映射的集群总线端口),否则集群总线通信会失败 # cluster-announce-ip 192.168.0.1 # 这里需要根据实际情况设置,如果是多台服务器,则设置为当前服务器的公网IP内网IP(集群内部能通信的IP) # cluster-announce-port 6379 # 客户端访问端口 # cluster-announce-bus-port 16379 # 集群总线端口 ``` 注意:在Docker中,我们通常通过环境变量来设置通告IP和端口(如引用[2]所示),者通过启动命令传入。由于在单台服务器上,我们可以使用宿主机的IP,但是每个节点的端口不同。 2. 创建目录结构(在宿主机上): ``` mkdir -p redis-cluster/node{1..6}/data ``` 将上述配置文件复制到每个节点目录下,并修改每个节点的配置文件中的端口(分别设置为6381到6386,举例)以及对应的集群总线端口(在配置文件中设置`cluster-announce-bus-port`为16381到16386)。但注意,由于我们使用Docker,每个容器内的端口是固定的(比如6379),但是映射到宿主机的端口不同。 3. 启动容器: 我们使用6个容器,每个容器映射两个端口:一个用于客户端访问(如6381->6379),一个用于集群总线(如16381->16379)。 以节点1为例(在宿主机上执行): ```bash docker run -d --name redis-node1 \ -p 6381:6379 \ -p 16381:16379 \ -v /path/to/redis-cluster/node1/redis.conf:/usr/local/etc/redis/redis.conf \ -v /path/to/redis-cluster/node1/data:/data \ redis:latest \ redis-server /usr/local/etc/redis/redis.conf ``` 注意:这里我们显式映射了集群总线端口(16379)到宿主机的16381端口,并在配置文件中设置`cluster-announce-bus-port`为16379(容器内端口)即可。但是,通告IP(`cluster-announce-ip`)需要设置为宿主机的IP(假设为192.168.0.100),那么我们可以通过环境变量传入,者在配置文件中写死。 更好的做法是在启动命令中通过`-e`设置环境变量,然后在配置文件中使用`${}`引用环境变量(但需要Redis支持,然而Redis配置文件不支持环境变量替换)。因此,我们可以使用启动脚本替换配置文件中的变量,者使用模板生成配置文件(这里不展开)。 另一种方式(如引用[2])是使用特定的镜像(如`redis-cluster:4.0`)来支持环境变量设置,但官方Redis镜像不支持。因此,我们可以自己构建镜像者采用在启动时通过`sed`修改配置文件。 为了简化,我们可以在启动容器前,为每个节点生成配置文件,并设置好`cluster-announce-ip`(宿主机IP)和`cluster-announce-bus-port`(容器内端口,即16379)以及`port`(容器内端口,6379)。注意,每个容器内的端口都是6379,但是映射到宿主机的端口不同。 但是,官方Redis镜像从5.0开始支持在配置文件中使用`%env{ENV_VAR}%`来引用环境变量?实际上,官方镜像并不支持,所以我们需要另寻他法。 因此,我们可以在宿主机上为每个节点准备好配置文件,并写死宿主机IP和对应的端口(注意:`cluster-announce-bus-port`在容器内是16379,但是映射到宿主机的端口是16381等,而通告给集群其他节点的应该是宿主机的IP和映射的集群总线端口?不对,实际上,集群节点之间通信是直接通过容器网络进行的,还是通过宿主机的网络?这取决于Docker的网络模式。 如果我们使用桥接网络(bridge),那么容器之间可以通过内部IP通信(不经过宿主机端口映射),这样就不需要设置`cluster-announce-*`参数。但是,如果集群节点分布在多个宿主机上,则必须通过宿主机的IP和映射的端口通信。 因此,这里我们考虑两种部署方式: a) 单台服务器:使用桥接网络,容器之间通过内部网络通信(不需要设置通告IP和端口)。 b) 多台服务器:必须设置通告IP(为宿主机的公网IP内网IP)和端口(映射的宿主机端口)。 由于我们是在单台服务器部署,所以可以省略`cluster-announce-*`配置,让集群自动使用容器内部的IP(但注意,容器重启IP可能会变,所以建议使用自定义网络并固定IP?者使用`host`网络模式?)。 但为了通用性,我们采用设置`cluster-announce-ip`为宿主机IP,`cluster-announce-port`为映射的客户端端口,`cluster-announce-bus-port`为映射的集群总线端口。 由于配置文件中不能使用环境变量,我们可以写一个启动脚本,在启动容器前动态生成配置文件(使用环境变量替换)。 这里为了简化,我们假设宿主机IP为192.168.0.100,并手动修改每个节点的配置文件,设置: cluster-announce-ip 192.168.0.100 cluster-announce-port 6381 # 节点1映射的客户端端口 cluster-announce-bus-port 16381 # 节点1映射的集群总线端口 然后启动容器。 4. 启动6个节点(示例为节点1,其他节点类似,端口和目录相应变化): ```bash # 节点1 docker run -d --name redis-node1 \ -p 6381:6379 \ -p 16381:16379 \ -v /path/to/redis-cluster/node1/redis.conf:/usr/local/etc/redis/redis.conf \ -v /path/to/redis-cluster/node1/data:/data \ redis:latest \ redis-server /usr/local/etc/redis/redis.conf # 节点2 docker run -d --name redis-node2 \ -p 6382:6379 \ -p 16382:16379 \ -v /path/to/redis-cluster/node2/redis.conf:/usr/local/etc/redis/redis.conf \ -v /path/to/redis-cluster/node2/data:/data \ redis:latest \ redis-server /usr/local/etc/redis/redis.conf ... 重复直到节点6 ``` 注意:每个节点的配置文件里,`cluster-announce-port`和`cluster-announce-bus-port`要对应到宿主机的端口。 5. 创建集群: 当所有节点启动后,使用`redis-cli`创建集群。我们可以进入任意一个容器执行创建命令: ```bash docker exec -it redis-node1 redis-cli --cluster create \ 192.168.0.100:6381 \ 192.168.0.100:6382 \ 192.168.0.100:6383 \ 192.168.0.100:6384 \ 192.168.0.100:6385 \ 192.168.0.100:6386 \ --cluster-replicas 1 ``` 这里使用了宿主机的IP和映射的客户端端口(6381~6386)来创建集群。`--cluster-replicas 1`表示每个主节点有一个从节点。 6. 验证集群: ```bash docker exec -it redis-node1 redis-cli -p 6379 cluster nodes ``` 注意:如果使用多台服务器部署,则每台服务器上运行部分节点,并在创建集群时使用每台服务器的IP和对应端口。 以上步骤是一个基本流程,实际部署中可能还需要考虑Docker网络、持久化、安全等问题。 由于引用[2]中使用了阿里云镜像,我们这里使用官方Redis镜像,所以步骤略有不同。 另外,引用[3]中使用了自定义网络`redis_cluster`,这样容器之间可以通过容器名称通信,避免了IP变化的问题。我们可以采用这种方式: 创建自定义网络: ```bash docker network create redis-cluster-net ``` 然后启动容器时加入该网络,并设置容器名称(如redis-node1等)。在创建集群时,使用容器名称和容器内的端口(6379)来创建: ```bash docker exec -it redis-node1 redis-cli --cluster create \ redis-node1:6379 \ redis-node2:6379 \ redis-node3:6379 \ redis-node4:6379 \ redis-node5:6379 \ redis-node6:6379 \ --cluster-replicas 1 ``` 这样,即使容器重启,只要名称不变,集群配置仍然有效。 因此,我们推荐使用自定义网络。 重新整理步骤(使用自定义网络): 1. 创建自定义网络: ```bash docker network create redis-cluster-net ``` 2. 创建6个节点目录和配置文件(每个配置文件内容基本相同,除了`port`可以都设置为6379吗?不可以,因为每个容器内都是6379,但是它们在不同的容器中,所以可以。但是,如果我们在同一个宿主机上,使用同一个配置文件模板,那么我们可以让每个容器内的端口都是6379,这样配置文件就可以完全一样。但是,我们映射到宿主机的端口需要不同(6381-6386),而集群总线端口映射也需要不同(16381-16386)?实际上,在自定义网络中,我们不需要映射宿主机端口(除了需要从宿主机访问集群外)。如果不需要从宿主机外部访问,可以不用映射端口到宿主机,只需要在容器内部使用6379端口通信。 但是,通常我们需要从宿主机外部访问,所以还是映射端口到宿主机。 配置文件(redis.conf)内容(所有节点相同): ``` port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 # 注意:由于使用自定义网络,容器之间通过容器名称通信,所以不需要设置cluster-announce-ip,因为容器内部IP是固定的(在自定义网络中,我们可以使用容器名称解析到IP) # 但是,如果集群节点需要被宿主机外部访问(比如其他机器连接这个集群),那么需要设置通告IP为宿主机的IP(者负载均衡的IP),否则外部客户端无法正确重定向。 # 因此,如果集群只被同一网络内的容器访问,可以不设置;如果需要被外部访问,则设置。 # 这里假设外部客户端通过宿主机的映射端口(6381-6386)访问,那么我们需要设置通告IP为宿主机IP,通告端口为映射的端口(6381-6386)。 # 因此,每个节点需要不同的通告设置,所以配置文件还是需要不同。 ``` 因此,我们仍然需要为每个节点单独配置`cluster-announce-ip`和`cluster-announce-port`(以及`cluster-announce-bus-port`)。所以,我们为每个节点准备不同的配置文件。 考虑到复杂性,我们推荐使用一个脚本自动化生成配置文件和启动容器。 由于时间关系,我们提供手动步骤: 步骤总结: 1. 创建自定义网络(redis-cluster-net)。 2. 为每个节点创建目录(node1~node6),并在每个目录下创建redis.conf,内容如下(以节点1为例,假设宿主机IP为192.168.0.100): ``` port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 # 节点1的配置 cluster-announce-ip 192.168.0.100 cluster-announce-port 6381 cluster-announce-bus-port 16381 ``` 节点2的配置文件: ``` ...(同上) cluster-announce-ip 192.168.0.100 cluster-announce-port 6382 cluster-announce-bus-port 16382 ``` 以此类推。 3. 启动容器(节点1): ```bash docker run -d --name redis-node1 \ --net redis-cluster-net \ -p 6381:6379 \ -p 16381:16379 \ -v /path/to/redis-cluster/node1/redis.conf:/usr/local/etc/redis/redis.conf \ -v /path/to/redis-cluster/node1/data:/data \ redis:latest \ redis-server /usr/local/etc/redis/redis.conf ``` 其他节点类似(注意修改名称、端口映射、数据卷路径和配置文件路径)。 4. 创建集群(使用宿主机IP和映射的客户端端口): ```bash docker exec -it redis-node1 redis-cli --cluster create \ 192.168.0.100:6381 \ 192.168.0.100:6382 \ 192.168.0.100:6383 \ 192.168.0.100:6384 \ 192.168.0.100:6385 \ 192.168.0.100:6386 \ --cluster-replicas 1 ``` 5. 验证集群。 注意:如果是在多台服务器部署,则每台服务器上运行部分节点,配置文件中的`cluster-announce-ip`设置为该服务器的IP,端口映射和宿主机端口对应。在创建集群时,使用每台服务器的IP和端口。 由于步骤较多,用户可以根据实际情况调整。 最后,提供相关问题: §§相关问题§§ 1. Redis集群最少需要多少个节点? 2. 如何扩展Redis集群? 3. 如何监控Redis集群的健康状态?</think>### 在服务器上使用 Docker 部署 Redis 集群的完整指南 #### 一、部署原理 Redis 集群采用分布式架构,要求至少 **6 个节点**(3 主节点 + 3 从节点)实现高可用。Docker 通过容器化技术封装 Redis 实例,利用端口映射和数据卷实现集群部署[^1][^2]。核心组件包括: - `cluster-enabled yes`:启用集群模式 - 集群总线端口:客户端端口 + 10000(如 6379 → 16379) - 节点发现机制:通过 `CLUSTER MEET` 命令建立连接 #### 二、单服务器部署步骤(6 节点) 1. **创建自定义网络** ```bash docker network create redis-cluster-net ``` 2. **准备配置文件模板** (`redis-cluster.conf`) ```conf port ${PORT} cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 ``` 3. **批量启动容器**(使用环境变量动态配置) ```bash for port in $(seq 6381 6386); do \ mkdir -p ./${port}/conf && \ PORT=${port} envsubst < redis-cluster.conf > ./${port}/conf/redis.conf && \ docker run -d --name=redis-${port} \ --net redis-cluster-net \ -p ${port}:${port} \ -p $((port+10000)):$((port+10000)) \ -v $(pwd)/${port}/conf:/etc/redis \ -v $(pwd)/${port}/data:/data \ redis:7.0-alpine \ redis-server /etc/redis/redis.conf; \ done ``` 4. **创建集群** ```bash docker exec -it redis-6381 redis-cli --cluster create \ $(for port in {6381..6386}; do echo -n "$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-${port}):${port} "; done) \ --cluster-replicas 1 ``` #### 三、多服务器部署方案(以 3 台服务器为例) | 服务器 IP | 容器端口 | 集群总线端口 | |----------------|----------|--------------| | 172.16.17.100 | 7000 | 17000 | | 172.16.17.100 | 7001 | 17001 | | 172.16.17.101 | 7002 | 17002 | | 172.16.17.101 | 7003 | 17003 | | 172.16.17.102 | 7004 | 17004 | | 172.16.17.102 | 7005 | 17005 | **每台服务器执行**: ```bash docker run -d --name redis-${PORT} \ -e CLUSTER_ANNOUNCE_IP=<本机IP> \ -p ${PORT}:${PORT} -p ${BUS_PORT}:${BUS_PORT} \ redis:7.0-alpine \ redis-server --port ${PORT} --cluster-enabled yes ``` **集群初始化命令**: ```bash redis-cli --cluster create \ 172.16.17.100:7000 172.16.17.100:7001 \ 172.16.17.101:7002 172.16.17.101:7003 \ 172.16.17.102:7004 172.16.17.102:7005 \ --cluster-replicas 1 ``` #### 四、关键配置说明 1. **网络模式** - 单服务器:`bridge` 网络 + 端口映射 - 多服务器:主机网络 Overlay 网络 2. **持久化策略** ```bash -v /redis-data/${port}:/data # 数据卷挂载 ``` 3. **集群健康检查** ```bash redis-cli -p 6381 cluster nodes | grep master ``` #### 五、验证集群 ```bash $ redis-cli -c -p 6381 127.0.0.1:6381> SET user:001 "value" -> Redirected to slot [12182] located at 172.18.0.4:6383 OK ``` ### 常见问题解决 1. **节点无法通信** - 检查防火墙:`ufw allow 6381-6386/tcp && ufw allow 16381-16386/tcp` - 验证网络连通性:`docker exec redis-6381 ping redis-6382` 2. **槽位未完全分配** ```bash redis-cli --cluster fix $(hostname -i):6381 ``` 3. **容器重启后 IP 变化** - 使用 `--ip` 指定静态 IP ```bash docker run ... --ip 172.19.0.${SEQ} ... ``` > **重要提示**:生产环境建议使用 Kubernetes Docker Swarm 管理集群状态,避免单点故障[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值