关注Docker有段时间了, 最近在搞去存储的事情, 会有一堆的小数据库脱离存储, 使用流复制来做HA.
对于小型数据库来说, 可以考虑放到云环境去, 但是以前考虑到虚拟化带来的性能损耗有点大, 所以一直未考虑过在虚拟化中使用数据库.
docker刚好解决了性能损耗这块的问题, 利用了Linux的cgroup和chroot特性来实现namespace的隔离, 将性能损耗降到几乎为0.
在云环境中, 数据库和其他应用的显著差别是数据存储这块.
数据库要求数据存储的可靠性, 持久化, 原子性, 一致性. 所以对存储的要求比较高.
另一方面, 数据库对CPU的要求也比较高, 在处理高并发的请求或者复杂的查询时, 耗费的CPU是比较多的.
网络方面, 当数据库有大量的数据进出时, 要求也比较高.
最后是数据的安全, 虚拟机和虚拟机之间的资源隔离也是很重要的.
下面假设我们要以docker 为基础部署云环境, 大概需要考虑哪些因素, 大致的框架如何, 谈一点个人想法, 如图 :
![docker based cloud thinking - 德哥@Digoal - PostgreSQL research](http://img2.ph.126.net/LpjNYprzpFSv9gukI9eqFg==/3111987342530455727.png?x-oss-process=image/resize,w_1400/format,webp)
对于openstack产品来说docker 和KVM这类虚拟化也差不多, 只是docker只能运行Linux, kvm可以允许windows, freebsd, linux等.
几大模块的功能 :
镜像存储
存储docker images.
宿主机
使用选择的image运行container.
注册服务
存储container的运行参数, name, 卷, 环境变量, 心跳文件, fence信息, 网络信息等. 可以存储在数据库中.
注意数据库运行在云环境中的一个注意事项, 为了防止文件被重写(如多个container写一份数据), 在启动container时, 应该fence掉前一个运行该数据的container, 所以我们需要注册fence信息.
管理机
管理container的运行, 停止; 监控container的状态, 事件触发.
云存储
数据文件所在, 因为当宿主机DOWN掉时, 可能要从其他宿主机起container, 所以数据需要通过云存储来共享 .
网络
需要将container的网络, 云存储网络, 镜像存储网络隔离开来, 以免相互造成干涉而降低性能. container则可能需要使用到网桥的功能. 可以通过brctl或者openvswitch来管理.
一个假想的上线流程.
1. 搭建网络
2. 搭建云存储
3. 搭建镜像存储
制作镜像.
4. 搭建宿主机
5. 搭建注册服务数据库
6. 搭建管理机
7. 注册服务元数据初始化, 新增宿主机信息, 镜像存储信息, 镜像信息(通过哪个镜像来启动container), 云存储信息, 挂载点信息, 网络信息等.
8. 添加container, 如包括镜像, 网络, 启动参数, 心跳文件, fence文件等信息.
9. 启动container
启动docker时, 我们可以通过entry文件来处理一些逻辑.
例如,
判断volume是否已初始化
通过run传递的env, 设置数据库的初始化参数, 启动参数等
如果已初始化, 查看心跳文件, fence文件等,
fence 前一个container
启动数据库.
为了确保数据库的可靠性, 我们可以大家两套云环境, 使用不同的云存储, 使用流复制一主一备. 主和备的数据文件分布在不同的云存储(或不同的云环境的不同云存储下面).
[参考]
2. man docker
3. man docker-run