sharding 되어 있지 않은(shard key 설정이 안된) 데이타가 들어 있는 collection에 shard key 를 설정 하려고 했다.

 

명령어 :  sh.shardCollection("데이타베이스.컬렉션명",{_id:"hashed"});

결과 :

{
"ok" : 0,
"errmsg" : "Please create an index that starts with the proposed shard key before sharding the collection",
"code" : 72,
"codeName" : "InvalidOptions",
"operationTime" : Timestamp(1557813436, 4),
"$clusterTime" : {
"clusterTime" : Timestamp(1557813436, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}

 

그래서 index 2개를 생성 하였다.

db.컬렉션명.createIndex({_id:1});
db.컬렉션명.createIndex({_id:"hashed"});

 

그리고 실행 

sh.shardCollection("데이타베이스.컬렉션명",{_id:"hashed"});

하니 잘되네~시간이 좀 걸리지만 점점 데이타가 맞춰진다.

 

Posted by 복태아빠
,

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ MONGODB REPLICA SET AND SHARDING GUIDE
+ h/w 1개에 모두 설치. 예제. h/w 가 여러대이면, ip / port 만 바끼면됨.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

conf 파일 문법, YML -  띠어쓰기 간격 중요.

#CONTENTS
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.1 rs0/mongod1          port:30001
1.1.2 rs0/mongod2          port:30002
1.1.3 rs0/arbiter          port:30003
1.1.4 rs0 replica set 설정
1.1.5 rs0 Arbiter 추가
1.2 rs1 구성.
1.2.1 rs1/mongod1          port:30004
1.2.2 rs1/mongod2          port:30005
1.2.3 rs1/arbiter          port:30006
1.2.4 rs1 replica set 설정
1.2.5 rs1 Arbiter 추가
1.3 rs2 구성.
1.3.1 rs2/mongod1          port:30007
1.3.2 rs2/mongod2          port:30008
1.3.3 rs2/arbiter          port:30009
1.3.4 rs2 replica set 설정
1.3.5 rs2 Arbiter 추가
2.CONFIG SERVER 구성.
2.1 cs0 구성          port:30010
2.2 cs1 구성          port:30020
2.3 cs2 구성          port:30030
2.4 config server replica set 설정
3.MONGOS ROUTER 구성.
3.1 mongos 구성.          port:30000
3.2 sharding 설정.
4.전체 start/stop

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.1 rs0/mongod1
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs0/mongod1/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs0/mongod1/mongod1.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs0/mongod1"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs0_mongod1.pid"
net:
   port: 30001
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs0"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.1 rs0/mongod2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs0/mongod2/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs0/mongod2/mongod2.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs0/mongod2"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs0_mongod2.pid"
net:
   port: 30002
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs0"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.3 rs0/arbiter
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs0/arbiter/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs0/arbiter/arbiter.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs0/arbiter"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs0_arbiter.pid"
net:
   port: 30003
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs0"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 #실행 rs0
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/mongod1/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/mongod2/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/arbiter/mongod.conf &
 
 #shutdown
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/mongod1/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/mongod2/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/arbiter/mongod.conf
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.4 rs0 replica set 설정
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #rs0 replica Set 설정.
 #/home/mongo/mongodb/bin/mongo localhost:30001/admin 접속.(primary 만하면됨)
 #arbiter 를 제외
 rs.initiate(
           {
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "127.0.0.1:30001" },
         { _id: 1, host : "127.0.0.1:30002" }
      ]
   })

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.1 rs0 구성.
1.1.5 rs0 Arbiter 추가
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #primary shell 에서 Arbiter 추가.
 #/home/mongo/mongodb/bin/mongo localhost:30001/admin 접속.(primary 만하면됨)
  >rs.addArb("127.0.0.1:30003")
  >rs0:PRIMARY> rs.status()   
================================================================================rs0 구성 완료========================================================


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs1 구성.
1.2.1 rs1/mongod1
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs1/mongod1/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs1/mongod1/mongod1.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs1/mongod1"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs1_mongod1.pid"
net:
   port: 30004
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs1"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs1 구성.
1.2.1 rs1/mongod2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs1/mongod2/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs1/mongod2/mongod2.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs1/mongod2"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs1_mongod2.pid"
net:
   port: 30005
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs1"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs1 구성.
1.2.3 rs1/arbiter
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs1/arbiter/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs1/arbiter/arbiter.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs1/arbiter"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs1_arbiter.pid"
net:
   port: 30006
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs1"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 #실행 rs1
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/mongod1/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/mongod2/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/arbiter/mongod.conf &
 
 #shutdown
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/mongod1/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/mongod2/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/arbiter/mongod.conf
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs1 구성.
1.2.4 rs1 replica set 설정
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #rs1 replica Set 설정.
 #/home/mongo/mongodb/bin/mongo localhost:30004/admin 접속.(primary 만하면됨)
 #arbiter 를 제외
 rs.initiate(
           {
      _id: "rs1",
      version: 1,
      members: [
         { _id: 0, host : "127.0.0.1:30004" },
         { _id: 1, host : "127.0.0.1:30005" }
      ]
   })

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs1 구성.
1.2.5 rs1 Arbiter 추가
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #primary shell 에서 Arbiter 추가.
 #/home/mongo/mongodb/bin/mongo localhost:30004/admin 접속.(primary 만하면됨)
  >rs.addArb("127.0.0.1:30006")
  >rs1:PRIMARY> rs.status()
  ================================================================================rs1 구성 완료========================================================


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.3 rs2 구성.
1.3.1 rs3/mongod1
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs2/mongod1/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs2/mongod1/mongod1.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs2/mongod1"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs2_mongod1.pid"
net:
   port: 30007
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs2"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.3 rs2 구성.
1.3.1 rs2/mongod2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs2/mongod2/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs2/mongod2/mongod2.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs2/mongod2"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs2_mongod2.pid"
net:
   port: 30008
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs2"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.3 rs2 구성.
1.3.3 rs2/arbiter
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/rs2/arbiter/mongod.conf
## 내용 ##
systemLog:
   destination: file
   path: "/home/mongo/mongodb/db/log/rs2/arbiter/arbiter.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/home/mongo/mongodb/db/data/rs2/arbiter"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongo_rs2_arbiter.pid"
net:
   port: 30009
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "rs2"
setParameter:
    failIndexKeyTooLong: false
sharding:
    clusterRole: shardsvr
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 #실행 rs2
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/mongod1/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/mongod2/mongod.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/arbiter/mongod.conf &
 
 #shutdown
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/mongod1/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/mongod2/mongod.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/arbiter/mongod.conf
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.3 rs2 구성.
1.3.4 rs2 replica set 설정
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #rs2 replica Set 설정.
 #/home/mongo/mongodb/bin/mongo localhost:30007/admin 접속.(primary 만하면됨)
 #arbiter 를 제외
 rs.initiate(
           {
      _id: "rs2",
      version: 1,
      members: [
         { _id: 0, host : "127.0.0.1:30007" },
         { _id: 1, host : "127.0.0.1:30008" }
      ]
   })

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.REPLICA SET 구성.
1.2 rs2 구성.
1.2.5 rs2 Arbiter 추가
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 #primary shell 에서 Arbiter 추가.
 #/home/mongo/mongodb/bin/mongo localhost:30007/admin 접속.(primary 만하면됨)
  >rs.addArb("127.0.0.1:30009")
  >rs2:PRIMARY> rs.status() 

================================================================================rs2 구성 완료========================================================  
================================================================================REPLICA SET 구성 완료================================================

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.CONFIG SERVER 구성.
2.1 cs0 구성          port:30010
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/confsvr/cs0/confsvr.conf
## 내용 ##
storage:
      dbPath: "/home/mongo/mongodb/db/data/cs0"
      journal:
          enabled: true
systemLog:
    destination: file
    path: "/home/mongo/mongodb/db/log/cs0/log.log"
    logAppend: true
processManagement:
    fork: true
net:
    bindIpAll: true
    port: 30010
replication:
    oplogSizeMB: 40960
    replSetName: "cs"
sharding:
    clusterRole: "configsvr"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.CONFIG SERVER 구성.
2.2 cs1 구성          port:30020
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/confsvr/cs1/confsvr.conf
## 내용 ##
storage:
      dbPath: "/home/mongo/mongodb/db/data/cs1"
      journal:
          enabled: true
systemLog:
    destination: file
    path: "/home/mongo/mongodb/db/log/cs1/log.log"
    logAppend: true
processManagement:
    fork: true
net:
    bindIpAll: true
    port: 30020
replication:
    oplogSizeMB: 40960
    replSetName: "cs"
sharding:
    clusterRole: "configsvr"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.CONFIG SERVER 구성.
2.3 cs2 구성          port:30030
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/confsvr/cs2/confsvr.conf
## 내용 ##
storage:
      dbPath: "/home/mongo/mongodb/db/data/cs2"
      journal:
          enabled: true
systemLog:
    destination: file
    path: "/home/mongo/mongodb/db/log/cs2/log.log"
    logAppend: true
processManagement:
    fork: true
net:
    bindIpAll: true
    port: 30030
replication:
    oplogSizeMB: 40960
    replSetName: "cs"
sharding:
    clusterRole: "configsvr"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 #실행 confsvr
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs0/confsvr.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs1/confsvr.conf &
 /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs2/confsvr.conf &
 
 #shutdown
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs0/confsvr.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs1/confsvr.conf
 /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs2/confsvr.conf
 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.CONFIG SERVER 구성.
2.4 config server replica set 설정
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#CONFIG SERVER 끼리 REPLICA SET 로 구성.
#/home/mongo/mongodb/bin/mongo localhost:30010/admin 접속.(primary 만하면됨)
 >rs.initiate(
  {
    _id: "cs",
    version: 1,
    members: [
       { _id: 0, host : "127.0.0.1:30010" },
       { _id: 1, host : "127.0.0.1:30020" },
       { _id: 2, host : "127.0.0.1:30030" }
    ]
  })
 >exit
 >재접속
 >rs.status()
================================================================================CONFIG SERVER 구성 완료=============================================  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.MONGOS ROUTER 구성.
3.1 mongos 구성.          port:30000
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/home/mongo/mongodb/db/config/mongos/mongos.conf
## 내용 ##
sharding:
    configDB: "cs/127.0.0.1:30010,127.0.0.1:30020,127.0.0.1:30030"
systemLog:
    destination: file
    path: "/home/mongo/mongodb/db/log/mongos/mongos.log"
    logAppend: true
processManagement:
    fork: true
net:
    port: 30000
    bindIpAll: true
    maxIncomingConnections: 30000
setParameter:
        ShardingTaskExecutorPoolHostTimeoutMS : 3600000
        ShardingTaskExecutorPoolMaxSize : 20
        ShardingTaskExecutorPoolMinSize : 10

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!!명령어 mongos , mongod 아님!!!!
#실행 mongos
/home/mongo/mongodb/bin/mongos -f /home/mongo/mongodb/db/config/mongos/mongos.conf &
 
#shutdown
/home/mongo/mongodb/bin/mongos --shutdown -f /home/mongo/mongodb/db/config/mongos/mongos.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.MONGOS ROUTER 구성.
3.2 sharding 설정.          port:30000
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#접속
#/home/mongo/mongodb/bin/mongo localhost:30000/admin
#shard (replica_set) 추가. arbiter 제외.
#sh.addShard("/<:port>,<:port>,…");

>sh.addShard("rs0/127.0.0.1:30001,127.0.0.1:30002")
>sh.addShard("rs1/127.0.0.1:30004,127.0.0.1:30005")
>sh.addShard("rs2/127.0.0.1:30007,127.0.0.1:30008")

#shard db 등록 sharding 할 database
sh.enableSharding("test") 

#chunksize 설정.(default 64) 필요하면 하기.
>use config
#db.settings.save( { _id:"chunksize", value:  } )
>db.settings.save( { _id:"chunksize", value: 32 } )

 

 

ex) sharding key 

sh.shardCollection("test.collection명",{키:"hashed"},false,{numInitialChunks: 1})

sh.shardCollection("test.collection명",{키:1},false)

sh.shardCollection("test.collection명",{_id:"hashed"})

 

#중복된 데이타 제거 - 해당 mongod 에서 실행 해야함.-시간지나면 줄어듬. #primary 에서 해야함. db.runCommand( {cleanupOrphaned: "test.collection명"} ) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++4.전체 start/stop ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

start

/home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/mongod1/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/mongod2/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs0/arbiter/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/mongod1/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/mongod2/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs1/arbiter/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/mongod1/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/mongod2/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/rs2/arbiter/mongod.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs0/confsvr.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs1/confsvr.conf & /home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/db/config/confsvr/cs2/confsvr.conf &

/home/mongo/mongodb/bin/mongos -f /home/mongo/mongodb/db/config/mongos/mongos.conf &

 

stop

 

/home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/mongod1/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/mongod2/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs0/arbiter/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/mongod1/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/mongod2/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs1/arbiter/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/mongod1/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/mongod2/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/rs2/arbiter/mongod.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs0/confsvr.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs1/confsvr.conf /home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/db/config/confsvr/cs2/confsvr.conf

#mongos 는 kill -9 pid 로

#/home/mongo/mongodb/bin/mongos --shutdown -f /home/mongo/mongodb/db/config/mongos/mongos.conf​

Posted by 복태아빠
,

예전에 프로젝트 하면서, 이미지를 여러가지 방법으로 가공, 처리 해야하는 경우가 있었다..


그때, 썸네일 화질을 높이기 위해서.. 고민고민 하다가.. 


나중에 어떤 사이트를 참고해서.. 개발한 lib 를 공유해 본다..


https://github.com/icksss/jikimThumbnail

Posted by 복태아빠
,

TIMESTEN DATABASE

DataBase 2018. 4. 3. 14:15

처음 써봤다..

메모리 db 라는데..

db 설계가 엉망이여서 그런지.. 빠른지 모르겠다.


개발 도구가 마땅치 않아서.. 고생 했는데. 아는대로 써놓고 보자.


TIMESTEN JDBC DRIVER는 TYPE2 다.

때문에 지랄 맞을 CLINET 를 설치 해야 한다. ㅠㅠ


ORACLE 에 인수된 DB라서 SQLDEVELOPER 로 접속 할수 있다.

순서가 중요 하다.

1. TIMESTEN CLIENT 설치

2. SQLDEVELOPER 설치

 - TIMESTEN CLINET를 설치 해야만 SQLDEVELOPER 의 접속 설정에 TIMESTEN CONNECTION을 세팅할수있는 TAB 이 생긴다.

3. 접속해 본다.


JDBC

1. JDBC DRIVER 는 TIMESTENCLIENT 설치 위치의 LIB 폴더에 있다.

2. ttjdbc7 -> 설치된 timesten db의 version에 따라서 , ttjdbc6를 쓸지, 7을 쓸지 결정한다. 최신은 ttjdbc7이다.

3.jdbc datasource 는 PooledDataSource 를 썻다.  이넘이 안정적이란다.. 설정도 쉽네..

4.driverClassName=com.timesten.jdbc.TimesTenDriver

5.이넘에 url 만드는데.. 겁나 오래 걸렸다.. 어디 자세히 나온데도 못 찾겠고..  sqldeveloper client 에서 접속 url 참고 하여, 만들었다.. ㅠㅠ

datasource.url=jdbc:timesten:client:ttc_server_dsn=${DBDSN};ttc_server=${DBHost};tcp_port=${DBPort}



완성된 spring boot 에서의 datasource 다..


spring.datasource.driverClassName=com.timesten.jdbc.TimesTenDriver

spring.datasource.url=jdbc:timesten:client:ttc_server_dsn=${dbdsn};ttc_server=${dbhost}tcp_port=${dbport}

spring.datasource.username=${DBUser}

spring.datasource.password=${DBPassword}

spring.max.active.connections=20

spring.idle.connections=0




Posted by 복태아빠
,

프로젝트 하면서, 온갖 문서때문에, 또는 문서의 용어(문서명) 때문에 혼란스러울 때가 있다..


내가 알고 있는 문서를 정리하여, 모르는 문서를 매핑하여, 생각해보면.. 어느정도 어떤 문서가 필요한지. 판단하는데 도움이 된다..


문서정리


* Web portal

1.요구사항정의서

2.기능명세서

3.화면설계서

4.디자인샘플

5.시스템정의서

6.테스트정의서

7.테스트결과서

8.매뉴얼

9.개발/운영가이드


* REST API

1.요구사항정의서

2.기능명세서

3.URL 정의서 (규격서)

4.시스템정의서

5.테스트정의서

6.테스트결과서

7.매뉴얼

8.개발/운영가이드


* 기타 

* 개발 가이드

1.java 설치 가이드

2.Maven 설치 가이드

3.Apache Tomcat 설치 가이드

4.개발도구 설치 및 환경설정 가이드

5.web portal 개발 가이드

6.Api 개발 가이드

7.Build & Deploy 가이드.


* Spring Boot Sample Project 생성.


외부 웹 프로젝트(외주) 가이드

내부 웹 프로젝트 가이드

기타 기반환경 가이드

Posted by 복태아빠
,

UI 개발자로써, 빅데이터 프로젝트를 하면서 얻은게 있다면, 한가지 있다.


데이타에 따른 통찰력, 그리고 시각화 설계를 위한 관점?


몇가지 정리를 해보았다.


기존 웹 프로젝트

 - 정형화된 데이터를 어떻게 보여줄것인가.

 - 업무/기능 에 대한 데이터와 프로세스를 어떻게 보여줄 것인가를 고민하여 정보를 전달 하는것에 초점이 맞춰져 있음.

 - 따라서 데이터의 성격/사용자의 사용 방법에 따라서, 어떻게 데이터를 잘 보여줄것인지가 중요함.

 - 데이터를 분석한후 틀을 만들고, 해당 틀에 해당 데이터만 삽입하여, 표현 하는 방식.

 * 예를 들면) 

   데이터에 따라서 보고서(차트) 양식이 존재하고, 데이터를 끼워 맞추는 형식. 즉, 메뉴/화면에 따라서 이미 보여질 화면이 정의되어 있음.


  * 개발적인 측면

  - 개발자가 데이터의 타입/필드가 미리 정의하여 처리하기 때문에 난이도가 낮음.



빅데이터 웹 프로젝트

 - 비정형 데이터를 어떻게 보여줄것인가.

 - 데이터를 여러 각도로 보면서, 새로운 정보를 얻어내는게 목적.

 - 사용자/분석가 들이 데이터를 여러 형태로 볼수 있어야 함.

 - 데이터가 어떠한 형태로 보여질지 모름.

 - 데이터를 여러가지 틀에 넣어보고, 새로운 정보를 찾을수 있는게 중요. 

 * 예를 들면 ) 

   10종류의 보고서(차트) 양식이 존재하고, 데이터를 10종류의 보고서(차트)에 넣어보고, 일부를 빼기도 하고, 10종류를 한번에 볼수도/따로 볼수도 있어야함.

   즉, 화면이 정해져 있지 않고, 정해진 데이터도 없으므로 높은 차원의 추상화가 필요함.


  * 개발적인 측면

  - 데이터의 타입/필드가 정해져 있지 않기 때문에 Object로 선언하고 처리 하기 때문에 난이도가 있음.


너무나 당연한 것이지만, 직접 개발해보고, 깨달은 것이다.

Posted by 복태아빠
,

MYSQL 함수 정리해 놓은 글 모아모아서..

 

MYSQL주요함수사용법.zip

 

mysql 

한달전 where reg_date >= date_add(now(), interval -1 month) 
하루전 where reg_date >= date_add(now(), interval -1 day) 
한시간전 where reg_date >= date_add(now(), interval -1 hour) 

+이면 후가 되겠죠! 

기타 날짜 조건

select date_format(D_time,"%Y-%m-%d") from 테이블명
select date_format(D_time,"%H:%i::%s") from 테이블명
D_time 오늘인거 가져오기
select D_time from 테이블명 where date_format(D_time,"%Y-%m-%d") = current_date;


등록된지 24시간이 안된거 가져오기
select D_time from 테이블명 where D_time > date_sub(now(), interval 1 day);

 mysql의 주요 함수 MySQL 
2005/06/15 17:31


참조 : http://dev.mysql.com/doc/mysql/en/functions.html


여기서는 mysql의 주요 함수에 대해서 설명한다. 지면관계 상 모든 함수를 설명하지는 못했으며 기초적인 함수와 중요함수 위주로 설명했다. 또한 mysql은 개발 속도가 비교적 빠른 데이터베이스 이므로 가능한 매뉴얼을 참고하는 것이 바람직하다.

편의를 위해 각 함수의 결과는 간략하게 표현했다.

예를 들어 다음 문장의 실행 결과를

mysql> select mod(29,9);

1 rows in set (0.00 sec)

+-----------+

| mod(29,9) |

+-----------+

| 2 |

+-----------+

 

아래와 같이 표현했다.

mysql> select mod(29,9);

-> 2

 

1) 그룹함수(grouping functions)

( ... )

괄호 . 연산의 순서를 명확하게 하기 위해 사용된다

mysql> select 1+2*3;

-> 7

mysql> select (1+2)*3;

-> 9
 


2) 일반적인 산술 연산자

일반적인 연산자들이 그대로 사용된다. 연산에 사용되는 숫자가 모두 정수일 경우 -, + , * 연산의 결과 값은 bigint (64bit)로 표현된다.
+
더하기

mysql> select 3+5;

-> 8

-

빼기
mysql> select 3-5;

-> -2

*
곱하기

mysql> select 3*5;

-> 15

mysql> select 18014398509481984*18014398509481984.0;

-> 324518553658426726783156020576256.0

mysql> select 18014398509481984*18014398509481984;

-> 0
 


두 번째 식의 결과값은 제대로 나오지 않았는데 그 이유는 정수형 곱셈의 결과 값이 bigint 형이 나타낼 수 있는64비트의 범위를 초과 했기 때문이다.


/

나누기

mysql> select 3/5;

-> 0.60

0으로 나누는 경우 결과는 null 이다.

mysql> select 102/(1-1);

-> null
 

 

3) 논리 연산


모든 논리 연산의 결과값은 1 (true,참) 또는 0 (false,거짓) 중의 하나이다..


not

!

부정. not 은 1 이면 0을 0이면 1을 리턴한다.

예외: not null 의 경우는 null을 리턴

mysql> select not 1;

-> 0

mysql> select not null;

-> null

mysql> select ! (1+1);

-> 0

mysql> select ! 1+1;

-> 1
 


마지막 예의 경우는 (!1)+1의 순서로 해석되므로 1이 된다.


or

||

또는. 인수 모두 0 이거나 null 이 아니면 1을 리턴

mysql> select 1 || 0;

-> 1

mysql> select 0 || 0;

-> 0

mysql> select 1 || null;

-> 1
 

 

and

&&

그리고. 인수중 하나라도 0 또는 null이면 0 을, 아니면1을 리턴.

mysql> select 1 && null;

-> 0

mysql> select 1 && 0;
-> 0
 

 

4) 비교 연산자

모든 비교 연산의 결과값은 1 (true,참) 또는 0 (false,거짓) 중의 하나이다..

아래의 함수들은 문자열 혹은 숫자 열에 사용될 수 있으며 필요에 따라 perl 언어에서와 마찬가지로 문자열은 숫자 열로 또는 숫자 열이 문자열로 바뀐다


mysql은 다음의 규칙에 따라 비교 연산을 수행한다


- 인수가 모두null 이면 비교연산의 결과도 null이다.

- 인수가 모두 문자열이면, 문자열로 비교된다.

- 인수가 모두 정수이면 정수로 비교된다.

- 한쪽 인수가 timestamp 또는 datetime 타입이고 다른 쪽이 숫자이면 timestamp 또는 datetime으로 변화되어 비교된다.

- 그 밖의 모든 경우에는 부동소수점 실수로 비교된다.


=

같다

mysql> select 1 = 0;

-> 0

mysql> select '0' = 0;

-> 1

mysql> select '0.0' = 0;

-> 1

mysql> select '0.01' = 0;

-> 0

mysql> select '.01' = 0.01;

-> 1
<>
!=

같지 않다.

mysql> select '.01' <> '0.01';

-> 1

mysql> select .01 <> '0.01';

-> 0

mysql> select 'zapp' <> 'zappp';

-> 1
<=

작거나 같다.

mysql> select 0.1 <= 2;

-> 1

<

작다

mysql> select 2 <= 2;

-> 1

>=

크거나 같다

mysql> select 2 >= 2;

-> 1

>

크다

mysql> select 2 > 2;

-> 0

<=>

한쪽이 null 인 경우에만 0

mysql> select 1 <=> 1, null <=> null, 1<=> null;

-> 1 1 0

isnull(expr)

만일 표현식expr이 null 이면 1을 그렇지않으면 0을 리턴한다.

mysql> select isnull(1+1);

-> 0

mysql> select isnull(1/0);

-> 1
 

※ 주의 =을 이용하여 null 값을 비교하면 항상 0 이 리턴 되므로 isnull() 함수를 이용해야 한다


expr between min and max
 


만일 표현식expr 이 min과 max 값 사이에 존재한다면 1을 그렇지 않으면 0을 리턴한다, expr 이 문자열인지 숫자인지에 따라 비교 방법이 결정된다.

mysql> select 1 between 2 and 3;

-> 0

mysql> select 'b' between 'a' and 'c';

-> 1

mysql> select 2 between 2 and '3';

-> 1

mysql> select 2 between 2 and 'x-3';

-> 0
expr in (value,...)
 

 

만일 표현식 expr 이 괄호 안의 목록에 존재하면 1 아니면 0을 리턴한다.

mysql> select 2 in (0,3,5,'wefwf');

-> 0

mysql> select 'wefwf' in (0,3,5,'wefwf');

-> 1
 

 

5) 문자열 비교 함수

like

where 조건 절에서 like 에서는 다음 2가지의 와일드카드 문자(wildcard characters)를 쓸 수 있다.

%
 0 또는 하나 이상의 문자에 해당한다.
 
_
 하나의 문자에 해당한다
 

mysql> select 'david!' like 'david_';

-> 1

mysql> select 'david!' like '%d%v%';

-> 1

mysql> select 'david!' like 'david-';

-> 0

mysql> select 'david_' like 'david-';

-> 1

ansi sql과 달리 확장 기능으로 수치 표현식에도 like 를 사용할 수 있다.

mysql> select 10 like '1%';

-> 1
 


6) 형 변환 연산자

binary

binary연산자는 다음에 따라오는 문자열을 바이너리 문자열로 바꿔서 연산한다. 바이너리 문자열의 큰 특징은 바로 대소문자를 구별한다는 것이다. 컬럼 자체가 바이너리 문자열로 정의 되어 있지 않더라도 대소문자를 구분해 문자열을 비교해야 할 경우 사용된다.

mysql> select "a" = "a";

-> 1

mysql> select binary "a" = "a";

-> 0
 


binary 는 mysql 3.23.0 에 새롭게 추가된 함수 이다.


7) 흐름 제어(control flow) 함수


ifnull(expr1,expr2)

만일 expr1 이 null 이 아닐 경우 ifnull() 함수는 expr1 자체의 값을 리턴하고 그렇지 않을 경우 expr2을 리턴한다.

mysql> select ifnull(1,0);

-> 1

mysql> select ifnull(0,10);

-> 0

mysql> select ifnull(1/0,10);

-> 10

mysql> select ifnull(1/0,'yes');

-> 'yes'
 


위의 두 번째 보기에서 엄연히 0은 null 과는 다르다는 점에 주의하자.

if(expr1,expr2,expr3)

 


만일 expr1 이 참이면 expr2를 리턴하고 그렇지 않으면 expr3을 리턴하다.

mysql> select if(1>2,2,3);

-> 3

mysql> select if(1<2,'yes','no');

-> 'yes'

mysql> select if(strcmp('test','test1'),'yes','no');

-> 'no'
 

 

8) 수학 함수

모든 수학 함수는 오류가 생기면 null 을 리턴한다.

-

음수 부호 숫자의 부호를 바꾼다.

mysql> select - 2;

-> -2

abs(x)
 


x의 절대값을 구한다.

mysql> select abs(2);

-> 2

mysql> select abs(-32);

-> 32
 


sign(x)

x 의 부호에 따라 음수일 경우 -1, 0 일 경우 0, 양수일 경우 1을 리턴한다.

mysql> select sign(-32);

-> -1

mysql> select sign(0);

-> 0

mysql> select sign(234);

-> 1

mod(n,m)

%
 


나머지 연산자 n 을 m으로 나눈 나머지를 구한다

mysql> select mod(234, 10);

-> 4

mysql> select 253 % 7;

-> 1

mysql> select mod(29,9);

-> 2
 


floor(x)

x보다 크지 않은 최대 정수를 구한다.

mysql> select floor(1.23);

-> 1

mysql> select floor(-1.23);

-> -2
 


ceiling(x)

x 보다 작지않은 최소 정수를 구한다.

mysql> select ceiling(1.23);

-> 2

mysql> select ceiling(-1.23);

-> -1
 


round(x)

x 의 반올림 값을 구한다

mysql> select round(-1.23);

-> -1

mysql> select round(-1.58);

-> -2

mysql> select round(1.58);

-> 2
 


round(x,d)

x 를 반올림해서 소수점아래 d 자리까지 구한다. 만일 d 가 0 이면 소수점 아래부분을 생략된다.

mysql> select round(1.298, 1);

-> 1.3

mysql> select round(1.298, 0);

-> 1
 


exp(x)

e^x 값을 구한다.

mysql> select exp(2);

-> 2.389056

mysql> select exp(-2);

-> 0.135335
 


log(x)

자연로그 값을 구한다.

mysql> select log(2);

-> 0.693147

mysql> select log(-2);

-> null

if you want the log of a number x to some arbitary base b, use the formula log(x)/log(b).
 


log10(x)

상용로그 값을 구한다

mysql> select log10(2);

-> 0.301030

mysql> select log10(100);

-> 2.000000

mysql> select log10(-100);

-> null

pow(x,y)
 


power(x,y)

x의 y승 값을 구한다.

mysql> select pow(2,2);

-> 4.000000

mysql> select pow(2,-2);

-> 0.250000
 


sqrt(x)

x의 근을 구한다

mysql> select sqrt(4);

-> 2.000000

mysql> select sqrt(20);

-> 4.472136
 


pi()

파이 값을 리턴한다

mysql> select pi();

-> 3.141593
 


cos(x)

x 의 코사인 값을 구한다 ( x 는 라디안)

mysql> select cos(pi());

-> -1.000000<
 
br>
sin(x)

x 의 사인 값을 구한다 ( x 는 라디안)

mysql> select sin(pi());

-> 0.000000
 


tan(x)

x 의 탄젠트 값을 구한다 ( x 는 라디안)

mysql> select tan(pi()+1);

-> 1.557408
 


acos(x)

x 의 아크 코사인 값을 구한다 ( x 가 -1 ~ 1 사이의 값이 아니면 null 리턴 )

mysql> select acos(1);

-> 0.000000

mysql> select acos(1.0001);

-> null

mysql> select acos(0);

-> 1.570796
 


asin(x)

x 의 아크 사인 값을 구한다 ( x 가 -1 ~ 1 사이의 값이 아니면 null 리턴 )

mysql> select asin(0.2);

-> 0.201358

mysql> select asin('foo');

-> 0.000000
 


atan(x)

x 의 아크 탄젠트 값을 구한다

mysql> select atan(2);

-> 1.107149

mysql> select atan(-2);

-> -1.107149

atan2(x,y)
 


x 와 y 사이의 아크 탄젠트 값을 구한다. atan(y / x) 와 같다

mysql> select atan(-2,2);

-> -0.785398

mysql> select atan(pi(),0);

-> 1.570796

cot(x)
 


x의 코탄젠트 값을 구한다

mysql> select cot(12);

-> -1.57267341

mysql> select cot(0);

-> null

rand()

rand(n)
 


0 과 1.0 사이의 난수를 만들어 낸다.

n이 주어질 경우 난수 발생을 위한 시드(seed) 로 사용된다.

mysql> select rand();

-> 0.5925

mysql> select rand(20);

-> 0.1811

mysql> select rand(20);

-> 0.1811

mysql> select rand();

-> 0.2079

mysql> select rand();

-> 0.7888
 


least(x,y,...)

주어진 인수 중 가장 작은 것을 찾아낸다.

mysql> select least(2,0);

-> 0

mysql> select least(34.0,3.0,5.0,762.0);

-> 3.0

mysql> select least("b","a","c");

-> "a"
 


greatest(x,y,...)

주어진 인수 중 가장 작은 큰 것을 찾아낸다.

mysql> select greatest(2,0);

-> 2

mysql> select greatest(34.0,3.0,5.0,762.0);

-> 762.0

mysql> select greatest("b","a","c");

-> "c"

in mysql versions prior to 3.22.5, you can use max() instead of greatest.

degrees(x)

returns the argument x, converted from radians to degrees.

mysql> select degrees(pi());

-> 180.000000
 


radians(x)

도(degree)를 라디안 값으로 변환한다.

mysql> select radians(90);

-> 1.570796
 


truncate(x,d)

숫자 x를 소수점 아래 d자리까지만 보여준다

mysql> select truncate(1.223,1);

-> 1.2

mysql> select truncate(1.999,1);

-> 1.9

mysql> select truncate(1.999,0);

-> 1
 


9) 문자열 함수

문자열 함수는 결과값의 길이가 max_allowed_packet 에서 정의된 것보다 클 경우 null 을 리턴한다.

문자열의 위치를 다루는 함수에서 첫번째 문자열의 위치는 1로 처리한다.

ascii(str)

문자열 str의 가장 좌측에 위치한 문자의 ascii 코드값을 알려준다. 문자열이 비어있으면 0 을, 인수가 null이면 null을 리턴한다.

mysql> select ascii('2');

-> 50

mysql> select ascii(2);

-> 50

mysql> select ascii('dx');

-> 100
 


conv(n,from_base,to_base)

숫자 n을 서로 다른 진수로 변환시킨 후 문자열로 출력한다. from_base 진수형식으로부터 to_base 진수형식으로 변환된다. 인수 중 하나라도 null 이 있으면 null이 리턴 된다. 2진수부터 36진수까지 지원된다

mysql> select conv("a",16,2);

-> '1010'

mysql> select conv("6e",18,8);

-> '172'

mysql> select conv(-17,10,-18);

-> '-h'

mysql> select conv(10+"10"+'10'+0xa,10,10);

-> '40'
 


bin(n)

10진수 을 2진수 형식으로 바꿔준다. conv(n,10,2) 와 같다.만일 n이 null이면 null을 리턴한다.

mysql> select bin(12);

-> '1100'
 


oct(n)

10진수 을 8진수 형식으로 바꿔준다. conv(n,10,8) 와 같다.만일 n이 null이면 null을 리턴한다.

mysql> select oct(12);

-> '14'
 


hex(n)

10진수 n을 16진수 형식으로 바꿔준다. conv(n,10,2) 와 같다.만일 n이 null이면 null을 리턴한다.

mysql> select hex(255);

-> 'ff'
 


char(n,...)

char() 정수 n 에 해당하는 ascii 코드 값 변환해 출력한다. null 은 무시된다.

mysql> select char(77,121,83,81,'76');

-> 'mysql'

mysql> select char(77,72.3,'72.3');

-> 'mmm'
 


concat(x,y,...)

문자열을 이어준다. 인수가 2개 이상 되어야 하며 하나라도 null 이 있으면 null 이 리턴 된다.

mysql> select concat('my', 's', 'ql');

-> 'mysql'

mysql> select concat('my', null, 'ql');

-> null
 


length(str)

octet_length(str)

char_length(str)

character_length(str)

문자열str의 길이를 리턴한다.

mysql> select length('text');

-> 4

mysql> select octet_length('text');

-> 4
 


locate(substr,str)

position(substr in str)

문자열 str 에서 처음으로 나타나는 문자열 substr 의 위치를 리턴한다. 만일 substr을 찾지 못한 경우 0을 리턴한다.

mysql> select locate('bar', 'foobarbar');

-> 4

mysql> select locate('xbar', 'foobar');

-> 0
 


lpad(str,len,padstr)

len 길이만큼 padstr 문자로 str의 왼쪽을 채워서 보여준다

mysql> select lpad('hi',4,'??');

-> '??hi'
 


rpad(str,len,padstr)

len 길이만큼 padstr 문자로 str의 오른쪽을 채워서 보여준다

mysql> select rpad('hi',5,'?');

-> 'hi???'
 


left(str,len)

문자열str 을 왼쪽에서len 길이만큼만 보여준다.

mysql> select left('foobarbar', 5);

-> 'fooba'
 


right(str,len)

substring(str from len)

문자열str 을 오른쪽에서len 길이만큼만 보여준다.

mysql> select right('foobarbar', 4);

-> 'rbar'

mysql> select substring('foobarbar' from 4);

-> 'rbar'
 


substring(str,pos,len)

substring(str from pos for len)

mid(str,pos,len)

문자열str 을 pos 위치에서len 길이만큼만 보여준다.

mysql> select substring('quadratically',5,6);

-> 'ratica'
 


substring(str,pos)

문자열str 을 pos 위치에서 끝까지 보여준다.

mysql> select substring('quadratically',5);

-> 'ratically'
 


substring_index(str,delim,count)

문자열 str 을 delim 로 구분해서 배열로 만든 후 count 만큼만 보여준다. count 가 양수이면 왼쪽에서 count 수만큼 보여주고 음수이면 오른쪽에서 count 수 만큼 보여준다.

mysql> select substring_index('www.mysql.com', '.', 2);

-> 'www.mysql'

mysql> select substring_index('www.mysql.com', '.', -2);

-> 'mysql.com'
 


ltrim(str)

문자열 str 의 왼쪽 공백을 제거한다.

mysql> select ltrim(' barbar');

-> 'barbar'
 


rtrim(str)

문자열 str 의 오른쪽 공백을 제거한다.

mysql> select rtrim('barbar ');

-> 'barbar'
 


trim([[both | leading | trailing] [remstr] from] str)

옵션에 따라 문자열에서 공백을 제거 한다.

both 앞뒤 공백제거

leading 앞쪽 공백제거

trailing 뒤쪽 동백제거

mysql> select trim(' bar ');

-> 'bar'

mysql> select trim(leading 'x' from 'xxxbarxxx');

-> 'barxxx'

mysql> select trim(both 'x' from 'xxxbarxxx');

-> 'bar'

mysql> select trim(trailing 'xyz' from 'barxxyz');

-> 'barx'
 


space(n)

n 개의 공백 문자열을 리턴한다.

mysql> select space(6);

-> ' '
 


replace(str,from_str,to_str)

문자열 str 에서 문자열 from_str을 문자열to_str로 치환한다.

mysql> select replace('www.mysql.com', 'w', 'ww');

-> 'wwwwww.mysql.com'
 


repeat(str,count)

문자열 str 을 count 수만큼 반복한다.

mysql> select repeat('mysql', 3);

-> 'mysqlmysqlmysql'
 


reverse(str)

문자열의 순서를 뒤집는다.

mysql> select reverse('abc');

-> 'cba'
 


insert(str,pos,len,newstr)

문자열 str 의 특정위치 pos 부터 len 길이만큼 새로운 문자열로 바꿔 넣는다.

mysql> select insert('quadratic', 3, 4, 'what');

-> 'quwhattic'
 


elt(n,str1,str2,str3,...)

문자열의 목록에서 n 번째 문자열을 리턴한다.

mysql> select elt(1, 'ej', 'heja', 'hej', 'foo');

-> 'ej'

mysql> select elt(4, 'ej', 'heja', 'hej', 'foo');

-> 'foo'
 


field(str,str1,str2,str3,...)

문자열 str 이 뒤따라오는 문자열의 목록에서 몇 번째 위치하는지 알려준다.

mysql> select field('ej', 'hej', 'ej', 'heja', 'hej', 'foo');

-> 2

mysql> select field('fo', 'hej', 'ej', 'heja', 'hej', 'foo');

-> 0
 


lcase(str)

lower(str)

문자열을 컴파일 시 지정된 문자 셋에 따라 소문자로 변환한다. (디폴트는 iso-8859-1 latin1 이다).

mysql> select lcase('quadratically');

-> 'quadratically'
 


ucase(str)

upper(str)

문자열을 컴파일 시 지정된 문자 셋에 따라 대문자로 변환한다. (디폴트는 iso-8859-1 latin1 이다).

mysql> select ucase('hej');

-> 'hej'
 


load_file(file_name)

파일을 읽어 파일의 내용을 문자열로 리턴한다. 파일은 같은 서버에 존재해야 하면 반드시 절대 경로를 적어주어야 한다. 또한 max_allowed_packet(디폴트로64kbyte)의 길이보다 작아야 한다. 파일이 존재하지 않거나 크기가 이 보다 크면 null이 리턴된다.

아래는 파일을 읽어 이 내용을 blob 컬럼에 업데이트 하는 보기이다.

mysql> update table_name set blob_column=load_file("/tmp/picture") where id=1;
 


위의 예에서 한가지 재미있는 점은 숫자형을 문자열로 바꿔주는 함수를 사용하지 않은 것인데 이는mysql이 필요에 자동적으로 따라 문자열을 숫자로 혹은 그 반대로 변환하기 때문이다. 다음 예를 보면 쉽게 이해가 될 것이다.

mysql> select 1+"1";

-> 2

mysql> select concat(2,' test');

-> '2 test'
 


10) 날짜 및 시간 함수

- 실제 mysql 에서는 다른 데이터베이스에서 제공하지 않는 매우 편리한 함수를 많이 제공하고 있다. 실제로 프로그래밍을 하다 보면 사소한 것까지 배려한 많은 함수에 저절로 감탄사가 나올 때가 있을 것이다.

dayofweek(date)

날자를 한 주의 몇 번째 요일인지를 나타내는 숫자로 리턴한다. (1 = 일요일, 2 = 월요일, ... 7 = 토요일)

mysql> select dayofweek('1998-02-03');

-> 3
 


weekday(date)

날자를 한 주의 몇 번째 요일인지를 나타내는 숫자로 리턴한다. (0 = 월요일, 1=화요일 ... 6 = 일요일)

mysql> select weekday('1997-10-04 22:23:00');

-> 5

mysql> select weekday('1997-11-05');

-> 2
 


dayofmonth(date)

그 달의 몇 번째 날인지를 알려준다. 리턴 값은 1에서 31 사이이다.

mysql> select dayofmonth('1998-02-03');

-> 3
 


dayofyear(date)

한해의의 몇 번째 날인지를 알려준다. 리턴 값은 1에서 366 사이이다.

mysql> select dayofyear('1998-02-03');

-> 34
 


month(date)

해당 날자가 몇 월인지 알려준다. 리턴 값은 1에서 12 사이이다.

mysql> select month('1998-02-03');

-> 2
 


dayname(date)

해당 날자의 영어식 요일이름을 리턴한다.

mysql> select dayname("1998-02-05");

-> 'thursday'
 


monthname(date)

해당 날자의 영어식 월 이름을 리턴한다.

mysql> select monthname("1998-02-05");

-> 'february'그럼
 


quarter(date)

분기를 리턴한다 (1~ 4)

mysql> select quarter('98-04-01');

-> 2
 


week(date)

week(date,first)

인수가 하나일 때는 해달 날자가 몇 번째 주일인지(0 ~ 52)를 리턴하고 2개일 때는 주어진 인수로 한 주의 시작일을 정해 줄 수 있다. 0이면 일요일을1이면 월요일을 한 주의 시작일로 계산해 몇 번째 주인가 알려준다.

mysql> select week('1998-02-20');

-> 7

mysql> select week('1998-02-20',0);

-> 7

mysql> select week('1998-02-20',1);

-> 8
 


year(date)

년도를 리턴한다.(1000 ~ 9999)

mysql> select year('98-02-03');

-> 1998
 


hour(time)

시간을 알려준다.(0 ~ 23)

mysql> select hour('10:05:03');

-> 10
 


minute(time)

분을 알려준다(0 ~ 59)

mysql> select minute('98-02-03 10:05:03');

-> 5
 


second(time)

초를 알려준다(0 ~ 59)

mysql> select second('10:05:03');

-> 3
 


period_add(p,n)

yymm 또는 yyyymm 형식으로 주어진 달에n 개월을 더한다. 리턴 값은 yyyymm 의 형식이다.

mysql> select period_add(9801,2);

-> 199803
 


period_diff(p1,p2)

yymm 또는 yyyymm 형식으로 주어진 두 기간사이의 개월을 구한다

mysql> select period_diff(9802,199703);

-> 11

date_add(date,interval expr type)

date_sub(date,interval expr type)

adddate(date,interval expr type)

subdate(date,interval expr type)
 


위의 함수들은 날자 연산을 한다. 잘 만 사용하면 꽤나 편리한 함수 들이다. 모두 mysql 3.22 버전에서 새롭게 추가되었다. adddate() 과 subdate() 는 date_add() 와 date_sub()의 또 다른 이름이다.

인수로 사용되는 date 는 시작일을 나타내는 datetime 또는date 타입이다. expr 는 시작일에 가감하는 일수 또는 시간을 나타내는 표현식이다.

type 값
 
의미
 
사용 예
 
second
 초
 seconds
minute
 분
 minutes
hour
 시간
 hours
day
 일
 days
month
 월
 months
year
 년
 years
minute_second
 분:초
 "minutes:seconds"
hour_minute
 시:분
 "hours:minutes"
day_hour
 일 시
 "days hours"
year_month
 년 월
 "years-months"
hour_second
 시 분
 "hours:minutes:seconds"
day_minute
 일, 시, 분
 "days hours:minutes"
day_second
 일, 시, 분, 초
 "days hours:minutes:seconds"


아래 예제를 참고하면 쉽게 이해가 갈 것이다.

mysql> select date_add("1997-12-31 23:59:59",

interval 1 second);

-> 1998-01-01 00:00:00

mysql> select date_add("1997-12-31 23:59:59",

interval 1 day);

-> 1998-01-01 23:59:59

mysql> select date_add("1997-12-31 23:59:59",

interval "1:1" minute_second);

-> 1998-01-01 00:01:00

mysql> select date_sub("1998-01-01 00:00:00",

interval "1 1:1:1" day_second);

-> 1997-12-30 22:58:59

mysql> select date_add("1998-01-01 00:00:00",

interval "-1 10" day_hour);

-> 1997-12-30 14:00:00

mysql> select date_sub("1998-01-02", interval 31 day);

-> 1997-12-02
 


to_days(date)

주어진 날자를 0000년부터의 일수로 바꾼다.

mysql> select to_days(950501);

-> 728779

mysql> select to_days('1997-10-07');

-> 729669
 


from_days(n)

주어진 일수 n로부터 날자를 구한다

mysql> select from_days(729669);

-> '1997-10-07'
 


date_format(date,format)

format 의 정의에 따라 날자 혹은 시간을 출력한다. 매우 빈번히 쓰이는 함수 이다.

format 에 사용되는 문자는 다음과 같다.


문자
 의미
%m
 월이름 (january..december)
%w
 요일명 (sunday..saturday)
%d
 영어식 접미사를 붙인 일(1st, 2nd, 3rd, etc.)
%y
 4자리 년도
%y
 2자리 년도
%a
 짧은 요일명(sun..sat)
%d
 일(00..31)
%e
 일(0..31)
%m
 월(01..12)
%c
 월(1..12)
%b
 짧은 월이름 (jan..dec)
%j
 한해의 몇 번째 요일인가 (001..366)
%h
 24시 형식의 시간 (00..23)
%k
 24시 형식의 시간 (0..23)
%h
 12시 형식의 시간 (01..12)
%i
 12시 형식의 시간 (01..12)
%l
 시간 (1..12)
%i
 분 (00..59)
%r
 시분초12시 형식 (hh:mm:ss [ap]m)
%t
 시분초 24시 형식 (hh:mm:ss)
%s
 초 (00..59)
%s
 초 (00..59)
%p
 am 또는 pm 문자
%w
 일주일의 몇 번째 요일인가(0=sunday..6=saturday)
%u
 한해의 몇 번째 주인가(0..52). 일요일이 시작일
%u
 한해의 몇 번째 주인가(0..52). 월요일이 시작일
%%
 `%' 문자를 나타냄


위 표에 나와 있는 것들을 제외한 모든 문자는 그냥 그대로 출력된다.

mysql> select date_format('1997-10-04 22:23:00', '%w %m %y');

-> 'saturday october 1997'

mysql> select date_format('1997-10-04 22:23:00', '%h:%i:%s');

-> '22:23:00'

mysql> select date_format('1997-10-04 22:23:00',

'%d %y %a %d %m %b %j');

-> '4th 97 sat 04 10 oct 277'

mysql> select date_format('1997-10-04 22:23:00',

'%h %k %i %r %t %s %w');

-> '22 22 10 10:23:00 pm 22:23:00 00 6'
 


주의! : mysql 3.23 버전부터 % 기호가 각 형식문자 앞에 필요하게 되었다 그 이전 버전에서는 선택 사항이다.

time_format(time,format)

 

이 함수는 date_format()와 비슷한 역할을 하지만 단지 시,분,초 만을 나타낼 수 있다는 점이다.

curdate()

current_date

 

오늘 날짜를 'yyyy-mm-dd' 또는 yyyymmdd 형식으로 리턴한다, 리턴 값은 이 함수가 문자열로 쓰이느냐 숫자로 쓰이느냐에 따라 달라진다.

mysql> select curdate();

-> '1997-12-15'

mysql> select curdate() + 0;

-> 19971215

 

curtime()

current_time

'hh:mm:ss' 또는 hhmmss 형식으로 현재시간을 나타낸다. 리턴 값은 이 함수가 문자열로 쓰이느냐 숫자로 쓰이느냐에 따라 달라진다.

mysql> select curtime();

-> '23:50:26'

mysql> select curtime() + 0;

-> 235026

 

now()

sysdate()

current_timestamp

오늘 날자와 현재 시간을 'yyyy-mm-dd hh:mm:ss' 또는 yyyymmddhhmmss 형식으로 리턴 한다, 역시 리턴 값은 이 함수가 문자열로 쓰이느냐 숫자로 쓰이느냐에 따라 달라진다. 실제 개발 시 사용자의 등록일시 등을 나타낼 때 유용하게 쓰이는 함수다. 뒷부분의 실전예제에서 보게 될 것이다.

mysql> select now();

-> '1997-12-15 23:50:26'

mysql> select now() + 0;

-> 19971215235026

 

unix_timestamp()

unix_timestamp(date)

인수가 없이 사용될 경우 현재 시간의 유닉스 타임스탬프를 리턴하고

만일 날짜형식의 date 가 인수로 주어진 경우에는 주어진 날자의 유닉스 타임스탬프를 리턴한다 유닉스 타임스탬프 란 그리니치 표준시로 1970 년 1월 1일 00:00:00 이 후의 시간경과를 초단위로 나타낸 것이다.

mysql> select unix_timestamp();

-> 882226357

mysql> select unix_timestamp('1997-10-04 22:23:00');

-> 875996580

 

주의 : 만일 unix_timestamp함수가 timestamp 컬럼 에서 사용될 경우에는 주어진 시간이 타임스탬프로 바뀌지 않고 그대로 저장된다.

from_unixtime(unix_timestamp)

주어진 유닉스 타임스탬프 값으로부터 'yyyy-mm-dd hh:mm:ss' 또는 yyyymmddhhmmss 형식의 날짜를 리턴한다.

mysql> select from_unixtime(875996580);

-> '1997-10-04 22:23:00'

mysql> select from_unixtime(875996580) + 0;

-> 19971004222300

 

from_unixtime(unix_timestamp,format)

주어진 유닉스 타임스탬프 값을 주어진 날짜 형식에 맞게 바꿔서 보여준다. 여기서 사용되는 형식문자는 date_format() 함수에서 사용된 것과 같다.

아래 예에서 %x 는 형식문자가 아니므로 그냥 x 가 표시됨에 유의하기 바란다.

mysql> select from_unixtime(unix_timestamp(),

'%y %d %m %h:%i:%s %x');

-> '1997 23rd december 03:43:30 x'

 

sec_to_time(seconds)

주어진 초를 'hh:mm:ss' 또는 hhmmss 형식의 시간단위로 바꿔준다.

mysql> select sec_to_time(2378);

-> '00:39:38'

mysql> select sec_to_time(2378) + 0;

-> 3938

 

time_to_sec(time)

주어진 시간을 초 단위로 바꿔준다.

mysql> select time_to_sec('22:23:00');

-> 80580

mysql> select time_to_sec('00:39:38');

-> 2378
 

 

Posted by 복태아빠
,

Apache Proxy

open study 2010. 12. 3. 15:46
http://www.apacheweek.com/features/reverseproxies  참조 번역


Web Proxies



Proxy server는 크게 웹에 대한 사용자의 gateway이다. 사용자가 브라우저 세팅에서 proxy를 설정하면 모든 HTTP request는 proxy를 통해 route된다.

일반적으로 proxy는 다음과 같은 역할에 사용된다.



  *  caching된 페이지를 얻음으로써, 빠른 웹 access.

  *  firewall 뒤의 사용자에게 특정 웹 접근을 가능하게 control

  * web content 의 filter 나 transform





Apache의 mod_proxy는 Forward Proxy와 Reverse Proxy를 지원하는데, Reverse Proxy는caching을 통한 웹성능 향상외에  웹으로부터 방화벽뒤에있는 서버로의 controlled access를 가능하게 하기 위해대부분 사용된다.



- Forward Proxy : 서비스 서버의 앞에 서서 요청을 얻어옴. 방화벽을 뚫기위해 많이 설정함.

- Reverse Proxy : 역시 서비스 서버의 앞에 서나 대행을 위해 사용됨.





Proxing with Apache



Standard Apache module인 mod_proxy는 HTTP/1.0 과 HTTP/1.1 두 protocolversion을 지원하는데, HTTP/1.1이 rich new cache control mechanisims을 가진다는 점에서큰 차이가 있다.





The Apache Proxy Modules



Apache modular arcitecture를 유지하기 위해서는, mod_proxy는 modular 자체이고, 전형적인proxy server는 가능한 여러 모듈을 필요로 할 것이다. 이장에서는 proxing과 관련한 이런 모듈에 대한 설명을 주로할 것이고,  caching 관련해서는 다루지 않는다.



mod_proxy: The core module deals with proxy infrastructure and configuration and managing a proxy request.
mod_proxy_http: This handles fetching documents with HTTP and HTTPS.
mod_proxy_ftp: This handles fetching documents with FTP.
mod_proxy_connect: This handles the CONNECT method for secure (SSL) tunneling.
mod_cache, mod_disk_cache, mod_mem_cache: These deal with managing adocument cache. To enable caching requires mod_cache and one or both ofdisk_cache and mem_cache.
mod_proxy_html: This rewrites HTML links into a proxy's address space.
mod_headers: This modifies HTTP request and response headers.
mod_deflate: Negotiates compression with clients and backends.




Building Apache for Proxing ( Apache 2.0 기준)



mod_proxy_html을 제외하고, 위 모든 모듈이 core Apache distribution에 들어가있으므로, 쉽게 사용가능하다. (mod_proxy_html 설치는 위 사이트 참조하십시여 ㅡㅡ;)



Apache의 configure에서

# ./configure --prefix=/env/apache2 --enable-proxy=shared
# make
# make install


간단히

./configure --enable-proxy --enable-proxy-http



기존 installation에 추가하기 위해서는 apxs를 써야한다.

# apxs -c -i [module-name].c
noting that mod_proxy itself is in two source files
(mod_proxy.c and proxy_util.c).






A Reverse Proxy Scenario



example.com이라는 회사가 internet을 통해 접근가능한 public IP address와 DNS entry를 가진 www.example.com이라는 website를 가지고 있다고 하자.

이 회사는 또한 방화벽 안에 private IP address와 등록되지 않은 DNS entry를 가진 여러application server를 가지고 있다. 이런 해당 network안의 applicationserver로internal1.example.com"과 "internal2.example.com" 이 있다고 하자. 이 서버들은public DNS entry를 가지지 않으므로, 회사외부로 부터 internal1.example.com으로 접근이 안되고"no such host" 에러가 날 것이다.



그런데, 이 application server로 web access를 해야된다고 결론이 난 것이다.  당연히 internet을 통해 직접적으로 노출하지는 말아야되고 해당 웹서버로 통합되긴 해야하므로,  내부적으로 http://www.example.com/app1/any-path-herehttp://internal1.example.com/any-path-here로 매핑하고 http;//www.example.com/app2/other-path-here를 http://internal2.example.com/other-path-here로 매핑하는 것이다.



Configuring the Proxy



이 모듈을 사용하기 위해서 우선 httpd.conf에 이것들을 loading 하라고 위 사이트에는 적혀있으나,실제로  mod_proxy는 아파치와 static으로 link되기 때문에 LoadModule을 하지 않아도 되므로 여기선생략하겠다.


proxy를 구성하기 전에, 우선 아래 중요한 securiy warning을 확인하자.

"ProxyRequests On" 으로 setting하지 말아라.

ProxyRequests 를 On으로 setting하면, 당신의 서버가 Open Proxy로 변해버린다.

web을 open proxy로 scan해버리는 인간들이 있어서, 이 서버를 불법적인 곳에 access하기위해 route하려고사용하거나  심하게는 이 proxy를 통해 email spam을 route할 수도 있다.  얼마안가서  정상적인 traffic은막혀버리고  family filter 같은 것에 의해 block당해버린 서버들을 발견하게 될 것이다.

물론 적절한 security measure로 forward proxy를 사용할 수 있으나, 여기선 다루지 않겠다.



reverse proxy를 설치하는 기본적인 configuration directive는 ProxyPass 이다.

해당 application server의 proxy rules를 set up하기 위해 아래와 같이 사용하면 된다.



ProxyPass /app1/ http://internal1.example.com/
ProxyPass /app2/ http://internal2.example.com/


그리고 apache를 재시작하면  http://www.example.com/app1/some-path-mapshttp://internal1.example.com/some-path 로 매핑되게 된다.
Posted by 복태아빠
,
잘되어 있는 사이트를 포스팅 해왔다.

Tomcat Web application 만들기 

먼저, 웹 루트를 어디로 정할 것인가?
(아파치나 톰캣 자체가 static html을 바라보는 웹 웹루트)

 

톰켓이 기본적으로 보고 있는 루트 컨텍스트는 webapps/ROOT 이다.

server.xml 내용을 보면

  1. 96:  <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">

와 같이 appBase는 ${catalina-home} 밑의 상대경로를 인자로 받으며,기본적으로 보안과 context의 통일적인 적용을 이유로 컨텍스트의 루트는 ROOT 디렉토리 밑이 됩니다.

따라서, 톰켓이 설치가 되면 웹루트는 ${catalina-home}/webapps/ROOT 가 된다.

(위의 과정대로 설치했다면 우리 시스템에서는 /usr/local/tomcat/webapps/ROOT 가 된다)

 이를 3가지 형태로 변경해 사용할 수 있다.

1. webapp 자체를 웹루트 디렉토리로 만들고 싶을 때,

단지, <Host> 태그 내에 아래와 같은 컨텍스트를 추가하면 됩니다.

    <Context path="" docBase="." reloadable="true"/>

   사실 컨텍스트는 더 많은 옵션이 있으나 여기는 최소한의 사항만 적었습니다. 실서버에 적용할 때는 log 부분도 신경을 써주셔야 합니다. 더 자세한 사항은 웹을 검색해 보시기 바랍니다.

2. webapp/test/ROOT를 웹루트 디렉토리로 만들고 싶을 때,

  1. 96:  <Host name="localhost"  appBase="webapps/test"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">

3. /home/dev/appName 을 웹루트 디렉토리로 만들고 싶을 때

  1. 96:  <Host name="localhost"  appBase="/home/dev/appName" unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
  2.     <Context path="" docBase="." reloadable="true"/>
        </Host>

     또는,

  1. 96:  <Host name="localhost"  appBase="/home/dev"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">

        <Context path="" docBase="mywebappdir" reloadable="true"/>
        </Host>

   Context 를 빼먹으면 ROOT를 자동으로 웹루트로 쓴다.

3번의 설명은 Host의  appBase 경로를 다른 곳으로 돌린 경우에 해당한다.

이러한 경우 다음 항목인 " 별도의 디렉토리를 appBase로 잡을 경우 설정" 내용을 참고하여 진행해야 한다.

우리 시스템(2008년8월 개발서버)은 3번과 같이 별도의 경로를 web, app Base디렉토리로 잡고 진행한다.

 

 

p.s.> 톰켓 5.0부터 추가적인 context는 server.xml에 추가하지 않고,
각 웹어플리케이션 디렉토리 별로 META-INF 밑에 context.xml을 추가하게 됩니다.

웹루트를 appBase와 같이 하려면 이의 설정을 server.xml에서 설정해도 무방한 것 같습니다만,
webapps를 루트로 쓰는 것은 특별한 경우가 아니면 지양하는 게 좋으며,
꼭 필요하다면 apache의 redirect를 쓰는 방법 등으로 해결할 수도 있습니다.

 

별도의 디렉토리를 웹 컨텍스트 루트로 잡을 경우 설정과정

  • 우리 시스템은 다른 하드디스크에 별도로 디렉토리를 생성하였다.

    이는 /media/disk 로 마운트되어 있다.

  • /media/disk/webapps 디렉토리를 생성해 권한을 사용가능한 일반유저 권한으로 설정한다(mkdir, chown 등 사용)
  • 위 디렉토리에 컨텍스트가 될 "test" 디렉토리를 만들고 시험적으로 되는지 확인해 볼 만한 index.jsp 파일 하나를 아래와 같이 대충 만들어 넣는다.
  1. <html>
    <head><title>TEST-INDEX</title>
    <body>
    <h1>INDEX</h1>
    </body>
    </html>

 

톰캣 관리자 화면에서 새로운 어플리케이션이 보여지게 하려면  TOMCAT_HOME /work/Catalina/호스트명(localhost)/{컨텍스트명}test.xml 파일을 아래와 같이 만들어 넣으면

  1. <?xml version='1.0' encoding='utf-8'?>
    <Context path="/test"
             docBase="/media/disk/webapps/test"
             debug="0"
             reloadable="true"
             crossContext="true"
    />

톰캣 관리자 화면에서 확인이 될 수 있다.

즉, 호스트 밑에 컨텍스트명과 동일한 컨텍스트 xml 파일을 넣으면 된다는 것이지만, 런타임에만 적용되므로 환경설정에 완전히 적용하기 위해선 컨텍스트 설정에 관한 자세한 설정은 Tomcat 6 컨텍스트 설정방법 을 참고한다.

TOMCAT_HOME : 톰캣 설치 디렉터리

 

1. 도메인으로 분류하는 방법

 

TOMCAT_HOME\conf\server.xml 을 열면 기본적으로 하나의 Service 엘리먼트가 있고
그 하위에 Engine 엘리먼트가, 또 그 하위에 아래와 같은 하나의 Host 엘리먼트가 있다.

 

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>

 

아래와 같이 추가하려는 도메인으로 Host 엘리먼트를 하나 더 추가한다.

 

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>
      <Host name="test.sisinfo.com
appBase="/media/disk/webapps/test"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>

 

appBase는 이 컨텍스트의 물리적 영역이 되겠다.
물론 실제의 물리적인 디렉터리도 아래와 같이 필요하다.

 

/media/disk/webapps/test/ROOT
/media/disk/webapps/test/ROOT/WEB-INF

 

WEB-INF의 web.xml등은 TOMCAT_HOME/webapps/ROOT/WEB-INF에서 복사한다.

/media/disk/webapps/test/ROOT 디렉터리는 이 컨텍스트의 루트 디렉터리로 작동한다.

 

여기서 test.sisinfo.com은 추가하려는 도메인이 되겠으며,
실제로 도메인을 보유하지 않고 개발 PC에서 작업하는 경우,
C:\Windows\system32\drivers\etc\hosts 파일을 열고
마지막 줄에 다음을 추가한다.

 

192.168.10.105      test.sisinfo.com

 

이제 웹브라우저를 열고 [test.sisinfo.com:포트번호]에 접속하면 된다.

 

만일 /media/disk/webapps/test/ROOT 가 아닌 /media/disk/webapps/test 를 룰트 디렉터리로 사용하고자 하는 경우에는
server.xml을 다음과 같이 작성한다.

      <Hostname="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>
      <Host name="test.sisinfo.com
"  appBase="/media/disk/webapps/test"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
    <context path="" docBase="/media/disk/webapps/test"></context>
      </Host>

 

2. 포트 번호로 분류하는 방법

 

톰캣에서도 MS의 IIS와 같이 포트 번호에 따라 호스팅하는 것이 가능하다.
TOMCAT_HOME\conf\server.xml 을 열고 아래와 같이 Service 엘리먼트를 추가한다.

 

  <Service name="testdomain">
    <Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="testdomain" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      <Host name="localhost"  appBase="C:\testdomain"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
            <context path="" docBase="C:\testdomain"></context>
      </Host>
    </Engine>
  </Service>

 

Service 엘리먼트의 name 속성은 추가하려는 컨텍스트의 이름이 되겠다.
첫 Connector 엘리먼트의 port 속성은 사용하려는 포트 번호를 넣으면 된다.
Host 엘리먼트와 context 엘리먼트, appBase에 대한 물리적 경로 생성은 1항의 설명과 같다.

 

이제 웹브라우저를 열고 [localhost:포트번호]에 접속하면 된다.

 

 

 

 

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

아파치와 연동없이 톰캣만으로도 하나의 IP로 다수의 웹사이트를 운영하는 것이 가능하다.
(아파치와 톰캣을 연동하는 방법에 대해서는 차후에 자세히 올리도록 하겠다)

특히 개발자의 경우 여러개의 프로젝트를 개발하거나 테스트하고자 할 때 웹사이트를 여러개 운영해야한다. 다수의 웹 사이트를 세팅하는 방법은 크게 2가지가 있다.

가상호스트를 이용하는 방법은 도메인을 이용하여 실제로 서비스를 운영하는 경우가 아니면 개발자에겐 별 의미가 없다. 여기서는 두번째 방법인 IP 어드레스의 포트를 이용하는 방법에 대해서 설명하겠다. (바로가기 : 톰캣에서 가상 호스트를 이용하는 방법)

우선 설치 환경은 다음과 같다.

  • O/S : Windows XP (난 아직 리눅스를 잘 모른다. 비슷하겠지만 테스트해보지 않았다)
  • Tomcat 6.0 (정확히는 6.0.10) : 다운로드

설명의 편의를 위해 톰캣의 설치 디렉토리는 'TOMCAT_HOME' 으로 표기할 것이다. 참고로 내 경우는 C:\Server\Tomcat6.0 이다.

설정하는 방법은 간단하다. /TOMCAT_HOME/conf/에 있는 server.xml 파일만 수정하면 끝이다. server.xml의 쓸데없는 주석부분을 다 없애고 핵심부분만 남겨놓으면 아래와 같다.


<Service name="Catalina">
  <Connector port="8080" protocol="HTTP/1.1"
   maxThreads="150" connectionTimeout="20000"
   redirectPort="8443" />
  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

  <Engine name="Catalina" defaultHost="localhost">
   <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>

   <Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
   </Host>

  </Engine>
 </Service>



우선 빨간색으로 표시한 부분만 이해하고 넘어가도 상관없다.
Connector port="8080"은 HTTP로 넘어오는 포트를 지정하는 것이다. 톰캣의 기본 포트가 8080인 이유가 여기에 있다. 따라서 8080 대신 기본 80포트를 사용하고 싶다면? 바로 이 부분을 port="80"으로 바꾸어주면 된다.

다음, Host 지시어의 appBase="webapps" 는 웹어플리케이션(웹사이트)의 위치를 나타낸다. appBase="./webapps"와 같은 의미다. 실제 위치는 TOMCAT_HOME/webapps이다. 물론 "d:/weapps/myweb1" 과 같이 절대경로로 지정하는 것도 가능하다.

그럼 웹사이트를 하다 더 추가하고 싶다면? 위의 <Service>...</Service>를 하나 더 만들어 버리면 된다. 위의 코드를 복사한 다음 server.xml 에 추가한다. 그리고 빨간색으로 표시한 부분만 수정하자.

<Service name="Catalina2">
  <Connector port="9090" protocol="HTTP/1.1"
     maxThreads="150" connectionTimeout="20000"
     redirectPort="8443" />
  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 
  <Engine name="Catalina" defaultHost="localhost">
   <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
     resourceName="UserDatabase"/>
 
   <Host name="localhost"  appBase="d:/webapps/myweb2"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
   </Host>
  </Engine>
 </Service>


다른 웹어플리케이션을 돌리기 위해 서비스를 하나 더 추가한 것이다.
port="9090" 은 새로 추가하고 싶은 포트이다.
appBase="d:/webapps/myweb2"는 9090 포트에서 돌아갈 웹사이트 위치이다.

이제 server.xml 설정은 끝난 것이다.
마지막으로 웹사이트의 ROOT 디렉토리를 지정해주자. 아래의 폴더를 생성한다.

d:/webapps/myweb2/ROOT/   (
d:/webapps/myweb2/ROOT/WEB-INF/
(WEB-INF 폴더를 만들고 web.xml 파일을 추가한다. 그냥 /TOMCAT_HOME/webapps/ROOT/WEB-INF/에 있는 web.xml 을 복사하면 된다.

무지 간단하다. 하지만 난 이 간단한 것을 위해서 하루종일 삽질해야만 했다. 검색해 보아도 문서는 많은데 실제 도움이 될만한 것이 별로 없었다.

테스트하기 위해 ROOT/index.html 또는 index.jsp를 만든다.
이제 톰캣을 재시작하고 웹브라우저로 접속해 보자.
http://localhost:8080
http://localhost:9090

 

 

 

 

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

톰캣에서 하나의 IP로 여러개의 웹사이트를 운영하는 방법은 2가지가 있다.

  • 가상 호스트(Virtual Host)를 이용하는 방법
  • IP Address의 port를 여러개 사용하는 방법
  • 여기서는 가상 호스트를 이용하여 톰캣에서 여러개의 웹사이트를 운영하는 방법에 대해서 설명하고자 한다.
    설치 환경은 다음과 같다.

    • O/S : Windows XP (Windows Server 동일)
    • Tomcat 6.0.10

    설명의 편의를 위해 톰캣의 설치 디렉토리는 'TOMCAT_HOME' 으로 표기할 것이다. 참고로 내 경우는 C:\Server\Tomcat6.0 이다.

    설정하는 방법은 /TOMCAT_HOME/conf/에 있는 server.xml 파일만 수정하면 된다. server.xml의 쓸데없는 주석부분을 다 없애고 관련 부분만 남겨놓으면 아래와 같다.   

    <Service name="Catalina">
          <Connector port="8080" protocol="HTTP/1.1"
           maxThreads="150" connectionTimeout="20000"
           redirectPort="8443" />
          <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

          <Engine name="Catalina" defaultHost="localhost">
           <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            resourceName="UserDatabase"/>

           <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
           </Host>

          </Engine>
         </Service>

    위의 내용에서 핵심 부분은 <Host></Host> 영역이다.

    1. 우선 <Connector port="8080" protocol="HTTP/1.1" 부분의 port를 80으로 수정한다.
      도메인명이 기본으로 80포트를 사용하기 때문이다.
     
    2. <Host>... </Host> 에 해당하는 부분을 복사하여 2개를 만든다. 그리고 이렇게 수정하자.
          

    <Host name="www.myweb1.com"  appBase="d:/webapps/myweb1"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
           </Host>

           <Host name="www.myweb2.com"  appBase="d:/webapps/myweb2"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
           </Host>

      appBase="webapps" 는 톰캣의 기본 웹루트인 TOMCAT_HOME/webapps 디렉토리를 가르킨다. 웹사이트를 원하는 디렉토리에 두고 싶다면 d:/webapps/myweb1 처럼 자기가 지정하고 싶은 곳으로 수정하면 된다.
     
    3. 마지막으로 웹사이트들의 ROOT 디렉토리를 지정해주자. 아래의 폴더를 생성한다.

    d:/webapps/myweb1/ROOT/
    d:/webapps/myweb1/ROOT/WEB-INF/

    d:/webapps/myweb2/ROOT/
    d:/webapps/myweb2/ROOT/WEB-INF/

    그리고 WEB-INF 폴더 밑에 각각 web.xml 파일을 추가한다. 그냥 /TOMCAT_HOME/webapps/ROOT/WEB-INF/에 있는 web.xml 을 복사하면 된다.

    4. 테스트하기 위해 ROOT/index.html 또는 index.jsp를 만든다.

    이제 톰캣을 재시작하고 웹브라우저로 접속해 보자.
    http://www.myweb1.com
    http://www.myweb2.com

    정말 간단하지 않은가?

    Posted by 복태아빠
    ,
    Posted by 복태아빠
    ,