Docker高级篇_mysql主从复制、redis集群

news2024/11/13 7:54:11

目录

  • Docker复杂安装详说
    • 安装mysql主从复制
    • 安装redis集群
      • 3主3从Redis集群(基于哈希槽分区)
      • 主从容错切换迁移
      • 主从扩容
      • 主从缩容

Docker复杂安装详说

安装mysql主从复制

1.新建主服务容器3307

docker run -d -p 3307:3306 --privileged=true -v /zhoujmi/mysql/log:/var/log/mysql -v /zhoujmi/mysql/data:/var/lib/mysql -v /zhoujmi/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql-master mysql:5.7

在这里插入图片描述
2.进入/zhoujmi/mysql/conf目录下新建my.cnf

cd /zhoujmi/mysql/conf
vim my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

3.重启容器实例

docker restart mysql-master

在这里插入图片描述

4.进入mysql-master容器
在这里插入图片描述
5.master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

在这里插入图片描述
6.新建从服务器3308

docker run -d -p 3308:3306 --privileged=true -v /zhoujmi/mysql-slave/log:/var/log/mysql -v /zhoujmi/mysql-slave/data:/var/lib/mysql -v /zhoujmi/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql-slave mysql:5.7

在这里插入图片描述
7.·进入/zhoujmi/mysql-slave/conf目录下新建my.cnf

cd /zhoujmi/mysql-slave/conf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

8.重启容器slaver实例

docker restart 8f0d689d58c3

在这里插入图片描述
9.在主数据库中查看主从同步状态

show master status

在这里插入图片描述
10.在从数据库中配置主从复制
命令:

change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
  • ·主从复制命令参数说明
    master_host:主数据库的IP地址;
    master_port:主数据库的运行端口;
    master_user:在主数据库创建的用于同步数据的用户账号;
    master_password:在主数据库创建的用于同步数据的用户密码;
    master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
    master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
    master_connect_retry:连接失败重试的时间间隔,单位为秒。

使用ifconfig命令查看master_host
在这里插入图片描述

在mysql-slave中输入:

change master to master_host='192.168.56.21', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000002', master_log_pos=154, master_connect_retry=30;

在这里插入图片描述
11.在从数据库中配置主从同步状态

show slave status \G;

在这里插入图片描述
13.在从数据库中开启主从同步

start slave;

在这里插入图片描述
14.查看主从同步状态
在这里插入图片描述
15.主从复制测试
在这里插入图片描述
在这里插入图片描述

安装redis集群

1~2亿条数据需要缓存,如何设计这个存储案例
采用分布式存储
算法:哈希取余分区,一致性哈希算法分区,哈希槽分区
1.哈希取余分区:
在这里插入图片描述
优点:只需要预估好数据规划好节点,可以保证每条数据都按照要求落到同一台服务器上
缺点:无法进行扩缩容,若某一台机器宕机还会无法取得数据
2.一致性哈希算法分区
一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0,2^32-1]这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 =2 ^32),这样让它逻辑上形成了一个环形空间。
在这里插入图片描述
服务器IP节点映射
将集群中各个IP节点映射到环上的某一个位置。
将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。假如4个节点NodeA、B、C、D,经过IP地址的哈希函数计算(hash(ip)),使用IP地址哈希后在环空间的位置如下:
在这里插入图片描述
key落到服务器的落键规则
当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数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算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,
例如系统中只有两台服务器:
在这里插入图片描述
3.哈希槽分区
哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。
解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。
在这里插入图片描述
一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
哈希槽计算
Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上
在这里插入图片描述

3主3从Redis集群(基于哈希槽分区)

架构图
由于主从是随机选择的,所以主从端口可能实际与架构不同
在这里插入图片描述

1.关闭防火墙,启动docker后台服务

docker run -d --name redis-node-1 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

在这里插入图片描述
2.进入容器,构建主从关系

docker exec -it redis-node-1 bash

注意换成自己主机的ip地址,用ifconfig查看,–cluster-replicas 1 表示为每个master创建一个slave节点

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

在这里插入图片描述
输入yes
在这里插入图片描述
3.连接进入6381作为切入点,查看节点状态

redis-cli -p 6381
cluster info
cluster nodes

在这里插入图片描述
在这里插入图片描述

主从容错切换迁移

数据读写存储
由于现在是集群状态,所以使用原来的redis-cli -p 6381会进入单机版,在存储某些数据的时候他的哈希槽在别的redis节点,就会存不上,所以进入的时候要加参数-c

redis-cli -p 6381 -c
set k1 v1

在这里插入图片描述
会发现存到了6383并且跳转到了6383
查看集群信息

redis-cli  --cluster check 192.168.56.21:6381

在这里插入图片描述
容错切换迁移
给6381存个k2 v2,然后停掉

set k2 v2
exit
exit
docker stop redis-node-1

在这里插入图片描述
进入6382,查看集群节点状态,可以发现6384从slave变成master了
在这里插入图片描述
重启6381容器,发现6381变成slave了
在这里插入图片描述

主从扩容

3主3从变成4主4从,那么必然涉及槽位的变更
1.新建6387、6388两个节点,启动并检查

docker run -d --name redis-node-7 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /zhoujmi/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker ps

在这里插入图片描述
2.进入6387内部,将6387作为master节点加入原集群

docker exec -it redis-node-7 bash
redis-cli --cluster add-node 192.168.56.21:6387 192.168.56.21:6381

在这里插入图片描述
3.现在并没有分配槽位,开始重新分配槽位

redis-cli --cluster reshard 192.168.56.21:6381

在这里插入图片描述
4096是16387除以4算出来的
id要填新加入节点的id
之后填all
暂停下来的话输入yes
在这里插入图片描述
4.再次检查集群信息

redis-cli --cluster check 192.168.56.21:6387

在这里插入图片描述
会发现每个节点的左边都给6387匀了一些

5.为6387节点添加从节点

redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli --cluster add-node 192.168.56.21:6388 192.168.56.21:6387 --cluster-slave --cluster-master-id f9126a0833aa77669440238e26b0119925f745da

6.第三次检查

redis-cli --cluster check 192.168.56.21:6387

在这里插入图片描述

主从缩容

缩容时要先停从节点,再停主节点
1.6388是从节点,先获取6388的id

redis-cli --cluster check 192.168.56.21:6387

在这里插入图片描述
2.将6388从集群中删除

redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.56.21:6388 fb2eb03be11074321ae18ce1ae9b785bfb3ea9fd

在这里插入图片描述
3.将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

redis-cli --cluster reshard 192.168.56.21:6381

在这里插入图片描述
4.检查集群状态,可以看到槽位都分给了6381

redis-cli --cluster check 192.168.56.21:6387

在这里插入图片描述
5.删除6387节点

redis-cli --cluster del-node 192.168.56.21:6387 f9126a0833aa77669440238e26b0119925f745da

在这里插入图片描述

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

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

相关文章

Spring Framwork_01

Core Container(核心容器):管理对象的技术 1.Beans 2.Core 3.Context 4.SpEL Core:核心工具包,包括字节码操作cglib、asm,资源的抽象Resource,对象实例化化工具等等。 Beans:Bean 的定义、Bean 的创建以及对 Bean 的解…

【自学Java】Java循环结构

Java循环结构 Java while教程 在 Java 语言 中,关键字 whie 用于判断一个判断条件,如果返回值都是 true,那么它会一直执行。与 if 不同之处在于,if 只会执行一次,而 while 中,只要条件满足,会…

【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动

前言 最近为了深入研究 嵌入式Linux 的开发,把【迅为iMX6Q】开发板 找了出来,重新搭建了开发编译环境 【迅为iMX6Q】开发板 的 u-boot,放在了 android 源码中,可以从 【迅为iMX6Q】开发板 网盘资料里,下载 iTOP-iMX6_…

Windows下redis环境搭建(可查看源码及Debug调试进入源码)及简易使用

Windows下redis环境搭建(可查看源码及Debug调试进入源码)及简易使用 在我们使用redis进行学习的过程中,在Windows平台上进行学习是一个非常高效的选择,因此下面介绍如何在Windows环境下搭建一个redis环境(即可Debug调试…

数据结构之入门二叉树

文章目录前言1.二叉树的知识铺垫2.二叉树的具体实现1.递归实现前中后序遍历2.其它相关接口的实现1.求二叉树的节点个数2.求叶子节点个数3.二叉树查找值为x的节点3.求树高度4.求k层节点的个数5.层序遍历6.判断二叉树是否是完全二插树3.总结前言 之前用数组实现了一种特殊的完全…

解决word写论文改成两栏时mathtype的公式无法居中的问题

想要的格式 投论文的时候,有很多期刊的要求是两栏排版,比如中国电机工程学报 理论上,用mathtype输入的公式,会根据word的格式自动地调整自己的缩进量(更确切地说,是会自动调整制表位)。比如下…

新手入门指南之玩转蓝桥云课(线上运行虚拟机,c++,Java,Javaweb,python环境,以及如何成功利用命令行运行这些环境)

目录 你好,蓝桥云课 👋 🌲欢迎来到蓝桥云课🌲 为什么要用 Linux 实验精神 蓝桥云课课程 加入课程 开始实验 实验环境 讨论发帖 实验报告 有效学习时间 我们的目标是星辰大海 🍐Linux 桌面环境使用指南&…

【C++ Primer】阅读笔记(4):string

目录 简介初始化string对象初始化方法直接初始化与拷贝初始化string对象上的操作操作方式读取string对象(cin>>s、cout<<s)getline(is,s)empty()size()string对象的比较(>、<、<=、>=)两个string对象相加(s1+s2)字面值与string对象相加遍历string对象参…

Jenkins复制和导出导入job

一、同一个Jenkins中复制job如果是同一个Jenkins复制job&#xff0c;只需要在创建Job时&#xff0c;选择Copy from一个已有的job即可。也就是在下方上面的红框中输入你新建job的名称&#xff0c;在下面的红框中输入你想要复制的job(已经建好的job)&#xff0c;然后点击确定。这…

【C初阶】实用调试技巧

实用调试技巧前言一、什么是bug&#xff1f;二、调试是什么&#xff1f;&#xff08;一&#xff09;调试&#xff08;二&#xff09;调试的基本步骤&#xff08;三&#xff09;Debug和Release的介绍。1.简单介绍三、Windows环境调试介绍&#xff08;一&#xff09;调试环境的准…

【SAP Abap】SAP ALV开发(REUSE_ALV_GRID_DISPLAY_LVC)全网最详细 DEMO

SAP ALV开发&#xff08;REUSE_ALV_GRID_DISPLAY_LVC&#xff09;全网最详细 DEMO1、ALV 简介2、演示程序1、ALV 简介 ALV 报表程序&#xff0c;是我们在 SAP 项目中最常开发的程序类型。 SAP 系统提供了三种 ALV 实现方式&#xff0c;分别是&#xff1a; FM ALV&#xff0c;…

win10下安装多个JDK配置方法

环境变量配置 此电脑 --- 属性 -- 高级系统设置 -- 环境变量 -- 系统变量 -- 新建 1、配置JAVA_HOME JAVA6_HOME jdk1.6的安装路径 JAVA8_HOME jdk1.8的安装路径 JAVA_HOME %JAVA8_HOME% 两个%表示引用变量的值&#xff0c;直接用JAVA_HOME&#xff0c;就能表示一连串长…

SAR影像变化检测方法之(SAR_CD_DDNet(无监督变化检测))论文阅读

一、论文信息 1、论文标题&#xff1a;Change Detection in Synthetic Aperture Radar Images Using a Dual-Domain Network 2、代码链接&#xff1a;https://github.com/summitgao/SAR_CD_DDNet 二、摘要 合成孔径雷达(SAR)图像的变化检测是一项关键而具有挑战性的任务。现…

Android---BottomAppBar

目录 BottomAppBar FloatingActionButton UI 完整代码 BottomAppBar Material Design 的一个重要特征是设计 BottomAppBar 。可适应用户不断变化的需求和行为。因此&#xff0c;BottomAppBar 是一个从标准物质指导的演变。它更注重功能&#xff0c;增加参与…

ansible 第三天

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 仓库 2: Name: RH294_Stream Description &#xff1…

Android Studio 用WIFI无线调试adb (3种方法)

最近数据线一直被boss借走&#xff0c;一旦借走就无法调试了&#xff0c;所以就打算不用数据线调试了&#xff0c;使用WIFI进行调试。 一、命令 1、首先配置adb环境变量 首先找到andoridSDK的路径中的platform-tools文件夹 &#xff0c;将他的路径复制我的是 C:\Users\YiShi…

365天深度学习训练营-第P7周:YOLOv5-Backbone/YOLOv5-C3模块实现

目录 一、前言 二、我的环境 三、代码实现 1、C3模块 2、Backbone模块 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ) 中的学习记录博客** >- **&#x1f366; 参考文章&#xff1a;36…

【算法】day03:动态规划dp

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录1. 青蛙跳台阶2. 矩形覆盖3. 二进制中1的个数4. 链表中倒数第k个结点普通小孩也要热爱生活&#xff01; 1. 青蛙跳台阶 跳台阶 1&#xff09;思路&#xff1a;如果青蛙在第n个台阶上&#xff0c;那么它要么来自n-1…

python命名规范

1.命名有字母、数字和下划线三个组成 2.项目名、包名、模块名、python文件名 都应该用英文开头&#xff0c;不能纯数字&#xff0c;否则无法识别 3.脚本名不能跟系统模块或三方模块重复 4.函数、类、方法、参数名称不能跟系统现有名称重复 5.类名必须以大写字母开头、除了类…

Kafka在windows下下载、启动、测试详细教程

目录 下载地址 启动 启动zookeeper 启动kafka 队列操作 创建消息队列名 删除消息队列名 查看所有的队列 测试 生产测试 消费测试 下载地址 Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/downloadswindows下kafka3.0版本的…