Foreward
redis的发布/订阅功能,可以说
正好有业务场景需要使用分布式锁,读到这篇文章,非常好,做下摘录.
1 | public class RedisKey { |
1 | @Slf4j |
对于数字签名、证书、CA、Https的相关概念一直都很混乱.参考了相关资料后,并记录.
公钥、私钥
用于对数据进行加密、解密.
摘要(digest)、数字签名(signature)
摘要,是对数据进行hash运算后的数据; 数字签名(signature),使用公(私)钥对摘要进行加密后的数据.
CA(Certificate Authority)证书中心、数字证书(Digest Certificate)
CA(证书中心)用自己的私钥,对用户公钥、用户个人信息进行加密,生成数字证书(Digest Certificate).
SSL握手过程
客户端向服务器发请求,请求证书
服务器把证书发给客户端
客户端一般会有大部分CA的公钥,客户端收到证书后,检查该颁发者是否是客户端认可的CA,如果是,就用该CA的公钥解密数字签名,然后再计算
证书中的”公钥和证书信息“的hash值,比较两者,如果相同,那就说明该证书没有被人篡改过,而且是该CA机构颁发的。当然,还会进行其它验证,
如证书的common name与http request header中的host(不包括端口)是否相同,等等,如果有哪项检查不通过,会有告警,如果所有检查通过,
那进入下一步。
客户端生成对称密钥,用证书中的公钥加密,发给服务器
服务器收到对称密钥后保存,给客户端一个应答。
客户端接收响应,这样就完成了SSL连接,后面的通信用对称密钥加密数据传输。
因为非对称加密相对对称加密来说比较耗时,所以正式的数据传输是用对称加密算法。非对称加密只是用于建立SSL时对称密钥的安全传输。我们可以设置
HTTPS长连接,这样建立好SSL+HTTP连接后,可以用这个连接发多次HTTPS请求,而不用每次请求都建立连接。
详细信息参考req
1 | # 生成一个RSA私钥,1024是加密强度,一般是1024或2048 |
1 | $ ./gencrt.sh |
1 | # 启动nginx |
1 | $ vim gencrt.sh |
这里记录自己常用的一些实战技巧.
容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关.
我就有以下场景需求.制作一个squid镜像,并在运行容器后,容器里执行squid start命令.
一般需要让容器可以后台长久运行,需要指定/bin/bash指令.1
$ docker run -ti --name [容器名] -d [镜像名] /bin/bash
利用ENTRYPOINT实现1
2
3
4
5
6
7
8
9
10FROM centos:7
RUN yum install -y squid
# ip高匿与端口
RUN echo 'request_header_access Via deny all' >> /etc/squid/squid.conf \
&& echo 'request_header_access X-Forwarded-For deny all' >> /etc/squid/squid.conf \
&& echo 'request_header_access From deny all' >> /etc/squid/squid.conf \
&& sed -i 's/http_access deny all/http_access allow all/g' /etc/squid/squid.conf \
&& sed -i 's/http_port 3128/http_port 57112/g' /etc/squid/squid.conf
ENTRYPOINT /usr/sbin/squid start && /bin/bash # 这个是重点
EXPOSE 57112
1、容器中需要安装supervisor服务;
2、上传本地supervisor配置文件1
2
3
4
5
6
7
8
9
10
11FROM centos:7
RUN yum install -y squid python-setuptools
RUN easy_install supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# ip高匿与端口
RUN echo 'request_header_access Via deny all' >> /etc/squid/squid.conf \
&& echo 'request_header_access X-Forwarded-For deny all' >> /etc/squid/squid.conf \
&& echo 'request_header_access From deny all' >> /etc/squid/squid.conf \
&& sed -i 's/http_access deny all/http_access allow all/g' /etc/squid/squid.conf \
&& sed -i 's/http_port 3128/http_port 57112/g' /etc/squid/squid.conf
EXPOSE 57112
1 | [supervisord] |
1 | # 本地运行Docker官方文档网站 |
目前docker提供ce(community edition)社区版本和ee(enterprise edition)企业版本.选择ce版本即可.
1 | # 卸载旧版本 |
1 | $ vim /etc/docker/daemon.json |
问题描述
从版本docker-ce-18.06.0.ce降到版本docker-ce-17.03.2.ce,不能启动.
1 | $ journalctl -xe |
解决方案
删除docker镜像存放目录/var/lib/docker,猜测是新版本目录结构与老版本不通导致.
1 | # docker-ce-17.03.2.ce版本/var/lib/docker目录 |
jenkins集群是必须搭建的,可以提高部署效率,每次只是部署几个job自然不会出现问题,如果一次要执行100个呢?试过就知道有多慢了!
jenkins-master只负责分发构建任务.
搭建之前,我先把几个关键点梳理下:
1 | $ docker pull jenkins/jenkins:lts |
1 | $ docker build -f jenkins-data-dockerfile -t jenkins-data . |
1 | # 创建用户持久化jenkins数据文件的目录及日志目录. |
1 | $ docker run -ti -d \ |
Jenkins->Credentials
这里可以添加root用户,避免一些权限问题.
Jenkins->系统管理->管理节点
指定远程工作目录,如果是用jenkins_slave用户时注意/home/jenkins_home需要jenkins_slave权限.为了方便起见,这里就直接使用root用户
这里我采用的做法是配置job,通过job将.ssh/id_rsa, .ssh/id_rsa.pub,.ssh/known_hosts拷贝到slave中(见rsa_sysnc.sh脚本).
(所有脚本proxy-scripts已同步到git上.)
1 | $ vim jenkins-data-dockerfile |
1 | $ vim jenkins-master-dockerfile |
1 | FROM centos:centos7 |
jenkins-master为较早创建的,其中全局工具配置里jdk路径、maven路径、工作空间路径等都是已经确定好的.在创建jenkins-slave时,需要保持与jenkins-master一致.(或者修改主master的相关路径)
jenkins->系统设置
Jenkins默认的内置工作空间为系统用户的根目录下,其文件夹名称为”.jenkins”.如果设置了JENKINS_HOME则使用.
最近准备迁移公司的svn仓库,记录下自己学习及迁移过程.
GitLab目前提供三个版本:(以下都是docker镜像)
只是为了满足基本使用,以CE版本安装.
运行环境要求
4G内存(最低2G)、4核或8核CPU
启动GitLab是比较简单.但在正式开始使用之前,对它的配置有个全面的了解是很有必要的.
1 | $ docker run -d \ |
--env GITLAB_OMNIBUS_CONFIG=""
该参数可以覆盖容器中GitLab的配置文件/etc/gitlab/gitlab.rb.具体参数详见gitlab.rb.template
使用xlang提供的汉化包.
我使用的gitlab版本是v11.3.5,在xlang的branch中只能找到11-3-stable-zh.所以我先进行了测试,看是否可用.(如何测试?可以按照这篇文章gitlab汉化操作.)
实际上就是使用汉化包的文件替换/opt/gitlab/embedded/service/gitlab-rails/
中的文件
1 | $ cp -rf gitlab-11-3-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/ |
测试暂时没发现问题,就是使用11-3-stable-zh版本的汉化包.
我用的是镜像,难道我将汉化包文件路径映射到容器中吗?好吧,来测试一把.
1 | $ docker run -d \ |
结果悲剧了,一直不断自动重启.这种问题也不是我能解决的,只能先放弃了.
怎么办呢?搜索了一番,找到了twang2218/gitlab-ce-zh提供的Dockerfile.
在twang2218的Dockerfile中找到了使用替换文件的操作
既然twang2218能打包成功,说明Dockerfile是正确的.现在只要替换为我使用的版本和汉化包版本应该同样有效.(他山之石可以攻玉)
在github上直接Forktwang2218/gitlab-ce-zh的代码,再clone到本地.
1 | $ git clone https://github.com/steven-ji/gitlab-ce-zh.git |
修改version.sh文件,增加11.3.5
1 | $ vim version.sh |
使用脚本生成Dockerfile文件.会生成11.3
目录,并且里面有个Dockerfile文件.
1 | $ ./build generate 11.3 |
注:由于xlang提供v11.3.5的汉化包为11.3-stable-zh,所以需要修改Dockerfile文件中的v11.3.5-zh为11.3-stable-zh
关联github即可,具体操作忽略.
1 | $ docker pull jilingjun1014/gitlab-zh:v11.3.5 |
GitLab启动加载的配置文件为gitlab.rb,先创建出来.
1 | $ touch /data/gitlab/config/gitlab.rb |
邮件的配置方式比较多,我的是以阿里云企业邮箱为主.(以下提供链接)
1 | gitlab_rails['gitlab_email_from'] = "username@company.com" |
1 | # ssh到Gitlab的docker容器中. |
不使用内置的nginx时可以不配置.
1 | # 配置文件中添加如下,则访问GitLab的路径就是:http://gitlab.example.com |
配置web访问端口
配置文件external_url
属性指定.(实际上,修改的是容器内的端口)
1 | external_url "http://gitlab.example.com:9080" |
如:访问端口为9080和9443,则在容器启动时,宿主机与容器的映射端口为-p 9443:9443 -p 9080:9080
配置容器ssh端口
配置文件:gitlab_rails['gitlab_shell_ssh_port'] = 9022
GitLab安装时默认绑定安装了一个内置的Nginx.
1 | # set access url |
1 | # 关闭内置nginx |
Git repository数据存储的默认路径是:/var/opt/gitlab/git-data.
注:如果采用了docker镜像方式,在启动时已经指定了宿主机的目录/data/gitlab/data,所以下面的配置可以不用.
1 | # default修改存储目录,alternative增加一个存储目录 |
对配置的所有修改,都需要重载配置并重启.
1 | $ gitlab-ctl reconfigure |
配置文件路径:/Users/jilingjun/Applications/data/gitlab/config
/Users/jilingjun/Applications/data/gitlab/config/ssl
数据存储路径:/Users/jilingjun/Applications/data/gitlab/data
日志存储路径:/Users/jilingjun/Applications/data/log/gitlab
1 | $ vim /Users/jilingjun/Applications/data/gitlab/config/gitlab.rb |
参考之前写的《生成自签名根证书》
1 | $ docker run -d \ |
生产上,有时需要对一些大表(几千万数据)的表中字段进行增、改操作.如果直接操作,很可能对线上有比较大的影响.很多时候,需要在非忙时(大多是凌晨)进行表修改.想想都折磨人.
这里记录使用工具gh-ost(go语言编写)进行表字段修改.
伪装成一个mysql的从节点,读取binary log.
在阿里云上的一台mysql,一张2000w数据的表,需要增加一个int型字段.
使用gh-ost,耗时37分钟.
binlog_format='ROW'
, or let gh-ost
do this for you.gh-ost
will not convert back to STATEMENT
(SBR)所以,gh-ost建议连接到mysql的从节点上.原因如上:如果binary log为statement模式时,gh-ost会强制转换到row模式,且需要自己手动改回statement.(注: gh-ost参数中配置–switch-to-rbr)
表需要存在主键,且主键的值不是null,否则需要在gh-ost参数中添加--allow-nullable-unique-key
.一般表的id都设置为自增主键,通用场景不用考虑这种问题.Read more
如果gh-ost连接的是从节点,需要确保主从节点上两张表的表结构一直.
--gcp
--aliyun-rds
下载完成后解压后直接使用即可.
使用的关键是相关参数的设置及理解.参数的详细信息通过./gh-ost --help
查看即可.这里我也罗列了详见附录gh-ost参数详解.
这里记录下我迁移中设置的相关参数.
阿里云的RDS,需要添加参数–aliyun-rds
无从节点,直接在主节点上执行–allow-on-master
检查mysql的binary log格式(FULL也是支持的).如果是statement,需要添加–switch-to-rbr参数,且最后需要手动将binlog_format设置回statement格式.
1 | $ show variables like 'binlog_format'; |
1 | ./gh-ost \ |
1 | -aliyun-rds |
问题很明显,目标服务器pip即安装了docker-py又安装了docker,解决办法:两者都写在后,重新安装docker-py.
1 | # 查询版本 |