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
相关推荐
哥哥还在IT中2 小时前
Docker的Cgroup Driver设置为Cgroupfs 和 Systemd 的区别
运维·docker·容器
java_logo2 小时前
LobeHub Docker 容器化部署指南
运维·人工智能·docker·ai·容器·ai编程·ai写作
源代码•宸2 小时前
GoLang写一个简单版生命游戏模拟器
经验分享·笔记·学习·游戏·golang
白帽黑客-晨哥3 小时前
最适合零基础的渗透测试学习路径:理论+实战+就业,我在湖南网安基地实现了
学习·web安全·渗透测试·实战项目·就业·湖南网安基地
qinyia3 小时前
WisdomSSH解决因未使用Docker资源导致的磁盘空间不足问题
运维·服务器·人工智能·后端·docker·ssh·github
❀͜͡傀儡师3 小时前
Docker 一键安装godoos
运维·docker·容器
Broken Arrows4 小时前
Docker原理之一的Namespace详解
运维·docker·容器
q***44814 小时前
java进阶--多线程学习
java·开发语言·学习