getstarted.rst 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. .. _getstarted:
  2. ===========
  3. Get Started
  4. ===========
  5. --------
  6. Overview
  7. --------
  8. emqttd(Erlang MQTT Broker) is an open source MQTT broker written in Erlang/OTP. Erlang/OTP is a concurrent, fault-tolerant, soft-realtime and distributed programming platform. MQTT is an extremely lightweight publish/subscribe messaging protocol powering IoT, M2M and Mobile applications.
  9. The emqttd project is aimed to implement a scalable, distributed, extensible open-source MQTT broker for IoT, M2M and Mobile applications that hope to handle millions of concurrent MQTT clients.
  10. Highlights of the emqttd broker:
  11. * Full MQTT V3.1/3.1.1 Protocol Specifications Support
  12. * Easy to Install - Quick Install on Linux, FreeBSD, Mac and Windows
  13. * Massively scalable - Scaling to 1 million connections on a single server
  14. * Cluster and Bridge Support
  15. * Easy to extend - Hooks and plugins to customize or extend the broker
  16. * Pluggable Authentication - LDAP, MySQL, PostgreSQL, Redis Authentication Plugins
  17. --------
  18. Features
  19. --------
  20. * Full MQTT V3.1/V3.1.1 protocol specification support
  21. * QoS0, QoS1, QoS2 Publish and Subscribe
  22. * Session Management and Offline Messages
  23. * Retained Message
  24. * Last Will Message
  25. * TCP/SSL Connection
  26. * MQTT Over WebSocket(SSL)
  27. * HTTP Publish API
  28. * STOMP protocol
  29. * STOMP over SockJS
  30. * $SYS/# Topics
  31. * ClientID Authentication
  32. * IpAddress Authentication
  33. * Username and Password Authentication
  34. * Access control based on IpAddress, ClientID, Username
  35. * Authentication with LDAP, Redis, MySQL, PostgreSQL
  36. * Cluster brokers on several servers
  37. * Bridge brokers locally or remotely
  38. * mosquitto, RSMB bridge
  39. * Extensible architecture with Hooks, Modules and Plugins
  40. * Passed eclipse paho interoperability tests
  41. -----------
  42. Quick Start
  43. -----------
  44. Download and Install
  45. --------------------
  46. The emqttd broker is cross-platform, which could be deployed on Linux, FreeBSD, Mac, Windows and even Raspberry Pi.
  47. Download binary package from: http://emqtt.io/downloads.
  48. Installing on Mac, for example:
  49. .. code-block:: bash
  50. unzip emqttd-macosx-0.16.0-beta-20160216.zip && cd emqttd
  51. # Start emqttd
  52. ./bin/emqttd start
  53. # Check Status
  54. ./bin/emqttd_ctl status
  55. # Stop emqttd
  56. ./bin/emqttd stop
  57. Installing from Source
  58. ----------------------
  59. .. NOTE:: emqttd broker requires Erlang R17+ to build.
  60. .. code-block:: bash
  61. git clone https://github.com/emqtt/emqttd.git
  62. cd emqttd && make && make dist
  63. cd rel/emqttd && ./bin/emqttd console
  64. -------------
  65. Web Dashboard
  66. -------------
  67. A Web Dashboard will be loaded when the emqttd broker is started successfully.
  68. The Dashboard helps check running status of the broker, monitor statistics and metrics of MQTT packets, query clients, sessions, topics and subscriptions.
  69. +------------------+---------------------------+
  70. | Default Address | http://localhost:18083 |
  71. +------------------+---------------------------+
  72. | Default User | admin |
  73. +------------------+---------------------------+
  74. | Default Password | public |
  75. +------------------+---------------------------+
  76. .. image:: ./_static/images/dashboard.png
  77. -------------------
  78. Modules and Plugins
  79. -------------------
  80. The Authentication and Authorization(ACL) are usually implemented by a Module or Plugin.
  81. Modules
  82. -------
  83. +-------------------------+--------------------------------------------+
  84. | emqttd_auth_clientid | Authentication with ClientId |
  85. +-------------------------+--------------------------------------------+
  86. | emqttd_auth_username | Authentication with Username and Password |
  87. +-------------------------+--------------------------------------------+
  88. | emqttd_auth_ldap | Authentication with LDAP |
  89. +-------------------------+--------------------------------------------+
  90. | emqttd_mod_presence | Publish presence message to $SYS topics |
  91. | | when client connected or disconnected |
  92. +-------------------------+--------------------------------------------+
  93. | emqttd_mod_subscription | Subscribe topics automatically when client |
  94. | | connected |
  95. +-------------------------+--------------------------------------------+
  96. | emqttd_mod_rewrite | Topics rewrite like HTTP rewrite module |
  97. +-------------------------+--------------------------------------------+
  98. Configure the 'auth', 'module' paragraph in 'etc/emqttd.config' to enable a module.
  99. Enable 'emqttd_auth_username' module:
  100. .. code-block:: erlang
  101. {access, [
  102. %% Authetication. Anonymous Default
  103. {auth, [
  104. %% Authentication with username, password
  105. {username, []},
  106. ...
  107. Enable 'emqttd_mod_presence' module:
  108. .. code-block:: erlang
  109. {modules, [
  110. %% Client presence management module.
  111. %% Publish messages when client connected or disconnected
  112. {presence, [{qos, 0}]}
  113. Plugins
  114. -------
  115. A plugin is an Erlang application to extend the emqttd broker.
  116. +----------------------------+-----------------------------------+
  117. | `emqttd_plugin_template`_ | Plugin template and demo |
  118. +----------------------------+-----------------------------------+
  119. | `emqttd_dashboard`_ | Web Dashboard |
  120. +----------------------------+-----------------------------------+
  121. | `emqttd_plugin_mysql`_ | Authentication with MySQL |
  122. +----------------------------+-----------------------------------+
  123. | `emqttd_plugin_pgsql`_ | Authentication with PostgreSQL |
  124. +----------------------------+-----------------------------------+
  125. | `emqttd_plugin_redis`_ | Authentication with Redis |
  126. +----------------------------+-----------------------------------+
  127. | `emqttd_plugin_mongo`_ | Authentication with MongoDB |
  128. +----------------------------+-----------------------------------+
  129. | `emqttd_stomp`_ | STOMP Protocol Plugin |
  130. +----------------------------+-----------------------------------+
  131. | `emqttd_sockjs`_ | SockJS(Stomp) Plugin |
  132. +----------------------------+-----------------------------------+
  133. | `emqttd_recon`_ | Recon Plugin |
  134. +----------------------------+-----------------------------------+
  135. A plugin could be enabled by 'bin/emqttd_ctl plugins load' command.
  136. For example, enable 'emqttd_plugin_pgsql' plugin::
  137. ./bin/emqttd_ctl plugins load emqttd_plugin_pgsql
  138. -----------------------
  139. One Million Connections
  140. -----------------------
  141. Latest release of emqttd broker is scaling to 1.3 million MQTT connections on a 12 Core, 32G CentOS server.
  142. .. NOTE::
  143. The emqttd broker only allows 512 concurrent connections by default, for 'ulimit -n' limit is 1024 on most platform.
  144. We need tune the OS Kernel, TCP Stack, Erlang VM and emqttd broker for one million connections benchmark.
  145. Linux Kernel Parameters
  146. -----------------------
  147. .. code-block:: bash
  148. # 2M:
  149. sysctl -w fs.file-max=2097152
  150. sysctl -w fs.nr_open=2097152
  151. echo 2097152 > /proc/sys/fs/nr_open
  152. # 1M:
  153. ulimit -n 1048576
  154. TCP Stack Parameters
  155. --------------------
  156. .. code-block:: bash
  157. # backlog
  158. sysctl -w net.core.somaxconn=65536
  159. Erlang VM
  160. ---------
  161. emqttd/etc/vm.args::
  162. ## max process numbers
  163. +P 2097152
  164. ## Sets the maximum number of simultaneously existing ports for this system
  165. +Q 1048576
  166. ## Increase number of concurrent ports/sockets
  167. -env ERL_MAX_PORTS 1048576
  168. -env ERTS_MAX_PORTS 1048576
  169. emqttd broker
  170. -------------
  171. emqttd/etc/emqttd.config:
  172. .. code-block:: erlang
  173. {mqtt, 1883, [
  174. %% Size of acceptor pool
  175. {acceptors, 64},
  176. %% Maximum number of concurrent clients
  177. {max_clients, 1000000},
  178. %% Socket Access Control
  179. {access, [{allow, all}]},
  180. %% Connection Options
  181. {connopts, [
  182. %% Rate Limit. Format is 'burst, rate', Unit is KB/Sec
  183. %% {rate_limit, "100,10"} %% 100K burst, 10K rate
  184. ]},
  185. ...
  186. Test Client
  187. -----------
  188. .. code-block:: bash
  189. sysctl -w net.ipv4.ip_local_port_range="500 65535"
  190. echo 1000000 > /proc/sys/fs/nr_open
  191. ulimit -n 100000
  192. ---------------------
  193. MQTT Client Libraries
  194. ---------------------
  195. GitHub: https://github.com/emqtt
  196. +--------------------+----------------------+
  197. | `emqttc`_ | Erlang MQTT Client |
  198. +--------------------+----------------------+
  199. | `emqtt_benchmark`_ | MQTT benchmark Tool |
  200. +--------------------+----------------------+
  201. | `CocoaMQTT`_ | Swift MQTT Client |
  202. +--------------------+----------------------+
  203. | `QMQTT`_ | QT MQTT Client |
  204. +--------------------+----------------------+
  205. .. _emqttc: https://github.com/emqtt/emqttc
  206. .. _emqtt_benchmark: https://github.com/emqtt/emqtt_benchmark
  207. .. _CocoaMQTT: https://github.com/emqtt/CocoaMQTT
  208. .. _QMQTT: https://github.com/emqtt/qmqtt
  209. .. _emqttd_plugin_template: https://github.com/emqtt/emqttd_plugin_template
  210. .. _emqttd_dashboard: https://github.com/emqtt/emqttd_dashboard
  211. .. _emqttd_plugin_mysql: https://github.com/emqtt/emqttd_plugin_mysql
  212. .. _emqttd_plugin_pgsql: https://github.com/emqtt/emqttd_plugin_pgsql
  213. .. _emqttd_plugin_redis: https://github.com/emqtt/emqttd_plugin_redis
  214. .. _emqttd_plugin_mongo: https://github.com/emqtt/emqttd_plugin_mongo
  215. .. _emqttd_stomp: https://github.com/emqtt/emqttd_stomp
  216. .. _emqttd_sockjs: https://github.com/emqtt/emqttd_sockjs
  217. .. _emqttd_recon: https://github.com/emqtt/emqttd_recon