mysql] max_allowed_packet 관련 오류

max_allowed_packet에 대한 설명은 다음과 같다.

통신 패킷은 MySQL 서버로 전송되는 단일 SQL 문, 클라이언트로 전송되는 단일 행 또는 마스터 복제본 서버에서 슬레이브로 전송되는 바이너리 로그 이벤트입니다. MySQL 8.0 서버 또는 클라이언트에서 전송할 수 있는 가장 큰 패킷은 1GB입니다.

패킷이라고 나오지만 실제 통신에서 전달되는 크기이다.

이 값은 기본이 16M으로 되어 있으나, 대용량 처리로 인하여 값을 변경해야 할 수 있다. 변경은 my.cnf의 설정에서 다음을 변경하면 된다.(128M로 변경 샘플)

[mysqld]
max_allowed_packet=128M

변경 내역을 반영하려면, 서버를 재기동하거나 다음의 명령어로 재기동 없이 반영 가능하다.

# mysql 설치 위치

> ./bin/mysqladmin -h 127.0.0.1 -u root -p reload

참고 자료


Posted by lahuman

MongoDB 3.2.20 Authentication Setting

MongoDB 3.2.20 버젼으로 진행된다. 설치와 cluster가 완료 되었다는 가정하에 진행이 된다. 또한 ElasticSearch와 MongoDB는 mongo-connect를 이용하여 연결 되어 있다.

고객사의 요청으로 MongoDB 접근에 대한 권한을 설정해야 하는 일이 생겼다.

간단하게 설정으로 해결되는 문제로 생각했는데 삽질이 컸다.

현재 MongoDB의 구조는 다음과 같다.

MongoDB Architecute

총 5대의 서버로 구성되어 있으며, 2대는 데이터를 적재하는 MongoDB, 1대는 Primary/Slave의 투표를 하는 ARBITER, 클러스터의 메타 데이터 및 구성 설정을 저장하는 config 서버, 마지막으로 클라이언트 응용 프로그램과 공유 된 클러스터 사이의 인터페이스를 제공하는 쿼리 라우터 역할 하는 mongos로 구성된다.

인증을 위한 KeyFile 생성

MongoDB는 다음 2가지 인증 매커니즘을 지원 합니다.

본 글에서는 간단하게 사용이 가능한 SCRMA을 이용합니다

키 생성 명령어

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

생성된 키를 각 설정 파일에 설정 해야 한다.

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>
net:
   bindIp: localhost,<ip address>

Server-A(20001), Server-B(20002), Server-C(20003), Server-D(20004)의 설정파일에 security: keyFile: 이 모두 설정되어야 한다. Server-F(10001)는 실행시 option으로 처리 한다.

재기동 옵션 A~D, F

/usr/bin/mongod --config /etc/mongod_repl1.conf
/usr/bin/mongod --config /etc/mongod_repl2.conf
/usr/bin/mongod --config /etc/mongod_repl3_arbiter.conf
/usr/bin/mongod --config /etc/mongod_repl4_config.conf --configsvr
/usr/bin/mongos --configdb localhost:20004 --port 10001 --fork --logpath /var/lib/mongodb/mongod_mongos.log --chunkSize 1 --keyFile /etc/m_key

MongoDB 재기동 & 계정 생성

설정이 완료된 이후에 MongoDB를 재기동 한다.

재기동이 완료 되면 계정을 생성 한다.

여기서는 단순하게 계정을 생성 하도록 한다. 계정 생성은 mongos와 repl1에 모두 생성 해야 한다.

  1. mongos 설정 ~~~ $> mongo –port 10001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

2. repl1 설정

$> mongo –port 20001

use admin; db.createUser( { user: “admin”, pwd: “1234”, roles: [ { role: “root”, db: “admin” } ] } );

3. mongo-connector 실행(생성한 계정의 id/pw를 option에 추가 한다.)

/usr/bin/python /usr/bin/mongo-connector -m localhost:10001 -t localhost:9200 -d elastic2_doc_manager -a admin -p 1234 ~~~

테스트

계정 처리가 완료 되면, 데이터를 조회/삽입 해본다.

$> mongo --port 10001

mongos> db.test.find({})
Error: error: {
	"ok" : 0,
	"errmsg" : "not authorized on test to execute command { find: \"test\", filter: {} }",
	"code" : 13
}
mongos>
mongos> use admin
switched to db admin
mongos> db.auth("admin", "1234")
1
mongos> db.test.find({})
mongos> db.test.insert({"x":1, "y":10})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find({})
{ "_id" : ObjectId("5b6b76a593ec1b18e1f5f441"), "x" : 1, "y" : 10 }

참고자료


Posted by lahuman

INT4 형식으로 저장된 IP 값을 Function을 이용하여 처리 하기

IP를 postgresql에 저장을 할때 문자열로 저장을 하기도 하지만, Network Address Types으로 제공도 된다.

NameStorage SizeDescription
cidr7 or 19 bytesIPv4 and IPv6 networks
inet7 or 19 bytesIPv4 and IPv6 hosts and networks
macaddr6 bytesMAC addresses

또한 다른 방식으로는 int8로 저장이 되기도 한다.

문제는 int4 형식으로 저장되었을 경우이다.

이 경우에는 음수값에 대하여 IP 형식으로 표출하기 위해서는 int4보다 큰 양수 형식으로 변환하여 표시 해야 한다.

간단하게 function을 이용하여 만들어 보았다.

create or replace function int2ip(intVal integer)
returns TABLE(
    ipVal text
)
as $$
begin
    if intVal < 0 then
      return QUERY SELECT ('0.0.0.0'::inet + ((2147483649+intVal)::bigint+2147483647::bigint))::text;
      -- return QUERY SELECT '0.0.0.0'::inet + ( 'x' || to_hex(intVal))::bit(32)::bigint
    else
      return QUERY SELECT ('0.0.0.0'::inet + intVal)::text;
    end if;
    
end; $$
language 'plpgsql';


-- 211.115.106.210
select int2ip(-747410734);

결과

int2ip
211.115.106.210/32

postgresql을 설치 하지 않고도 온라인에서 간단하게 테스트 하는 사이트를 이용하였다..

참고 사이트


Posted by lahuman