背景:

  公司使用阿里云的云数据库MongoDB。基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试。

  阿里云官方推荐使用rinetd搭建跳板系统,实现公网访问云mongo。使用过程中,发现,python程序在使用过程中如果没有正确释放连接,即使python程序退出后,该mongo连接仍然被rinetd占用。曾出现调用该地址的python程序全部退出后,rinetd仍占用100多个连接,导致云mongo可用连接数不足。此时,需要重启rinetd方可释放被占用的连接。

  最终使用本机ssh连接阿里云ECS,再从该主机使用私网连接到mongo的方法,实现云mongo公网访问。这种方法可以使开发环境中的robomongo连接到mongo。

python连接云mongo:

  1 依赖

python -m pip install sshtunnel==0.1.2

  2 demo

# -*- coding:utf-8 -*-
from __future__ import unicode_literals import pymongo
from sshtunnel import SSHTunnelForwarder class AliyunMongoDebug(object):
def __init__(self):
self._record = {} def get_aliyun_mongo_client(self, only_read=True):
# 跳板机参数
ecs_host = "<ecs ip>"
ecs_user = "<ecs user>"
ecs_password = "<ecs password>" # 云mongo 配置
aliyun_mongo_master_host = "<mongo 副本集 主服务器>"
aliyun_mongo_slave_host = "<mongo 副本集 副本>"
aliyun_mongo_database = "<mongo 数据库>"
aliyun_mongo_account = "<mongo 账号>"
aliyun_mongo_password = "<mongo 密码>" host = aliyun_mongo_slave_host if only_read else aliyun_mongo_master_host
server = SSHTunnelForwarder(
(ecs_host, 22),
ssh_password=ecs_password,
ssh_username=ecs_user,
remote_bind_address=(host, 3717)) server.start() client = pymongo.MongoClient('127.0.0.1', server.local_bind_port)
mongo_database = client[aliyun_mongo_database]
mongo_database.authenticate(aliyun_mongo_account, aliyun_mongo_password) self._record[client] = server return client def return_aliyun_mongo_client(self, client):
if client in self._record:
server = self._record.pop(client)
else:
server = None client.close()
if server:
server.close() if __name__ == '__main__':
mongo_debug_manager = AliyunMongoDebug()
mongo_client = None
try:
mongo_client = mongo_debug_manager.get_aliyun_mongo_client(only_read=False)
mongo_client["Test"]["ssh_test"].insert({"msg": "Hello World!"})
finally:
if mongo_client:
mongo_debug_manager.return_aliyun_mongo_client(mongo_client)

使用sshtunnel实现python公网连接阿里云mongo服务器的更多相关文章

  1. 购买阿里云ECS+安装宝塔面板+Mac下怎么连接阿里云ECS服务器

    1.购买阿里云ECS 2.重置实例密码 这个有点对用户不友好,实际意思就是设置服务器的root登录密码 3.配置安全组放行端口 因为服务器需要从宝塔网站download安装包,包括一些常用的服务比如S ...

  2. 使用Navicat远程连接阿里云ECS服务器上的MySQL数据库

    一.必须给服务器的安全组规则设置端口放行规则,在管理控制台中设置: 之后填写配置,授权对象是授权的IP,其中0.0.0.0/0为所有IP授权,之后保存; 二.Navicat使用的配置 在编辑连接处,要 ...

  3. Linux学习1-Xshell连接阿里云ECS服务器

    前言 前段时间双十一活动,头脑发热买了个阿里云的服务器,买了后也不知道怎么用一直放着在.最近想起来,于是看了下阿里云ECS的相关资料. 由于平常一直用xshell比较多,不太习惯阿里云的ESC终端连接 ...

  4. 用Navicat连接阿里云ECS服务器上的MySQL数据库

    今天用navtive连接阿里云服务器(Linux)的数据库时,老是连接不上,并且报10060错误,要通过以下两个步骤解决: 1.先进入linux连接数据库并输入密码: mysql -uroot -p ...

  5. 使用Navicat连接阿里云ECS服务器上的MySQL数据库

    一.首先要mysql授权 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的mysql数据库密码' WITH GR ...

  6. 本地Windows远程桌面连接阿里云Ubuntu服务器

    本地Windows远程桌面连接阿里云Ubuntu 16.04服务器: 1.目的:希望通过本地的Windows远程桌面连接到阿里云的Ubuntu服务器,通过远程桌面图形界面的方式操作服务器. 2.条件: ...

  7. 通过公网连接阿里云redis,rinetd

    目前云数据库 Redis 需要通过 ECS 的内网进行连接访问.如果您本地需要通过公网访问云数据库 Redis,可以在 ECS Linux 云服务器中安装 rinetd 进行转发实现. 1.在云服务器 ...

  8. Linux------使用Xfpt6连接阿里云ECS服务器

    1.安装Xftp6,直接下一步到安装完成就可以了 2.新建文件传输 3.新建会话 4.填写会话信息 5.点击“连接”即可

  9. VNC远程连接阿里云Linux服务器 图形界面

    VNC 简介: VNC,全称:Virtual Network Computing,即虚拟网络计算机:分客户端和服务端,即VNC Viewer和VNC Server.它是一款远程控制的软件,一般用于远程 ...

随机推荐

  1. ARMCortex系列仿真调试器

    主流的调试工具1.  J-LinkJ-Link是最著名的ARM开发调试工具,J-Link由SEGGER公司生产.提供对市面上几乎所有ARM内核芯片的支持.目前最新版本的J-Link产品为V8,支持JT ...

  2. WPS, 破解WPA/WPA2密钥的捷径

    1.关于WPS(WIFI保护设置) WPS(WIFI保护设置)主要致力于简化无线网络的安全加密设置. 传统方式下,用户新建一个无线网络时,必须在接入点手动设置网络名(SSID)和安全密钥,然后在客户端 ...

  3. 时间轴QTimeLine

    一个动画由多张静态图片组成,每一张静态图片为一帧.每隔一定时间显示一帧,如果时间间隔非常短的话,那这些静态图片就会构成一个连续影像,动画由此而来.QTimeLine提供了用于控制动画的时间轴,它在实现 ...

  4. rest framework错误笔记——身份验证和权限

    按照官网教程(http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/)走到最后一步验证时,命令窗 ...

  5. pygame将文字保存为图片形式

    近期自学了点小基础,分享一下用pygame制作字体图片的方法:   # 将文字保存为图片形式 import pygame import sys pygame.init()   导入字体包,也可以调用系 ...

  6. class特性

    每个HTML元素都可以附带一个class特性.有时候,你希望有一种方法可以指定多个元素并将这些元素和页面上的其他元素区分出来,而不是单独指定文档中的某个元素. <!DOCTYPE html> ...

  7. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

  8. 用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)

    首先我们需要搭建一个空的项目,当然xcode6.0以后不支持直接创建空项目,所以我们需要在系统生成项目之后,删除xcode自动给你生成的控制器和storyboard,另外需要在Main Interfa ...

  9. RNN(3) ------ “blog:RNN学习之路”

    博客链接:http://blog.csdn.net/yangyangyang20092010/article/details/50374289 Recurrent Neural Network 学习之 ...

  10. 网站遭遇CC及DDOS攻击紧急处理方案

    检测访问是否是CC攻击的命令: 80口为网站的访问端口,可以根据实际情况进行修改 # netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: ' ...