Docker 集群配置

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 6381docker 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 6382docker 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 6383docker 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 6384docker 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 6385docker 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/bashredis-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.mzph.cn/news/662358.shtml

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

相关文章

Spring:JDBCTemplate 的源码分析

一:JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二:执行SQL语句的方法 1:在JdbcTempla…

前端性能优化:Vue项目打包后app.xxx.js 和 chunk-vendors.xxx.js 文件太大,导致页面加载时间太长

问题场景,如下图,环境上的 app.js 和chunk-vendors.js 两个文件大小,高达3.4M 和 2M ,加载所耗费的时间也很长。 下面说一下如何解决: 1、首先需要安装插件 compression-webpack-plugin,我这里用的是6.1.1…

情人节送什么礼给男朋友合适?适合送男友的礼物合集

情人节即将来临,作为贴心的女友,你是否已经开始为男友精心挑选礼物了呢?为了让这个特殊的日子充满温馨与甜蜜,选择一份既实用又充满心意的礼物是至关重要的,下面为大家推荐一些适合在情人节送给男友的好物,…

探索自然语言处理在改善搜索引擎、语音助手和机器翻译中的应用

文章目录 每日一句正能量前言文本分析语音识别机器翻译语义分析自然语言生成情感分析后记 每日一句正能量 努力学习,勤奋工作,让青春更加光彩。 前言 自然语言处理(NLP)是人工智能领域中与人类语言相关的重要研究方向&#xff0c…

腾讯主导制定全球首个车载小程序国际标准,助力车载应用生态发展

2024年1月,国际电信联盟标准部门(ITU-T)正式发布了由腾讯主导制定的《F.749.8 In-vehicle multimedia applets: Framework and functional requirements》(车载多媒体小程序框架和技术需求)国际标准。 这是全球首个由中国企业主导制定的车载小…

LNMP环境搭建动态网站

一、环境准备 服务器:openEuler 22.03 Linux IPV4 :192.168.110.144/24 网页服务器:Nginx1.21.0 数据库:MySQL 8.0.36 PHP:8.0.30 1.安装软件 [rootnode3 ~]# yum install php-mysqlnd php php-gd php-fpm php-xml -y…

在ESXi中部署时出现the host does not support intel vt-x

在VCenter中新建了一台ESXi用于部署VCSA进行实验 在部署VCSA的第二阶段,出现the host does not support intel vt-x,部署失败。 解决办法:点进ESXi虚拟机的设置界面(要先关机),将硬件虚拟化打开&#xff0c…

【Vue3+Vite】路由机制router 快速学习 第四期

文章目录 路由简介路由是什么路由的作用 一、路由入门案例1. 创建项目 导入路由依赖2. 准备页面和组件3. 准备路由配置4. main.js引入router配置 二、路由重定向三、编程式路由(useRouter)四、路由传参(useRoute)五、路由守卫总结 路由简介 路由是什么 路由就是根据不同的 URL…

正点原子--STM32中断系统学习笔记(2)

引言 上篇帖子STM32中断系统学习笔记(1)是理论,这篇帖子开始实战,目标是通过按键实现LED的控制。 1.工程建立 以正点原子HAL库 实验1 跑马灯实验为基础,复制工程,在“Drivers--BSP”目录下建立EXTI文件夹,并创建ext…

Windows - 防火墙 - 如何开启单个端口以供Web应用访问(以82端口为例) - 开启端口后还是访问失败了?

Windows - 防火墙 - 如何开启单个端口以供Web应用访问(以82端口为例) - 开启端口后还是访问失败了? 前言 在网上搜“防火墙开启某个端口”供其他机器访问,都是只讲到了“如何允许某个端口被访问”,而没有后续了。 我之前就遇到过这个问题&…

数据据库八之 视图、触发器、事务

【零】准备数据 【1】创建表 (1)部门表 d_id是部门的编号d_name是部门的名字 # 确保表不存在 drop table if exists department; # 创建表 create table department( d_id int auto_increment primary key, d_name varchar(6) )auto_increment 501 …

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识; c. 学会自我思考,提升认知,不要只会模仿; 课程内容 1. Fine-Tuning 有什么作用? a. 什么是模型训练&#xff…

Linux(一)

目录结构 【在 Linux 世界里,一切皆文件】 linux 的文件系统是采用级层式的树状目录结构; 序号名称介绍备注1/:根目录一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始; 当…

Open CASCADE学习|曲面上一点的曲率及切平面

曲率(Curvature)是一个几何学的概念,用于描述一个物体的形状在某一点上的弯曲程度。在我们日常生活中,曲率与我们的生活息息相关,如道路的弯道、建筑物的拱形结构、自然界的山脉等等。了解曲率的概念和计算方法&#x…

Unity中开发程序打包发布

添加ESC脚本 使用Unity打包发布的过程中,考虑到打开的程序会处于全屏界面,而此时我们又会有退出全屏的需求,因此需要添加ESC脚本,当我们单击ESC脚本的过程中,退出全屏模式。 在Assets/Scenes下,创建esc.cs…

Python之PySpark简单应用

文章目录 一、介绍1.准备工作2. 创建SparkSession对象:3. 读取数据:4. 数据处理与分析:5. 停止SparkSession: 二、示例1.读取解析csv数据2.解析计算序列数据map\flatmap 三、问题总结1.代码问题2.配置问题 一、介绍 PySpark是Apa…

Linux离线安装Telnet

前言:由于服务器部署在内网环境,不能yum安装 1.先从网站下载好我们所需要到的三个rpm包http://www.rpmfind.net/linux/rpm2html/search.php?queryxinetd&submitSearch...&system&arch image.png 三个依赖包分别是: -rw-r--r-- 1…

Invicti Professional v24.1.0.43434

新的安全检查 添加了对 dotCMS 的检查添加了对 Ultimate Member WordPress 插件的检查添加了新的 mXSS 模式添加了新签名来检测 JWK 改进 改进了针对 Weak Ciphers Enabled 漏洞的建议改进了对 swagger.json 漏洞的检测添加了对 AWS WAFv2 规则的支持改进了更多错误和警告消…

探索Gin框架:Golang使用Gin完成文件上传

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在之前的文章中,我们讲解了Gin框架的快速入门使用,今天我们来聊聊如何使用…

element-ui button 仿写 demo

基于上篇 button 源码分享写了一个简单 demo&#xff0c;在写 demo 的过程中&#xff0c;又发现了一个小细节&#xff0c;分享一下&#xff1a; 1、组件部分&#xff1a; <template><buttonclass"yss-button"click"handleClick":class"[ty…