HAProxy를 통한 RabbitMQ MQTT의 로드밸런싱

1. 개요
RabbitMQ MQTT서버를 리눅스(moramlinux)와 Windows 2012 Server(MoramDBSvr)에 설치하여 클러스터링을 걸어놓은 상태이다. 이를 이용하여 리눅스(mosamlinux)에 HAProxy를 설치하여 아래처럼 4530 포트로 요청이 들어왔을때 192.168.0.206 또는 192.168.0.207 서버로 전달하기 위하여 기술한 내용이다.

2. 설치

add-apt-repository ppa:vbernat/haproxy-1.6
apt-get update
apt-get dist-upgrade
apt-get install haproxy

3. 환경설정
/etc/haproxy/haproxy.cfg 파일을 열어 수정한다.

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

        maxconn    4096 # 최대연결수


defaults
        log     global
        #mode    http
        mode    tcp
        #option  httplog
        option  tcplog
        option  dontlognull
        option  redispatch
        retries 3

        timeout connect 5000
        timeout client  50000
        timeout server  50000


listen  rabbitmq
        bind 192.168.0.207:4530
        mode tcp
        balance roundrobin
        server rabbitmq-mosaicdbsvr 192.168.0.206:1883 check inter 5s rise 2 fall 3
        server rabbitmq-moramlinux 192.168.0.207:1883 check inter 5s rise 2 fall 3

4. 리스타드

service haproxy restart

RabbitMQ MQTT 설치 및 환경설정

1. 다운로드 및 설치
a. 얼랑(erlang) 설치
http://www.erlang.org/downloads 에서 다운로드 하여 설치

1. 다운로드 및 설치
1) 얼랑(erlang) 설치
http://www.erlang.org/downloads 에서 다운로드 하여 설치
rabbitmq01

2) RabbitMq 설치
https://www.rabbitmq.com/download.html 에서 다운로드 하여 설치
rabbitmq02

2. 관리콘솔 활성화
웹을 통해 MQ의 상태 등을 관리하기 위한 관리콘솔로써,
설치폴더의 C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin에서

rabbitmq-plugins enable rabbitmq_management 

을 입력하여 활성화

rabbitmq03

반영은 RabbitMQ 서비스를 재시작해야 한다.
관리자권한으로 명령프롬프트를 띄워 아래와 같이 입력

C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-service stop
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-service start

그리고 관리콘솔로 로그인하기 위하여 웹상에서 아래와 같이 입력하면 된다.

http://localhost:15672/

기본 ID/PASSWORD는 guest/guest 임

3. 방화벽 설정
아래 포트를 방화벽에서 Open한다.
– 5672 : AMQP 포트
– 15672 : 웹 관리 콘솔
– 4369 : EPMD (Erlang Port Mapper Daemon)
– 1883 : MQTT 접속 포트

rabbitmq04

4. 사용자 계정 생성
1) http://localhost:15672/ 에 guest/guest 로 로그인
2) Admin > Users 메뉴로 이동하여 계정 등록
3) Admin 계정 등록
rabbitmq05

Guest 계정을 없애고 admin을 등록하기 위해 위와 같이 입력
참고: 모든권한을 주려면 Tags 선택시 Admin을 클릭해야 한다.

4) 서비스 계정 등록
아래와 같이 서비스로만 사용할 계정은 Tags가 아무것도 없도록 한다.

rabbitmq06

5) 퍼미션 부여
– 위에서 등록한 admin과 testuser 계정에 대하여 퍼미션을 부여하기 위해 해당 계정을 클릭
– Virtual Host를 선택하고 아래 Set Permission을 클릭
– 비밀번호를 넣고 사용자 정보 업데이트
rabbitmq07

6) 명령어를 통한 계정 관리
– 계정생성 : rabbitmqctl add_user [사용자] [비밀번호] – 계정삭제 : rabbitmqctl delete_user [사용자] – 비밀번호 변경 : rabbitmqctl change_password [사용자] [새로운 비밀번호] – 계정리스트 보기 : rabbitmqctl list_users
– 태그부여 : rabbitmqctl set_user_tags [사용자] [태그]

5. MQTT 활성화
다음 명령을 통해 활성화

rabbitmq-plugins enable rabbitmq_mqtt

6. 환경설정 파일
– 해당사용자 계정의 하위 폴더에 있는 (Ex: C:\Users\yomile\AppData\Roaming\RabbitMQ) rabbitmq.config 파일 수정

[{rabbit,        [{tcp_listeners,    [5672]}]},
 {rabbitmq_mqtt, [{tcp_listeners,    [1883]}]}
].

Apache ActiveMQ 인증처리

1. 개요
ActiveMQ에 접속할때 ID와 패스워드가 없으면 메시지 송수신 처리가 안되도록 한다.
2. 설정방법
– Active MQ 설정
Activemq.xml파일을 열어 아래와 같이 authenticationUser 태그에 적절하게 사용자명과 패스워드를 넣어 추가한후 ActiveMQ를 재기동한다.


	
		
			
		
	

3. 클라이언트
– 코딩
접속 시 사용자명과 패스워드를 아래와 같이 파라미터로 설정한다.
물론 인증이 제대로 안되면 Exception이 발생하게 된다.

ActiveMQConnectionFactory  connectionFactory = new ActiveMQConnectionFactory("user", "password", "tcp://localhost:61616"); 
Connection jmsCon = connectionFactory.createConnection();