设置转发和代理访问阿里MongoDB云数据库

采菊篱下 发表了文章 • 0 个评论 • 552 次浏览 • 2017-03-09 21:34 • 来自相关话题

摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方案。

环境架构说明
环境说明:
包含公网 + 私网ip的ECS
公网IP地址:121.196.197.64内网IP地址:10.0.0.110
 
MongoDB云数据库
节点1:s-uf6745fa496c28d4.mongodb.rds.aliyuncs.com:3717(Primary,通过ping域名来获取对应的ip,获取到ip地址10.0.0.119,因域名对应的ip可能发生变化,在生产环境切勿直接指定ip,可以直接用域名)节点2:s-uf624ab1be981c34.mongodb.rds.aliyuncs.com:3717
 
结构示意图如下:




目标:
通过121.196.197.64:27017能访问到10.0.0.119:3717提供的MongoDB云服务。

方案一:Iptables实现
利用iptables的nat机制,可以方便的实现请求转发,首先需要ECS开启包转发的支持echo 1 > /proc/sys/net/ipv4/ip_forward配置转发规则iptables -t nat -A PREROUTING -d 121.196.197.64 -p tcp --dport 27017 -j DNAT --to-destination 10.0.0.119:3717
iptables -t nat -A POSTROUTING -d 10.0.0.119 -p tcp --dport 3717 -j SNAT --to-source 10.0.0.110此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上,如果你需要严格限制,只允许你办公区公网ip地址访问的话,添加第一条规则的时候还可以增加一个 -s 参数,限制访问源!

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,而不能按复制集的方式访问。mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo
方案二:Harpoxy四层代理实现
haproxy支持tcp(四层)、http(七层)2种转发模式,类似于iptables,我们也可以利用haproxy来实现公网访问MongoDB云数据库。

修改/etc/haproxy/haproxy.cfg配置文件内容,根据默认的配置文件稍作修改,主要配置tcp转发模式、前端、后端服务的地址信息。(haproxy版本为1.5.4)global
log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
# 使用tcp转发模式
mode tcp
log global
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

# 前端地址信息, 121.196.197.64:27017
frontend main 121.196.197.64:27017
default_backend app

# 后端地址信息,10.0.0.119:3717
backend app
balance roundrobin
server app1 10.0.0.119:3717 check启动haproxyhaproxy -f /etc/haproxy/haproxy.cfg此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上。

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,也不能按复制集的方式访问。mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo以上服务同样适用于RDS、Redis云数据库,但切记仅能用于测试开发环境,生产环境请做好安全心里准备! 查看全部
AliyunMongodb.png


摘要:基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试,但是开发就是要测试性能,没有办法作为一个运维你必须想办法了,本文介绍能让用户通过公网访问MongoDB云数据库的方案。


环境架构说明
环境说明:
包含公网 + 私网ip的ECS
  • 公网IP地址:121.196.197.64
  • 内网IP地址:10.0.0.110

 
MongoDB云数据库
  • 节点1:s-uf6745fa496c28d4.mongodb.rds.aliyuncs.com:3717(Primary,通过ping域名来获取对应的ip,获取到ip地址10.0.0.119,因域名对应的ip可能发生变化,在生产环境切勿直接指定ip,可以直接用域名)
  • 节点2:s-uf624ab1be981c34.mongodb.rds.aliyuncs.com:3717

 
结构示意图如下:
MongodbArch.png

目标:
通过121.196.197.64:27017能访问到10.0.0.119:3717提供的MongoDB云服务。

方案一:Iptables实现
利用iptables的nat机制,可以方便的实现请求转发,首先需要ECS开启包转发的支持
echo 1 > /proc/sys/net/ipv4/ip_forward
配置转发规则
iptables -t nat -A PREROUTING -d 121.196.197.64 -p tcp --dport 27017 -j DNAT --to-destination 10.0.0.119:3717
iptables -t nat -A POSTROUTING -d 10.0.0.119 -p tcp --dport 3717 -j SNAT --to-source 10.0.0.110
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上,如果你需要严格限制,只允许你办公区公网ip地址访问的话,添加第一条规则的时候还可以增加一个 -s 参数,限制访问源!

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,而不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo

方案二:Harpoxy四层代理实现
haproxy支持tcp(四层)、http(七层)2种转发模式,类似于iptables,我们也可以利用haproxy来实现公网访问MongoDB云数据库。

修改/etc/haproxy/haproxy.cfg配置文件内容,根据默认的配置文件稍作修改,主要配置tcp转发模式、前端、后端服务的地址信息。(haproxy版本为1.5.4)
global
log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
# 使用tcp转发模式
mode tcp
log global
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

# 前端地址信息, 121.196.197.64:27017
frontend main 121.196.197.64:27017
default_backend app

# 后端地址信息,10.0.0.119:3717
backend app
balance roundrobin
server app1 10.0.0.119:3717 check
启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg
此时你就能在任意能连通公网的机器上连接121.196.197.64:27017访问MongoDB云服务,所有的请求都会转发到10.0.0.119:3717上。

需要注意的是,此时访问121.196.197.64:27017只能以单节点的方式直连,也不能按复制集的方式访问。
mongo --host 121.196.197.64:27017 --authenticationDatabase admin -uroot -pxxoo
以上服务同样适用于RDS、Redis云数据库,但切记仅能用于测试开发环境,生产环境请做好安全心里准备!

为什么Docker使用-d参数后台运行容器退出了?

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 597 次浏览 • 2017-03-09 20:35 • 来自相关话题

Docker容器启动过程

Something 发表了文章 • 0 个评论 • 507 次浏览 • 2017-03-09 15:02 • 来自相关话题

下面让我们看看一个Docker容器它启动过程中,背后到底做了什么?docker run -i -t ubuntu /bin/bash输入上面这行命令,启动一个ubuntu容器时,到底发生了什么?
 
大致过程可以用下图描述:




首先系统要有一个docker daemon的后台进程在运行,当刚才这行命令敲下时,发生了如下动作:
docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器,docker daemon会向host os(即:linux)请求创建容器linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源)docker daemon请检查本机是否存在docker镜像文件(可以简单理解为操作系统安装光盘),如果有,则加载到容器中(即:光盘插入裸机,准备安装操作系统)将镜像文件加载到容器中(即:裸机上安装好了操作系统,不再是裸机状态)
 
最后,我们就得到了一个ubuntu的虚拟机,然后就可以进行各种操作了。
 
 
如果在第4步检查本机镜像文件时,发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站)去联网下载,下载回来后,再进行装载到容器的动作,即下图所示:




另外官网有一张图也很形象的描述了这个过程:




原文地址:http://www.cnblogs.com/yjmyzz/p/docker-container-start-up-analysis.html 

参考文章:
https://www.gitbook.com/book/joshhu/docker_theory_install/details  
https://docs.docker.com/engine/introduction/understanding-docker/  查看全部
下面让我们看看一个Docker容器它启动过程中,背后到底做了什么?
docker run -i -t ubuntu /bin/bash
输入上面这行命令,启动一个ubuntu容器时,到底发生了什么?
 
大致过程可以用下图描述:
dockerflow.png

首先系统要有一个docker daemon的后台进程在运行,当刚才这行命令敲下时,发生了如下动作:
  1. docker client(即:docker终端命令行)会调用docker daemon请求启动一个容器,
  2. docker daemon会向host os(即:linux)请求创建容器
  3. linux会创建一个空的容器(可以简单理解为:一个未安装操作系统的裸机,只有虚拟出来的CPU、内存等硬件资源)
  4. docker daemon请检查本机是否存在docker镜像文件(可以简单理解为操作系统安装光盘),如果有,则加载到容器中(即:光盘插入裸机,准备安装操作系统)
  5. 将镜像文件加载到容器中(即:裸机上安装好了操作系统,不再是裸机状态)

 
最后,我们就得到了一个ubuntu的虚拟机,然后就可以进行各种操作了。
 
 
如果在第4步检查本机镜像文件时,发现文件不存在,则会到默认的docker镜像注册机构(即:docker hub网站)去联网下载,下载回来后,再进行装载到容器的动作,即下图所示:
dockerload.png

另外官网有一张图也很形象的描述了这个过程:
dockerfollow.png

原文地址:http://www.cnblogs.com/yjmyzz/p/docker-container-start-up-analysis.html 

参考文章:
https://www.gitbook.com/book/joshhu/docker_theory_install/details  
https://docs.docker.com/engine/introduction/understanding-docker/ 

Elasticsearch怎么备份和迁移数据

采菊篱下 回复了问题 • 3 人关注 • 2 个回复 • 1744 次浏览 • 2017-03-03 17:02 • 来自相关话题

在Docker容器中计划任务不能执行?

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 560 次浏览 • 2017-02-24 13:25 • 来自相关话题

如何执行一个已经运行Docker容器内的脚本?

采菊篱下 回复了问题 • 3 人关注 • 4 个回复 • 622 次浏览 • 2017-03-09 20:17 • 来自相关话题

OVM-V1.5 版正式发布,新增对ESXI节点的支持

maoliang 发表了文章 • 0 个评论 • 557 次浏览 • 2017-02-21 17:13 • 来自相关话题

OVM-V1.5版本正式发布,此版本新增对Esxi节点的支持,目前OVM混合虚拟化平台已经能够统一管理KVM、ESXI、Docker三种类型的底层虚拟化技术。同时也提升了OVM的易用性,管理平台和计算节点 iso镜像合并到一个镜像里,安装方面同时新增u盘安装,提高工作效率。


OVM是国内首款、完全免费、企业级——混合虚拟化管理平台,是从中小企业目前的困境得到启发,完全基于国内企业特点开发,更多的关注国内中小企业用户的产品需求。


OVM-V1.5虚拟化管理平台功能变动清单:

 

Ø  新增对VMwareEsxi节点的支持


Ø  合并管理平台和计算节点镜像为一个iso


Ø  支持通过USB安装OVM


Ø  修复其他若干bug

 

详细信息


1、新增对VMwareEsxi节点的支持

 

OVM-V 1.5版本新增对Esxi节点的支持,支持将现有的VMwareEsxi计算节点直接添加到OVM虚拟化管理平台进行管理,并支持将原有Esxi虚拟机导入到平台进行统一管理。目前OVM混合虚拟化平台已经能够统一管理KVM、ESXI、Docker三种类型的底层虚拟化技术。

 

2.   管理平台和计算节点 iso镜像合并


OVM-V 1.5版本将管理平台和计算节点原来的两个iso镜像合并到一个iso镜像里面,在安装过程中提供选项来安装不同的服务,此次的合并不仅方便了大家的下载,也提升了OVM的易用性。



3.   支持通过USB方式安装,提高工作效率

OVM1.5版本镜像支持通过USB方式进行安装,极大提高了一线运维人员的工作效率。

 

获得帮助

下载请访问OVM社区官网:51ovm.com

使用过程中遇到什么问题及获得下载密码,加入OVM社区qq官方交流群:22265939

  查看全部
OVM-V1.5版本正式发布,此版本新增对Esxi节点的支持,目前OVM混合虚拟化平台已经能够统一管理KVM、ESXI、Docker三种类型的底层虚拟化技术。同时也提升了OVM的易用性,管理平台和计算节点 iso镜像合并到一个镜像里,安装方面同时新增u盘安装,提高工作效率。


OVM是国内首款、完全免费、企业级——混合虚拟化管理平台,是从中小企业目前的困境得到启发,完全基于国内企业特点开发,更多的关注国内中小企业用户的产品需求。


OVM-V1.5虚拟化管理平台功能变动清单:

 

Ø  新增对VMwareEsxi节点的支持


Ø  合并管理平台和计算节点镜像为一个iso


Ø  支持通过USB安装OVM


Ø  修复其他若干bug

 

详细信息


1、新增对VMwareEsxi节点的支持

 

OVM-V 1.5版本新增对Esxi节点的支持,支持将现有的VMwareEsxi计算节点直接添加到OVM虚拟化管理平台进行管理,并支持将原有Esxi虚拟机导入到平台进行统一管理。目前OVM混合虚拟化平台已经能够统一管理KVM、ESXI、Docker三种类型的底层虚拟化技术。

 

2.   管理平台和计算节点 iso镜像合并


OVM-V 1.5版本将管理平台和计算节点原来的两个iso镜像合并到一个iso镜像里面,在安装过程中提供选项来安装不同的服务,此次的合并不仅方便了大家的下载,也提升了OVM的易用性。



3.   支持通过USB方式安装,提高工作效率

OVM1.5版本镜像支持通过USB方式进行安装,极大提高了一线运维人员的工作效率。

 

获得帮助

下载请访问OVM社区官网:51ovm.com

使用过程中遇到什么问题及获得下载密码,加入OVM社区qq官方交流群:22265939

 

Java程序处理中文乱码

回复

chris 发起了问题 • 1 人关注 • 0 个回复 • 556 次浏览 • 2017-02-16 23:40 • 来自相关话题

Docker挂载主机目录出现Permission denied状况分析

采菊篱下 发表了文章 • 0 个评论 • 1077 次浏览 • 2017-02-16 23:10 • 来自相关话题

今天用脚本部署一个Docker私有化环境,挂载宿主机目录出现Permission denied的情况,导致服务启动失败,具体情况如下:








问题原因及解决办法:
原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
1、在运行容器的时候,给容器加特权,及加上 --privileged=true 参数docker run -i -t -v /data/mysql/data:/data/var-3306 --privileged=true b0387b8279d4 /bin/bash -c "/opt/start_db.sh"2、临时关闭selinuxsetenforce 03、添加selinux规则,改变要挂载的目录的安全性文本:# 更改安全性文本的格式如下
chcon [-R] [-t type] [-u user] [-r role] 文件或者目录

选顷不参数:
-R :连同该目录下癿次目录也同时修改;
-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u;
-r :后面街觇色,例如 system_r

[root@localhost Desktop]# chcon --help
Usage: chcon [OPTION]... CONTEXT FILE...
or: chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
or: chcon [OPTION]... --reference=RFILE FILE...
Change the SELinux security context of each FILE to CONTEXT.
With --reference, change the security context of each FILE to that of RFILE.

Mandatory arguments to long options are mandatory for short options too.
--dereference affect the referent of each symbolic link (this is
the default), rather than the symbolic link itself
-h, --no-dereference affect symbolic links instead of any referenced file
-u, --user=USER set user USER in the target security context
-r, --role=ROLE set role ROLE in the target security context
-t, --type=TYPE set type TYPE in the target security context
-l, --range=RANGE set range RANGE in the target security context
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's security context rather than specifying
a CONTEXT value
-R, --recursive operate on files and directories recursively
-v, --verbose output a diagnostic for every file processed

The following options modify how a hierarchy is traversed when the -R
option is also specified. If more than one is specified, only the final
one takes effect.

-H if a command line argument is a symbolic link
to a directory, traverse it
-L traverse every symbolic link to a directory
encountered
-P do not traverse any symbolic links (default)

--help display this help and exit
--version output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'chcon invocation'在主机中修改/data/mysql/data目录的安全性文档[root@localhost Desktop]# chcon -Rt svirt_sandbox_file_t /data/mysql/data在docker中就可以正常访问该目录下的相关资源了。
卷权限参考:https://yq.aliyun.com/articles/53990  查看全部
Docker.jpeg

今天用脚本部署一个Docker私有化环境,挂载宿主机目录出现Permission denied的情况,导致服务启动失败,具体情况如下:
errorqx.png

cerror.png

问题原因及解决办法:
原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:
1、在运行容器的时候,给容器加特权,及加上 --privileged=true 参数
docker run -i -t -v /data/mysql/data:/data/var-3306 --privileged=true b0387b8279d4 /bin/bash -c "/opt/start_db.sh"
2、临时关闭selinux
setenforce 0
3、添加selinux规则,改变要挂载的目录的安全性文本:
# 更改安全性文本的格式如下
chcon [-R] [-t type] [-u user] [-r role] 文件或者目录

选顷不参数:
-R :连同该目录下癿次目录也同时修改;
-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u;
-r :后面街觇色,例如 system_r

[root@localhost Desktop]# chcon --help
Usage: chcon [OPTION]... CONTEXT FILE...
or: chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
or: chcon [OPTION]... --reference=RFILE FILE...
Change the SELinux security context of each FILE to CONTEXT.
With --reference, change the security context of each FILE to that of RFILE.

Mandatory arguments to long options are mandatory for short options too.
--dereference affect the referent of each symbolic link (this is
the default), rather than the symbolic link itself
-h, --no-dereference affect symbolic links instead of any referenced file
-u, --user=USER set user USER in the target security context
-r, --role=ROLE set role ROLE in the target security context
-t, --type=TYPE set type TYPE in the target security context
-l, --range=RANGE set range RANGE in the target security context
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's security context rather than specifying
a CONTEXT value
-R, --recursive operate on files and directories recursively
-v, --verbose output a diagnostic for every file processed

The following options modify how a hierarchy is traversed when the -R
option is also specified. If more than one is specified, only the final
one takes effect.

-H if a command line argument is a symbolic link
to a directory, traverse it
-L traverse every symbolic link to a directory
encountered
-P do not traverse any symbolic links (default)

--help display this help and exit
--version output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'chcon invocation'
在主机中修改/data/mysql/data目录的安全性文档
[root@localhost Desktop]# chcon -Rt svirt_sandbox_file_t /data/mysql/data
在docker中就可以正常访问该目录下的相关资源了。
卷权限参考:https://yq.aliyun.com/articles/53990 

Kafka Consumer客户端启动报错

采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 660 次浏览 • 2017-02-11 18:50 • 来自相关话题