08高级篇(大厂进阶)Docker复杂安装详说

Mysql主从复制docker版

docker run -p 3307:3306 --name mysql-master \
-v /opt/docker/mysql/mysql-master/log:/var/log/mysql \
-v /opt/docker/mysql/mysql-master/data:/var/lib/mysql \
-v /opt/docker/mysql/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
/opt/docker/mysql/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
docker run -p 3308:3306 --name mysql-slave \
-v /opt/docker/mysql/mysql-slave/log:/var/log/mysql \
-v /opt/docker/mysql/mysql-slave/data:/var/lib/mysql \
-v /opt/docker/mysql/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
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;
 
change master to master_host='node001', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
 
show slave status \G;

分布式存储之哈希取余算法

2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:
hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点
  简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点
   原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。
某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。

分布式存储之一致性哈希算法

一致性Hash算法背景

一致性哈希算法在1997年由麻省理工学院提出的,射击目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了。

为了在节点数目发生改变时尽可能少的迁移数据。

将所有存储节点排列在首尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放。

而当节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。

优点:加入和删除节点只影响哈希环中顺时针方向的相邻节点,对其他节点无影响

缺点:数据的分布和节点位置相关,因为这些节点不是均匀分布在哈希环上,所以数据在进行存储时达不到均匀分布的效果

分布式存储之哈希槽算法

1.为什么出现

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

2.能干什么

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

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动

哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配

3.多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
 

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

3主3从redis集群配置上

# 启动redis容器
docker run -d --name redis-node-1 --net host --privileged=true -v /opt/docker/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 /opt/docker/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 /opt/docker/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 /opt/docker/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 /opt/docker/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 /opt/docker/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
[root@node001 ~]# docker run -d --name redis-node-1 --net host --privileged=true -v /opt/docker/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
9013d5714ac1dc943cc7bf0a074229f48d9904f861d72f436ee5dcf9b54c747c
[root@node001 ~]# 
[root@node001 ~]# docker run -d --name redis-node-2 --net host --privileged=true -v /opt/docker/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
5d9503edf84c5e62741c382e23abcf678423023aa0060696b0bed1e88b1315f8
[root@node001 ~]# 
[root@node001 ~]# docker run -d --name redis-node-3 --net host --privileged=true -v /opt/docker/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
5920e496a5608f833d5eb3cde99912f2b5aea77f37c64da42184694d2673fa86
[root@node001 ~]# 
[root@node001 ~]# docker run -d --name redis-node-4 --net host --privileged=true -v /opt/docker/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
150bec0dc65dac9787c743ad0aa2fbf823a7643691b32874a7bde86840a46d83
[root@node001 ~]# 
[root@node001 ~]# docker run -d --name redis-node-5 --net host --privileged=true -v /opt/docker/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
06f08c9945cec03bea6a5076490483e81ecba6e6d2d2cb3445404d8fdaeb2298
[root@node001 ~]# 
[root@node001 ~]# docker run -d --name redis-node-6 --net host --privileged=true -v /opt/docker/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
20eb1323fb7335a3dbfb5bc637e5f0e0e218781b3e19a57868bca2b17f0b46bb
[root@node001 ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS     NAMES
20eb1323fb73   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-6
06f08c9945ce   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-5
150bec0dc65d   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-4
5920e496a560   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-3
5d9503edf84c   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-2
9013d5714ac1   redis:6.0.8   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes             redis-node-1
[root@node001 ~]# 
redis-cli --cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1
 
redis-cli --cluster create node001:6381 node001:6382 node001:6383 node001:6384 node001:6385 node001:6386 --cluster-replicas 1
 
redis-cli --cluster create 192.168.10.101:6381 192.168.10.101:6382 192.168.10.101:6383 192.168.10.101:6384 192.168.10.101:6385 192.168.10.101:6386 --cluster-replicas 1

3主3从redis集群配置中

[root@node001 ~]# docker exec -it redis-node-1 /bin/bash
root@node001:/data# redis-cli --cluster create 192.168.10.101:6381 192.168.10.101:6382 192.168.10.101:6383 192.168.10.101:6384 192.168.10.101:6385 192.168.10.101:6386 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.101:6385 to 192.168.10.101:6381
Adding replica 192.168.10.101:6386 to 192.168.10.101:6382
Adding replica 192.168.10.101:6384 to 192.168.10.101:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: cec1d6fd56f5c03a6512d95488404f561b26eb7c 192.168.10.101:6381
   slots:[0-5460] (5461 slots) master
M: 4478fc7f9a44dda4b4a6ea936614579f98896a13 192.168.10.101:6382
   slots:[5461-10922] (5462 slots) master
M: cb54a1df71ce30c579275fb20bacb732d631f02c 192.168.10.101:6383
   slots:[10923-16383] (5461 slots) master
S: bb9b7116c665a7e7e6502431a627731040968bc1 192.168.10.101:6384
   replicates cb54a1df71ce30c579275fb20bacb732d631f02c
S: d206b3fb74c9747a7a4c42cb30142e28961c4496 192.168.10.101:6385
   replicates cec1d6fd56f5c03a6512d95488404f561b26eb7c
S: 6f6915bcae8f1e27ded6fd18bece12930b205e4d 192.168.10.101:6386
   replicates 4478fc7f9a44dda4b4a6ea936614579f98896a13
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.10.101:6381)
M: cec1d6fd56f5c03a6512d95488404f561b26eb7c 192.168.10.101:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: cb54a1df71ce30c579275fb20bacb732d631f02c 192.168.10.101:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 4478fc7f9a44dda4b4a6ea936614579f98896a13 192.168.10.101:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6f6915bcae8f1e27ded6fd18bece12930b205e4d 192.168.10.101:6386
   slots: (0 slots) slave
   replicates 4478fc7f9a44dda4b4a6ea936614579f98896a13
S: d206b3fb74c9747a7a4c42cb30142e28961c4496 192.168.10.101:6385
   slots: (0 slots) slave
   replicates cec1d6fd56f5c03a6512d95488404f561b26eb7c
S: bb9b7116c665a7e7e6502431a627731040968bc1 192.168.10.101:6384
   slots: (0 slots) slave
   replicates cb54a1df71ce30c579275fb20bacb732d631f02c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@node001:/data# redis-cli -p 6381
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:215
cluster_stats_messages_pong_sent:205
cluster_stats_messages_sent:420
cluster_stats_messages_ping_received:200
cluster_stats_messages_pong_received:215
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:420
127.0.0.1:6381> cluster nodes
cb54a1df71ce30c579275fb20bacb732d631f02c 192.168.10.101:6383@16383 master - 0 1688558340209 3 connected 10923-16383
4478fc7f9a44dda4b4a6ea936614579f98896a13 192.168.10.101:6382@16382 master - 0 1688558339000 2 connected 5461-10922
cec1d6fd56f5c03a6512d95488404f561b26eb7c 192.168.10.101:6381@16381 myself,master - 0 1688558338000 1 connected 0-5460
6f6915bcae8f1e27ded6fd18bece12930b205e4d 192.168.10.101:6386@16386 slave 4478fc7f9a44dda4b4a6ea936614579f98896a13 0 1688558340000 2 connected
d206b3fb74c9747a7a4c42cb30142e28961c4496 192.168.10.101:6385@16385 slave cec1d6fd56f5c03a6512d95488404f561b26eb7c 0 1688558341225 1 connected
bb9b7116c665a7e7e6502431a627731040968bc1 192.168.10.101:6384@16384 slave cb54a1df71ce30c579275fb20bacb732d631f02c 0 1688558339000 3 connected
127.0.0.1:6381> 

redis集群读写error说明

127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.10.101:6383
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> set k3 v3
OK
127.0.0.1:6381> set k4 v4
(error) MOVED 8455 192.168.10.101:6382
127.0.0.1:6381> set k5 v5
(error) MOVED 12582 192.168.10.101:6383
127.0.0.1:6381> set k6 v6
OK
127.0.0.1:6381> 

redis集群读写路由增强正确案例

root@node001:/data# redis-cli -p 6381 -c
127.0.0.1:6381> flushall
OK
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 192.168.10.101:6383
OK
192.168.10.101:6383> set k1 v2
OK
192.168.10.101:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.10.101:6381
OK
192.168.10.101:6381> set k3 v3
OK
192.168.10.101:6381> set k4 v4
-> Redirected to slot [8455] located at 192.168.10.101:6382
OK
192.168.10.101:6382> 

查看集群信息cluster check

root@node001:/data# redis-cli --cluster check 192.168.10.101:6381
192.168.10.101:6381 (cec1d6fd...) -> 2 keys | 5461 slots | 1 slaves.
192.168.10.101:6383 (cb54a1df...) -> 1 keys | 5461 slots | 1 slaves.
192.168.10.101:6382 (4478fc7f...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.10.101:6381)
M: cec1d6fd56f5c03a6512d95488404f561b26eb7c 192.168.10.101:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: cb54a1df71ce30c579275fb20bacb732d631f02c 192.168.10.101:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 4478fc7f9a44dda4b4a6ea936614579f98896a13 192.168.10.101:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6f6915bcae8f1e27ded6fd18bece12930b205e4d 192.168.10.101:6386
   slots: (0 slots) slave
   replicates 4478fc7f9a44dda4b4a6ea936614579f98896a13
S: d206b3fb74c9747a7a4c42cb30142e28961c4496 192.168.10.101:6385
   slots: (0 slots) slave
   replicates cec1d6fd56f5c03a6512d95488404f561b26eb7c
S: bb9b7116c665a7e7e6502431a627731040968bc1 192.168.10.101:6384
   slots: (0 slots) slave
   replicates cb54a1df71ce30c579275fb20bacb732d631f02c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@node001:/data# 

主从容错切换迁移

主从扩容需求分析

主从扩容案例演示

主从缩容需求分析

主从缩容案例演示

分布式存储案例小总结

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
感谢您的提问!以下是一些关于 Docker 进阶学习的建议: 1. 学习容器编排工具:Docker Compose 和 Kubernetes 是两个常用的容器编排工具。通过学习它们,您可以更好地管理和编排多个容器,构建复杂的应用架构。 2. 持续集成与持续部署(CI/CD):学习如何使用 Docker 构建持续集成和持续部署流程。这将有助于自动化应用程序的构建、测试和部署,提高开发和交付效率。 3. 多阶段构建(Multi-stage Builds):掌握多阶段构建技术可以帮助您优化 Docker 镜像的大小和性能。通过在构建过程中创建多个阶段,并且只保留最终运行所需的组件,可以减小镜像的体积。 4. Docker 插件和扩展:探索 Docker 的插件和扩展生态系统,了解如何使用它们来扩展 Docker 的功能。一些常见的扩展包括网络插件、存储插件和身份验证插件,它们可以提供额外的功能和灵活性。 5. 容器安全和隔离:学习如何配置和管理容器的安全性和隔离性。了解容器的安全最佳实践,并使用适当的配置和工具来加强容器的安全性,以防止潜在的攻击和数据泄漏。 6. Docker Swarm:Docker Swarm 是 Docker 官方提供的一个原生的容器编排和集群管理工具。通过学习 Docker Swarm,您可以了解如何使用它来管理分布式应用程序,并实现负载均衡和高可用性。 7. 监控和日志:学习如何监控和记录 Docker 容器的性能和日志。了解如何使用相关工具和技术来监测容器的资源利用率、运行状况和错误日志,以便及时发现和解决问题。 这些是 Docker 进阶学习的一些建议,希望对您有所帮助!如有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值