使用 Docker swarm 构建 PostgreSQL 集群

又是一个渣翻,Copyright belongs to the original text。

原文地址

背景

PostgreSQL 在 9.0 版本已经开始持续接收大量的增强,包括:

  1. 异步拓展
  2. 同步拓展
  3. 仲裁提交
  4. 级联拓展
  5. 逻辑拓展

PostgreSQL 文档也提供了一个 overview 以及 不同拓展方法的比较。详见PostgreSQL 集群策略比较

用于部署 PostgreSQL 的拓展的主拓展的方法论,是一个重要的工具来为你的数据库集群创建高可用的环境。需要一个合适的部署策略来确保你的数据被保存到不同磁盘,以及不同的数据中心。

继续阅读“使用 Docker swarm 构建 PostgreSQL 集群”

记恢复 https

这几天 https 挂掉了,似乎是因为铁门的证书(过期,不被chrome认可)了。因此重新搞一下 https。

恢复 https 也没有做什么工作,就是把之前的证书重新申请一次,然后下载下来的文件把之前的 https 文件替换掉。https 相关的文章很多,我就不再赘述了。可以参见很多人的文章。

此处唯一需要注意的是,我使用 Docker,对于 certbot ,也就是 letsencrypt 的支持不够好(也可能是我在man里面粗略的看了一下,没有找到)。因此,对于三个与的letsencrypt我就不使用了。

本篇是老文,之前一直都没有发出。

今天发出,作为博客长时间滑水的终止符。

这次更新 https,也做了一些工作,就是把原来的 rewrite 选项改成了 301,做了一个重定向,整个速度都提升了不少(未测试,仅观感),感觉很不错。因此把之前的配置贴出来。

原来的配置

    location / {	
        rewrite ^ https://$host$request_uri? permanent;	
    }	
     location ^~ /.well-known {	
        allow all;	
        root  /data/letsencrypt/;	
    }

现在的

return 301 https://$host$request_uri;

为什么我密码对了,就是登录不上?

今天又偶遇了之前用阿里云出现的问题:

明明密码没有错,本地登录可以,但远程登录就是不ok。

之前一直没有排查到错误,今天终于在本地机器的加持下得以解决。这是什么问题呢?IP地址冲突。

的确是IP地址冲突。首先先使用校园网client ssh b-server 服务器,失败了。使用同一个物理主机的a-server与b-server进行互联,成功了。校园网client能够连接a-server。因此,观察 a-server 和 b-server 的区别,发现 a-server 子网掩码是255.255.255.128,而 b-server 的子网掩码是 255.255.255.0。

此外,还有:

查看系统开放的端口
netstat -nltp
测试本地是否能够访问,排查本地问题
ssh user@locahost

子网掩码不同,为什么就连接不上呢?(原理)

最终,解决了这个问题。通过重启 networking 以及 重新通过 dhcp 获取 ip 地址。

  1. 使用 systemctl restart networking.service 重启 networking 服务。
  2. 使用 ifconfig eth0 down; ifconfig eth0 up 来开关具体的网卡。
  3. 使用 # dhclient -r 释放当前ip
  4. 使用 # dhclient 获取新的ip

大功告成,算是阶段性的解决了这个问题。DDNS迫在眉睫啊!

# Docker swarm 学习

本文的学习过程主要是通过 Docker 官方文档

花了一段时间学习 Docker swarm,一个docker的容器集群服务,来应对即将到来的高并发项目需求。

Docker machine

Docker machine 是 Docker 官方编排的项目之一,可以理解成一个 Docker 宿主机器的统一管理CLI,自部署不是很好用:目前国内仅仅 aliyun 支持,其他的我在官方文档中没有找到。

Docker machine 的安装十分简单,通过官网提供的脚本即可,For Linux:

$ base=https://github.com/docker/machine/releases/download/v0.14.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine

安装好以后,即可按照相关的操作进行运行。

比如,创建两个虚拟机:

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

进入虚拟机:

$ docker-machine ssh myvm1

显示虚拟机

NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.05.0-ce

然后即可在虚拟机的基础上进行相关的操作,十分方便。

Docker-swarm

Docker swarm 则是一个集群的东西,基本的概念是,每个宿主机器都是一个 worker ,然后大家都加入一个东西,叫做 stack ,stack 里面有许多的 container ,每个宿主机器,也分别是一个 node 。

这个 stack 是依据我们的 service 建立的,stack 中保存着 service 建立的名称,也可以通过 stack 查看相关的节点。

每个 node 都可以运行多个 container ,swarm 会进行 负载均衡 ,这个就很酷了。

图示

在官方的例子中,docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: svtter/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

复制的 app service 数量为 5。

大体上就是这个样子。

想法

行文至此,想到可以进一步学习,然后去一些相关的社区学习一波。(不过按照之前的经验,很多社区的质量都不高,讨论纯属浪费时间。)

学完这些东西,至少可以把自己的服务器升级一波,做成标准的DevOps,以及充分利用服务器资源了。

Code

GitHub – Svtter/Docker_Swarm_Test: a Docker swarm example project. Reference to official document.