Registry高可用性设计

Registry高可用性(HA)是多数生产系统需要关心的问题,基本要求就是没有单点故障。下面是2种常见的HA方案:
(1)共享存储
一种比较标准的方案,就是多个的Registry实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置LB进来的请求,可以分流到不同的实例中去处理,实现了负载均衡,也避免了单点故障。
(2)双主复制
在两个节点间采用双主复制策略,互相复制镜像。即使有一个实例失效,另一个实例仍然可以提供服务,从而在一定程度上可以满足HA的需求。
相比而言采用共享存储的方式更为合理,后端即可采用ceph、swift共享存储方式,亦可使用阿里云等云存储方式。
存在的问题:
(1)session 保存
请求经过LB转发以后,每次请求都会被平均分配至各个harbor。这就导致了使用浏览器登录时,会出现session在不同的harbor间失效的问题。可以通过设置LB将指定IP的请求发送到固定的harbor可以解决上述问题,也可以通过共享session的方法解决。共享session的话,目前harbor支持使用redis来共享session。
(2)数据库数据一致性
因为高可用就得需要启动至少两个harbor,而每个harbor都有自己的mysql,其数据库数据的一致性问题就有待解决。解决方案可以让多个harbor使用同一个mysql数据库,数据库采用高可用的方式搭建。这样就屏蔽掉了数据不一致问题。

Harbor 如何使用外部数据库?

操作步骤如下:
(1)harbor数据库导出
docker exec -it harbor-db bash
mysqldump -u root -p --databases registry > registry.dump #数据库的默认密码在cat common/config/adminserver/env 中查看
docker cp harbor-db:/tmp/registry.dump . #退出container,将备份的数据copy 出来
(2)将数据导入到外部mysql
mysql -uharbor -h $MYSQLHOST -p
source ./registry.dump;
(3)配置外置数据库
修改docker-compose.yml 文件,将mysql部分删除
(4)修改harbor导入的环境变量


共享session设置:

Harbor对session共享已经给予了支持,只需要将_REDIS_URL这个环境变量配置到各个节点harbor ui组件的env文件中即可:
vi common/config/adminserver/env
LOG_LEVEL=debug
CONFIG_PATH=/etc/ui/app.conf
UI_SECRET=LuAwkKUtYjF4l0mQ
JOBSERVICE_SECRET=SmsO1kVo4SrmgOIp
GODEBUG=netdns=cgo
_REDIS_URL=redis_ip:6379,100,redis_password,0