【Docker】中级篇

(一)Docker复杂安装详说

【1】安装mysql主从复制

(1)新建主服务器容器实例3307

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

在这里插入图片描述

(2)进入/mydata/mysql-master/conf目录下新建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)修改完配置后重启master实例

docker restart mysql-master

在这里插入图片描述

(4)进入mysql-master容器

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

(5)master容器实例内创建数据同步用户

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

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

(6)新建从服务器容器实例3308

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

在这里插入图片描述

(7)进入/mydata/mysql-master/conf目录下新建my.cnf

在这里插入图片描述

[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

(8)修改完配置后重启slave实例

docker restart mysql-slave

(9)在主数据库中查看主从同步状态

show master status;

在这里插入图片描述

(10)进入mysql-slave容器

docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

(11)在从数据库中配置主从复制

change master to master_host='192.168.19.11',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;

(12)在从数据库中查看主从同步状态

show slave status \G;

在这里插入图片描述

(13)在从数据库中开启主从同步

start slave;

在这里插入图片描述

(14)查看从数据库状态发现已经同步

(15)主从复制测试

在主库执行以下sql

create database testslave;

use testslave;

CREATE TABLE hero ( id int(11) AUTO_INCREMENT, name varchar(30) , hp float , damage int(11) , PRIMARY KEY (id) )  DEFAULT CHARSET=utf8;

insert into hero values (null, '盖伦', 616, 100);

在从库进行查询,查询成功。

【2】安装redis集群

(1)面试题

1-2亿条数据需要缓存,请问如何设计这个存储案例?
单机单台100%不可能,肯定是分布式存储,用redis如何落地?既然是分布式,那么一个数据落在哪一台服务器上?能不能保证下次读的时候也是从那一台服务器上读出来?

2亿条记录就是2亿个k-v,我们单机不行,必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

(1)哈希取余分区
在这里插入图片描述在这里插入图片描述(2)一致性哈希算法分区
在这里插入图片描述(3)哈希槽分区

(2)搭建三主三从redis集群

(1)新建6个docker容器实例

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)进入容器redis-node-1并为6台机器构建集群关系

docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.19.11:6381 192.168.19.11:6382 192.168.19.11:6383 192.168.19.11:6384 192.168.19.11:6385 192.168.19.11:6386 --cluster-replicas 1

–cluster-replicas 1 表示为每个master创建一个slave节点

在这里插入图片描述
在这里插入图片描述
(3)链接进入6381作为切入点,查看节点状态

redis-cli -p 6381
cluster info

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

(3)主从容错切换迁移案例

(1)数据读写存储
首先进入6381,尝试存储数据,发现有的数据槽位超过了6381分配的槽位,那么就会报错

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

单机模式连接

redis-cli -p 6381

在这里插入图片描述改成用集群方式连接,优化路由

redis-cli -p 6381 -c

在这里插入图片描述(2)容错切换迁移(测试主从切换)
首先在6381主机中查看集群信息
在这里插入图片描述停掉6381主机
在这里插入图片描述重新进入6382

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

查看集群信息,可以看到原来的6386从机已经变成了主机
在这里插入图片描述把6381启动以后,6381变成了新的从机,要想把6381重新变为主机,可以把现在6386停掉再重启

(4)主从扩容案例

(1)新建6387、6388两个节点,新建后启动,查看是否是8个节点

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

docker ps

在这里插入图片描述
(2)进入6387容器实例内部

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

(3)把新增的6387节点(空槽位)作为master节点加入原集群
把新增的6387作为master节点加入集群,6381就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

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

在这里插入图片描述(4)第1次检查集群情况

redis-cli --cluster check 192.168.19.11:6381

在这里插入图片描述
(5)重新分派槽号给6387

redis-cli --cluster reshard 192.168.19.11:6387

给新分配4096个槽位
在这里插入图片描述然后输入all,从每一个槽位上取一些过来

(6)第2次检查集群情况

redis-cli --cluster check 192.168.19.11:6381

在这里插入图片描述
(7)为主节点6387分配从节点6388
最后的编号是6387的编号

redis-cli --cluster add-node 192.168.19.11:6388 192.168.19.11:6387 --cluster-slave --cluster-master-id 9322efd4b8f57d0c01fccc2d2ba310021781f74f

(8)第3次检查集群情况

redis-cli --cluster check 192.168.19.11:6381

在这里插入图片描述

(5)主从缩容案例

(1)检查集群情况1获取6388的节点ID

redis-cli --cluster check 192.168.19.11:6382

(2)把6388删除,从集群中把4号从节点6388删除
最后跟的节点ID就是6388的节点ID

redis-cli --cluster del-node 192.168.19.11:6388 2e4ec79d0731b36c01a8d3739e30c67551b76eeb

(3)把6387的槽号清空,重新分配,本例把清出来的槽号都给6381

redis-cli --cluster reshard 192.168.19.11:6381

在这里插入图片描述
然后输出done表示结束
在这里插入图片描述
(4)第2次检查集群情况

redis-cli --cluster check 192.168.19.11:6382

在这里插入图片描述(5)把6387删除
最后跟的节点ID就是6387的节点ID

redis-cli --cluster del-node 192.168.19.11:6387 9322efd4b8f57d0c01fccc2d2ba310021781f74f

(6)第3次检查集群情况

redis-cli --cluster check 192.168.19.11:6382

可以看到没有6387的节点了

在这里插入图片描述

(二)DockerFile解析

(三)Docker微服务实战

(四)Docker网络

(1)是什么
(2)常用基本命令
(3)能干嘛
(4)网络模式
(5)Docker平台架构图解

(五)Docker-compose容器编排

在这里插入图片描述

(六)Docker轻量级可视化工具Portainer

(七)Docker容器监控之CAdvisor+InfluxDB+Granfana

(八)终章&总结

猜你喜欢

转载自blog.csdn.net/weixin_44823875/article/details/128604481