书接上回,本篇主要讲解
- 搭建私有库
- Docker 容器数据卷挂载
- Docker 高级安装
三、搭建私有镜像库
- 下载镜像docker registry
docker pull registry
- 运行私有库Registry,相当于本地有个私有DockerHub
docker run -d -p 5000:5000 -v /zty/myregistry/:/tmp/registry --privileged=true registry
- curl验证一下私服库上有什么镜像
curl -XGET http://主机IP:私服开放的端口/v2/_catalog
- 将新镜像修改成适合私服的tag
docker tag [imagesName:version] 主机IP:私服映射端口/[imagesName:version]
- 修改配置文件使之支持http
没有daemon.json文件就创建一个
cd /etc/docker
vim daemon.json
# 然后输入
{
"insecure-registried":[192.168.0.187:5050] #主机IP:映射的端口
}
之后可以重启一下,确保生效,但是重启之后要再打开registry容器
docker run -d -p 5000:5000 -v /zty/myregistry/:/tmp/registry --privileged=true registry
【补充:
如果docker出现了问题,可以用sudo dockerd --debug查看debug 问题出在哪里 】
- 将镜像push推送到私服库中
docker push 主机IP:私服开放端口/[imageName:tag]
- 将镜像从私服库拉下来
docker pull 主机IP:私服开放端口/[imageName:tag]
这个标签是要记住的!
四、容器数据卷
是什么?
将容器的文件持久化挂载到主机。卷指的是目录或者文件,存在一个或多个容器中,不属于联合文件系统,绕过联合文件存储或共享数据
容器卷记得加一个参数 --privileged=true
查看挂载是否成功
docker inspect [ContainerID]
容器stop了 主机修改也能同步
ro和rw读写规则
默认就是可读可写rw的
只读:容器实例内部被限制,只能读取不能写 read only 容器内部不能写
docker run -it --privileged=true -v /宿主机绝对路径:/容器内路径:ro [imagesName] /bin/bash
卷的继承和共享
docker run -it --privileged=true --volume-from 父类 [imagesName] /bin/bash
五、Docker高级安装
5.1 mysql主从复制
- 新建主服务器
- 进入/mydata/mysql-master/conf目录下新建my.cnf
vim my.conf
改完重启
docker restart mysql-master
- 进入mysql-master容器 登陆
docker exec -it mysql-master /bin/bash
mysql -uroot -p
- master容器内创建数据同步用户
在mysql下输入命令:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
- 新建从服务器3308,同1
- 在/mydata/mysql-slave/conf目录下改my.conf,同2
改完重启
- 在主数据库中查看主从同步状态
show master status;
- 进入mysql-slave容器,配置主从
- 在从数据库中查看主从同步状态
show slave status ; [表格排列] show slave status \G; [键值对排列]
Slave_IO_Running:NO Slave_SQL_Running:NO 说明主从还未开启
- 在从数据库中开启主从同步状态
start slave
查看 show slave status \G; 看Slave_IO_Running和Slave_SQL_Running是不是Yes
【Slave_IO_Running 是Connecting 未解决】
5.2 存储算法-redis分布式存储为例
1. 哈希取余分区【小厂】
缺点在于:一旦有一个机器坏了 ,那算法就全部错乱了
2. 一致性哈希算法分区【中厂】
三大步骤:
1)算法构建一致性哈希环
将哈希值所产生的线性空间[0, -1],通过适当的算法将它首尾相连,逻辑上成为环形空间.
之前的取余一般是对机器取余,但是这个是对取余,所以0到
-1会成为一个首尾相连的环形。
之前是对机器数取余,现在是对取余,形成0~
-1构成的圆环,称作Hash环
2)服务器IP节点
选择IP或者主机名作为关键字进行哈希映射
3)key落到服务器的落键规则
当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。
如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D
优点:
- 容错性:有一个机器宕机了之后,只影响逆时针后一个机器
- 扩展性:若增加节点,也只影响后一个机器
缺点:
- 数据倾斜问题:节点不均匀,导致压力不同=》倾斜
3. 哈希槽分区【大厂】
是什么:为解决一致性哈希算法的数据倾斜问题,
哈希槽实质就是一个数组,数组[0,-1]形成hash slot空间
能做什么:解决均匀分配的问题,在数据和节点之间又增加了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里面放的是数据。
槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。
多少个hash槽:一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
hash槽计算:Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上