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

  • 连接与跳转
  • 隧道
  • 原理
  • 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.Driverproperty>
<property name="connection.username">客户提供的账户名property>
<property name="connection.password">客户提供的密码property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialectproperty>

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】
  
<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】


<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)


    <filter>
        <filter-name>CORSfilter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilterfilter-class>
        <init-param>
            
            <param-name>cors.allowOriginparam-name>
            <param-value>*param-value>
        init-param>

        <init-param>
            <param-name>cors.supportedMethodsparam-name>
            <param-value>GET,POST,HEAD,PUT,DELETEparam-value>
        init-param>

        <init-param>
            <param-name>cors.supportedHeadersparam-name>
            <param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modifiedparam-value>
        init-param>

        <init-param>
            <param-name>cors.exposedHeadersparam-name>
            <param-value>Set-Cookieparam-value>
        init-param>

        <init-param>
            <param-name>cors.supportsCredentialsparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>

    <filter-mapping>
        <filter-name>CORSfilter-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)换成@


你可能感兴趣的:(share,Linux)