您的位置:首页 > 数据库

通过隧道连接内网的PostgreSQL以及跨域与部署方案

2016-07-27 21:13 465 查看
连接与跳转

隧道

原理

postgresql指令

postgresql修改数据库存放目录

项目跨域

Ajax跨域

部署

拓展

一般公司都会在集群(eg.Hadoop/Spark集群)上分配许多节点IP,在外网的基础上做的局域网由许多内网(局域网)IP构成。内网相对于互联网世界而言,是虚设的,在公共网络中找不到。鉴于此,为了保护重要数据,会在外网设置一个集群登录入口节点,只具备登录权限,用来跳转到其他节点IP以实现多路复用。

连接与跳转

ssh 账户@外网ip
->通过外网进入登录节点

password...


ssh 内网ip
or
ssh 账户@内网ip
->通过ssh,选择跳转到哪个虚拟机

su root
->进入虚拟机后,切换root用户以便切换到仅对数据库有权限的账户dbuser

su dbuser
->切换成dbuser,进行数据库操作

隧道

①为了给后台项目和Navicat等数据库工具提供通道连接到客户提供的数据库服务器(在局域网中,只能通过外网找到),需要用隧道做一个映射;

②可在XShell中,进行
查看
-
隧道窗格
-
添加
转移规则;

③紧接着,在本机localhost中找一个没有被占用的端口(eg.3280),源:localhost:3280 –映射–> 局域网IP:5432;

原理

比如客户提供给我们一台postgresql数据库服务器,这款软件的默认端口是5432,但是在局域网中它仅是被分配出来的虚拟机,如果需要通过其他网络连接进来,需要在客户的外网开辟一个端口(不一定为5432)来映射局域网中的这台postgresql数据库。

但往往这种做法是不被采用的,因为它可能会泄露客户的私密数据。

(注:没有在登录节点映射的话是不能外网登录的,建议数据库不要开外网端口)

想要连接这台在客户那里的局域网服务器,可以用我们前面建立的隧道,而不必在客户外网开辟端口映射。

项目的配置文件:

<property name="connection.url">jdbc:postgresql://localhost:3280/数据库名(客户提供的内网数据库名称)</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.username">客户提供的账户名</property>
<property name="connection.password">客户提供的密码</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>


Navicat的连接

①下载
Navicat for PostgreSQL


②新建连接;

③在常规里面填写如下信息:

主机名或IP:localhost

端口:3280

初始数据库:postgres(默认创建)or具体的数据库名称

用户名:客户提供的账户名

密码:客户提供的密码

postgresql指令

service postgresql-9.4 restart
-> 重启postgresql指令,但service命令都是要root权限,所以一般很少会这么重启;

export PGHOME=/opt/PostgreSQL/9.4
export PATH=$PGHOME/bin:$PATH
export PGDATA=$PGHOME/data
export LD_LIBRARY_PATH=$PGHOME/lib
#export完环境变量之后,才能使用下面的命令
pg_ctl stop
pg_ctl start
psql #进入postgresql的命令


没有设置环境变量,也可通过这条指令进入数据库:

bin/psql -U postgres


postgresql修改数据库存放目录

①进入/opt/PostgreSQL/9.4/data/postgresql.conf,修改postgresql.conf配置文件中数据库存放的目录:
data_directory = '/data/pg_data'


②进入/opt/PostgreSQL/9.4/data中,可以看到,有许多文件和文件夹。

base pg_clog pg_hba.conf pg_log pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION postgresql.auto.conf postmaster.opts

global pg_dynshmem pg_ident.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_xlog postgresql.conf

③把所有文件拷贝到新指向的路径
cp -r 文件1,文件2,文件3... /data/pg_data


④重启生效。

项目跨域

公司的局域网中,前后端开发隔离,在开发测试阶段可以选择本机开启项目跨域,供局域网的其他主机,即前端开发人员进行API接口的调用。

所以我们可以在tomcat中配置跨域的信息,以让局域网中的小伙伴们访问后台项目。

在….apache-tomcat-8.0.35\wtpwebapps\ROOT目录底下,放入clientaccesspolicy.xml和crossdomain.xml;

【clientaccesspolicy.xml】
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

【crossdomain.xml】
<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="*" />

</cross-domain-policy>


Ajax跨域

方法一:

Jersey框架提供Web Service的API,作为控制层,吐出JSON供前台(网页、APP等)使用。

@GET
@Path("year_month")
@Produces(MediaType.TEXT_PLAIN)//输出"text/plain"的介质类型
public Response getInfo() {
...
return Response.ok(JSONArray.toString())
.header("Access-Control-Allow-Origin", "*").build();//把JSON格式的对象或数组转换为字符串,然后建立响应给前台的一个报文头,表示允许任意IP访问服务端内容。
}


方法二:

在web.xml中配置过滤器,该过滤器使用现成的过滤方案(cors-filter-1.7.jar、java-property-utils-1.9.jar)

<!-- 服务器端解决跨域问题(ajax跨域),该方法与具体的框架实现无关 (需要两个jar包:cors-filter-1.7.jar、java-property-utils-1.9.jar) -->
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<!--配置授信的白名单域名 -->
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>

<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET,POST,HEAD,PUT,DELETE</param-value>
</init-param>

<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modified</param-value>
</init-param>

<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>

<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


部署

①假如外网机器IP为A,数据库服务器为B1,Web服务器为B2;

②在B2上装Tomcat,端口号为8080,要把端口映射到外网A,才能供外网的访客访问。即A:任意一个没被占用端口->B2:8080

③因为B1和B2是属于同一个网段(内网),所以B2的项目可以直接访问内网的B1数据。

④在部署项目之前,只需要改数据库配置文件的ip和端口为:
A:端口
即可.

⑤用ftp传文件,发现tomcat目录并没有权限访问,这时候可以先传到外网的目录。然后通过外网登录节点,进入到指定文件夹。

scp 项目war包 用户名@IP:Tomcat路径/webapps


然后再进入B2查看,即可看到新上传的项目。

拓展

“腾讯内部数据存储主要是MYSQL,但是数据分析主要是HADOOP+PGSQL”,由此可见postgresql对数据分析的项目至关重要,它处理百万级千万级的数据量是游刃有余的,本身的功能也很强大。

可参看:

http://www.zhihu.com/question/20010554

http://blog.csdn.net/james_wade63/article/details/50772041

作者: @nanphonfy

Email:
nanphonfy (Nfzone) gmail.com 请将(Nfzone)换成@
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: