Docker 搭建Redis 集群之路

前言

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

需求(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-engine2. 安装需要的依赖包:sudo yum install -y yum-utils3. 配置阿里镜像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.io5. docker -v6.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 myrediscluster4. 查看Docker 网卡信息docker network ls5.	查看dockerr网络详细信息docker network inspect myrediscluster6、补充(删除网卡信息、帮助命令)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
done8. 启动: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
done9. 进入容器:
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 111. 先停止运行,再删除(重新来)for port in $(seq 6390 6395); 
do 
docker stop redis-${port}
done	for port in $(seq 6390 6395); 
do 
docker rm redis-${port}
done12. 命令解释: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. 单节点demoimport 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+端口进行增删改查,不用masternodes.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);//最小空闲连接数, 默认0jedisPoolConfig.setMinIdle(0);// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1jedisPoolConfig.setMaxWaitMillis(-1); // 设置2秒//对拿到的connection进行validateObject校验jedisPoolConfig.setTestOnBorrow(true);//未设置auth Password// JedisCluster jedis = new JedisCluster(nodes, jedisPoolConfig);//设置auth PasswordJedisCluster 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.mzph.cn/news/70895.shtml

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

相关文章

python 笔记(1)——基础和常用部分

目录 1、print 输出不换行 2、格式化输出字符串 3、浮点数的处理 4、进制转换和ASCII与字符间的转换 5、随机数 6、字符串截取和内置方法 6-1&#xff09;字符串截取 6-2&#xff09;字符串内置方法 7、元组、列表&#xff0c;及其遍历方式 7-1&#xff09;列表常用内…

为什么5G 要分离 CU 和DU?(4G分离RRU 和BBU)

在 Blog 一文中&#xff0c;5G--BBU RRU 如何演化到 CU DU&#xff1f;_5g rru_qq_38480311的博客-CSDN博客 解释了4G的RRU BBU 以及 5G CU DU AAU&#xff0c;主要是讲了它们分别是什么。但是没有讲清楚 为什么&#xff0c;此篇主要回答why。 4G 为什么分离基站为 RRU 和 BBU…

Windows下搜索文件内容的关键字用什么命令

Windows下搜索文件内容的关键字用什么命令 findstr /s /n /i "keyword" file_path其中&#xff0c;/s 表示递归检索子文件夹&#xff0c;/n 表示显示搜索结果所在行号&#xff0c;/i 表示忽略大小写&#xff0c;“keyword” 是要搜索的关键字&#xff0c;file_path 是…

【LeetCode-中等题】17. 电话号码的字母组合

文章目录 题目方法一&#xff1a;递归回溯 题目 方法一&#xff1a;递归回溯 参考讲解&#xff1a;还得用回溯算法&#xff01;| LeetCode&#xff1a;17.电话号码的字母组合 首先可以画出树图&#xff1a; 先将数字对应的字符集合 加入到一个map集合 这里需要一个index来控…

PPT怎么转换为PDF格式,收藏这两个在线工具。

PPT是一种常用的演示文稿格式&#xff0c;它可以包含丰富的动画效果和超链接&#xff0c;让你的内容更加生动和有趣。但是&#xff0c;如果你想将PPT分享给别人&#xff0c;或者在不同的设备上查看&#xff0c;你可能会遇到一些问题&#xff0c;比如&#xff1a; PPT文件太大&a…

使用Python实现二维应力云图

要画应力分布云图&#xff0c;可以使用Python中的科学计算和可视化库来实现 import numpy as np import matplotlib.pyplot as plt# 生成示例数据 x np.linspace(0, 10, 100) # X轴数据范围 y np.linspace(0, 5, 50) # Y轴数据范围 X, Y np.meshgrid(x, y) # 生成网…

Linux命令行

目录 CLI GUI 命令行界面 图形界面 命令行提示符 # $ ​编辑 命令一般由三个部分组成 历史命令&#xff0c;使用上下键&#xff0c;或者使用history&#xff0c;ctrlr搜索历史命令 通配符 *,? 切换用户 su 作业管理 &&#xff0c;jobs,bg,fg CLI GUI 命令行界面 …

内网穿透的应用-不再依赖iCloud!利用群晖生态,自己掌控本地SSD的云存储!

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是想使用群晖生态软件&#xff0c;就必须要在服务端安装群晖系统&#xff0c;具体如何安装群晖虚拟机请参考&#xff1a; 1. 安装并配置synology drive1.1 安装群辉drive套件1.2 在局域…

STM32 CAN快速配置(HAL库版本)

STM32 CAN快速配置&#xff08;HAL库版本&#xff09; 目录 STM32 CAN快速配置&#xff08;HAL库版本&#xff09;前言1 软件编程1.1 初始化1.1.1 引脚设置1.1.2 CAN参数设置1.1.3 CAN滤波器设置 1.2 CAN发送1.3 CAN接收 2 运行测试结束语 前言 控制器局域网总线&#xff08;CA…

fastjson漏洞批量检测工具

JsonExp 简介 版本&#xff1a;1.3.5 1. 根据现有payload&#xff0c;检测目标是否存在fastjson或jackson漏洞&#xff08;工具仅用于检测漏洞&#xff09;2. 若存在漏洞&#xff0c;可根据对应payload进行后渗透利用3. 若出现新的漏洞时&#xff0c;可将最新的payload新增至…

深入学习与探索:高级数据结构与复杂算法

文章目录 学习高级数据结构B树&#xff1a;数据库引擎的骨干线段树&#xff1a;高效的区间查询Trie树&#xff1a;高效的字符串检索 探索复杂算法领域图算法&#xff1a;解决复杂网络问题字符串匹配算法&#xff1a;处理文本搜索近似算法&#xff1a;在NP难题上取得近似解 结论…

kubesphere devops使用

一、创建项目 1 创建项目 企业管理员切换到相应企业空间(租户),创建项目&#xff0c;k8s集群会创建一个相同名字的namespace。如下图所示管理员创建一个ipaas-devops项目。 2.创建镜像拉取密钥信息 进入项目如ipaas-devops&#xff0c;选择配置->保密字典->创建&#xf…

“交叉轮”轮融资后,哪吒汽车能否脚踏“风火轮”续写逆袭故事?

2023年的新能源汽车江湖&#xff0c;烟波浩渺的水面下暗潮汹涌。 从特斯拉年初打响降价第一枪&#xff0c;降价潮至今未见尾声。9月刚至&#xff0c;小鹏汽车、零跑汽车又推出了调价政策。 这一背景下&#xff0c;车企内卷加剧是必然。年初&#xff0c;哪吒汽车联合创始人、C…

EOCR-AR电机保护器自动复位的启用条件说明

为适用不同的现场使用需求&#xff0c;施耐德韩国公司推出了带有自动复位功能的模拟型电动机保护器-EOCR-AR。EOCR-AR电机保护器具有过电流、缺相、堵转保护功能&#xff0c;还可根据实际需要设置自动复位时间。 EOCR-AR自动复位的设置方法 如上图&#xff0c;R-TIME旋钮是自动…

巨人互动|Google海外户Google分析的基础概念

Google Analytics&#xff08;谷歌分析&#xff09;是最受欢迎的网站分析工具之一。它为网站管理员提供了深入了解其网站访问者的机会&#xff0c;并通过数据分析提供有关网站流量、用户行为和转化率的洞察。 1、跟踪代码&#xff08;Tracking Code&#xff09; 跟踪代码是嵌入…

element-ui 修改tooltip样式

1.表格tooltip 统一修改 <el-table:data"tableDatas"tooltip-effect"light" .el-tooltip__popper.is-light {background: #FFF;box-shadow: 0px 0px 8px 1px rgba(0,0,0,0.16);border-radius: 4px;opacity: 1;border: none;&[x-placement^top] .p…

Android相机调用-CameraX【外接摄像头】【USB摄像头】

Android相机调用有原生的Camera和Camera2&#xff0c;我觉得调用代码都太复杂了&#xff0c;CameraX调用代码简洁很多。 说明文档&#xff1a;https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新&#xff0c;对于外接摄像…

基于FPGA的图像sobel边缘提取算法开发,包括tb测试文件以及matlab验证代码

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 202…

智汇云舟出席全球制造业峰会并作主题分享

9月1日-5日&#xff0c;由中华人民共和国商务部、中华人民共和国国家发展和改革委员会、中华人民共和国科学技术部、中国国际贸易促进委员会、辽宁省人民政府共同主办的全球制造业峰会暨第二十一届中国&#xff08;沈阳&#xff09;国际装备制造业博览会在沈阳国际会展中心召开…

Java复习-25-单例设计模式

单例设计模式 目的&#xff08;使用场景&#xff09; 在实际开发下&#xff0c;会存在一种情况&#xff1a;某一种类在程序的整个生命周期中&#xff0c;只需要实例化一次就足够了。例如&#xff0c;系统数据类&#xff0c;由于操作系统只有一个&#xff0c;因此在程序初始化…