一个docker-compose微服务脚本,自用

容器为swoole+php7

docker-compose.yml

version: '3.6'
services:
  redis:
    image: redis
  web:
    image: cfanbo/swoole4_php7:v1
    depends_on:
      - redis
    links:
      - redis
    volumes:
      - /Users/sxf/sites/msgserve:/usr/src/myapp
    command: "php /usr/src/myapp/src/wx_push_server.php start"

对于 wx_push_server.php文件里redis的主机地址应该写成docker-compose配置文件里的容器服务名(redis)

分布式事务XA解决方案之两阶段提交(2PC)

https://zh.wikipedia.org/wiki/%E4%BA%8C%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4

对于三阶段提交请参考:
https://www.cnblogs.com/binyue/p/3678390.html
https://www.cnblogs.com/charlesblc/p/6289348.html

计算机网络以及数据库领域内,二阶段提交英语:Two-phase Commit)是指,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

需要注意的是,二阶段提交(英文缩写:2PC)不应该与并发控制中的二阶段锁(英文缩写:2PL)进行混淆。

前提[编辑]

二阶段提交算法的成立基于以下假设:

  1. 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者(Cohorts)。且节点之间可以进行网络通信。
  2. 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损坏不会导致日志数据的消失。
  3. 所有节点不会永久性损坏,即使损坏后仍然可以恢复。

基本算法[编辑]

以下对二阶段提交算法分阶段进行说明。

第一阶段(提交请求阶段)[编辑]

  1. 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
  2. 参与者节点执行询问发起为止的所有事务操作,并将Undo信息Redo信息写入日志。
  3. 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中止”消息。

有时候,第一阶段也被称作投票阶段,即各参与者投票是否要继续接下来的提交操作。

第二阶段(提交执行阶段)[编辑]

成功[编辑]

当协调者节点从所有参与者节点获得的相应消息都为”同意”时:

  1. 协调者节点向所有参与者节点发出”正式提交”的请求。
  2. 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送”完成”消息。
  4. 协调者节点收到所有参与者节点反馈的”完成”消息后,完成事务。

失败[编辑]

fail

如果任一参与者节点在第一阶段返回的响应消息为”终止”,或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:

  1. 协调者节点向所有参与者节点发出”回滚操作”的请求。
  2. 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送”回滚完成”消息。
  4. 协调者节点收到所有参与者节点反馈的”回滚完成”消息后,取消事务。

有时候,第二阶段也被称作完成阶段,因为无论结果怎样,协调者都必须在此阶段结束当前事务。

算法示意[编辑]

下述流程图简单示意了二阶段提交算法中协调者和参与者之间的通信流程

    协调者                                              参与者
                              QUERY TO COMMIT
                -------------------------------->
                              VOTE YES/NO           prepare*/abort*
                <-------------------------------
commit*/abort*                COMMIT/ROLLBACK
                -------------------------------->
                              ACKNOWLEDGMENT        commit*/abort*
                <--------------------------------  
end

“*” 所标记的操作意味着此类操作必须记录在稳固存储上.[1]

缺点[编辑]

二阶段提交算法的最大缺点就在于 它的执行过程中间,节点都处于阻塞状态。即节点之间在等待对方的相应消息时,它将什么也做不了。特别是,当一个节点在已经占有了某项资源的情况下,为了等待其他节点的响应消息而陷入阻塞状态时,当第三个节点尝试访问该节点占有的资源时,这个节点也将连带陷入阻塞状态。

另外,协调者节点指示参与者节点进行提交等操作时,如有参与者节点出现了崩溃等情况而导致协调者始终无法获取所有参与者的响应信息,这时协调者将只能依赖协调者自身的超时机制来生效。但往往超时机制生效时,协调者都会指示参与者进行回滚操作。这样的策略显得比较保守。

二阶段协议的实现[编辑]

.

关联条目[编辑]

参照[编辑]

  1. 跳转^ C. Mohan, Bruce Lindsay and R. Obermarck (1986): “Transaction management in the R* distributed database management system”,ACM Transactions on Database Systems (TODS), Volume 11 Issue 4, Dec. 1986, Pages 378 – 396

修改docker默认存储目录(转)

Docker 修改默认存储位置

  • 首先使用 docker info 查看 docker 的基本信息
sudo docker info
Containers: 0
Images: 5
Storage Driver: devicemapper
 Pool Name: docker-253:0-679369-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: 
 Metadata file: 
 Data Space Used: 533.9 MB
 Data Space Total: 107.4 GB
 Data Space Available: 106.8 GB
 Metadata Space Used: 954.4 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Library Version: 1.02.89-RHEL6 (2014-09-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-431.29.2.el6.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 853.5 MiB
Name: rhel62build
ID: LIO4:I43U:YFQU:SN45:YOE6:7GTF:6AGX:VSKQ:ICIV:AKWD:3OKQ:HUSC

这是一个新装的docker环境,其中看不出当前docker文件存储的路径。但是docker默认会使用 /var/lib/docker 作为默认存储位置。

  • 停止 Docker 服务
sudo /etc/init.d/docker stop
  • 将原来默认的/var/lib/docker备份一下,然后复制到别的位置并建立一个软链接
cd /var/lib
sudo cp -rf docker docker.bak
sudo cp -rf docker /<my_new_location>/
sudo ln -s /<my_new_location>/docker docker
  • 启动 Docker 服务
sudo /etc/init.d/docker start
  • 最后使用 docker info 查看更新结果
sudo docker info
Containers: 0
Images: 5
Storage Driver: devicemapper
 Pool Name: docker-8:21-393695-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop1
 Metadata file: /dev/loop2
 Data Space Used: 533.9 MB
 Data Space Total: 107.4 GB
 Data Space Available: 15.33 GB
 Metadata Space Used: 954.4 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /build/docker/devicemapper/devicemapper/data
 Metadata loop file: /build/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.89-RHEL6 (2014-09-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-431.29.2.el6.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 853.5 MiB
Name: rhel62build
ID: LIO4:I43U:YFQU:SN45:YOE6:7GTF:6AGX:VSKQ:ICIV:AKWD:3OKQ:HUSC

转载请以链接形式标明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/50310653

使用docker-compose 快速创建一个mysql 数据库容器

//创建一个独立的容器目录

mkdir docker-db
cd docker-db

前提、创建 docker Compose 配置文件
#vi docker-compose.yml 文件,内容如下

version: '3.6'
services: 

    db:
        image: hub.c.163.com/library/mysql:5.7
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: wordpress
            MYSQL_USER: root
            MYSQL_PASSWORD: 123456
            MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
        ports:
            - "33061:3306"

image也可以直接写mysql:5.7 或者mysql:latest,不指定获取地址。
上面的 ports 这一块,是指宿主机端口号:容器端口号。在使用的时候,直接访问本机的 33061 端口即可。端口号前也可以指定一个固定的IP 地址。
Compose file version 3 reference:https://docs.docker.com/compose/compose-file/

一、创建并启动容器

$docker-composer up

在 docker-composr.yml 所在的目录里,执行上面的命令,此时会自动从远程服务器拉取容器所需的信息。这时窗口一直处于运行状态,我们通过添加
-d
参数,来实现后台服务运行。

二、停止关闭容器

$ docker-compose stop

关闭后,容器文件仍然在磁盘上存在,重新执行 docker-compose start 即可启动。

三、删除容器

docker-compose rm

上面的命令可以将已经停止运行的容器进行删除,也可以将停止和删除用一条命令代替

docker-compose down

更多命令请执行 docker-compose -h 查看。

Docker Machine 简介

一句话概括的话就是 Docker Machine是一个可以方便对多个宿主服务器中的多个容器进行管理的工具。

Docker 与 Docker Machine 的区别 https://www.cnblogs.com/sparkdev/p/7066789.html

Docker Machine 工具出现的意义 https://www.2cto.com/net/201707/660864.html

Docker Machine 用法 http://www.linuxidc.com/Linux/2017-06/145232.htm

Docker Machine 命令 http://blog.csdn.net/warren_1992/article/details/51451522

Mac平台上Docker安装与使用 http://blog.csdn.net/warren_1992/article/details/51451522

windows平台在dos下执行docker pull 命令出错

这里docker Machine 是安装和管理 Docker 的工具(用来代替Boot2Docker,对于个人玩的话,不建议使用docker Machine,毕竟多了一个虚拟层,不如直接使用当前物理机器作为容器的宿主机)

$ docker pull gitlab/gitlab-ce:latest

Warning: failed to get default registry endpoint from daemon (error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.). Using system default: https://index.docker.io/v1/
error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/images/create?fromImage=gitlab%2Fgitlab-ce&tag=latest: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

解决方法:打开新窗口后执行(

docker-machine env

根据提示运行命令

@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i

default 是docker-machine的name,可以通过docker-machine -ls 查看。

如果还提示这个错误,说明没有启用 default ,执行下面的命令

D:\docker
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown

如果为stopped状态,则需要启用一下

$ docker-machine start default
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

最后再执行

$ docker pull hub-mirror.c.163.com/gitlab/gitlab-ce:latest
latest: Pulling from gitlab/gitlab-ce
1be7f2b886e8: Pull complete
6fbc4a21b806: Pull complete
c71a6f8e1378: Pull complete
4be3072e5a37: Pull complete
06c6d2f59700: Pull complete
3e236075b07f: Pull complete
9d3aa9a75297: Pull complete
1fad4f75154b: Pull complete
5383bef86102: Pull complete
7343d4ab63b3: Pull complete
7f250f1b8a34: Downloading [==================> ] 157.4MB/415.4MB

 

centos 下安装 certbot 常见问题

上一篇(https://blog.haohtml.com/archives/17422)我们介绍了centos下安装certbot的方法,但有时间服务器环境不一样,总会遇到一些问题,常见问题如下:

centos7.5下安装certbot常见问题

一、出错”ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer.“
解决办法:

sudo pip uninstall pyOpenssl
sudo pip install pyOpenSSL==0.14.0

查看版本:

pip show pyOpenssl

一、出错信息为“certbot AttributeError: ‘module’ object has no attribute ‘SSL_ST_INIT’”

解决办法:

pip uninstall pyOpenSSL
pip install pyOpenSSL==16.2.0