Docker 集群配置

news2025/7/8 22:16:38
1、配置 MySQL
MySQL 简单安装

docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据

docker run -d -p 2222:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 \
-v /opt/mysql/log:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/conf:/etc/mysql/conf.d \
--name mysql mysql:5.7.6

# 创建配置文件
cd /opt/mysql/conf
vim my.cnf
#----------------------配置文件------------------------
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
#----------------------配置文件------------------------

# 重启容器实例
docker restart mysql
docker exec -it mysql /bin/bash
MySQL 主从复制

主服务的配置

# 创建主服务容器实例
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0

# 创建配置文件
vim /mydata/mysql-master/conf/my.cnf

# 修改配置之后重启实例
docker restart mysql-master

# 进入容器
docker exec -it mysql-master /bin/bash
mysql -uroot -p

# 进入MySQL后,创建同步账户
create user 'slave'@'%' identified by '123456';
grant replication slave,replication client on *.* to 'slave'@'%';

# 创建完从数据库,在主数据库中查看主从同步状态
show master status;

从服务的配置

# 创建从服务容器实例
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0

# # 创建配置文件
vim /mydata/mysql-slave/conf/my.cnf

# 修改配置之后重启实例
docker restart mysql-slave

# 进入容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -p

# 在从服务器配置主从关系
mysql>change master to master_host='192.168.137.106',master_user='slave', \
master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001', \
master_log_pos=617,master_connect_retry=30;

# 查看主从同步状态
show slave status \G;

# 开启主从同步
mysql>start slave;

测试:在主数据库中创建表,然后在从数据库中查看是否同步成功!

2、配置 Redis
Redis 简单安装
# 配置文件(复制一个redis.conf到/opt/redis/conf)
vim redis.conf
#----------------------配置文件------------------------
# 允许redis外地连接,注释bind
# bind 127.0.0.1
# 将daemonize yes注释起来或者daemonize no设置,
# 因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no
#----------------------配置文件------------------------

# 启动容器
docker run -d -p 6379:6379 --name myredis --privileged=true  \
-v /opt/redis/data:/data \
-v /opt/redis/redis.conf:/etc/redis/redis.conf \
 redis:latest redis-server /etc/redis/redis.conf

Redis 集群安装

哈希取余分区

2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

优点:简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固超的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。

缺点:原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化: Hash(key)/3会变成Hash(key)/?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。


一致性哈希算法分区

设计目标:分布式缓存数据变动和映射问题,某个机器单机了,分母数量改变了,自然取余数不OK了。提出一致性Hash解决方案。目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系。

优点

  • 容错性:假设Node C宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。
  • 扩展性:数据量增加了,需要增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余圣部数据重新洗牌。

缺点

  • 数据倾斜问题:·致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器:


哈希槽分区

哈希槽实质就是一个数组,数组[0,2^14-1]形成hash slot空间。

解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

一个集群只能有16384个槽,编+0-16383(0-2*14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的处理起来比较容易,这样数据移动问题就解决了。

3主3从配置

运行6台redis实例

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381

docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382

docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:latest --cluster-enabled yes --appendonly yes --port 6383

docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:latest --cluster-enabled yes --appendonly yes --port 6384

docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:latest --cluster-enabled yes --appendonly yes --port 6385

docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:latest --cluster-enabled yes --appendonly yes --port 6386

构建主从关系

# 进入redis-node-1容器
docker exec -it redis-node-1 /bin/bash

redis-cli --cluster create 192.168.137.106:6381 192.168.137.106:6382 \
192.168.137.106:6383 192.168.137.106:6384 192.168.137.106:6385 \
192.168.137.106:6386 --cluster-replicas 1

# 在6381节点查看集群状态
redis-cli -p 6381
127.0.0.1:6381> cluster info

Redis 主从容错

基于3主3从案例,实现数据读取存储,容错切换迁移。

docker exec -it redis-node-1 /bin/bash
# 直接进入集群中的其中一个节点,插入数据可能会报错,因为超出了key的槽位值
redis-cli -p 6381

docker exec -it redis-node-1 /bin/bash
# -c:以集群方式连接节点
redis-cli -p 6381 -c

# 检查集群
redis-cli --cluster check 192.168.137.106:6381

主从容错,切换转移

# 停止1号主节点
docker stop redis-node-1

# 进入2号主节点,查看集群节点状态
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes

如果需要将node-1重新变为主节点,那就将node-4先停掉,让node-1重新成为主节点,在启动node-4节点。


Redis 主从扩容

# 新建2个redis容器实例
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:latest --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:latest --cluster-enabled yes --appendonly yes --port 6388

# 进入node-7容器实例
docker exec -it redis-node-7 /bin/bash

# 将新增的6387节点(空槽号)作为master节点加入原集群
redis-cli --cluster add-node 192.168.137.106:6387 192.168.137.106:6381
  • 6387就是将要作为master新增节点
  • 6381就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
# 查看集群节点状态
redis-cli --cluster check 192.168.137.106:6381

重新分配槽号

# 在新增节点(node-7)中重新分配hash
redis-cli --cluster reshard 192.168.137.106:6381

# 重新检查集群中的节点
redis-cli --cluster check 192.168.137.106:6381

# 添加新增加的主从节点的从节点,--cluster-master-id 是6387节点的编号
redis-cli --cluster add-node 192.168.137.106:6388 192.168.137.106:6387 \
--cluster-slave --cluster-master-id c8bf7f45257baaae181d6d708e06e5a3eff5d9a8 

# 查看集群节点状态
redis-cli --cluster check 192.168.137.106:6381

Redis 主从缩容

先清除从节点6388 -> 清出来的槽号重新分配,再删除6387,恢复成3主3从

# 删除集群4的从节点6388:redis-cli --cluster del-node ip:从机端口 从节点ID
redis-cli --cluster del-node 192.168.137.106:6388 e583cdf44289582a7e6ad2e190b7c8b5beb1c300

# 检查集群节点信息
redis-cli --cluster check 192.168.137.106:6381

# 重新分配hash槽。注意:端口写谁都可以,这里以6381作为落脚点
redis-cli --cluster reshard 192.168.137.106:6381

# 检查集群节点情况
redis-cli --cluster check 192.168.137.106:6381

# 删除6387节点
redis-cli --cluster del-node 192.168.137.106:6387 c8bf7f45257baaae181d6d708e06e5a3eff5d9a8

# 检查集群节点情况
redis-cli --cluster check 192.168.137.106:6381

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

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

相关文章

通过18次止损,我终于领悟到交易的真谛

截断亏损让利润奔跑,这是操作的基础,也是操作的大体思路。了解并接受这个市场认识,基本上就把握住了市场的门道。至于市场走势,是无法准确预测的。 在交易的第一年,我处于一种懵懂的状态,对市场知之甚少。第…

2024美赛数学建模A题思路分析 - 资源可用性和性别比例

# 1 赛题 问题A:资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外,但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1:1,但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。…

【以太网】VSC8512XJG-03、VSC8512XJG-02、VSC8514XMK-14、VSC8514XMK-11千兆以太网(GE)PHY

一、VSC8512 12 Port GbE Cu PHY with 4 Dual Media ports[12端口GBE Cu PHY,带4个双介质端口] 概述 VSC8512采用单一封装的12端口千兆以太网(GE)铜线PHY解决方案。VSC8512采用了Microchip最新的65纳米Simpliphy™技术,是业界最具…

猫什么时候发腮?猫咪发腮指南!这些生骨肉冻干发腮效果好

猫什么时候发腮是许多猫主人非常关心的问题。在猫咪的成长过程中,发腮是一项重要的体征,也是猫咪成熟的标志。主人需要在适龄的年龄段加强营养补给,可以让让猫咪拥有可爱的肉嘟嘟脸型,不要错失最佳发腮期。那么,什么时…

第八篇:node模版引擎Handlebars及他的高级用法(动态参数)

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 目录 📘 引言: &#x1f…

OpenCV学习记录——边缘检测

文章目录 前言一、边缘检测原理二、Canny边缘检测算法三、具体应用代码 前言 在做某些图像处理时,通常需要将识别到的物体边界提取出来,从而帮助我们实现目标检测,这就需要用到边缘检测,例如人脸识别和运动目标的检测都需要先进行…

Flutter 应用服务:主题、暗黑、国际化、本地化 - app_service库

Flutter应用服务 主题、暗黑、国际化、本地化 app_service库 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/det…

Nginx 多项目部署,vue刷新404 解决方案

网上找的资料大多都解决不了,废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了,给我顶起来,让更多人 快速的解决。

Arduino 推出基于乐鑫 ESP32-S3 的 STEM 教育机器人

Arduino Alvik 是 Arduino Education 推出的一款新型机器人,可作为一种跨学科工具,为当前教育和未来机器人世界筑起连接的桥梁。Hackster 的 Gareth Halfacree 表示:“Alvik 的设计灵感来自 Arduino 简化复杂技术的理念,同时它也 …

上海市事业编报名照不能成功上传的原因

2024年上海市事业编报名照需要根据以下要求生成: 1、近期6个月,免冠证件照。 2、照片背景白底或者蓝底或者红底背景。 3、照片文件jpg格式,大小在100KB以下 4、照片像素大小,宽度75至150像素内,高度为105至210像素内 5…

gRPC - Google远程过程调用(Google Remote Procedure Call,gRPC)

什么是gRPC? Google远程过程调用(Google Remote Procedure Call,gRPC)是基于HTTP 2.0传输层协议承载的高性能开源RPC软件框架,为管理和配置网络设备提供了一种API接口设计的方法。gRPC提供了多种编程语言,如…

Linux之系统安全与应用续章

目录 一. PAM认证 1.2 初识PAM 1.2.1 PAM及其作用 1.2.2 PAM认证原理 1.2.3 PAM认证的构成 1.2.4 PAM 认证类型 1.2.5 PAM 控制类型 二. limit 三. GRUB加密 /etc/grub.d目录 四. 暴力破解密码 五. 网络扫描--NMAP 六. 总结 一. PAM认证 1.2 初识PAM PAM是Linux系…

软件工程知识梳理4-详细设计

详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统,也就是说.经过这个阶段的设计工作.应该得出对目标系统的精确描述.从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。 详细设计的的目标不仅仅是逻辑上正确地实现每个模块地功能&a…

查询、导入导出、统计性能优化的一些总结

目录 1、背景 2、优化实现 2.1查询数据表速度慢 2.2调别人接口速度慢 2.3导入速度慢、 2.4导出速度慢的做出介绍 2.5统计功能速度慢 3、总结 1、背景 系统上线后,被用户反应系统很多功能响应时长很慢。用户页面影响速度有要求,下面针对查询数据表…

红队打靶练习:INFOSEC PREP: OSCP

目录 信息收集 1、arp 2、nmap WEB 信息收集 wpscan dirsearch ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110.128 Starting arp-scan 1.10.0 with 256 ho…

“与客户,共昂首”——Anzo Capital昂首资本尽释行业进取之姿

“以匠心,铸不凡” 活动的现场,Anzo Capital 作为演讲嘉宾分享“以匠心,铸不凡”的产品理念。Anzo Capital积淀九载,匠心打造出“STP”和“ECN”两大核心账户,以光之速度将交易中的订单直达市场和流动性提供商&#…

江科大stm32学习笔记10——对射式红外传感器

一、接线 上电之后可以看到对射式红外传感器亮两个灯,如果此时用挡光片挡住两个黑色方块中间的部分,则只亮一个灯。 二、代码 将4-1的工程文件夹复制粘贴一份,重命名为“5-1 对射式红外传感器计次”,打开keil,右键添…

基于muduo网络库开发服务器程序和CMake构建项目 笔记

跟着施磊老师做C项目,施磊老师_腾讯课堂 (qq.com) 一、基于muduo网络库开发服务器程序 组合TcpServer对象创建EventLoop事件循环对象的指针明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数在当前服务器类的构造函数当中,注册处理连接的回调函数和处理…

tcp/ip模型中,帧是第几层的数据单元?

在网络通信的世界中,TCP/IP模型以其高效和可靠性而著称。这个模型是现代互联网通信的基石,它定义了数据在网络中如何被传输和接收。其中,一个核心的概念是数据单元的层级,特别是“帧”在这个模型中的位置。今天,我们就…

C++ STL库详解:容器适配器stack和queue的结构及功能

一、stack 1.1stack的介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器&#xf…