2017年的3月1号之后,Docker的版本命名开始发生变化,同时将CE版本和EE版本进行分开。
区别如下:
Docker社区版(CE):为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。 docker-ce提供了简单的安装和快速的安装,以便可以立即开始开发。docker-ce集成和优化,基础设施。(免费)
Docker企业版(EE):专为企业的发展和IT团队建立谁。docker-ee为企业提供最安全的容器平台,以应用为中心的平台。(付费)
本文 记录 配置
Compose项目来源于之前的fig项目,使用python语言编写,与docker/swarm配合度很高。
Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
docker-compose默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。
2018年2月 提交人:聂启忠 简介:混部技术是指把集群混合起来,将不同类型的任务调度到相同的物理资源上,通过调度,资源隔离等控制手段 , 在保障 SLO 的基础上,充分使用资源能力,极大降低成本。 点评:混部技术已经在阿里开始较大规模应用,而且是作为未来数据中心的标准技术。使用混部技术可以充分利用机器资源,大幅降低成本。我们目前机器使用率普遍不高,使用混部技术正可解决这一问题。 链接
提交人:陈伟星
简介:数据平面开发套件(DPDK)是由Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
点评:dpdk在腾讯内部已经有一部分在使用。在网络密集型的应用中,linux内核协议栈对于数据包的处理速度较低,利用dpdk可以绕过内核协议栈从而提高数据处理性能
域名解析服务
若需要:域名会解析到VIP上,然后通过负载均衡服务将请求分发到业务服务器上。 若不需要:域名将直接解析到服务器上,当服务器宕机,需要域名所属人员通过dns自助服务将服务器从域名解析上删除。
域名解析正确 屏幕输出:PING p.3.local (172.22.132.158) 56(84) bytes of data.
即说明域名已解析到172.22.132.158这个IP上。
域名无法解析 屏幕输出:unknown host p.3.local
即说明域名无法解析。
域名解析不了,我该怎么办? 如果在数据中心(机房),请先检查本机的nameserver设置(正确的地址是:172.16.16.16, 10.16.16.16),以Centos 6为例: cat /etc/resolv.conf 如果设置正确,并运行 dig @172.16.16.16可以解析,请重启本地nscd服务, 以centos 6为例,重启方法: service nscd restart 如果运行dig @172.16.16.16不可以解析,traceroute -n -q 1 172.16.16.16, 将traceroute输出发邮件. 如果在办公网发现解析不了,请联系桌面技术支持; 如果本机没有dig命令, 请安装bind-utils软件包。
检查域名是否可以解析以及解析的IP地址是否正确
如果域名可以解析,并且解析结果正确,请联系网络值班(153-1150-7695)
域名变更多长时间生效? 域名变更生效时间可以通过设置TTL来控制解析记录在DNS缓存上的缓存时间。
通常情况下DNS缓存会在一个TTL周期内更新解析记录,但在公网上也存在不遵守协议规范的情况造成有部分用户解析记录还没有更新。发生这种情况需要联系运营商清缓存。
公网域名和私网域名的区别是什么? 公网域名:指域名以.com, .cn, .hk等结尾的域名;一般由公网用户或办公网用户申请使用。 私网域名:指IDC机房内部使用以.local结尾的域名(例如:baidu.local);主要在机房内部服务调用; 如果机房内部调用使用公网域名,会导致域名解析延迟增加。 注 :申请域名时,请确定域名用途。
将域名绑定到IP的方法:例如:将a.baidu.com绑定到2.2.2.3这个IP上面:
windows操作:
在c:\windows\system32\drivers\etc路径下的hosts文件,添加 2.2.2.3 a.baidu.com.com 内容。
linux操作:执行以下命令:
# vim /etc/hosts 2.2.2.3 a.baidu.com.com
访问流程图见左图
注:
域名测试方法,请参考:怎么判断域名能否正常解析? 域名解析不正常,请参考:域名解析不了,我该怎么办? 域名解析到VIP上,需要到DNS自助服务上查询VIP和IP的对应关系。
如果不包含,即不是VIP(负载均衡)返回的错误,请检查后端服务! 如果包含,目前,VIP(负载均衡)层针对以下几种情况,会返回重定向跳转到首面: 后端服务器健康检查失败 无服务器可用 连接后端服务重试2次都失败 http://www.baidu.com.com/lb=1&err=3 后端服务在接收到请求后,没有响应的情况下异常断开连接 http://www.baidu.com.com/lb=1&err=2 后端服务响应超时(默认超时时间:60秒) http://www.baidu.com.com/lb=1&err=4 如果业务服务器返回错误码,负载均衡服务将错误直接转发到客户端,并不重定向跳转到首页。
经过vip访问时,跳转到了,我们设定的错误页(haproxy.conf)
这种需要: (1)检查vip上有没有这个域名的配置 (没这个域名的acl,也没有default_backend) (2)后端超时时间设置是不是太短(之前是默认15s)等
如果是跳转到了http://www.baidu.com.com ,这种多数是后端nginx(nginx标识:Server: baidu.comWS )没有配置对应域名导致的,需检查后端nginx配置。
导致负载不均的原因:一般是开启了会话保持或长连接。
如果采用的是默认策略,且机器权重(weight)分配合理,请分析访问日志,检查每台服务器在一分钟内的的请求数是否相近:
如果相近,说明VIP(负载均衡)请求分发没有问题; 如果相差很大,请将访问日志分析结果发邮件到dns@baidu.com.com,确认负载均衡策略。 注:机器权重,需要根据机器本身的处理能力来分配。
域名共用VIP会不会有问题? 目前,确认域名是否可以共用VIP,只能通过域名认领的方式来确认,如果认领成功,即表明该域名可以和其他域名共用。
升级到HTTPS,服务器端如何判断请求来自于HTTP还是HTTPS? 对于HTTPS请求,负载均衡层负责完成加解密;
服务器通过读取HTTP请求头中的X-Proto字段判别,值为HTTP即为HTTP用户请求,值为SSL即为HTTPS用户请求。
HTTP请求 X-Proto: HTTP HTTPS请求 X-Proto: SSL
服务器有问题:dns自助-VIP变更,从VIP里摘除。 VIP有问题:dns自助-解析变更,替换VIP。
VIP有没有探活的功能? 负载均衡服务默认对后端服务进行端口探活,周期是30秒。
域名开通HTTPS了吗?怎么开通? 对于新申请的域名,默认就开通了HTTPS;
检查是否开通HTTPS的方法:在浏览器地址栏中,输入以下内容:https://域名/
如果提示连接被重置或跳转到http://www.baidu.com.com/lb=1&err=3 ,请联系dns@baidu.com.com, 且在邮件中注明域名信息。
如何获取客户端的IP?
这两个字段的区别如下:
J-Forwarded-For:该字段是负载均衡看到的客户端IP,若用户请求中带有J-Forwarded-For的话,将会被客户端IP覆盖。 X-Forwarded-For:该字段可能包括多个IP值,如果客户请求中带有这个字段,负载均衡会在这个字段中添加对端的IP地址。
2, 通过Nginx realip module real_ip_header J-Forwarded-For; set_real_ip_from 172.16.0.0/12;
如何获取客户端的端口号? 在Nginx日志格式中,可以通过$http_x_baidu.comlb_client_port 变量来获取X-baidu.comlb-Client-Port 字段的值。
http header中,X-baidu.comlb-Client-Port 字段用来透传客户端的端口。
需要负载层开启https配置么? 默认已经开启
可以在负载层上强制开启http转https么? 负载层只调度,不涉及业务逻辑. 可以在后端nginx配置强制https访问
为什么机器有大量请求来自负载均衡机器? 目前,服务器是挂在VIP后面对外提供服务的。可以通过以下方法获取服务器IP:
可以通过j-forwarded-for拿到调用端真实IP; 通过np.baidu.com.com,输入服务器IP可以查到域名和VIP信息; 如果没有显示域名信息,那么请联系运维。
记录redis 使用命令与redis存储设计
redis实践
Redis 安全配置
Jedis作为redis的最佳客户端,它提供了连接池的特性,“连接池”在通常情况下可以有效的提高应用的通信能力,并且这是一种良好的设计模式。Jedis的连接池设计基于apache commons-pool原生库,仅作了简单的封装;在本文中,我将介绍如何使用jedisPool进行程序设计。
public class PoolTestMain {
public static void main(String[] args) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(32);
config.setMaxIdle(6);
config.setMinIdle(0);
config.setMaxWait(15000);
config.setMinEvictableIdleTimeMillis(300000);
config.setSoftMinEvictableIdleTimeMillis(-1);
config.setNumTestsPerEvictionRun(3);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
config.setTestWhileIdle(false);
config.setTimeBetweenEvictionRunsMillis(60000);//一分钟
config.setWhenExhaustedAction((byte)1);
JedisPool pool = new JedisPool(config,"127.0.0.1",6379,15000,"0123456",12);
Jedis client = pool.getResource();//从pool中获取资源
try{
client.select(0);
client.set("k1", "v1");
System.out.println(client.get("k1"));
}catch(Exception e){
e.printStackTrace();
}finally{
pool.returnResource(client);//向连接池“归还”资源,千万不要忘记。
}
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="32"></property>
<property name="maxIdle" value="6"></property>
<property name="maxWait" value="15000"></property>
<property name="minEvictableIdleTimeMillis" value="300000"></property>
<property name="numTestsPerEvictionRun" value="3"></property>
<property name="timeBetweenEvictionRunsMillis" value="60000"></property>
<property name="whenExhaustedAction" value="1"></property>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
<!-- config -->
<constructor-arg ref="jedisPoolConfig"></constructor-arg>
<!-- host -->
<constructor-arg value="127.0.0.1"></constructor-arg>
<!-- port -->
<constructor-arg value="6379"></constructor-arg>
<!-- timeout -->
<constructor-arg value="15000"></constructor-arg>
<!-- password -->
<constructor-arg value="0123456"></constructor-arg>
<!-- database index -->
<constructor-arg value="12"></constructor-arg>
</bean>
</beans>
##### 2) 测试类:不过在实际的spring环境中,只需要“注入”即可.
public static void main(String[] args) {
//resources/beans.xml
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
JedisPool jedisPool = (JedisPool)context.getBean("jedisPool");
Jedis client = jedisPool.getResource();
try{
client.select(0);
client.set("k1", "v1");
System.out.println(client.get("k1"));
}catch(Exception e){
e.printStackTrace();
}finally{
jedisPool.returnResource(client);//must be
}
}
上述代码,事实上存在设计上尚有改进之处,spring-data中对redis的支持,在编程级别更加轻便,<此方面内容将会在稍后专门介绍.>
记录redis 使用命令与redis存储设计