zookeeper 서버에서 leader인지 follower인지를 다음처럼 간단히 확인할 수 있다. 


$ echo srvr | nc localhost 2181


그러면 Mode로 쉽게 파악할 수 있다. 



$ echo srvr | nc localhost 2181

Zookeeper version: 3.3.3-1203054, built on 11/17/2011 05:47 GMT

Latency min/avg/max: 0/0/82

Received: 70940852

Sent: 71197941

Outstanding: 1

Zxid: 0x2000016bf

Mode: follower

Node count: 4325



$ echo srvr | nc localhost 2181 | grep Mode

Mode: leader





실제 요청(request)이 들어오고 있는지 확인하려면 다음과 같이 진행하다. 


$ echo stat | nc localhost 2181

Zookeeper version: 3.3.3-1203054, built on 11/17/2011 05:47 GMT

Clients:

...


Latency min/avg/max: 0/0/16

Received: 4288

Sent: 4288

Outstanding: 0

Zxid: 0x1007f3e40

Mode: follower

Node count: 4317



stat 또는 srvr 정보는 다음과 같다. 



지표

내용

Latency min/avg/max

클라이언트 요청을 처리하는데 소요되는 전체 지연 시간(latency)

지연시간이 길어질수록 좋지 않다.

Outstanding

서버에서 큐잉되고 있는 요청 개수. 점점 요청 개수가 많아질 수록 개수는 늘어난다. 1,2까지는 괜찮은 것 같다. 하지만 그 이상이 되면 확인해볼 필요가 있다.

Received

지금까지 받은 클라이언트 요청 개수

Sent

지금까지 보낸 클라이언트 패킷 수(응답과 상태 알림)

Mode

노드의 상태
leader 또는 follow, standalone

Zxid

노드의 id

Node Count

주키퍼 네임스페이스의 znode 개수





참고로 나는 클러스터의 zookeeper 정보의 node count를 통해서 동기 상태를 파악한다.





정상적으로 동작하는지 확인하려면 ruok를 실행한다. imok이 들어오면 괜찮다.


$ echo ruok | nc 127.0.0.1 2181

imok




클러스터 정보를 보고 싶으면, jmx로 연결해서 확인한다.  org.apache.ZookeeperService에서 ReplicatedServer mbean을 확인한다. 





환경 정보(java, zookeeper classpath 등등)는 envi 커맨드를 사용한다. 


$ echo envi | nc 127.0.0.1 2181



dump 커맨드를 사용하면 zookeeper의 모든 노드 정보를 출력한다. 노드의 값은 나오지 않는다. 


$ echo dump | nc 127.0.0.1 2181


SessionTracker dump:

org.apache.zookeeper.server.quorum.LearnerSessionTracker@63f69aa9

ephemeral nodes dump:

Sessions with Ephemerals (225):


0x54f9dca900afb7f:

/google/plus/real/monitor/n_0000000040

.....




zookeeper의 어드민은 현재 장비를 기준으로 되어 있지, 전체적으로 모니터링이 조금 어렵다. 

zktop.py 소스를 다운받아 통합 모니터링이 가능하다. 


$ wget https://raw.githubusercontent.com/phunt/zktop/master/zktop.py

$ chmod 755 zktop.py

$ ./zktop.py --server "a.google.com:2181,b.google.com:2181,c.google.com:2181"






Posted by 김용환 '김용환'

zookeeper rmr 커맨드

nosql 2017.01.12 15:30


zookeeper 3.4.0부터 deleting recursive node 개념이 추가되었다. 이전 버전에서는 3.3.x 이하 버전에서는 사용할 수 없는 기능이다. 



https://issues.apache.org/jira/browse/ZOOKEEPER-729



$ ./zkCli.sh rmr /node

Posted by 김용환 '김용환'


테스트 용도로 hbase 1.x.x(hbase 1.0, hbase 1.2, hbase1.2.2)를 설치하고, hbase.rootdir를 로컬 디렉토리로 정하고(로컬 디렉토리로 정하지 않아도 에러가 발생했다), hbase-site.xml에 정의한 후, standalone으로 실행할 때, 다음과 같은 에러가 발생할 수 있다. 



2016-08-02 20:49:27,597 FATAL [Samuelui-MacBook-Pro:59298.activeMasterManager] master.HMaster: Failed to become active master

java.net.ConnectException: Call From Samuelui-MacBook-Pro.local/1.1.1.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:422)

at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:783)

at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:730)

at org.apache.hadoop.ipc.Client.call(Client.java:1415)

at org.apache.hadoop.ipc.Client.call(Client.java:1364)

at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)

at com.sun.proxy.$Proxy16.setSafeMode(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)

at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)

at com.sun.proxy.$Proxy16.setSafeMode(Unknown Source)

at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.setSafeMode(ClientNamenodeProtocolTranslatorPB.java:602)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.apache.hadoop.hbase.fs.HFileSystem$1.invoke(HFileSystem.java:279)

at com.sun.proxy.$Proxy17.setSafeMode(Unknown Source)

at org.apache.hadoop.hdfs.DFSClient.setSafeMode(DFSClient.java:2264)

at org.apache.hadoop.hdfs.DistributedFileSystem.setSafeMode(DistributedFileSystem.java:986)

at org.apache.hadoop.hdfs.DistributedFileSystem.setSafeMode(DistributedFileSystem.java:970)

at org.apache.hadoop.hbase.util.FSUtils.isInSafeMode(FSUtils.java:525)

at org.apache.hadoop.hbase.util.FSUtils.waitOnSafeMode(FSUtils.java:971)

at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:424)

at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:153)

at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:128)

at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:638)

at org.apache.hadoop.hbase.master.HMaster.access$500(HMaster.java:184)

at org.apache.hadoop.hbase.master.HMaster$1.run(HMaster.java:1729)

at java.lang.Thread.run(Thread.java:745)

Caused by: java.net.ConnectException: Connection refused

at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)

at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:529)

at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:493)

at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:606)

at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:700)

at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:367)

at org.apache.hadoop.ipc.Client.getConnection(Client.java:1463)

at org.apache.hadoop.ipc.Client.call(Client.java:1382)

... 29 more



2016-08-03 10:53:19,227 DEBUG [main-SendThread(fe80:0:0:0:0:0:0:1%1:2181)] zookeeper.ClientCnxnSocketNIO: Ignoring exception during shutdown input

java.net.SocketException: Socket is not connected

        at sun.nio.ch.Net.translateToSocketException(Net.java:145)

        at sun.nio.ch.Net.translateException(Net.java:179)

        at sun.nio.ch.Net.translateException(Net.java:185)

        at sun.nio.ch.SocketAdaptor.shutdownInput(SocketAdaptor.java:404)

        at org.apache.zookeeper.ClientCnxnSocketNIO.cleanup(ClientCnxnSocketNIO.java:200)

        at org.apache.zookeeper.ClientCnxn$SendThread.cleanup(ClientCnxn.java:1185)

        at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1110)

Caused by: java.nio.channels.NotYetConnectedException

        at sun.nio.ch.SocketChannelImpl.shutdownInput(SocketChannelImpl.java:782)

        at sun.nio.ch.SocketAdaptor.shutdownInput(SocketAdaptor.java:402)

        ... 3 more



2016-08-02 16:07:11,339 WARN  [RS:0;172.26.116.174:50808-SendThread(fe80:0:0:0:0:0:0:1%1:2181)] zookeeper.ClientCnxn: Session 0x1564a13ad290003 for server null, unexpected error, closing socket connection and attempting reconnect

java.net.ConnectException: Connection refused

at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)

at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)

at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)






에러가 발생하는 코드는 다음과 같다.

https://github.com/apache/hbase/blob/branch-1.0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java



        MonitoredTask status = TaskMonitor.get().createStatus("Master startup");

        status.setDescription("Master startup");

        try {

          if (activeMasterManager.blockUntilBecomingActiveMaster(timeout, status)) {

            finishActiveMasterInitialization(status);

          }

        } catch (Throwable t) {

          status.setStatus("Failed to become active: " + t.getMessage());

          LOG.fatal("Failed to become active master", t);

          // HBASE-5680: Likely hadoop23 vs hadoop 20.x/1.x incompatibility

          if (t instanceof NoClassDefFoundError &&

              t.getMessage().contains("org/apache/hadoop/hdfs/protocol/FSConstants$SafeModeAction")) {

            // improved error message for this special case

            abort("HBase is having a problem with its Hadoop jars.  You may need to "

              + "recompile HBase against Hadoop version "

              +  org.apache.hadoop.util.VersionInfo.getVersion()

              + " or change your hadoop jars to start properly", t);

          } else {

            abort("Unhandled exception. Starting shutdown.", t);

          }

        } finally {

          status.cleanup();

        }




문제를 해결하기 위해 네트워크를 확인했다.


1) ssh 확인

22 번 포트로 ssh 키로 잘 접속되는지 확인.

ssh localhost 


2) 방화벽 확인

맥의 Perference의 Sharing icon를 선택해서 방화벽을 오픈되는지 확인

telnet localhost 123123


3) hdfs 또는 file 확인


hbase-site.xml 파일에서 다음으로 작성. 로그 상 9000번 포트로 접근하는 걸 봐서는 hdfs로 접근하는 것 같아서, file:///을 사용해서 변경하니 잘 작동했다.


 <property>

    <name>hbase.rootdir</name>

    <value>/tmp/hbase/data</value>

  </property>


        


==> 


 <property>

    <name>hbase.rootdir</name>

    <value>file:///tmp/hbase/data</value>

  </property>




Posted by 김용환 '김용환'



5대 서버에 redis cluster 셋업하기


다운로드 받고 설치

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz 

$ tar zxvf redis-3.0.7.tar.gz



설정 추가하기 


$ cd redis-3.0.7

$ mkdir 7000

$ cat > cluster.conf

port 7000

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 3000

daemonize yes

appendonly yes

dir ./7000



실행한 redis의 상태를 보면, 7000 번 포트가 떠있고, cluster 상태인지 알 수 있다. 

$ ./src/redis-server cluster.conf

$


$ ps -ef | grep redis

www   11235     1  0 11:25 ?        00:00:00 ./src/redis-server *:7000 [cluster]


cluster.conf 파일에 dir 지시자의 결과 디렉토리(7000)에 다음 파일이 존재하는 것을 확인할 수 있다.

$ ls

appendonly.aof  nodes.conf




만약 cluster.conf 파일에 daemonize yes를 사용하지 않고 데몬을 띄우면, Running in cluster mode 라는 로그를 볼 수 있다. 

$ ./src/redis-server cluster.conf


* No cluster configuration found, I'm d2c520147ed01b7b8dca0509b0ba71e0ba028f6c

                _._

           _.-``__ ''-._

      _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit

  .-`` .-```.  ```\/    _.,_ ''-._

 (    '      ,       .-`  | `,    )     Running in cluster mode

 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 7000

 |    `-._   `._    /     _.-'    |     PID: 27837

  `-._    `-._  `-./  _.-'    _.-'

 |`-._`-._    `-.__.-'    _.-'_.-'|

 |    `-._`-._        _.-'_.-'    |           http://redis.io

  `-._    `-._`-.__.-'_.-'    _.-'

 |`-._`-._    `-.__.-'    _.-'_.-'|

 |    `-._`-._        _.-'_.-'    |

  `-._    `-._`-.__.-'_.-'    _.-'

      `-._    `-.__.-'    _.-'

          `-._        _.-'

              `-.__.-'



한 대의 서버에 레디스 클러스터(src/redis-trib.rb)를 실행한다. 그 전에 먼저 ruby가 설치되었는지 확인하고, redis gem을 설치한다.


만약 아래와 같은 에러가 나면, 권한이 없다는 것이다.(cd /usr/local/lib/ruby/gems/2.1.0 디렉토리에 chmod 또는 chown 명령어를 사용한다).

$ ruby install redis

ERROR:  While executing gem ... (Gem::FilePermissionError)

    You don't have write permissions for the /usr/local/lib/ruby/gems/2.1.0 directory.



$ gem install redis

Fetching: redis-3.3.0.gem (100%)

Successfully installed redis-3.3.0

Parsing documentation for redis-3.3.0

Installing ri documentation for redis-3.3.0

Done installing documentation for redis after 0 seconds

1 gem installed





redis gem을 설치한 서버에서 src/redis-trib.rb 파일을 실행한다.


$ src/redis-trib.rb create 1.1.1.1:7000 1.1.1.2:7000 1.1.1.3:7000 1.1.1.4:7000 1.1.1.5:7000 

>>> Creating cluster

>>> Performing hash slots allocation on 5 nodes...

Using 5 masters:

1.1.1.1:7000

1.1.1.2:7000

1.1.1.3:7000

1.1.1.4:7000

1.1.1.5:7000

M: d2c520147ed01b7b8dca0509b0ba71e0ba028f6c 1.1.1.1:7000

   slots:0-3276 (3277 slots) master

M: 928190fdc1003f6bafc85da34cc23d20ce6cd1b01 1.1.1.2:7000

   slots:3277-6553 (3277 slots) master

M: 7a31e87116846784171dd55c559eaf6f3beef08f 1.1.1.3:7000

   slots:6554-9829 (3276 slots) master

M: bb90967fa662a4ca57d7329a138e86ae48b7b828 1.1.1.4:7000

   slots:9830-13106 (3277 slots) master

M: ffc4b32105d84e1ef0db310afddf70ae6befcf9e 1.1.1.5:7000

   slots:13107-16383 (3277 slots) master

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join..

>>> Performing Cluster Check (using node 1.1.1.1:7000)

M: d2c520147ed01b7b8dca0509b0ba71e0ba028f6 1.1.1.1:7000

   slots:0-3276 (3277 slots) master

M: 928190fdc1003f6bafc85da34cc23d20ce6cd1b0 1.1.1.2:7000

   slots:3277-6553 (3277 slots) master

M: 7a31e87116846784171dd55c559eaf6f3beef08f 1.1.1.3:7000

   slots:6554-9829 (3276 slots) master

M: bb90967fa662a4ca57d7329a138e86ae48b7b828 1.1.1.4:7000

   slots:9830-13106 (3277 slots) master

M: ffc4b32105d84e1ef0db310afddf70ae6befcf9e 1.1.1.5:7000

   slots:13107-16383 (3277 slots) master

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


hash slot이 제대로 설치되었는지 확인했다.



클러스터 상태로 접근해서 레디스 데이터를 저장하고 삭제해 본다.

$ ./src/redis-cli  -c -p 7000
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 1.1.1.2:7000
OK
1.1.1.2:7000> get foo
"bar"
1.1.1.2:7000> del foo

(integer) 1 



Posted by 김용환 '김용환'


cassandra에서 cli, cqlsh, nodetool에 대한 히스토리 정보를 보는 방법을 설명한다.


~/.cassandra 디렉토리 밑에 3 개의 파일이 있다.


$ ls  .cassandra/

cli.history  cqlsh_history  nodetool.history



cli(https://wiki.apache.org/cassandra/CassandraCli)는 cqlsh의 전신이었으며, cli.history 파일에 히스토리 로그를 쌓는다.


cqlsh는 cqlsh.history 파일에서 히스토리 로그를 확인한다. cqlsh에서 화살표 위,아래로 확인할 수도 있지만, 오래 전부터 쌓인 많은 정보를 확인하고 싶다면 cql.history을 확인한다.


nodetool 툴에서 사용한 히스토리 로그를 확인하려면 nodetool.history를 확인한다.




Posted by 김용환 '김용환'


cassandra는 null 필드를 지원하지 않으니. null 대신 default 값을 잘 사용하는 것이 좋다.


$ ./cqlsh

Connected to Test Cluster at 127.0.0.1:9042.

[cqlsh 5.0.1 | Cassandra 2.1.10 | CQL spec 3.2.1 | Native protocol v3]

Use HELP for help.

cqlsh>

cqlsh>

cqlsh> CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1 } ;

cqlsh> use test ;

cqlsh:test> CREATE TABLE foo (name text, age int, pet text, primary key (name)) ;

cqlsh:test> insert into foo (name, age, pet) values ('yves', 81, 'german shepherd') ;

cqlsh:test> insert into foo (name, pet) values ('coco', 'ferret') ;

cqlsh:test> SELECT * FROM foo ;


 name | age  | pet

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

 coco | null |          ferret

 yves |   81 | german shepherd



cqlsh:test> SELECT * FROM foo WHERE age=null;

InvalidRequest: code=2200 [Invalid query] message="Unsupported null value for indexed column age"


Posted by 김용환 '김용환'
hive가 다 좋은데, 성능이 너무 느려서 힘들었다. 과거에 로그를 찾기 위해 hive로 고생한 것 생각하면....ㅠㅠ

(출처 : blog.netflix.com)



hive보다 좋은  페이스북에서 SQL쿼리 엔진를 프레스토를 간략하게 소개한다.
https://prestodb.io/

설치 방법
https://prestodb.io/docs/current/installation/deployment.html
설치는 presto coordinator와 worker로 나눠서 설치한다.


프레스토 아키텍처로 좋은 그림은 딱 아래와 같다. 프레스토는 coordinator와 여러 대의 worker로 나누어진다. interface역할을 coordinator가 한다. 

( 출처 : http://labs.gree.jp/blog/2014/12/12838/)


프레스토의 내부 아키텍처는 다음과 같다. connector plugin을 이용하여 어떠한 storage도 붙을 수 있다. 

(출처 : slideshare)


써보니. Hive보다 진짜 빠르다. 대신 그 만큼 cpu와 메모리 자원을 많이 쓴다. 
worker는 정말 좋은 서버로 구축해야 하며, hadoop에도 cpu 자원을 많이 쓰니, 조금 sql 문에 신경써야 한다. 



presto 사용시 바로 hadoop 을 쓰는 것보다 presto에서 바로 쓸 수 있는 특정 파일시스템(ORC, Parquet)을 써야 성능이 잘 나온다고 한다. (실제로도 빠르다.)







아래는 공부하기에 좋은 자료. 

http://www.slideshare.net/frsyuki/presto-hadoop-conference-japan-2014
Presto - Hadoop Conference Japan 2014 from Sadayuki Furuhashi




http://pt.slideshare.net/GuorongLIANG/facebook-presto-presentation

Facebook Presto presentation from Guorong LIANG



https://code.facebook.com/posts/370832626374903/even-faster-data-at-the-speed-of-presto-orc/



http://techblog.netflix.com/2014/10/using-presto-in-our-big-data-platform.html




Posted by 김용환 '김용환'



tech planet 2015 - 라인 redis clusters를 서원필님이 발표했다. 발표 내용 중 좋은 팁들이 나와서 메모해 둔다.

http://techplanet.skplanet.com/speaker_track1.html#track1_6




#tip 1(사진을 못 찍음)


apache coomon pools
- jmx optionon, gc time 50% 증가
- pool설정이 잘못되면, stream buffer의 빈번한 생성/과로 인해 GC 부하

cpu affinity
- redis, nic interrupt cpu 분리하는 편이 좋음
- high load 상황에서 cpu usage 20-30%까지 차이 발생

(tip#1 슬라이드의 나머지 내용은 잘 기억 안남)

# tip 2
max-memory
- data가 너무 크면 slaveof 시간등이 늘어나게 된다. 26G dump에 33분분

maxmemory-policy
- rehashing 중에 max-memory에 도달하면, LRU가 필요 이상으로 많은 메모리를 삭제하려는 문제가 있음
- 상황에 따라 N분간 LRU 삭제만 할 수도 있음
(hash 크기를 크게 하여 사용)

ziplist/intst 적극 활용
- 평균 45% 정도의 메모리 사용량 감소 효과
- 한번 ziplist/intset -> set/hash/zset/list로 바뀌면 다시 반대로 돌아가지 않는다.
- "zunionstore key 1 key" 형태로 하면 강제로 변경 가능하지만 fragmentation 문제 발생 가능
  -- mem_fragmentation_ratio:2.33 


# tip 3

Lua script 적극 활용
- number of I/O
- Atomicity

client-output-buffer-limit 설정
- write가 많으면 "client-output-buffer-limit.slave" 기본값으로는 slaveof 실패할 수 있음

사람은 실수를 한다.
- keys, shutdown, flushall, flushdb, save 등 위험한 명령어는 rename

기본적으로 하지 말아야 할 것들에 대한 정보
- src/latency.c, createLatencyReport()








Posted by 김용환 '김용환'



huston admin, robomongo, mongohub 등이 있다.


리눅스에 replica set을 쓰는 형태라 테스트를 하고 있고, 로컬 장비는 mac이라 쓰기 편해야 했는데.

robomongo 0.8 버전은 아직 replica set을 지원하지 않아서, 제대로 데이터를 읽지 못했다.


mongohub를 쓰면 replica set, sharded cluster, standalone 모두 제공해서 쓸 만한 듯 하다. 


https://github.com/jeromelebel/MongoHub-Mac

Posted by 김용환 '김용환'



mongodb 실행시 아래와 같은 경고가 발생했다. 

 CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 31394 processes, 1024000 files. Number of processes should be at least 512000 : 0.5 times number of files.




이 문제를 확인하려면, 소스를 확인한다.


https://github.com/mongodb/mongo/blob/c0db389c3f72280d9c82202e9ee6fc70e7a17027/src/mongo/db/startup_warnings_mongod.cpp


#if defined(RLIMIT_NPROC) && defined(RLIMIT_NOFILE) // Check that # of files rlmit > 1000 , and # of processes > # of files/2
const unsigned int minNumFiles = 1000;
const double filesToProcsRatio = 2.0;
struct rlimit rlnproc;
struct rlimit rlnofile;
if (!getrlimit(RLIMIT_NPROC, &rlnproc) && !getrlimit(RLIMIT_NOFILE, &rlnofile)) {
if (rlnofile.rlim_cur < minNumFiles) {
log() << startupWarningsLog;
log() << "** WARNING: soft rlimits too low. Number of files is " << rlnofile.rlim_cur
<< ", should be at least " << minNumFiles << startupWarningsLog;
}
if (false) {
// juse to make things cleaner
}
#ifdef __APPLE__
else if (rlnproc.rlim_cur >= 709) {
// os x doesn't make it easy to go higher
// ERH thinks its ok not to add the warning in this case 7/3/2012
}
#endif
else if (rlnproc.rlim_cur < rlnofile.rlim_cur / filesToProcsRatio) {
log() << startupWarningsLog;
log() << "** WARNING: soft rlimits too low. rlimits set to " << rlnproc.rlim_cur
<< " processes, " << rlnofile.rlim_cur
<< " files. Number of processes should be at least "
<< rlnofile.rlim_cur / filesToProcsRatio << " : " << 1 / filesToProcsRatio
<< " times number of files." << startupWarningsLog;
}
} else {
log() << startupWarningsLog;
log() << "** WARNING: getrlimit failed. " << errnoWithDescription() << startupWarningsLog;
}
#endif





위의 코드를 살펴보면, 아래 코드에서 걸렸다.

else if (rlnproc.rlim_cur < rlnofile.rlim_cur / filesToProcsRatio) {



ulimit -a로 실행해서 나오는 max user processes (rlnproc.rlim_cur)개수가 open files 수 / 2.0 보다 작다면 경고 메시지가 출력된다. 따라서 이 문제를 해결하려면 /etc/security/limits.conf 에 다음 내용을 추가한다.


*       soft    nproc   1024000

*       hard    nproc   1024000



mongodb를 종료하고, logout하고 login 한 후 mongod를 실행하면 다시는 warning로그는 발생하지 않는다.






참고로 아래 에러 로그가 발생하면 file number 개수 크기를 수정한다. (ulimit -n x)


WARNING: soft rlimits too low. Number of files is ...




또한, mongodb에서는 ulimit 설정을 다음과 같이 추천한다. 



http://docs.mongodb.org/manual/reference/ulimit/


Recommended ulimit Settings

Every deployment may have unique requirements and settings; however, the following thresholds and settings are particularly important for mongod and mongos deployments:

  • -f (file size): unlimited
  • -t (cpu time): unlimited
  • -v (virtual memory): unlimited [1]
  • -n (open files): 64000
  • -m (memory size): unlimited [1] [2]
  • -u (processes/threads): 64000



Posted by 김용환 '김용환'