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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day36 无重叠区间 划分字母区间 合并区间

题目1:435 无重叠区间 题目链接:435 无重叠区间 题意 intervals[i][starti,endi] 移除区间,使得区间互不重叠,返回移除区间的最小数量 相邻区间挨在一起,尽量移除重叠区间 代码 class Solution { publ…

【C语言】异常处理 | assert函数 | errno错误码

文章目录 C语言传统的处理错误的方式1. 终止程序(例如使用 assert)2. 返回/设置错误码手动实现C语言库函数内置的错误码Linux系统调用内置的错误码 C语言传统的处理错误的方式 C语言传统的处理错误的方式主要包括assert终止程序和返回或设置错误码两种方…

面试经典150题 -- 区间(总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台最经典 150 题,掌握面试所有知识点https://leetcode.cn/studyplan/top-interview-150/ 228 汇总区间 直接用双指针模拟即可 ; class Solution { public…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 (1)逆序创建链表La就是使用头插法创建一个链表,所谓头插法就是在创建链表时始终将新元素插入到头结点之后,而正序创建链表Lb就是使用尾插法创建一个链表,所谓尾插法…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起…

Latex学习记录

目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑,编号、对齐 3.Latex公式编号: 多行公式多编号,多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…

【LeetCode: 462. 最小操作次数使数组元素相等 II + 贪心】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

根据路由动态注册组件失败

动态注册组件 方式1 import 这种跟webpack的版本有关系 import低版本不支持传入动态参数 <template><components :is"componentName" v-show"isShow" :key"componentName"></components> </template>const _import fi…

网络基础【Linux网络编程】

目录 一、网络发展 二、协议和协议分层 OSI七层网络模型 TCP/IP协议栈 三、网络和OS的关系 四、网络传输基本流程 五、数据包封装和分用 六、IP地址和MAC地址 MAC地址 局域网通信原理 IP地址 一、网络发展 详细参考此篇博文&#xff1a;网络发展史 独立模式 计算机…

第三百零三回

文章目录 1. 概念介绍2. 实现方法2.1 文字信息2.2 红色边框 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现密码输入框"相关的内容&#xff0c;本章回中将介绍如何在在输入框中提示错误.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

Qt加载网页崩溃 ASSERT:“m_adapterClient“ in file ...

1、软件启动后加载网页无异常&#xff0c;点击按钮&#xff0c;加载新网页时崩溃 崩溃代码&#xff1a; QWebEngineView *createWindow(QWebEnginePage::WebWindowType type) { Q_UNUSED(type); return this; } 2、原因 Qt只是调用谷歌的浏览器引擎&#xff…

构建用于预警大型语言模型辅助生物威胁创建的系统

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 Op…

vivado jesd204核综合错误

用204核的时候老是报如下错误。 [Opt 31-67] Problem: A LUT2 cell in the design is missing a connection on input pin I0, which is used by the LUT equation. This pin has either been left unconnected in the design or the connection was removed due to the trimm…

ubuntu 上安装和配置Apache2+Subversion

目录 一、安装Apache2和SVN 二、Apache2设置 三、subversion配置 四、创建仓库和设置权限 五、仓库备份和恢复 系统环境 Ubuntu Linux (20.04) apache2 Subversion(1.13.0) 一、安装Apache2和SVN 通过命令在线安装apache2和subversion apt-get install apache2 libap…

Maven高级知识——分模块开发、继承与聚合

目录 一、分模块设计与开发 1.1 不分模块的问题 1.2 分模块设计 二、 继承与聚合 2.1 继承 2.1.1 继承关系 2.1.2 版本锁定 2.1.2.1 场景 2.1.2.2 介绍 2.1.2.3 实现 2.1.2.4 属性配置 2.2 聚合 2.2.1 介绍 2.2.2 实现 2.3 继承与聚合对比 三、Maven打包方式&#xff08;jar、w…

数据结构—动态查找

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…

element-ui link 组件源码分享

link 组件的 api 涉及的内容不是很多&#xff0c;源码部分的内容也相对较简单&#xff0c;下面从以下这三个方面来讲解&#xff1a; 一、组件结构 1.1 组件结构如下图&#xff1a; 二、组件属性 2.1 组件主要有 type、underline、disabled、href、icon 这些属性&#xff0c;…

OpenCV+ moviepy + tkinter 视频车道线智能识别项目源码

项目完整源代码&#xff0c;使用 OpenCV 的Hough 直线检测算法&#xff0c;提取出道路车道线并绘制出来。通过tkinter 提供GUI界面展示效果。 1、导入相关模块 import matplotlib.pyplot as plt import numpy as np import cv2 import os import matplotlib.image as mpimg …

虚幻UE 特效-Niagara特效实战-魔法阵

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他四篇实战&#xff1a;UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…