项目源码合集 https://gitee.com/qiuyusy/small-project-study

搭建过程疯狂踩坑,记录一下希望各位少走弯路

目录

  • 主从搭建
    • 配置文件redis.conf
    • 运行容器
    • 测试
    • 优化
  • 哨兵集群
    • 配置文件
    • 运行容器
    • 测试
    • 代码
    • 读写分离
  • 分片集群
    • 配置文件redis.conf
    • 运行容器
    • 测试
    • 集群伸缩
    • 转移插槽
    • 故障转移
    • 代码连接

主从搭建

主 redis_0 7001

从 redis_1 7002

从 redis_2 7003

mkdir -p /opt/docker/redis_study/redis_0/conf
mkdir -p /opt/docker/redis_study/redis_0/data
mkdir -p /opt/docker/redis_study/redis_1/conf
mkdir -p /opt/docker/redis_study/redis_1/data
mkdir -p /opt/docker/redis_study/redis_2/conf
mkdir -p /opt/docker/redis_study/redis_2/data

配置文件redis.conf

/opt/docker/redis_study/redis_0/conf

记得配置文件需要关闭aof appendonly no

replica-announce-ip 192.168.222.128 设置IP地址

加入bind 0.0.0.0,这个很重要

把配置文件cp 到 两个从的目录下

然后在两个从机的配置中添加replicaof 192.168.222.128 7001,设定为主机的从机

5.0之前用 slaveof 5.0以后用replicaof

运行容器

注意这里三个节点容器内的端口别都设为6379!这样IP和端口相同会导致后面哨兵集群无法选出新的主节点

主 redis_0 7001

docker run -p 7001:7001 --name redis_0 \
-v /opt/docker/redis_study/redis_0/data:/data \
-v /opt/docker/redis_study/redis_0/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

从 redis_1 7002

docker run -p 7002:7002 --name redis_1 \
-v /opt/docker/redis_study/redis_1/data:/data \
-v /opt/docker/redis_study/redis_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

从 redis_2 7003

docker run -p 7003:7003 --name redis_2 \
-v /opt/docker/redis_study/redis_2/data:/data \
-v /opt/docker/redis_study/redis_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

测试

主机redis_0 set name qiuyu

从机redis_2 get name

主从设置成功

可以使用 info replication查看集群信息

从节点只能读无法写

优化

磁盘慢但网络快的话,主节点可以开启repl-diskless-sync no,提高全量同步性能

哨兵集群

sentinel_0 27001

sentinel_1 27002

sentinel_2 27003

mkdir -p /opt/docker/redis_study/sentinel_0/conf
mkdir -p /opt/docker/redis_study/sentinel_1/conf
mkdir -p /opt/docker/redis_study/sentinel_2/conf
mkdir -p /opt/docker/redis_study/sentinel_0/log
mkdir -p /opt/docker/redis_study/sentinel_1/log
mkdir -p /opt/docker/redis_study/sentinel_2/log

配置文件

protected-mode no
bind 0.0.0.0
# 后台运行 docker -d 这里就无需开启
daemonize no
port 27001 # 27001 27002 27003
# log
dir "/home/redis_sentinel/log"
logfile "/home/redis_sentinel/log/27001.log"
# sentinel
sentinel monitor mymaster 192.168.222.128 7001 2
# 超时
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000sentinel announce-ip 192.168.222.128
sentinel announce-port 27001 # 27001 27002 27003

其他两个哨兵也配置一下,记得修改port 和 log

运行容器

docker run -p 27001:27001 --name sentinel_0 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_0/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_0/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.confdocker run -p 27002:27002 --name sentinel_1 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_1/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_1/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.confdocker run -p 27003:27003 --name sentinel_2 \
--sysctl net.core.somaxconn=1024 \
--privileged=true \
-v /opt/docker/redis_study/sentinel_2/conf:/usr/local/etc/redis/conf/ \
-v /opt/docker/redis_study/sentinel_2/log:/home/redis_sentinel/log \
-d redis redis-sentinel /usr/local/etc/redis/conf/sentinel.conf

这里坑贼多,配吐了

  • 指定sentinel.conf配置文件映射到容器内时直接使用文件映射, 这么做有可能导致哨兵没有写入配置文件的权限, 表现为WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy. 解决方案:使用文件夹映射或者加上--privileged=true用来提升root权限

  • docker redis The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn 解决 : 加上 --sysctl net.core.somaxconn=1024

测试

关闭redis_0后,sentinel_1被选举为leader,然后sentinel_1选择redis_1成为主节点

1:X 09 Mar 2023 16:17:39.478 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:X 09 Mar 2023 16:17:39.478 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:X 09 Mar 2023 16:17:39.478 # Configuration loaded
1:X 09 Mar 2023 16:17:39.479 * monotonic clock: POSIX clock_gettime
1:X 09 Mar 2023 16:17:39.479 * Running mode=sentinel, port=27001.
1:X 09 Mar 2023 16:17:39.483 # Sentinel ID is bdc44c4a16815f0a2050c378df49c26e5de22874
1:X 09 Mar 2023 16:17:39.483 # +monitor master mymaster 192.168.222.128 7001 quorum 2
1:X 09 Mar 2023 16:17:39.484 * +slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:39.484 * +slave slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:41.738 * +sentinel sentinel dc564ce67b88380c9befc8324bee0c021995e570 192.168.222.128 27002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:17:42.290 * +sentinel sentinel 201d9e4b941d7adc262058975dab2f25e587e1cf 192.168.222.128 27003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.428 # +sdown master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.513 # +odown master mymaster 192.168.222.128 7001 #quorum 3/2
1:X 09 Mar 2023 16:19:05.513 # +new-epoch 1
1:X 09 Mar 2023 16:19:05.513 # +try-failover master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.515 # +vote-for-leader bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.521 # dc564ce67b88380c9befc8324bee0c021995e570 voted for bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.521 # 201d9e4b941d7adc262058975dab2f25e587e1cf voted for bdc44c4a16815f0a2050c378df49c26e5de22874 1
1:X 09 Mar 2023 16:19:05.587 # +elected-leader master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.587 # +failover-state-select-slave master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.688 # +selected-slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.688 * +failover-state-send-slaveof-noone slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:05.780 * +failover-state-wait-promotion slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.542 # +promoted-slave slave 192.168.222.128:7002 192.168.222.128 7002 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.542 # +failover-state-reconf-slaves master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:06.642 * +slave-reconf-sent slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.594 * +slave-reconf-inprog slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.594 * +slave-reconf-done slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # -odown master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # +failover-end master mymaster 192.168.222.128 7001
1:X 09 Mar 2023 16:19:07.677 # +switch-master mymaster 192.168.222.128 7001 192.168.222.128 7002
1:X 09 Mar 2023 16:19:07.677 * +slave slave 192.168.222.128:7003 192.168.222.128 7003 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:19:07.677 * +slave slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:19:12.702 # +sdown slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002

然后恢复redis_0 ,成为redis_0的从节点

1:X 09 Mar 2023 16:22:34.113 # -sdown slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002
1:X 09 Mar 2023 16:22:44.100 * +convert-to-slave slave 192.168.222.128:7001 192.168.222.128 7001 @ mymaster 192.168.222.128 7002

代码

导入依赖

<!--    redis    -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置: 无需配置redis节点,直接配置哨兵就行

spring:redis:sentinel:master: mymasternodes:- 192.168.222.128:27001- 192.168.222.128:27002- 192.168.222.128:27003

简单测一下,都是OK的

@SpringBootTest
class MyTest {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Testvoid testSelect(){String name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);}@Testvoid testInset(){stringRedisTemplate.opsForValue().set("test","test");}
}

读写分离

启动类中配置下这个@Bean就行了

@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return new LettuceClientConfigurationBuilderCustomizer() {@Overridepublic void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}};}// 或者直接lambda@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}
}

这个bean中配置的就是读写策略,包括四种:

  • MASTER:从主节点读取
  • MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
  • REPLICA:从slave(replica)节点读取
  • REPLICA _PREFERRED:优先从slave(replica)节点读取,所有的slave都不可用才读取master

分片集群

为了防止一个节点存储太多数据以及提高并发写能力,搭建一个分片集群

IP PORT 角色 名称
192.168.222.128 7001 master redis_1_1
192.168.222.128 7002 master redis_2_1
192.168.222.128 7003 master redis_3_1
192.168.222.128 8001 slave redis_1_2
192.168.222.128 8002 slave redis_2_2
192.168.222.128 8003 slave redis_2_2

创建文件夹存放数据

mkdir -p /opt/docker/redis_study/redis_1_1/conf
mkdir -p /opt/docker/redis_study/redis_1_1/data
mkdir -p /opt/docker/redis_study/redis_1_2/conf
mkdir -p /opt/docker/redis_study/redis_1_2/data
mkdir -p /opt/docker/redis_study/redis_2_1/conf
mkdir -p /opt/docker/redis_study/redis_2_1/data
mkdir -p /opt/docker/redis_study/redis_2_2/conf
mkdir -p /opt/docker/redis_study/redis_2_2/data
mkdir -p /opt/docker/redis_study/redis_3_1/conf
mkdir -p /opt/docker/redis_study/redis_3_1/data
mkdir -p /opt/docker/redis_study/redis_3_2/conf
mkdir -p /opt/docker/redis_study/redis_3_2/data

配置文件redis.conf

需要在之前的redis.conf基础上加入cluster-enabled yes cluster-config-file /tmp/6379/nodes.conf cluster-node-timeout 5000

port 7001 # 7001 7002 7003 8001 8002 8003
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 绑定地址
bind 0.0.0.0

运行容器

docker run -p 7001:7001 --name redis_1_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_1/data:/data \
-v /opt/docker/redis_study/redis_1_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7001docker run -p 7002:7002 --name redis_2_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_1/data:/data \
-v /opt/docker/redis_study/redis_2_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7002docker run -p 7003:7003 --name redis_3_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_1/data:/data \
-v /opt/docker/redis_study/redis_3_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7003docker run -p 8001:8001 --name redis_1_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_2/data:/data \
-v /opt/docker/redis_study/redis_1_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8001docker run -p 8002:8002 --name redis_2_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_2/data:/data \
-v /opt/docker/redis_study/redis_2_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8002docker run -p 8003:8003 --name redis_3_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_2/data:/data \
-v /opt/docker/redis_study/redis_3_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8003

然后进入一个容器的内部

docker exec -it redis_1_1 bash

redis-cli --cluster create --cluster-replicas 1 192.168.222.128:7001 192.168.222.128:7002 192.168.222.128:7003 192.168.222.128:8001 192.168.222.128:8002 192.168.222.128:8003
  • 1 表示 每个主节点一个从节点
  • 总共6个,每组2个也就是三组,前3个默认就是主节点

出现一直等待的问题

原因:

Redis集群中的各个节点,需要开放一个端口,同其他节点建立连接,用于接收心跳数据等操作。也就是说,redis_1_1节点,开放7001端口供client连接时,同时提供17001端口(10000 + 7001),供其他Redis节点连接。

所以多开放一个端口1xxxx或者使用--net host的方式(推荐--net host不然后面会踩坑)

docker run -p 7001:7001 -p17001:17001 --name redis_1_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_1/data:/data \
-v /opt/docker/redis_study/redis_1_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7001docker run -p 7002:7002 -p17002:17002 --name redis_2_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_1/data:/data \
-v /opt/docker/redis_study/redis_2_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7002docker run -p 7003:7003 -p17003:17003 --name redis_3_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_1/data:/data \
-v /opt/docker/redis_study/redis_3_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7003docker run -p 8001:8001 -p18001:18001 --name redis_1_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_2/data:/data \
-v /opt/docker/redis_study/redis_1_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8001docker run -p 8002:8002 -p18002:18002 --name redis_2_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_2/data:/data \
-v /opt/docker/redis_study/redis_2_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8002docker run -p 8003:8003 -p18003:18003 --name redis_3_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_2/data:/data \
-v /opt/docker/redis_study/redis_3_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8003

重新试一下,OK!

测试

redis-cli -p 7001 然后 get直接出错

我们在集群模式连接redis时一定要加-c

redis-cli -c -p 7001

可以看到自动根据插槽slot重定到了7002

没有{}时根据整个key crc取余计算插槽,有{}时根据{}内的key计算,这样可以控制同一批到同一个插槽

集群伸缩

添加一个新节点到集群,默认master

mkdir -p /opt/docker/redis_study/redis_4_1/conf
mkdir -p /opt/docker/redis_study/redis_4_1/data
docker run --net host --name redis_4_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_4_1/data:/data \
-v /opt/docker/redis_study/redis_4_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7004

进入容器,新节点加入集群

redis-cli --cluster add-node 192.168.222.128:7004 192.168.222.128:7001

通过命令查看集群状态:

redis-cli -p 7004 cluster nodes

如图,7004加入了集群,并且默认是一个master节点:

但是,可以看到7004节点的插槽数量为0,因此没有任何数据可以存储到7004上,需要进行转移插槽

转移插槽

我们插入 num 发现被插入到7001中,我们想要将num插入到7004中就需要转移插槽reshard

使用reshard可以转移插槽

redis-cli --cluster reshard 192.168.222.128:7001

他会问你丫的要多少插槽,这里就定3000个

然后问你要把插槽给谁,这里找到7004的ID填入

然后问你想要从谁那移动插槽过来?

  • all 全部,就是其他三个节点都给你一部分
  • ID 给你插槽的节点ID
  • done 表示结束

输入7001的ID,然后输入done,就开始准备移动了

然后他会为你确定转吗?yes

移动完我们看看集群什么情况

redis-cli -p 7004 cluster nodes

可以看到7001的0-2999插槽被转移到了7004上

再试试set num,OK没有重定向到7001上了

故障转移

可以看到7002还是master

我们把7002的容器给停了docker stop redis_2_1

再看下集群状态,可以看到与7002对应的8003以及升为了master

重新开启7002后,7002成为了slave

如果想要手动故障转移的话

利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

这种failover命令可以指定三种模式:

  • 缺省:默认的流程,如图1~6歩
  • force:省略了对offset的一致性校验
  • takeover:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见

现在我们让7002夺回他的master地位

步骤如下:

1)利用redis-cli连接7002这个节点redis-cli -c -p 7002

2)执行cluster failover命令

来看看集群信息,看到7002又变为了master,8003则变回slave

代码连接

spring:redis:cluster:nodes:- 192.168.222.128:7001- 192.168.222.128:7002- 192.168.222.128:7003- 192.168.222.128:7004- 192.168.222.128:8001- 192.168.222.128:8002- 192.168.222.128:8003
2023-03-11 15:07:45.386  WARN 11612 --- [oEventLoop-4-10] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.4:7003]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.386  WARN 11612 --- [oEventLoop-4-13] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.7:8003]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.386  WARN 11612 --- [oEventLoop-4-11] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.5:8001]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.386  WARN 11612 --- [ioEventLoop-4-9] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.3:7002]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.387  WARN 11612 --- [ioEventLoop-4-8] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.2:7001]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.387  WARN 11612 --- [ioEventLoop-4-7] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.1:7004]: java.nio.channels.ClosedChannelException
2023-03-11 15:07:45.387  WARN 11612 --- [oEventLoop-4-12] i.l.c.c.t.DefaultClusterTopologyRefresh  : Unable to connect to [172.17.0.6:8002]: java.nio.channels.ClosedChannelException

报错!这里为什么连接的不是配置的地址

docker network inspect bridge看一下,原来docker默认桥接模式,连接到容器内了,我们改为host模式

[root@localhost ~]# docker network inspect bridge
[{"Name": "bridge","Id": "c8ec522db624553660584ed74d453b343d1c3dec1f166b0b8f9275a30a82710e","Created": "2023-03-10T17:41:51.080737251+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"1dc658345986e33c2a42f65ef788aec8b6d852bda43ceeb0e0b76210fee24da7": {"Name": "redis_3_1","EndpointID": "cd9ad02d0702a55c0ed0f912a4a19bc8591074c0085e828f3441c9262de6655b","MacAddress": "02:42:ac:11:00:04","IPv4Address": "172.17.0.4/16","IPv6Address": ""},"a03b8920396bfc3c6c744875929931c8a77aa914d699372a9ba857ca859acc6c": {"Name": "redis_2_2","EndpointID": "00cd297374b4945ae0a54eae3f6d2211047fb35647fd09de279bac707c938553","MacAddress": "02:42:ac:11:00:06","IPv4Address": "172.17.0.6/16","IPv6Address": ""},"bd110c2b8afdcf347a7c0b33c3d1507bc19fe2cf60c6a91fb5a22f8b13484090": {"Name": "redis_1_1","EndpointID": "5f290865f19023f6d57dd47af2d5c3c10b0d84397485080d6a0efc4f01fa221f","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""},"c75e53ca79f1e5f3c89252eb0fed0e06126847daaefd12b6ecab6a7fda4bf383": {"Name": "redis_1_2","EndpointID": "d7efddb06930b6bcb8a177d05b2a297a1edac79ecb70c383358c59a95315d829","MacAddress": "02:42:ac:11:00:05","IPv4Address": "172.17.0.5/16","IPv6Address": ""},"d83c9d9217fec3e06480594a7d81a8268966c59b8cdf6ef2398f854af8fe7507": {"Name": "redis_3_2","EndpointID": "00b754b7e72a746e1b1d5a162d2152e06787826996f94d2b304ac2b8762dfbcb","MacAddress": "02:42:ac:11:00:07","IPv4Address": "172.17.0.7/16","IPv6Address": ""},"da919e410d9a671d26e23252def156efcdedb232106e8cb894cd026b90d2d709": {"Name": "redis_4_1","EndpointID": "cb245d40d171d174d8b835a77ce944d14c7ec30c19751592ad16528c3d3f5e69","MacAddress": "02:42:ac:11:00:08","IPv4Address": "172.17.0.8/16","IPv6Address": ""},"dacb6b6e6d96c3f9f66a80475a537bb3efdd9488e6a96655edb5dfce44206997": {"Name": "redis_2_1","EndpointID": "2ea48a1e14578fbb4e360676b1b953282825a06c84d01fa77b4b66ce3d7d8856","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""}},"Options": {"com.docker.network.bridge.default_bridge": "true","com.docker.network.bridge.enable_icc": "true","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.host_binding_ipv4": "0.0.0.0","com.docker.network.bridge.name": "docker0","com.docker.network.driver.mtu": "1500"},"Labels": {}}

行吧使用-net host重新生成容器

docker run --net host --name redis_1_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_1/data:/data \
-v /opt/docker/redis_study/redis_1_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7001docker run --net host --name redis_2_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_1/data:/data \
-v /opt/docker/redis_study/redis_2_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7002docker run --net host --name redis_3_1 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_1/data:/data \
-v /opt/docker/redis_study/redis_3_1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 7003docker run --net host --name redis_1_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_1_2/data:/data \
-v /opt/docker/redis_study/redis_1_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8001docker run --net host --name redis_2_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_2_2/data:/data \
-v /opt/docker/redis_study/redis_2_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8002docker run --net host --name redis_3_2 \
--privileged=true \
-v /opt/docker/redis_study/redis_3_2/data:/data \
-v /opt/docker/redis_study/redis_3_2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--cluster-enabled yes --appendonly yes --port 8003

然后进容器重新配置集群

redis-cli --cluster create --cluster-replicas 1 192.168.222.128:7001 192.168.222.128:7002 192.168.222.128:7003 192.168.222.128:8001 192.168.222.128:8002 192.168.222.128:8003

终于OK!

【006】Redis主从/哨兵/分片集群docker搭建相关推荐

  1. redis 主从 + 哨兵模式集群部署(3台机器)

    前言 本文只讲如何部署,然后会贴出具体配置,以及如何验证是否部署成功(redis 版本采用 4.0.6 ).既不会介绍 redis 如何安装(本人采用源码安装方式),也不会涉及主从复制,哨兵模式具体原 ...

  2. Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

    文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...

  3. Docker下Redis Cluster分片集群的搭建、基本操作、集群扩容和集群故障转移(非关系型数据库技术课程 第九周)

    文章目录 Docker 下Redis Cluster 分片集群搭建 1. Cluster 分片集群 1.1 Cluster 集群的结构和作用 1.2 Cluster 分片集群 的作用 1.3哈希槽(h ...

  4. Redis主从配置和集群配置

    Redis主从配置和集群配置 文章目录 Redis主从配置和集群配置 一.Redis主从配置 1.主从概念 2.主从配置 3.数据操作 二.Redis集群配置 1.简介 2.Redis 集群好处 3. ...

  5. Redis单机模式主从模式哨兵模式集群模式搭建

    文章目录 一.Redis下载及安装 1.1.下载 1.2.环境安装 1.3.编译安装 1.4.修改配置 1.5.启动Redis 1.6.验证Redis是否启动 1.7.进入到Redis客户端 1.8. ...

  6. redis 主从同步、集群、持久化

    持久化 redis有两种方式实现持久化:RDB和AOF AOF:类似数据库WAL 机制,但是redis是先执行命令,然后在记录AOF日志,是一种写后日志而不是咱们常说的写前日志(这样做主要是为了red ...

  7. SpringBoot整合MongoDB以及副本集、分片集群的搭建

    整合springboot应用 说明: 这里主要以 springboot 应用为基础应用进行整合开发. Spring Data : Spring 数据框架 JPA .Redis.Elasticsearc ...

  8. Docker(7)Redis主从配置和集群配置

    文章目录 Redis 集群配置 新建6个redis容器 构建主从关系 Redis 集群配置 三主三从集群搭建 新建6个redis容器 单台创建命令 docker run -d --name redis ...

  9. redis sentinel哨兵模式集群搭建教程

    1.环境说明 我们将使用192.168.220.128.192.168.220.129两台机器搭建sentinel交叉主从为例 当前我们已在192.168.220.128上按redis安装教程安装了r ...

最新文章

  1. 如何在树莓派上进行python编程_设置并使用树莓派进行Python和C语言编程 (下)
  2. 第十节 字符串指针变量与字符数组的区别(十一)
  3. 微服务API模拟框架frock介绍
  4. Eugeny and Array(水题,注意题目描述即可)
  5. mysql一张表最多多少索引_MySQL一个索引最多有多少个列?真实的测试例子
  6. Hbase协处理器实践总结(hbase数据同步)
  7. linux 进程崩溃log,Linux系统日志及日志分析
  8. 两个前置摄像头_前后六颗摄像头?vivo V17 Pro率先实现升降式前置双摄
  9. react withRouter 离开页面触发
  10. juel java_Juel基本使用
  11. 文件夹批量重命名方法
  12. 苹果app退款_苹果 App Store 已购买的应用如何申请退款?
  13. html鼠标移动到图片上显示冒泡框,Bootstrap 教程 - 提示冒泡(Tooltip)
  14. Saas.为什么要搞Saas,会遇到哪些问题,看看5年Saas开发踩过的坑
  15. JAVA day06:代码作业(封装)
  16. 人工智能导论(2)——启发式算法(八数码问题)
  17. SQL注入的攻击与防御(简单篇)
  18. 在Excel表格中如何设置字体随单元格大小变化
  19. python ray定时_当 Python 邂逅 POV-Ray
  20. 当AI音箱成为未来生活入场券,百度用上亿补贴帮助全民“上车”

热门文章

  1. 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)...
  2. uc key.php,通过ucenter中的uc_key获取webshell通杀 Discuz X1.5 X2.5 X3
  3. 国泰银行将收购美国汇丰银行10家分行及其在西岸的部分贷款及存款
  4. 类型即正义:TypeScript 从入门到实践(序章)
  5. Win7网络共享看不见计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...
  6. python 求两个矩阵相乘
  7. 豆瓣python源码_(附源码)Python爬虫之豆瓣攻坚战
  8. MSP430定时器输出比较不稳定的解决方法
  9. AJAX技术学习总结
  10. txt转换epub如何转?你将在这篇文章里找到答案