简述 ETCD 适应的场景?
etcd 基于其优秀的特点,可广泛的应用于以下场景:
- 服务发现 (Service Discovery):服务发现主要解决在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。
- 消息发布与订阅:在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。应用中用到的一些配置信息放到 etcd 上进行集中管理。
- 负载均衡:在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。etcd 本身分布式架构存储的信息访问支持负载均衡。etcd 集群化以后,每个 etcd 的核心节点都可以处理用户的请求。所以,把数据量小但是访问频繁的消息数据直接存储到 etcd 中也可以实现负载均衡的效果。
- 分布式通知与协调:与消息发布和订阅类似,都用到了 etcd 中的 Watcher 机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更做到实时处理。
- 分布式锁:因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。
- 集群监控与 Leader 竞选:通过 etcd 来进行监控实现起来非常简单并且实时性强。
云原生是一种现代化的软件开发和部署方法,旨在充分利用云计算的优势,提高应用程序的可伸缩性、弹性和可靠性。
云原生的详细定义包括云原生计算基金会(Cloud Native Computing Foundation,CNCF)的官方定义和延伸含义。
|
|
可选策略
在docker run通过 –restart 设置守护机制:
- no: 不自动重新启动容器(默认)
- on-failure: 容器发生error而退出(容器退出状态不为0)重启容器
- unless-stopped: 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
- always: 如果容器停止,总是重新启动容器。如果手动kill容器,则无法自动重启。
docker update追加命令
运行中的容器,当时没有指定restart可以通过update命令追加
参考:https://www.jianshu.com/p/5c1f152ac4a6
1. 前言
(Union filesystem)联合文件系统允许我们把多个文件系统逻辑上合并成一个文件系统,组成Union filesystem的文件系统不必相同(它们可以是ext2/3/4,vfat,ntfs,jffs…)。overlay是联合文件系统的一种(a ufs…),overlay文件系统构建于其他文件系统之上,overlay其实更像是个挂载系统(mount system),功能是把不同的文件系统挂载到统一的路径。
https://developer.aliyun.com/article/799104
还可以看看这个
|
|
容器和KVM虚拟化是两种不同的虚拟化技术,它们各有优缺点,适用于不同的场景。
容器
容器是一种轻量级的虚拟化技术,利用操作系统层面的虚拟化实现。每个容器都运行在一个独立的命名空间中,可以看作是进程的一个集合,共享主机操作系统的内核。容器可以快速启动、停止和迁移,占用的资源比KVM虚拟机少,因此更适合部署大规模的分布式应用程序。常见的容器技术包括Docker、LXC等。 优点:
背景
简单来说,一个租户就是一个公司的客户,多个租户共用同一个SaaS系统,一旦SaaS系统不可用,那么所有的租户都不可用,
多租户问题,其实是一种架构设计方式,就是在一台或者一组服务器上运行的SaaS系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改。
在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 挂载主机目录 (Bind mounts)
数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过UFS
,可以提供很多有用的特性:
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Usage: Run a command in a new container
中文意思为:通过run命令创建一个新的容器(container)
- 常用选项说明
d, --detach=false
, 指定容器运行于前台还是后台,默认为falsei, --interactive=false
, 打开STDIN,用于控制台交互t, --tty=false
, 分配tty设备,该可以支持终端登录,默认为falseu, --user=""
, 指定容器的用户a, --attach=[]
, 登录容器(必须是以docker run -d启动的容器)w, --workdir=""
, 指定容器的工作目录c, --cpu-shares=0
, 设置容器CPU权重,在CPU共享场景使用e, --env=[]
, 指定环境变量,容器中可以使用该环境变量m, --memory=""
, 指定容器的内存上限P, --publish-all=false
, 指定容器暴露的端口p, --publish=[]
, 指定容器暴露的端口h, --hostname=""
, 指定容器的主机名v, --volume=[]
, 给容器挂载存储卷,挂载到容器的某个目录-volumes-from=[]
, 给容器挂载其他容器上的卷,挂载到容器的某个目录-cap-add=[]
, 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities-cap-drop=[]
, 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities-cidfile=""
, 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法-cpuset=""
, 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU-device=[]
, 添加主机设备给容器,相当于设备直通-dns=[]
, 指定容器的dns服务器-dns-search=[]
, 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件-entrypoint=""
, 覆盖image的入口点-env-file=[]
, 指定环境变量文件,文件格式为每行一个环境变量-expose=[]
, 指定容器暴露的端口,即修改镜像的暴露端口-link=[]
, 指定容器间的关联,使用其他容器的IP、env等信息-lxc-conf=[]
, 指定容器的配置文件,只有在指定–exec-driver=lxc时使用-name=""
, 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字-net="bridge"
, 容器网络设置:- bridge 使用docker daemon指定的网桥
- host //容器使用主机的网络
- container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
- none 容器使用自己的网络(类似–net=bridge),但是不进行配置
-privileged=false
, 指定容器是否为特权容器,特权容器拥有所有的capabilities-restart="no"
, 指定容器停止后的重启策略:- no:容器退出时不重启
- on-failure:容器故障退出(返回值非零)时重启
- always:容器退出时总是重启
-rm=false
, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)-sig-proxy=true
, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
示例
- 运行一个在后台执行的容器,同时,还能用控制台管理:
docker run -i -t -d ubuntu:latest
- 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:
docker run -d ubuntu:latest ping www.docker.com
- 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,
docker run -d --restart=always ubuntu:latest ping www.docker.com
- 为容器指定一个名字,
docker run -d --name=ubuntu_server ubuntu:latest
- 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),
docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
- 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),
docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
主要依靠的一个开源软件runlike
See runlike-github
|
|
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P
或-p
参数来指定端口映射。
当使用-P
标记时,Docker会随机映射一个端口到内部容器开放的网络端口。
Bridge模式
当Docker
进程启动时,会在主机上创建一个名为docker0
的虚拟网桥,此主机上启动的Docker
容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0
子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair
设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为eth0
(容器的网卡),另一端放在主机中,以vethxxx
这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过brctl show
命令查看。