Docker 搭建Redis 集群之路

news2025/1/6 19:12:34

前言

搞技术就是动手,动手再动手,实践出真知,毕竟最终是要解决问题的呢,废话不多讲,开搞,主要是为了记录一下,毕竟过程还是有点艰辛呢

需求(target)

  1. Windows 电脑 装一个虚拟机
  2. 用虚拟机构造Linux 系统
  3. 下载Docker 搭建Redis 集群
  4. 代码交互集群

过关斩将

  1. 检查电脑是否开启虚拟话化
  2. VMware 或者 VirtualBox 等虚拟机软件

以VirtualBox 为例 (根据个人喜好)

1. 进入官网:
       https://www.virtualbox.org/ 
2. 下载对应版本的压缩包文件:
  ![virtualbox](https://img-blog.csdnimg.cn/c489543054784b50bdaa6807a4a2d462.png)

3.安装 (选择合适的物理盘)
4. 验证
icon
界面

快速搭建Linux(使用镜像)

1.使用vagrant
2.官网:
https://www.vagrantup.com/downloads
https://app.vagrantup.com/boxes/search
vagrant download
boxes serarch
3. 安装 (电脑会自动重启)
4. 验证
win + R cmd 黑窗口 vagrant -v
有版本号 ,ok
cmd

5.构建Linux
1. vagrant box list (看看可使用的box 列表)
2. vagrant init boxName
例 vagrant init centos-7
会在安装的对应目录下生成一个

Vagrantfileboxname
3. vagrant up (启动并创建Linux)
有时挺快,大部分时间会失败,因为是国外服务器,如果20分钟还没好就不等了
国内镜像:
https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7.box

4.vagrant box add E:\myLinux\CentOS-7.box --name centos-7 (加入box)
4. vargrant ssh (连接)
5. 可以 使用黑窗口 也可以使用xshell
computer

xshell

下载docker image

1.卸载之前版本  
  sudo yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
				  
2. 安装需要的依赖包:
  sudo yum install -y yum-utils

3. 配置阿里镜像
  sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

4. 更新安装docker 容器
sudo yum install docker-ce docker-ce-cli containerd.io

5. docker -v

6.sudo systemctl start docker   
   如果报错:
    Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
 更改文件类型:   
 mv daemon.json daemon.conf
6.查看docker 镜像:  sudo docker images       
7. 设置开机自启:sudo systemctl enable docker
8. 由于权限问题 命令前加 sudo  或者直接使用 root 账户 :su root

redis 集群搭建(3主3从)

1.docker search redis   
2.docker pull redis     (默认拉去最新的)
3. 创建虚拟网卡
    创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。
    docker network create myrediscluster

 4. 查看Docker 网卡信息
    docker network ls
	
 5.	查看dockerr网络详细信息
     docker network inspect myrediscluster
	
 6、补充(删除网卡信息、帮助命令)
   docker network rm myrediscluster #删除网卡命令 多个中间 空格隔开
    docker network --help #显示可带参数等	
	
 7.	编写配置文件
    此处用到了一点 shlle 编程中 的一些命令,让我们操作更加便利
	for port in $(seq 6390 6395); 
do 
mkdir -p /mydata/rediscluster/node-${port}/conf
touch /mydata/rediscluster/node-${port}/conf/redis.conf
cat  << EOF > /mydata/rediscluster/node-${port}/conf/redis.conf
port ${port}
requirepass 1234
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-announce-ip 192.168.56.10
cluster-node-timeout 18000
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
done

8. 启动:
   for port in $(seq 6390 6395); \
do \docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \--privileged=true -v /mydata/rediscluster/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \--privileged=true -v /mydata/rediscluster/node-${port}/data:/data \--restart always --name redis-${port} --net myrediscluster \--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done

9. 进入容器:
docker exec -it redis-6392 /bin/bash
10. 创建集群:
redis-cli  -a 1234 --cluster create 192.168.56.10:6390 192.168.56.10:6391 192.168.56.10:6392 192.168.56.10:6393 192.168.56.10:6394 192.168.56.10:6395   --cluster-replicas 1

11. 先停止运行,再删除(重新来)
   for port in $(seq 6390 6395); 
do 
docker stop redis-${port}
done	


for port in $(seq 6390 6395); 
do 
docker rm redis-${port}
done

12. 命令解释:
  port:节点端口;
requirepass:设置密码,访问时需要验证
protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
daemonize:是否以守护线程的方式启动(后台启动),默认 no;
appendonly:是否开启 AOF 持久化模式,默认 no;
cluster-enabled:是否开启集群模式,默认 no;
cluster-config-file:集群节点信息文件;
cluster-node-timeout:集群节点连接超时时间;
cluster-announce-ip:集群节点 IP (对外通讯的地址 或者配置 docker 宿主机地址)
cluster-announce-port:集群节点映射端口;
cluster-announce-bus-port:集群节点总线端口。
启动:
-it:交互
-d:后台运行,容器启动完成后打印容器
–privileged:是否让docker 应用容器 获取宿主机root权限(特殊权限--p :端口映射
-v:文件挂载
–sysctl参数来设置系统参数,通过这些参数来调整系统性能
–restart always:在容器退出时总是重启容器
–name:给容器取名
–net myrediscluster:使用我们创建的虚拟网卡(想详细了解,可以去看看Docker 网络方面知识)	

问题&图片展示

上面搭建成功就可以操作了
success

问题

p1 : Waiting for the cluster to join
Waiting for the  cluster  to join
p2: 拒绝连接拒绝连接p3: MOVED (-c 使用集群模式访问)
在这里插入图片描述p4:
[ERR] Node 172.18.0.2:6392 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

上面问题根源都是IP 地址的问题
ifconfig
mycomputer
ip addr
vm ip info
docker inspect redis-6395 | grep IP (docker image ip info)
image ip
ping
ping

代码连接

1. 依赖
       <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.11.1</version>
        </dependency>

2. 单节点demo
  import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
/**
 * @className RedisSingletonDemo
 * @description:
 * @date 2023/9/1 16:36
 * @created by windBird
 */
public class RedisSingletonDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis(new HostAndPort("192.168.56.10",6379));
        jedis.set("redisSingleton","我通了");
        System.out.println(jedis.get("redisSingleton"));
    }
}

3. 集群:
 import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @className RedisDemo
 * @description:
 * @date 2023/8/14 22:50
 * @created by windBird
 */
public class RedisDemo {
    public static void main(String[] args) {
        JedisCluster cluster =null;
        try {
            Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
            //一般选用slaveof从IP+端口进行增删改查,不用master
            nodes.add(new HostAndPort("192.168.56.10", 6390));
            nodes.add(new HostAndPort("192.168.56.10", 6391));
            nodes.add(new HostAndPort("192.168.56.10", 6392));
            nodes.add(new HostAndPort("192.168.56.10", 6393));
            nodes.add(new HostAndPort("192.168.56.10", 6394));
            nodes.add(new HostAndPort("192.168.56.10", 6395));
            // Jedis连接池配置
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大空闲连接数, 默认8个
            jedisPoolConfig.setMaxIdle(100);
            // 最大连接数, 默认8个
            jedisPoolConfig.setMaxTotal(500);
            //最小空闲连接数, 默认0
            jedisPoolConfig.setMinIdle(0);
            // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
            jedisPoolConfig.setMaxWaitMillis(-1); // 设置2秒
            //对拿到的connection进行validateObject校验
            jedisPoolConfig.setTestOnBorrow(true);
            //未设置auth Password
           // JedisCluster jedis = new JedisCluster(nodes, jedisPoolConfig);
            //设置auth Password
           JedisCluster jedis = new JedisCluster(nodes,20000,3000,10,"1234", new JedisPoolConfig());
            System.out.println(jedis.get("weather"));
            jedis.set("name","sugar");
            jedis.set("address","china");
            System.out.println(jedis.exists("name"));
            System.out.println(jedis.get("name"));
            System.out.println(jedis.get("address"));
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            if(null !=cluster)
                cluster.close();
        }
    }
}

timeout
docker ps -a
docker restart redis (CONTAINER ID 或者 names)
restart

在这里插入图片描述
集群超时
cluster timeout批量重启cluster nodes
for port in ( s e q 63906395 ) ; d o d o c k e r r e s t a r t r e d i s − (seq 6390 6395); do docker restart redis- (seq63906395);dodockerrestartredis{port}
done

cluster restart

cluster go
重新设值:
docker exec -it redis-6392 /bin/bash
redis-cli -c -a 1234 -h 192.168.56.10 -p 6392

vm ok

ok

心动不如行动,来试试呗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络层重点协议-IP协议(结构分析)

IP协议数据报格式 一.4位版本号 用来表示IP协议的版本&#xff0c;现有的IP协议只有两个版本IPv4和IPv6 二.4位首部长度 IP协议数据报报头的长度 三.8位服务类型 3位优先权字段&#xff08;已经弃用&#xff09;&#xff0c;4位TOS字段&#xff0c;和1位保留 字段&#xff08;必…

分享 8 个 VSCode 插件,提升你的编码体验

大多数开发者都在不断寻找让开发工作更轻松的方法&#xff0c;我也是如此。合适的工具可以帮助你实现这一目标。 在本文中&#xff0c;我们将探讨我个人使用的八个扩展&#xff0c;以优化我的编码体验。让我们来看看这些扩展的列表&#xff0c;亲自体验它们如何改善你的编码体验…

月报总结|Moonbeam 8月份大事一览

夏日已经趋近尾声&#xff0c;脚下的这片土地正迎来凉爽的秋天。Moonbeam在最炎热的8月中&#xff0c;依然朝着其愿景不断向前迈进。Moonbeam生态也迎来了许多好消息&#xff0c;先前启动的第二批生态Grant计划也完成了最后的链上投票&#xff0c;3个项目成功通过投票&#xff…

如何设计接口认证对接第三方API?

一、前言 在与第三方系统做接口对接时&#xff0c;往往需要考虑接口的安全性问题&#xff0c;本文主要分享几个常见的系统之间做接口对接时的认证方案。 二、认证方案 例如订单下单后通过 「延时任务」 对接 「物流系统」 这种 「异步」 的场景&#xff0c;都是属于系统与系统…

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…

业务安全及实战案例

业务安全 关于漏洞&#xff1a; 注入业务逻辑信息泄露 A04:2021 – Insecure Design 在线靶场PortSwigger 1. 概述 1.1 业务安全现状 1.1.1 业务逻辑漏洞 ​ 近年来&#xff0c;随着信息化技术的迅速发展和全球一体化进程的不断加快&#xff0c;计算机和网络已经成为与…

第三章 Linux多线程开发 线程取消 属性 同步 互斥锁 死锁 读写锁 生产者消费者 信号量

线程取消&#xff1a; /*#include <pthread.h>int pthread_cancel(pthread_t thread);- 功能&#xff1a;取消线程&#xff08;让线程终止&#xff09;取消某个线程&#xff0c;可以终止某个线程的运行&#xff0c;但是并不是立马终止&#xff0c;而是当子线程执行到一个…

SLAM从入门到精通(ROS的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 ros&#xff0c;全称robot operating system。说它是操作系统&#xff0c;其实有点夸大了。一般认为&#xff0c;它是提供了robot处理的统一框架&a…

华为OD机试 - 英文输入法(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

网络编程day040830

目录 select的TCP服务器 代码 完成select的TCP客户端 代码 结果 思维导图 select的TCP服务器 代码 #include<myhead.h>//do-while只是为了不让花括号单独存在&#xff0c;并不循环 #define ERR_MSG(msg) do{\fprintf(stderr,"%d:",__LINE__);\perror(ms…

Python代码雨

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

JAVA设计模式第七讲:设计模式在 Spring 源码中的应用

设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在的各种问题&#xff0c;所提出的解决方案。本文以面试题作为切入点&#xff0c;介绍了设计模式的常见问题。我们需要掌握各种设计模式的原理、实现、设计意图和应用场景&#xff0c;搞清楚能解决什么问题…

2022年12月 C/C++(八级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:生理周期 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因…

若依前端vue设置子路径

若依前端vue设置子路径 说明&#xff1a;本文档中以前后端分离版为例&#xff0c;版本为:3.8.6 一设置变量 在.env.development和.env.production 中定义一个变量如VUE_APP_PROJECT_IDENTIFIER # 项目标识字符 VUE_APP_PROJECT_IDENTIFIER admin二引用路径变量 ${process…

在PHP8中统计数组元素个数-PHP8知识详解

在php8中&#xff0c;统计数组元素的个数&#xff0c;有下面几个函数&#xff1a;使用count()函数统计数组元素个数、使用sizeof()函数统计数组元素个数。还讲到了&#xff0c;使用array_count_values()函数来统计数组中每个元素出现的次数。 1、使用count()函数统计数组元素个…

医疗知识图谱 neo4j

开源项目&#xff1a; https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装&#xff1a; pip install pyahocorasick pip install py2neo 三.需要修改&#xff1a; 需要改的点&#xff1a; 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…

读懂AUTOSAR,之CAN Driver L-PDU发送和“重入问题”

1. L-PDU发送 L-PDU传输时,Can模块将L-PDU内容ID和数据长度转换为硬件特定格式(如果需要),并触发传输。 [SWS_Can_00059] CAN到内存的数据映射定义为首先发送的CAN数据字节为数组元素0,最后发送的CAN数据字节为数组元素7或63(在CAN FD的情况下)。(SRS_SPAL_12063)[S…

Android图形-Hardware Composer HAL

目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC&#xff1f; 3.2 HWC的支持需求 3.3 HWC的实现思路 3.4 HWC的基元 3.5 HIDL接口 3.6 函数指针 3.7 图层和屏幕句柄 3.8 屏幕合成操作 3.9 多个屏幕 3.10 虚拟屏幕合成 3.10.1 模式 3.10.2 输出格式 3.11 同…

房地产微传单制作秘笈

随着科技的快速发展&#xff0c;传统的宣传方式已经无法满足现代人的需求。而电子传单作为一种新型的宣传方式&#xff0c;已经逐渐受到人们的关注和喜爱。特别是对于房地产行业来说&#xff0c;电子传单更是成为了一种节省成本、快速传播的利器。 为了满足各行业的宣传需求&am…