Docker学习笔记—day008

Docker学习笔记---day008(MySql主从复制和redis集群配置)

文章目录

一、Mysql主从复制(搭建步骤)

1.1、Mysql主从复制的原理

主从复制 是用来建立一个和 主数据库完全一样的数据库环境称为从数据库 ;主数据库一般是准实时的业务数据库

如果企业中使用的后端MySql数据库只有一台时候,会存在以下问题:1、单点故障服务不可用;2、无法处理大量的并发数据请求;3、数据丢失

主从复制的作用:

  • 如果主节点出现故障 ,直接将服务切换到从节点 ,来保证服务的可用性
  • 如果并发量较大 ,可以进行读写分离,让主库负责写,从库负责读
  • 如果主库数据丢失,从库还会保存一份,可减少数据丢失的分险


主从数据库之间的数据复制方式:异步复制、半同步复制、组复制

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

shell 复制代码
docker run -d -p 3307:3306 --privileged=true \
  -v /mydata/mysql-master/log:/var/log/mysql \
  -v /mydata/mysql-master/data:/var/lib/mysql \
  -v /mydata/mysql-master/conf:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=root\
  --name mysql-master \
  mysql:5.7                                     

1.3、进入/etc/mysql-master/conf 目录下新建my.cnf

bash 复制代码
cd /mydata/mysql-master/conf 
touch my.cnf

复制mysql的原始配置文件 my.cnf

bash 复制代码
[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

修改完配置后重启mysql-master容器实例

shell 复制代码
docker restart mysql-master

1.4、进入mysql-master容器

bash 复制代码
# docker exec -it 容器ID /bin/bash
docker exec -it b7092ad4a1dd /bin/bash

1.5、master容器实例内创建数据同步用户

sql 复制代码
# 认证-创建复制账户
create user 'slave'@'%' identified by '123456'
# 授权-授权复制权限
grant replication slave, replication client on *.* to 'slave'@'%'

1.6、新建从服务器容器实例3308

shell 复制代码
```shell
docker run -d -p 3308:3306 --privileged=true \
  -v /mydata/mysql-slave/log:/var/log/mysql \
  -v /mydata/mysql-slave/data:/var/lib/mysql \
  -v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
  -e MYSQL_ROOT_PASSWORD=root\
  --name mysql-slave \
  mysql:5.7                                     
复制代码
### 1.7、进入/etc/mysql-slave/conf 目录下新建my.cnf

```shell
 cd /mydata/mysql-slave/conf/
vi my.cnf

添加从机配置

bash 复制代码
[mysqld]
## 设置server_id。同一个局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
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
## relay_log 配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave 设置为只读(具有super权限的用户除外)
read_only=1

1.8、修改配置后重启slave实例

xml 复制代码
docker restart mysql-slave

1.9、在主数据库中查看主从同步状态

sql 复制代码
show master status;

1.10、进入mysql-slave容器

shell 复制代码
docker exec -it mysql-slave /bin/bash
mysql -uroot -p
# 接着输入密码

1.11、在从数据库中配置主从复制

命令格式

sql 复制代码
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地址-从库需要通过这个地址找到主库。(需要将'宿主机IP'替换为真实的主库服务器IP地址)
# master_user:连接主库时使用的用户名
# master_password:连接主库时对应用户的密码(即创建'slave'用户时设置的密码)
# master_port:主库监听的端口
# master_log_file:从那个二进制日志文件开始复制(这个值必须与在主库上执行的 show mysql status;命名后得到的file值一致)
# master_log_pos:从二进制日志的那个位置开始复制(同上)
# master_connect_retry: 连接重试间隔(秒)-如主库和1从库连接意外中断,从库需要每隔30s尝试重新连接
change master to master_host='192.168.17.131', master_user='slave', master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=2129,master_connect_retry=30;
/

1.12、在从数据库中查看主从同步状态

sql 复制代码
show slave status \G;  // 参数\G 会将文件内容以KV键值对的形式展现出来

1.13、在从数据库中开启主从同步

sql 复制代码
start slave;

1.14、查看从数据库状态发现已经同步

sql 复制代码
show slave status;

1.15、主从复制测试

在主机上创建库、创建表、插入数据

在从数据库当中进行查看(主从复制)

二、安装Redis集群(分布式存储)

1-2亿条数据需要缓存,请问如何设计这个存储案例

解决办法:单机设备不可能实现,使用redis分布式存储

2.1、分布式存储的三种理论依据(重点)

2.1.1、哈希取余分区

假设有3台机器构成的一个集群,用户每次读写操作都是根据公式:hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

优点 : 简单有效,只需预估好数据规划还节点。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每一台服务器固定处理一部分请求,起到负载均衡+分而治之的作用。
缺点: 进行扩容和缩容比较麻烦,得重新设置映射关系。

2.1.2、一致性哈希算法

由来 :为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数就不行了。
目的 :当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

优点: 容错性高、可扩容

缺点:节点太少,会存在数据倾斜的问题(被缓存的大部分集中在某一台服务器上)

3大步骤

  1. 算法构建一致性哈希环

通过hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集(hash空间)[0-2^32-1],这是一个线性空间。但在算法中,将它的首尾相连,在逻辑上构成一个环形空间

简单说:一致性hash算法将整个哈希值空间组织称一个虚拟的环。

  1. 服务器IP节点映射

将集群中各个IP节点映射到环上的某一个位置

  1. key落到服务器的落键规则

当我们需要存储一个KV键值对时,首先计算key的hash值,hash(key),将这个key使用相同的hash函数计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针"行走",第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。

2.1.3、哈希槽分区(经常问)

缘由:解决一致性哈希算法的数据倾斜问题

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

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

2.2、3主3从redis集群配置

2.2.1、关闭防火墙+启动docker后台服务
shell 复制代码
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 启动并启用Docker
sudo systemctl start docker
sudo systemctl enable docker
2.2.2、新建6台redis容器实例
shell 复制代码
# 开启66个redis容器实例
# --net host  使用宿主机的IP和端口,默认
# --cluster enabled yes  开启集群模式
# --appendonly 启用AOF(Append Only File)持久化
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
2.2.3、进入redis-node-1并为6台机器构建集群关系

进入容器:

powershell 复制代码
docker exec -it redis-node-1 /bin/bash

构建主从关系:

shell 复制代码
redis-cli --cluster create 192.168.17.131:6381 192.168.17.131:6382 192.168.17.131:6383 192.168.17.131:6384 192.168.17.131:6385 192.168.17.131:6386 --cluster-replicas 1
# --cluster-replicas 1 表示为每一个master创建一个slave节点(一主一从(共三组))
2.2.4、链接进入6381做为切入点,查看集群状态
powershell 复制代码
cluster nodes  # 节点详细信息


通过下面命令我们可以看出那个master挂载的是那个slave

powershell 复制代码
cluster nodes  # 节点详细信息
# 1-5
# 2-6
# 3-4
相关推荐
HyperAI超神经16 分钟前
【vLLM 学习】Prefix Caching
人工智能·深度学习·学习·大语言模型·cpu·gpu·vllm
.小墨迹30 分钟前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
黑客思维者1 小时前
机器学习007:监督学习【回归算法】(线性回归)--股票背后的预测学
学习·机器学习·回归·线性回归·监督学习
EniacCheng1 小时前
【RUST】学习笔记-整型
笔记·学习·rust
断剑zou天涯1 小时前
【算法笔记】树状数组IndexTree
java·笔记·算法
北岛寒沫2 小时前
北京大学国家发展研究院 经济学辅修 经济学原理课程笔记(第九课 公共产品与公共资源)
经验分享·笔记
Vizio<2 小时前
STM32HAL库开发笔记-STM32CubeMX点灯
笔记·stm32·嵌入式硬件
找方案2 小时前
hello-agents 学习笔记:智能体发展史 —— 从符号逻辑到 AI 协作的进化之旅
人工智能·笔记·学习·智能体·hello-agents
skywalk81632 小时前
Auto-Coder用Qwen3-Coder-30B-A3B-Instruct模型写一个学习汉字的项目
人工智能·学习·auto-coder
MarkHD2 小时前
智能体在车联网中的应用:一份详尽到每日的100天学习路线图
学习