【微服务实战之Docker容器】第六章-复杂安装(Mysql主从Redis集群)

系列文章目录

【微服务实战之Docker容器】第一章-下载及安装


文章目录

  • 系列文章目录
  • 安装mysql主从复制
    • 1、新建主服务器容器实例3307
    • 2、新建从服务器3308
    • 3. 主从复制测试
  • Redis篇
    • 穿插Redis面试题
      • 哈希槽分区进行亿级数据存储
        • Hash取余分区
        • 一致性Hash算法分区
        • Hash槽分区(通常都使用这种方式)
    • Redis集群配置(三主三从)
      • 集群部署
      • 演示主节点宕机,从节点上位(主从容错)
      • 演示集群扩容
      • 演示集群缩容


高阶篇:
docker安装mysql、redis集群
docker-compose,dockerfile一键部署多个实例
docker微服务实战
docker网络、集群化部署

安装mysql主从复制

1、新建主服务器容器实例3307

  1. 创建/mydata/mysql-master/conf目录,在下面新建my.cnf
mkdir -p /mydata/mysql-master/conf
touch my.cnf
  1. 修改配置
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
  1. 启动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:5.7
  1. 进入容器,进行登录
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
show databases;

其中的mysql库我们设置了不需要同步
在这里插入图片描述

mysq新建数据同步用户(数据安全加固,只有固定用户可以进行数据同步)

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

授权

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

账号slave,密码123456的用户可以同步数据

2、新建从服务器3308

  1. 先启动容器3308(mysql从节点)
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:5.7
  1. 进入/mydata/mysql-slave/conf目录下新建my.cnf
mkdir -p /mydata/mysql-slave/conf
cd /mydata/mysql-slave/conf
  1. 编辑从节点配置
vim my.cnf

内容

[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
  1. 修改完配置后重启slave实例
docker restart mysql-slave
  1. 在主数据库中查看主从同步状态
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
show master status;

表示从mall-mysql-bin.000001文件的第154行开始同步
在这里插入图片描述

  1. 进入从数据库,配置开启主从复制
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

配置主从复制(注意:master_log_file和master_log_pos需要修改为上一步show master status查出来的结果mall-mysql-bin.000001和164)
在这里插入图片描述

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=154, master_connect_retry=30;  

主从复制配置参数说明:

master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。 

在从数据库(mysql-slave)查看主从同步状态

show slave status;

在这里插入图片描述

在从数据库启动主从同步
start slave;

再次在从数据库(mysql-slave)查看主从同步状态

show slave status;

已经开始同步了
在这里插入图片描述

3. 主从复制测试

主机新建库-使用库-新建表-插入数据
create database syn_test;
use syn_test;
create table mytest (id int,name varchar(20));
insert into mytest value (1,‘zhangsan’);

从机使用库-查看记录
use syn_test;
select * from mytest;
在这里插入图片描述

OK。Mysql主从复制已经成功开启。

Redis篇

穿插Redis面试题

cluster(集群)模式-docker版

哈希槽分区进行亿级数据存储

1-2亿条数据需要缓存,你如何设计这个存储案例?
这时单节点Redis不足以支持,我们就需要使用集群的方式来进行存储,那么问题来了,如何使用集群的方式进行存储呢?
通常我们有三种方案(负载均衡)

Hash取余分区

hash(key)%集群个数来决定存储在哪台服务器上,这种方式的有点是简单,通过这种简单的方式实现数据的读写负载均衡,每台服务器都处理它固定的请求,但这样的缺点也很明显,就是我们进行扩容时不方便,集群个数会动态变化,或者某个机器宕机了,都会导致所有的数据都重新洗牌(计算公式的分母改变了)。

一致性Hash算法分区

在这里插入图片描述

这里简单介绍一下吧,一致性hash算法共分三大步:
第一步:构建一致性hash环,通常是0-2^32次方。
第二步:服务器节点IP映射到环上。
第三步:key落到服务器上的规则(通常是在环上顺时针找到的第一个服务器)。
服务器和数据落在环上的位置通过一致性算法来得到。
这样做,不再以服务器数量作为分母,减少了服务器扩展对数据的影响(不是完全消除)。
如果出现错误,某个服务器宕机,或需要扩展新增服务器,我们不需要全部重新录入数据,只需要将环上离新服务器或坏掉的服务器直接的数据进行重新录入。

这样做的缺点:如果节点太少,且离得很近,就很容易发生数据倾斜,大量的数据都存在少量的服务器上(可以通过引入虚拟节点来解决)。

Hash槽分区(通常都使用这种方式)

hash槽是为了解决均匀分配的问题,在数据和节点间又加入了一层叫做hash槽,用于管理数据和节点的关系。

Redis集群中内置了16384个哈希槽,redis会根据节点的数量大致均等的将哈希槽映射到不同的节点,当需要在Redis集群中放置一个key-value时,redis会先对key用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的hash槽,也就是映射到某个节点上。如下代码:key之A、B在Node2,key之C在Node3上。

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

Redis集群配置(三主三从)

集群部署

在这里插入图片描述

  1. 新建6个Docker Redis容器实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/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 /data/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 /data/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 /data/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 /data/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 /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

在这里插入图片描述

如果运行成功,效果如下:
在这里插入图片描述

  1. 进入Redis容器构建主从关系
    进入容器redis-node-1并为6台机器构建集群关系
docker exec -it redis-node-1 /bin/bash

构建集群和主从关系(注意:ip需要换成自己的虚拟机IP)
//注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址

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

–cluster-replicas 1 表示为每个master创建一个slave节点
在这里插入图片描述
在这里插入图片描述

输入yes,表示确认信息正常
在这里插入图片描述

一切OK的话,3主3从搞定~

  1. 链接进入6381作为切入点,查看节点状态
redis-cli -h 127.0.0.1 -p 6381
cluster info

在这里插入图片描述

cluster nodes

在这里插入图片描述

这也说明的redis集群的主从映射关系随机分配
在这里插入图片描述

  1. 验证集群
    登录6381,验证Redis集群
docker exec -it redis-node-1 /bin/bash

连接Redis,集群模式需要指定端口

redis-cli -p 6381

尝试放入数据

set k1 v1

失败
在这里插入图片描述

 set k2 v2set k3 v3

多试几个,发现有的能成功,有的不能成功,这是因为hash槽存在,我们使用redis-cli -p 6381的方式只连上了单节点的redis,不能分配到该机器上的存储是会存储失败。
加上-c参数,连接到集群节点

redis-cli -h 127.0.0.1 -p 6381 -c

-c:连接集群节点
-h:连接的节点ip
-p:连接的节点端口(默认6379)
再次存入数据

set k1 v1

k1的哈希值是12706,被分配到了6383节点
在这里插入图片描述

查看集群信息

 redis-cli --cluster check 192.168.248.128:6381 

在这里插入图片描述

演示主节点宕机,从节点上位(主从容错)

在这里插入图片描述

把master1关掉,模拟宕机

 docker stop redis-node-1

这是node1已经停掉了,我们通过node2上redis看下集群信息

docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c

看下集群信息

cluster nodes

在这里插入图片描述

演示集群扩容

在这里插入图片描述随着数据增大,集群不够用了,我们需要将Redis三主三从扩容为四主四从,下面介绍一下扩容的步骤以及扩容后槽位发生的变化。

  1. 启动6387和6388
docker run -d --name redis-node-7 --net host --privileged=true -v /data/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 /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388  

8个redis全都启动了
在这里插入图片描述

进入6387容器实例内部

docker exec -it redis-node-7 /bin/bash

将新增的6387节点(空槽号)作为master节点加入原集群

 redis-cli --cluster add-node IP:6387 IP:6381 

6387就是将要作为master新增节点6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
在这里插入图片描述

检查集群情况

 redis-cli --cluster check 127.0.0.1:6381  

可以看到6387在集群上,但没有分配槽位(0 slots),加入了集群,但没完全加入。
在这里插入图片描述

重新分派槽号命令:

redis-cli --cluster reshard IP地址:端口号

这里我执行的命令是,相当于对6381Redis集群进行了槽位重新分配

redis-cli --cluster reshard 192.168.248.128:6381

在这里插入图片描述

要分给新的集群多少个节点?这里我们四台均分,每台4096
输入4096,进行回车
在这里插入图片描述

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

接着yes
等待分配完成

再次检查集群情况

redis-cli --cluster check 127.0.0.1:6381  

已经有槽位了,原来的集群槽位每个节点平均的匀出了一部分给新的节点。
为什么这么分配呢?我们思考一下,是把原来的三个节点全都打乱重新分配更快还是每个节点都只匀出固定的一部分给新节点更快。
在这里插入图片描述

接下来为主节点6387分配从节点6388

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

这里我执行的命令,新主机节点ID 需要改为集群中6387的节点ID

 redis-cli --cluster add-node 192.168.248.128:6388 192.168.248.128:6387 --cluster-slave --cluster-master-id fafca651f3f5dafd2f61922baf8190ec42c848e7

再次检查集群状态(不一定非得6381,集群的主节点任意一个都可以)

redis-cli --cluster check 127.0.0.1:6381  

在这里插入图片描述

好节点已经分配完成。
最后再说明一下,通过观察集群的key我们发现,重新分配槽位后数据也相应的变化过了(redis做的)。
在这里插入图片描述

演示集群缩容

扩容完了,我们流量高峰期撑过去了,现在不需要集群那么多机器了,为了合理利用资源我们又要进行缩容。
将扩容好的四主四从缩容回三主三从。

检查集群情况1获得6388的节点ID

 redis-cli --cluster check 192.168.248.128:6382   

在这里插入图片描述

命令:

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

执行的命令

 redis-cli --cluster del-node 192.168.248.128:6388 f7089480b0c40ef966d907cb930c1d4697f3f9a6

检查一下发现,6388被删除了,只剩下7台机器了。

 redis-cli --cluster check 192.168.248.128:6382  

在这里插入图片描述

将6387的槽号清空,重新分配,本例将清出来的槽号都给6382
先进入槽位重新分配

redis-cli --cluster reshard 192.168.248.128:6381  

在这里插入图片描述

现在我们是去掉一个节点,所以是4096

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

这里我们选择全部给6382节点,输入6382的节点ID,下一步会让我们输入谁来出这个节点(删除哪个节点)。
注意!!! 这里分配的接收节点只能是主节点,我们之前测试容错时把6381和6382的主从关系互换了,所以这里6382是主节点。
在这里插入图片描述

接下来输入从哪里出这个节点,我们输入6387的节点ID
在这里插入图片描述

回车,会出现下一个,这里意思是可以从多个节点出,但是我们就只需要一个,所以输入done,敲回车即可,就会重新开始分配。
在这里插入图片描述
在这里插入图片描述

接着,输入yes表示确认重新分配。
完成。
再次检查集群状态。

 redis-cli --cluster check 192.168.248.128:6382  

在这里插入图片描述

接着,将6387节点删除。

 redis-cli --cluster del-node ip:从机端口 从机6387节点ID 
 redis-cli --cluster del-node 192.168.248.128:6387 fafca651f3f5dafd2f61922baf8190ec42c848e7

再次检查集群状态。

 redis-cli --cluster check 192.168.248.128:6382  

在这里插入图片描述

缩容完成,我们的Redis的弹性扩缩容,以及容错切换已经学习完成!!!
可以在项目中灵活的进行扩容缩容啦~

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

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

相关文章

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述: 如下图,在使用torch.nn.Sigmoid非线性激活时报错 源代码: class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

最新开源的解析效果非常好的PDF解析工具MinerU (pdf2md pdf2json)

毫不夸张的说 PDF解析工具MinerU是照进RAG黑暗中的一道光——这是我对它的评价。我测过太多了文档解析工具! 最近在做文档解析的工作。看了很多的开源的文档解析的工具,版面分析的工具,其中包括paddelpaddel这样30kstar的明星工具。但是效果都…

JVM:MAT内存泄漏检测原理

文章目录 一、介绍 一、介绍 MAT提供了称为支配树(Dominator Tree)的对象图。支配树展示的是对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。 支配树中对象本身占用的空间称之为…

【Node.js】会话控制

express 中操作 cookie cookie 是保存在浏览器端的一小块数据。 cookie 是按照域名划分保存的。 浏览器向服务器发送请求时,会自动将 当前域名下可用的 cookie 设置在请求头中,然后传递给服务器。 这个请求头的名字也叫 cookie ,所以将 c…

PHP场地预约共享茶室棋牌室小程序系统源码

🍵🎲【聚会新宠】场地预约神器,共享茶室棋牌室小程序大揭秘!🎉 🏡【开篇:告别繁琐,聚会新选择】🏡 还在为找不到合适的聚会场地而烦恼吗?想要一个既私密又舒…

LLaMA 背景

什么是LLaMA? 模型介绍:LLaMA是Meta开发的语言模型,旨在推动开放科学和人工智能的实践。 参数范围:这些模型的参数数量从7B到65B不等,覆盖了不同规模的需求。 训练数据:LLaMA模型是在数万亿个公开数据集的…

全国媒体邀约,主流媒体到场出席采访报道

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 全国媒体邀约,确保主流媒体到场出席采访报道,可以带来一系列的好处,这些好处不仅能够增强活动的可见度,还能对品牌或组织的长期形象产生积…

elementUI在手机端使用遇到的问题总结

之前的博客有写过用vue2elementUI封装手机端选择器picker组件,支持单选、多选、远程搜索多选,最终真机调试的时候发现有很多细节样式需要调整。此篇博客记录下我调试过程中遇到的问题和解决方法。 一、手机真机怎么连电脑本地代码调试? 1.确…

pycharm如何debug for循环里面的错误值

一般debug时,在for循环里面的话,需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…

<数据集>木材缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:4000张 标注数量(xml文件个数):4000 标注数量(txt文件个数):4000 标注类别数:8 标注类别名称:[Quartzity,Live_Knot,Marrow,resin,Dead_Knot,knot_with_crack,Knot_m…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

Leetcode1929. 数组串联

问题描述&#xff1a; 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言…

leetcode101. 对称二叉树,递归法+迭代法详解附代码

leetcode101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 递归法…

Python算法实现之排序算法的Python实现详解

概要 排序算法是计算机科学中最基础和最重要的算法之一。它们在数据处理中起着关键作用,广泛应用于搜索、数据分析和优化等领域。本文将详细介绍几种常见的排序算法及其Python实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序,并通过具体示例代码展示它们的工作…

qml 实现一个listview

主要通过qml实现listvie功能&#xff0c;主要包括右键菜单&#xff0c;滚动条&#xff0c;拖动改变内容等&#xff0c;c 与 qml之间的变量和函数的调用。 main.cpp #include <QQuickItem> #include <QQmlContext> #include "testlistmodel.h" int main…

19-2 LLM之野望 2 - LLM给到Quora面临的困境

Quora 有一个简单的前提&#xff1a;它是一个分享知识和专业知识的地方&#xff0c;好奇的人可以就任何可以想象到的话题提出问题&#xff0c;并从平台博学的社区获得深思熟虑的、见识广博的答案。 想想雅虎答案 (Yahoo Answers)&#xff0c;它适用于技术员工和格拉德威尔式的…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

1. 个人谈心 ——【如何学习编程及合理安排休息时间】

&#x1f4d6; 声明 ! ! ! 此文章仅仅属于个人思想&#xff0c;如有不满或者意见不相同&#xff0c;可以在评论区讨论留言&#xff0c;非常感谢支持&#xff01;&#xff01;&#xff01; &#x1f495;个人主页&#xff1a;三亿老奶奶心中的梦 &#x1f4d8;收录专栏&#xff…

【贪心算法】力扣1481.不同整数的最少数目

给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素&#xff0c;请找出移除后数组中不同整数的最少数目。 示例 1&#xff1a; 输入&#xff1a;arr [5,5,4], k 1 输出&#xff1a;1 解释&#xff1a;移除 1 个 4 &#xff0c;数组中只剩下 5 一种整数。…

docker默认存储地址 var/lib/docker 满了,换个存储地址操作流程

1. 查看docker 存储地址 docker info如下 var/lib/docker2、查看内存大小 按需执行 df -h 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找这个文件的容量 df -h 查找所有挂载点 du -hs /home/syy_temp/*1、df -h 2、sud…