通過隧道連接內網的PostgreSQL以及跨域與部署方案

一般公司都會在集羣(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)換成@


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章