{"id":373,"date":"2015-10-28T04:19:13","date_gmt":"2015-10-28T04:19:13","guid":{"rendered":"http:\/\/onlinelab.info\/?p=373"},"modified":"2015-10-28T04:19:13","modified_gmt":"2015-10-28T04:19:13","slug":"tim-hieu-rabbitmq-phan-2","status":"publish","type":"post","link":"https:\/\/www.asianux.org.vn\/index.php\/2015\/10\/28\/tim-hieu-rabbitmq-phan-2\/","title":{"rendered":"T\u00ecm hi\u1ec3u RabbitMQ &#8211; Ph\u1ea7n 2"},"content":{"rendered":"<p>Trong ph\u1ea7n 1, t\u00f4i \u0111\u00e3 gi\u1edbi thi\u1ec7u v\u1ec1 s\u01a1 l\u01b0\u1ee3c rabbitmq, vai tr\u00f2 c\u1ee7a rabbitmq trong h\u1ec7 th\u1ed1ng ph\u00e2n t\u00e1n v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e0i \u0111\u1eb7t. Trong ph\u1ea7n n\u00e0y, t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y c\u00e1ch v\u1ec1 cluster v\u00e0 c\u1ea5u h\u00ecnh cluster trong rabbitmq<\/p>\n<h1 class=\"ui dividing header\">Cluster l\u00e0 g\u00ec<\/h1>\n<p>Cluster l\u00e0 nh\u00f3m c\u00e1c th\u00e0nh ph\u1ea7n m\u00e0 ho\u1ea1t \u0111\u1ed9ng c\u00f9ng v\u1edbi nhau \u0111\u1ec3 cung c\u1ea5p m\u1ed9t d\u1ecbch v\u1ee5 n\u00e0o \u0111\u00f3. Th\u00e0nh ph\u1ea7n \u1edf \u0111\u00e2y g\u1ecdi l\u00e0 m\u1ed9t node. M\u1ed7i node n\u00e0y l\u00e0 m\u1ed9t process ho\u1ea1t \u0111\u1ed9ng. Th\u01b0\u1eddng th\u00ec node \u0111\u01b0\u1ee3c \u0111\u1ed3ng nh\u1ea5t v\u1edbi m\u1ed9t server do m\u1ed7i node th\u01b0\u1eddng \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean m\u1ed9t server ri\u00eang r\u1ebd ( \u0111\u1ec3 tr\u00e1nh b\u1ecb ch\u1ebft ch\u00f9m ). Kh\u00e1i ni\u1ec7m cluster n\u00e0y xu\u1ea5t hi\u1ec7n trong r\u1ea5t nhi\u1ec1u ki\u1ebfn tr\u00fac nh\u01b0 galera, mysql, redis&#8230; M\u1ee5c \u0111\u00edch s\u1eed d\u1ee5ng cluster l\u00e0 \u0111\u1ec3 load balancing, high availibility (\u0111\u1ea3m b\u1ea3o h\u1ec7 th\u1ed1ng v\u1eabn ho\u1ea1t \u0111\u1ed9ng khi c\u00f3 s\u1ef1 c\u1ed1), scale h\u1ec7 th\u1ed1ng.<\/p>\n<h1 class=\"ui dividing header\">Cluster trong rabbitmq<\/h1>\n<p>Trong rabbitmq, m\u1ed9t cluster l\u00e0 m\u1ed9t nh\u00f3m c\u00e1c erlang node l\u00e0m vi\u1ec7c c\u00f9ng v\u1edbi nhau. M\u1ed7i erlang node c\u00f3 m\u1ed9t rabbitmq application ho\u1ea1t \u0111\u1ed9ng v\u00e0 c\u00f9ng chia s\u1ebb t\u00e0i nguy\u00ean: user, vhost, queue, exchange&#8230;<\/p>\n<div class=\"fluidbox__wrap\"><a class=\"fluidbox fluidbox__instance-1 fluidbox--initialized fluidbox--closed fluidbox--ready\" href=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-01%2023%3A26%3A39.png_w0mj6sxzay\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"fluidbox__thumb\" src=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-01%2023%3A26%3A39.png_w0mj6sxzay\" alt=\"alt text\" title=\"\"><\/a><\/div>\n<h1 class=\"ui dividing header\">M\u1ed9t s\u1ed1 \u0111\u1eb7c \u0111i\u1ec3m c\u1ea7n ch\u00fa \u00fd<\/h1>\n<ul class=\"ui list\">\n<li>Metadata c\u1ee7a m\u1ed9t node \u0111\u01b0\u1ee3c replicate \u0111\u1ebfn c\u00e1c node c\u00f2n l\u1ea1i trong cluster ngo\u1ea1i tr\u1eeb queue. Queue \u0111\u01b0\u1ee3c t\u1ea1o ra tr\u00ean node n\u00e0o th\u00ec v\u1eabn n\u1eb1m tr\u00ean node \u0111\u00f3, kh\u00f4ng c\u00f3 replicate g\u00ec h\u1ebft nh\u01b0ng b\u1ea1n ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 nh\u00ecn th\u1ea5y m\u1ed9t queue t\u1ea1o ra tr\u00ean m\u1ed9t node khi truy xu\u1ea5t qua c\u00e1c node c\u00f2n l\u1ea1i do \u0111\u00f3 \u0111\u1ed1i v\u1edbi client m\u1ed9t cluster rabbitmq ch\u1eb3ng kh\u00e1c g\u00ec m\u1ed9t single rabbitmq.<\/li>\n<li>V\u00ec queue kh\u00f4ng \u0111\u01b0\u1ee3c replicate n\u00ean b\u1ea3n th\u00e2n cluster rabbitmq ch\u01b0a cung c\u1ea5p high availibility (HA). B\u1ea1n v\u1eabn c\u1ea7n c\u1ea5u h\u00ecnh th\u00eam ch\u00fat n\u1eefa nh\u01b0ng cluster l\u00e0 ti\u1ec1n \u0111\u1ec1 \u0111\u1ec3 rabbitmq c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c HA.<\/li>\n<li>M\u1ed9t node c\u00f3 th\u1ec3 l\u00e0 disc node (m\u1eb7c \u0111\u1ecbnh) ho\u1eb7c ram node<\/li>\n<li>Nh\u01b0 trong t\u00e0i li\u1ec7u c\u1ee7a rabbitmq c\u00f3 kh\u1eb3ng \u0111\u1ecbnh, rabbitmq kh\u00f4ng x\u1eed l\u00fd t\u1ed1t network partition n\u00ean kh\u00f4ng khuy\u1ebfn kh\u00edch s\u1eed d\u1ee5ng cluster c\u1ee7a rabbitmq tr\u00ean WAN. C\u00f3 th\u1ec3 b\u1ea1n s\u1ebd th\u1eafc m\u1eafc network partition l\u00e0 g\u00ec ? M\u1ed9t network partition hay c\u00f2n g\u1ecdi l\u00e0 split brain l\u00e0 t\u00ecnh hu\u1ed1ng r\u1ea5t hay g\u1eb7p trong h\u1ec7 cluster.<\/li>\n<\/ul>\n<div class=\"fluidbox__wrap\"><a class=\"fluidbox fluidbox__instance-2 fluidbox--initialized fluidbox--closed fluidbox--ready\" href=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-01%2023%3A29%3A21.png_bwnuenk169\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"fluidbox__thumb\" src=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-01%2023%3A29%3A21.png_bwnuenk169\" alt=\"alt text\" title=\"\"><\/a><\/div>\n<p>Khi network partition x\u1ea3y ra, h\u1ec7 cluster b\u1ecb chia \u0111\u00f4i v\u00e0 m\u1ed7i ph\u1ea7n kh\u00f4ng th\u1ec3 li\u00ean l\u1ea1c \u0111\u01b0\u1ee3c v\u1edbi ph\u1ea7n c\u00f2n l\u1ea1i n\u00ean \u0111\u00e2m ra b\u1ea3n th\u00e2n t\u1eebng partition l\u1ea1i c\u1ee9 ng\u1ee1 n\u00f3 l\u00e0 to\u00e0n b\u1ed9 cluster. V\u1ea5n \u0111\u1ec1 ch\u00ednh l\u00e0 \u1edf \u0111\u00e2y. M\u1ed7i partition khi \u0111\u00f3 s\u1ebd kh\u00f4ng \u0111\u1ed3ng b\u1ed9 \u0111\u01b0\u1ee3c v\u1edbi ph\u1ea7n c\u00f2n l\u1ea1i n\u00ean ch\u00fang ta s\u1ebd c\u00f3 hai t\u1eadp d\u1eef li\u1ec7u ri\u00eang bi\u1ec7t tr\u00ean m\u1ed7i partition. Nguy\u00ean do d\u1eabn \u0111\u1ebfn network partition th\u01b0\u1eddng l\u00e0 network kh\u00f4ng \u1ed5n \u0111\u1ecbnh ho\u1eb7c qu\u00e1 t\u1ea3i tr\u00ean node (Khi qu\u00e1 t\u1ea3i do CPU ho\u1eb7c IO b\u1ecb ngh\u1ebdn network c\u1ee7a server th\u01b0\u1eddng r\u1ea5t ch\u1eadp ch\u1eddn ). LAN network so v\u1edbi WAN network th\u00ec th\u01b0\u1eddng \u1ed5n \u0111\u1ecbnh h\u01a1n nhi\u1ec1u n\u00ean rabbitmq cluster th\u00edch h\u1ee3p khi c\u00e1c node \u0111\u01b0\u1ee3c li\u00ean k\u1ebft v\u1edbi nhau qua LAN network. V\u1ec1 network partition, t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y trong m\u1ed9t ph\u1ea7n kh\u00e1c.<\/p>\n<ul class=\"ui list\">\n<li>Clustering rabbitmq ch\u1ec9 l\u00e0 m\u1ed9t trong ba c\u00e1ch c\u1ea5u h\u00ecnh h\u1ec7 ph\u00e2n t\u00e1n rabbitmq. Clustering ph\u00f9 h\u1ee3p cho m\u00f4i tr\u01b0\u1eddng LAN network c\u00f2n v\u1edbi m\u00f4i tr\u01b0\u1eddng WAN network th\u00ec c\u00e1c m\u00f4 h\u00ecnh nh\u01b0 federation hay shovel l\u1ea1i \u0111\u01b0\u1ee3c khuy\u1ebfn kh\u00edch. Trong tr\u01b0\u1eddng h\u1ee3p c\u1ee7a t\u00f4i, t\u00f4i kh\u00f4ng s\u1eed d\u1ee5ng rabbitmq trong m\u00f4i tr\u01b0\u1eddng WAN n\u00ean hai m\u00f4 h\u00ecnh shovel v\u00e0 federation t\u00f4i kh\u00f4ng tr\u00ecnh b\u00e0y.<\/li>\n<\/ul>\n<h1 class=\"ui dividing header\">\u0110i\u1ec1u ki\u1ec7n \u0111\u1ec3 thi\u1ebft l\u1eadp clustering<\/h1>\n<ul class=\"ui list\">\n<li>T\u1ea5t c\u1ea3 c\u00e1c node ph\u1ea3i c\u00f9ng erlang version v\u00e0 rabbitmq version<\/li>\n<li>C\u00e1c node li\u00ean k\u1ebft qua LAN network<\/li>\n<li>T\u1ea5t c\u1ea3 c\u00e1c node chia s\u1ebb c\u00f9ng m\u1ed9t erlang cookie<\/li>\n<\/ul>\n<p><em>Trong m\u00f4 h\u00ecnh cluster, c\u00e1c node s\u1eed d\u1ee5ng ph\u01b0\u01a1ng th\u1ee9c trao \u0111\u1ed5i gi\u1eefa c\u1ee7a erlang. Khi s\u1eed d\u1ee5ng ph\u01b0\u01a1ng th\u1ee9c n\u00e0y, hai erlang node ch\u1ec9 n\u00f3i chuy\u1ec7n \u0111\u01b0\u1ee3c v\u1edbi nhau khi c\u00f3 c\u00f9ng erlang cookie. Erlang cookie ch\u1ec9 l\u00e0 m\u1ed9t chu\u1ed7i k\u00fd t\u1ef1. Khi startup m\u1ed9t rabbitmq server l\u1ea7n \u0111\u1ea7u ti\u00ean, m\u1eb7c \u0111\u1ecbnh m\u1ed9t erlang cookie ng\u1eabu nhi\u00ean \u0111\u01b0\u1ee3c sinh ra n\u1eb1m trong<span class=\"Apple-converted-space\">\u00a0<\/span><code>\/var\/lib\/rabbitmq\/.erlang.cookie<\/code><\/em><\/p>\n<h1 class=\"ui dividing header\">L\u00e0m vi\u00eac v\u1edbi cluster<\/h1>\n<h3 class=\"ui dividing header\">Th\u1ef1c hi\u1ec7n t\u1ea1o cluster<\/h3>\n<p>Chu\u1ea9n b\u1ecb ba rabbitmq server th\u1ecfa m\u00e3n \u0111\u1ee7 \u0111i\u1ec1u ki\u1ec7n.<\/p>\n<p>\u0110\u1ea7u ti\u00ean, ch\u00fang ta c\u1ea7n ch\u1ecdn m\u1ed9t node, sau \u0111\u00f3 copy erlang cookie c\u1ee7a node \u0111\u00f3 sang c\u00e1c node c\u00f2n l\u1ea1i.<\/p>\n<p>V\u00ec node name c\u1ee7a rabbitmq c\u00f3 d\u1ea1ng<span class=\"Apple-converted-space\">\u00a0<\/span><code>rabbit@hostname<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>n\u00ean b\u1ea1n c\u1ea7n chu\u1ea9n b\u1ecb s\u1eb5n hostname cho m\u1ed7i node. Hostname l\u00e0 b\u1ea5t c\u1ee9 string n\u00e0o b\u1ea1n mu\u1ed1n nh\u01b0ng t\u1ed1t nh\u1ea5t \u0111\u1eebng s\u1eed d\u1ee5ng c\u00e1c k\u00fd t\u1ef1 \u0111\u1eb7c bi\u1ec7t trong n\u00e0y. Sau \u0111\u00f3 \u0111\u01b0a v\u00e0o<code>\/etc\/hosts<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>c\u1ee7a c\u1ea3 ba node:<\/p>\n<pre><code class=\"ui segment hljs bash\"><span class=\"hljs-number\">192.168<\/span>.<span class=\"hljs-number\">3.241<\/span> rabbit1  <span class=\"hljs-comment\">### g\u1ecdi l\u00e0 node 1<\/span>\n<span class=\"hljs-number\">192.168<\/span>.<span class=\"hljs-number\">3.242<\/span> rabbit2  <span class=\"hljs-comment\">### g\u1ecdi l\u00e0 node 2<\/span>\n<span class=\"hljs-number\">192.168<\/span>.<span class=\"hljs-number\">3.252<\/span> rabbit3  <span class=\"hljs-comment\">### g\u1ecdi l\u00e0 node 3<\/span>\n<\/code><\/pre>\n<p>Nh\u01b0 b\u1ea1n th\u1ea5y, t\u00f4i l\u1ef1a ch\u1ecdn c\u00e1ch \u0111\u1eb7t t\u00ean an to\u00e0n \u0111\u1ec3 tr\u00e1nh r\u1eafc r\u1ed1i.<\/p>\n<p><strong>B\u01b0\u1edbc 1:<\/strong><br \/>\nKh\u1edfi \u0111\u1ed9ng rabbitmq-server tr\u00ean m\u1ed7i node.<br \/>\nTr\u00ean m\u1ed7i node, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y<\/p>\n<p><code>service rabbitmq-server start<\/code><br \/>\nho\u1eb7c<br \/>\n<code>rabbitmq-server -detached<\/code><\/p>\n<p>Trong c\u00e1ch th\u1ee9 hai, b\u1ea1n c\u00f3 th\u1ec3 s\u1ebd g\u1eb7p m\u1ed9t warning:<br \/>\n<strong>Warning: PID file not written; -detached was passed.<\/strong><br \/>\n\u0110\u1eebng qu\u00e1 lo l\u1eafng. Trong manual c\u1ee7a rabbitmq-server c\u00f3 cho bi\u1ebft khi ch\u1ea1y v\u1edbi tham s\u1ed1 -detached server process s\u1ebd ho\u1ea1t \u0111\u1ed9ng \u1edf ch\u1ebf \u0111\u1ed9 background v\u00e0 \u0111i\u1ec1u \u0111\u00f3 khi\u1ebfn cho pid c\u1ee7a process kh\u00f4ng \u0111\u01b0\u1ee3c ghi v\u00e0o pid file.<\/p>\n<p><strong>B\u01b0\u1edbc 2:<\/strong><br \/>\nCh\u1ecdn m\u1ed9t node l\u00e0m kh\u1edfi \u0111i\u1ec3m sau \u0111\u00f3 c\u00e1c node c\u00f2n l\u1ea1i s\u1ebd join v\u1edbi node kh\u1edfi \u0111i\u1ec3m \u0111\u1ec3 h\u00ecnh th\u00e0nh l\u00ean cluster.<\/p>\n<p>Tr\u01b0\u1edbc khi th\u1ef1c hi\u1ec7n, ch\u00fang ta th\u1eed xem cluster status c\u1ee7a t\u1eebng node tr\u01b0\u1edbc khi join v\u1edbi nhau. Tr\u00ean m\u1ed7i node, b\u1ea1n th\u1ef1c hi\u1ec7n l\u1ec7nh<br \/>\n<code>rabbitmqctl cluster_status<\/code><\/p>\n<p>V\u00e0 \u0111\u00e2y l\u00e0 k\u1ebft qu\u1ea3:<\/p>\n<p>Tr\u00ean rabbit@rabbit1<\/p>\n<pre><code class=\"ui segment hljs r\">Cluster status of node rabbit@rabbit1 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit1]}]}]\n<\/code><\/pre>\n<p>Tr\u00ean rabbit@rabbit2<\/p>\n<pre><code class=\"ui segment hljs r\">Cluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit2]}]}]\n<\/code><\/pre>\n<p>Tr\u00ean rabbit@rabbit3<\/p>\n<pre><code class=\"ui segment hljs r\">Cluster status of node rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit3]}]}]\n<\/code><\/pre>\n<p>C\u00f3 th\u1ec3 th\u1ea5y m\u1ed7i node \u0111ang l\u00e0 m\u1ed9t cluster ri\u00eang bi\u1ec7t. T\u00f4i s\u1ebd ph\u1ea3i gom c\u1ea3 ba node n\u00e0y \u0111\u1ec3 h\u00ecnh th\u00e0nh m\u1ed9t cluster duy nh\u1ea5t.<\/p>\n<p>Gi\u1ea3 s\u1eed, t\u00f4i ch\u1ecdn node rabbit@rabbit2 l\u00e0m node kh\u1edfi \u0111i\u1ec3m. V\u1edbi vai tr\u00f2 node kh\u1edfi \u0111i\u1ec3m, node rabbit@rabbit2 s\u1ebd kh\u00f4ng c\u1ea7n c\u1ea5u h\u00ecnh g\u00ec th\u00eam.<\/p>\n<p>\u0110\u1ea3m b\u1ea3o node 2 \u0111ang ch\u1ea1y<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit2]}]},\n {running_nodes,[rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n\n<\/code><\/pre>\n<p>T\u00f4i c\u1ea7n join node 1 v\u1edbi node 2<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit1 ~]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit1 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit1 ~]<span class=\"hljs-comment\"># rabbitmqctl join_cluster rabbit@rabbit2<\/span>\nClustering node rabbit@rabbit1 with rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit1 ~]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit1 <span class=\"hljs-keyword\">...<\/span>\n<\/code><\/pre>\n<p>L\u00e0m t\u01b0\u01a1ng t\u1ef1 v\u1edbi node 3<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit3 ~]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit3 ~]<span class=\"hljs-comment\"># rabbitmqctl join_cluster rabbit@rabbit2<\/span>\nClustering node rabbit@rabbit3 with rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit3 ~]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n<\/code><\/pre>\n<p><strong>B\u01b0\u1edbc 3:<\/strong><br \/>\nXem cluster status tr\u00ean m\u1ed7i node.<\/p>\n<p>Tr\u00ean node 1<\/p>\n<pre><code class=\"ui segment hljs ruby\">[root<span class=\"hljs-variable\">@rabbit1<\/span> ~]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\n<span class=\"hljs-constant\">Cluster<\/span> status of node rabbit<span class=\"hljs-variable\">@rabbit1<\/span> ...\n[{nodes,[{disc,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>]}]},\n {running_nodes,[rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>,rabbit<span class=\"hljs-variable\">@rabbit1<\/span>]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span><span class=\"hljs-prompt\">&gt;&gt;<\/span>},\n {partitions,[]}]\n<\/code><\/pre>\n<p>Tr\u00ean node 2<\/p>\n<pre><code class=\"ui segment hljs ruby\">[root<span class=\"hljs-variable\">@rabbit2<\/span> ~]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\n<span class=\"hljs-constant\">Cluster<\/span> status of node rabbit<span class=\"hljs-variable\">@rabbit2<\/span> ...\n[{nodes,[{disc,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>]}]},\n {running_nodes,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span><span class=\"hljs-prompt\">&gt;&gt;<\/span>},\n {partitions,[]}]\n\n<\/code><\/pre>\n<p>Tr\u00ean node 3<\/p>\n<pre><code class=\"ui segment hljs ruby\">[root<span class=\"hljs-variable\">@rabbit3<\/span> ~]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\n<span class=\"hljs-constant\">Cluster<\/span> status of node rabbit<span class=\"hljs-variable\">@rabbit3<\/span> ...\n[{nodes,[{disc,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>]}]},\n {running_nodes,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span><span class=\"hljs-prompt\">&gt;&gt;<\/span>},\n {partitions,[]}]\n<\/code><\/pre>\n<p>B\u1ea1n c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh cluster trong config. Tr\u00ean m\u1ed7i node, b\u1ea1n ch\u1ec9 c\u1ea7n khai b\u00e1o d\u00f2ng sau trong \/etc\/rabbitmq\/rabbitmq.config<\/p>\n<pre><code class=\"ui segment hljs scala\">{cluster_nodes, {[<span class=\"hljs-symbol\">'rabbit<\/span><span class=\"hljs-annotation\">@rabbit<\/span>1',<span class=\"hljs-symbol\">'rabbit<\/span><span class=\"hljs-annotation\">@rabbit<\/span>2',<span class=\"hljs-symbol\">'rabbit<\/span><span class=\"hljs-annotation\">@rabbit<\/span>3'], disc}}\n<\/code><\/pre>\n<p><strong>Nh\u1eadn x\u00e9t:<\/strong><br \/>\nC\u00f3 th\u1ec3 th\u1ea5y t\u1ea5t c\u1ea3 c\u00e1c node \u0111\u00e3 nh\u00ecn th\u1ea5y nhau. T\u1ea5t c\u1ea3 \u0111\u1ec1u l\u00e0 disc node (m\u1eb7c \u0111\u1ecbnh). T\u1ea5t c\u1ea3 c\u00e1c node \u0111\u1ec1u \u0111ang running. Cluster_name \u0111\u01b0\u1ee3c l\u1ea5y theo node name c\u1ee7a node kh\u1edfi \u0111i\u1ec3m v\u00e0 kh\u00f4ng c\u00f3 m\u1ed9t partition n\u00e0o trong cluster.<\/p>\n<p><em>M\u1ed9t node trong cluster c\u00f3 th\u1ec3 b\u1ecb stop\/start (d\u00f9ng rabbitmqctl stop_app\/rabbitmqctl start_app tr\u00ean ch\u00ednh node \u0111\u00f3) \u0111\u1ed3ng ngh\u0129a ng\u1eebng cung c\u1ea5p d\u1ecbch v\u1ee5 trong cluster nh\u01b0ng b\u1ea3n th\u00e2n node \u0111\u00f3 v\u1eabn kh\u00f4ng b\u1ecb lo\u1ea1i kh\u1ecfi cluster<\/em><\/p>\n<h3 class=\"ui dividing header\">Th\u1ef1c hi\u1ec7n restart cluster<\/h3>\n<p>Ch\u00fang ta s\u1ebd restart l\u1ea7n l\u01b0\u1ee3t t\u1eebng node.<\/p>\n<p>Gi\u1ea3 s\u1eed t\u00f4i th\u1ef1c hi\u1ec7n restart theo th\u1ee9 t\u1ef1 sau:<br \/>\nstop node 3 -&gt; stop node 1 -&gt; start node 3 -&gt; start node 1. Node 2 v\u1eabn gi\u1eef ho\u1ea1t \u0111\u1ed9ng \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o d\u1ecbch v\u1ee5 kh\u00f4ng down.<\/p>\n<p>Stop node 3, node 1<\/p>\n<p>Tr\u00ean node 3:<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit3 ~]<span class=\"hljs-comment\">#  rabbitmqctl stop<\/span>\nStopping and halting node rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n<\/code><\/pre>\n<p><em>B\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng<span class=\"Apple-converted-space\">\u00a0<\/span><code>service rabbitmq-server stop<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>thay cho<span class=\"Apple-converted-space\">\u00a0<\/span><code>rabbitmqctl top<\/code><\/em><\/p>\n<p>Tr\u00ean node 1:<\/p>\n<pre><code class=\"ui segment hljs sql\">[root@rabbit1 ~]# service rabbitmq-server <span class=\"hljs-operator\"><span class=\"hljs-keyword\">stop<\/span>\nStopping rabbitmq-<span class=\"hljs-keyword\">server<\/span>: rabbitmq-<span class=\"hljs-keyword\">server<\/span>.\n<\/span><\/code><\/pre>\n<p>Xem cluster status tr\u00ean node 2:<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},\n {running_nodes,[rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n<\/code><\/pre>\n<p>Ch\u1ec9 c\u00f2n m\u1ed9t m\u00ecnh node 2 \u0111ang ho\u1ea1t \u0111\u1ed9ng<\/p>\n<p>Start node 3, node 1<\/p>\n<p>Tr\u00ean node 3:<\/p>\n<pre><code class=\"ui segment hljs sql\">[root@rabbit3 ~]# service rabbitmq-server <span class=\"hljs-operator\"><span class=\"hljs-keyword\">start<\/span>\n<span class=\"hljs-keyword\">Starting<\/span> rabbitmq-<span class=\"hljs-keyword\">server<\/span>: SUCCESS\nrabbitmq-<span class=\"hljs-keyword\">server<\/span>.\n<\/span><\/code><\/pre>\n<p>Tr\u00ean node 1:<\/p>\n<pre><code class=\"ui segment hljs sql\">[root@rabbit1 ~]# service rabbitmq-server <span class=\"hljs-operator\"><span class=\"hljs-keyword\">start<\/span>\n<span class=\"hljs-keyword\">Starting<\/span> rabbitmq-<span class=\"hljs-keyword\">server<\/span>: SUCCESS\nrabbitmq-<span class=\"hljs-keyword\">server<\/span>.\n<\/span><\/code><\/pre>\n<p>Xem cluster status tr\u00ean node 2:<\/p>\n<pre><code class=\"ui segment hljs ruby\">[root<span class=\"hljs-variable\">@rabbit2<\/span> root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\n<span class=\"hljs-constant\">Cluster<\/span> status of node rabbit<span class=\"hljs-variable\">@rabbit2<\/span> ...\n[{nodes,[{disc,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>]}]},\n {running_nodes,[rabbit<span class=\"hljs-variable\">@rabbit1<\/span>,rabbit<span class=\"hljs-variable\">@rabbit3<\/span>,rabbit<span class=\"hljs-variable\">@rabbit2<\/span>]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span><span class=\"hljs-prompt\">&gt;&gt;<\/span>},\n {partitions,[]}]\n\n<\/code><\/pre>\n<p>Nh\u01b0 v\u1eady, ngay sau khi \u0111\u01b0\u1ee3c start tr\u1edf l\u1ea1i, c\u00e1c node s\u1ebd t\u1ef1 \u0111\u1ed9ng tham gia v\u00e0o cluster v\u00e0 running lu\u00f4n.<\/p>\n<p>Trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p c\u00f3 s\u1ef1 c\u1ed1 nghi\u00eam tr\u1ecdng nh\u01b0 to\u00e0n b\u1ed9 c\u00e1c node \u0111\u1ec1u down l\u1ea7n l\u01b0\u1ee3t ho\u1eb7c t\u1ea5t c\u1ea3 \u0111\u1ec1u down \u0111\u1ed3ng th\u1eddi th\u00ec quy tr\u00ecnh start cluster l\u1ea1i h\u01a1i kh\u00e1c m\u1ed9t ch\u00fat. Ch\u00fang ta \u0111i v\u00e0o t\u1eebng tr\u01b0\u1eddng h\u1ee3p m\u1ed9t.<\/p>\n<p><strong>Tr\u01b0\u1eddng h\u1ee3p th\u1ee9 nh\u1ea5t:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>T\u00ecnh hu\u1ed1ng x\u1ea3y ra khi b\u1ea1n c\u1ea7n restart cluster \u0111\u1ec3 upgrade cho rabbitmq ho\u1eb7c erlang. Sau khi node 1, node 2 \u0111\u01b0\u1ee3c b\u1ea1n stop th\u00ec th\u1ea3m h\u1ecda x\u1ea3y ra v\u1edbi node c\u00f2n l\u1ea1i. Node c\u00f2n l\u1ea1i b\u1ecb down ngo\u00e0i \u00fd mu\u1ed1n. Trong tr\u01b0\u1eddng h\u1ee3p n\u00e0y vi\u1ec7c kh\u1edfi \u0111\u1ed9ng l\u1ea1i cluster \u0111\u00f2i h\u1ecfi th\u1ee9 t\u1ef1: Node cu\u1ed1i c\u00f9ng b\u1ecb down ph\u1ea3i l\u00e0 node \u0111\u1ea7u ti\u00ean \u0111\u01b0\u1ee3c start. Gi\u1ea3 s\u1eed c\u00e1c node b\u1ecb down theo th\u1ee9 t\u1ef1: node 3 -&gt; node 1 -&gt; node 2. Sau \u0111\u00f3 t\u00f4i c\u1ed1 g\u1eafng start c\u00e1c node 3 ho\u1eb7c node 1 \u0111\u1ea7u ti\u00ean. T\u00f4i s\u1ebd kh\u00f4ng th\u00e0nh c\u00f4ng. Rabbitmq \u0111\u1ec3 l\u1ea1i v\u00e0i d\u00f2ng log sau:<\/p>\n<pre><code class=\"ui segment hljs sql\">This cluster node was shut down while other nodes were still running.\nTo avoid losing data, you should <span class=\"hljs-operator\"><span class=\"hljs-keyword\">start<\/span> the other nodes <span class=\"hljs-keyword\">first<\/span>, <span class=\"hljs-keyword\">then<\/span>\n<span class=\"hljs-keyword\">start<\/span> this one. <span class=\"hljs-keyword\">To<\/span> <span class=\"hljs-keyword\">force<\/span> this node <span class=\"hljs-keyword\">to<\/span> <span class=\"hljs-keyword\">start<\/span>, <span class=\"hljs-keyword\">first<\/span> invoke\n<span class=\"hljs-string\">\"rabbitmqctl force_boot\"<\/span>. <span class=\"hljs-keyword\">If<\/span> you <span class=\"hljs-keyword\">do<\/span> so, <span class=\"hljs-keyword\">any<\/span> changes made <span class=\"hljs-keyword\">on<\/span> other\ncluster nodes <span class=\"hljs-keyword\">after<\/span> this one was shut down may be lost.\n<\/span><\/code><\/pre>\n<p>\u0110\u1ec3 kh\u1edfi \u0111\u1ed9ng \u0111\u01b0\u1ee3c cluster, b\u1ea1n ch\u1ec9 c\u1ea7n tu\u00e2n theo nguy\u00ean t\u1eafc, start node 2 \u0111\u1ea7u ti\u00ean. V\u1edbi c\u00e1c node sau, th\u1ee9 t\u1ef1 kh\u00f4ng quan tr\u1ecdng. B\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng th\u1ee9 t\u1ef1 node 2 &#8211; &gt; node 1 -&gt; node 3 ho\u1eb7c node2 -&gt; node 3 -&gt; node1.<\/p>\n<p><strong>Tr\u01b0\u1eddng h\u1ee3p th\u1ee9 hai:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>C\u0169ng gi\u1ed1ng tr\u01b0\u1eddng h\u1ee3p m\u1ed9t nh\u01b0ng \u0111\u00e1ng ti\u1ebfc l\u00e0 node 2 b\u1ecb s\u1ef1 c\u1ed1 qu\u00e1 nghi\u00eam tr\u1ecdng kh\u00f4ng th\u1ec3 ph\u1ee5c h\u1ed3i \u0111\u01b0\u1ee3c. V\u1eady l\u00e0 node cu\u1ed1i c\u00f9ng kh\u00f4ng th\u1ec3 boot \u0111\u01b0\u1ee3c. L\u00fac n\u00e0y b\u1ea1n ph\u1ea3i \u00e9p m\u1ed9t node kh\u00f4ng ph\u1ea3i node down cu\u1ed1i c\u00f9ng l\u00e0m node kh\u1edfi \u0111i\u1ec3m<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit1 root]<span class=\"hljs-comment\"># rabbitmqctl force_boot<\/span>\nForcing boot <span class=\"hljs-keyword\">for<\/span> Mnesia dir \/var\/lib\/rabbitmq\/mnesia\/rabbit@rabbit1 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit1 root]<span class=\"hljs-comment\"># service rabbitmq-server start<\/span>\nStarting rabbitmq-server: SUCCESS\nrabbitmq-server.\n<\/code><\/pre>\n<p>Sau \u0111\u00f3 b\u1ea1n kh\u1edfi \u0111\u1ed9ng l\u1ea1i c\u00e1c node k\u1ebf ti\u1ebfp.<\/p>\n<p><strong>Tr\u01b0\u1eddng h\u1ee3p th\u1ee9 ba:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>Kh\u1ee7ng khi\u1ebfp h\u01a1n ! B\u1ea1n ch\u1eb3ng l\u00e0m g\u00ec nh\u01b0ng c\u1ee5m server m\u00e0 ch\u1ee9a rabbitmq cluster b\u1ecb crash \u0111\u1ed9t ng\u1ed9t. L\u00fac n\u00e0y th\u00ec b\u1ea1n ch\u1eb3ng th\u1ec3 bi\u1ebft node n\u00e0o down tr\u01b0\u1edbc hay down sau c\u1ea3. C\u00e1ch x\u1eed l\u00fd gi\u1ed1ng h\u1ec7t tr\u01b0\u1eddng h\u1ee3p th\u1ee9 hai<\/p>\n<h3 class=\"ui dividing header\">R\u1eddi m\u1ed9t node kh\u1ecfi cluster<\/h3>\n<p><strong>C\u00e1ch 1:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>\u0110\u1ec3 cho b\u1ea3n th\u00e2n node \u0111\u00f3 qu\u00ean r\u1eb1ng n\u00f3 \u0111\u00e3 t\u1eebng \u1edf trong cluster. Gi\u1ea3 s\u1eed t\u00f4i mu\u1ed1n t\u00e1ch node 2 kh\u1ecfi cluster ho\u00e0n to\u00e0n.<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl stop_app                                                                                                      <\/span>\nStopping node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl reset<\/span>\nResetting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit2]}]},\n {running_nodes,[rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n<\/code><\/pre>\n<p>\u0110\u1ec3 reset th\u00e0nh c\u00f4ng, b\u1ea1n kh\u00f4ng \u0111\u01b0\u1ee3c config cluster trong file c\u1ea5u h\u00ecnh.<br \/>\nReset \u0111\u1ed3ng th\u1eddi s\u1ebd x\u00f3a m\u1ecdi data c\u1ee7a node 2 nh\u01b0 vhost, user, exchange, queue&#8230;<\/p>\n<p><strong>C\u00e1ch 2:<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>L\u00e0m cho c\u00e1c node c\u00f2n l\u1ea1i trong cluster h\u1eaft h\u1ee7i node c\u1ea7n \u0111\u01b0\u1ee3c t\u00e1ch kh\u1ecfi cluster \ud83d\ude41<\/p>\n<p>[root@rabbit2 root]# rabbitmqctl stop_app<br \/>\nStopping node rabbit@rabbit2 &#8230;<\/p>\n<p>[root@rabbit3 root]# rabbitmqctl forget_cluster_node rabbit@rabbit2<br \/>\nRemoving node rabbit@rabbit2 from cluster &#8230;<\/p>\n<p>L\u00fac n\u00e0y c\u00e1c node c\u00f2n l\u1ea1i trong cluster \u0111\u1ec1u \u0111\u00e3 kh\u00f4ng coi node 2 n\u1eb1m trong cluster nh\u01b0ng node2 v\u1eabn kh\u00f4ng ch\u1ecbu ch\u1ea5p nh\u1eadn th\u1ef1c t\u1ebf ph\u0169 ph\u00e0ng \u0111\u00f3. N\u1ebfu b\u1ea1n start_app node 2<\/p>\n<pre><code class=\"ui segment hljs perl\">Error: {error,{inconsistent_cluster,<span class=\"hljs-string\">\"Node rabbit<span class=\"hljs-variable\">@rabbit2<\/span> thinks it's clustered with node rabbit<span class=\"hljs-variable\">@rabbit3<\/span>, but rabbit<span class=\"hljs-variable\">@rabbit3<\/span> disagrees\"<\/span>}}\n<\/code><\/pre>\n<p>\u0110\u1ec3 node 2 ho\u1ea1t \u0111\u1ed9ng \u0111\u01b0\u1ee3c b\u00ecnh th\u01b0\u1eddng, b\u1ea1n ph\u1ea3i l\u00e0m n\u00f3 qu\u00ean \u0111i n\u00f3 t\u1eebng thu\u1ed9c v\u1ec1 cluster.<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl reset<\/span>\nResetting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit2]}]},\n {running_nodes,[rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n<\/code><\/pre>\n<h3 class=\"ui dividing header\">Th\u00eam m\u1ed9t node v\u00e0o cluster<\/h3>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl join_cluster rabbit@rabbit3<\/span>\nClustering node rabbit@rabbit2 with rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\nroot@rabbit2 roorabbitmqctl cluster_status\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},\n {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n<\/code><\/pre>\n<p>N\u1ebfu c\u1ed1 join_cluster t\u1eeb m\u1ed9t running node, b\u1ea1n s\u1ebd g\u1eb7p:<\/p>\n<pre><code class=\"ui segment hljs http\"><span class=\"hljs-attribute\">Error<\/span>: <span class=\"hljs-string\">mnesia_unexpectedly_running<\/span>\n<\/code><\/pre>\n<h3 class=\"ui dividing header\">Th\u00eam m\u1ed9t RAM node<\/h3>\n<p><strong>So s\u00e1nh RAM node v\u1edbi disc node<\/strong><br \/>\nS\u1ef1 kh\u00e1c bi\u1ec7t l\u1edbn nh\u1ea5t l\u00e0 ram node ch\u1ec9 gi\u1eef metadata c\u1ee7a n\u00f3 trong memory c\u00f2n b\u1ea3n th\u00e2n c\u00e1c queue data v\u1eabn l\u01b0u xu\u1ed1ng disk. S\u1ef1 kh\u00e1c bi\u1ec7t n\u00e0y cho ph\u00e9p ram node \u00edt t\u1ea1o ra c\u00e1c ho\u1ea1t \u0111\u1ed9ng IO h\u01a1n n\u00ean performance t\u1ed1t h\u01a1n disc node. M\u1ed9t cluster ho\u00e0n to\u00e0n ch\u1ec9 c\u00f3 ram node th\u00ec r\u1ea5t c\u00f3 nguy c\u01a1 m\u1ea5t metadata. Gi\u1ea3i ph\u00e1p an to\u00e0n h\u01a1n c\u1ea3 l\u00e0 tr\u1ed9n l\u1eabn ram node v\u00e0 disc node. Trong cluster, ph\u1ea7n metadata \u0111\u01b0\u1ee3c replicate gi\u1eefa c\u00e1c node (disc node l\u01b0u metadata tr\u00ean disk) n\u00ean s\u1ebd kh\u00f4ng lo m\u1ea5t s\u1ea1ch metadata.<\/p>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl join_cluster --ram rabbit@rabbit3<\/span>\nClustering node rabbit@rabbit2 with rabbit@rabbit3 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},\n {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n<\/code><\/pre>\n<h3 class=\"ui dividing header\">Thay \u0111\u1ed5i node type<\/h3>\n<pre><code class=\"ui segment hljs r\">[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl change_cluster_node_type disc<\/span>\nTurning rabbit@rabbit2 into a disc node <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},\n {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl stop_app<\/span>\nStopping node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl change_cluster_node_type ram<\/span>\nTurning rabbit@rabbit2 into a ram node <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl start_app<\/span>\nStarting node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[root@rabbit2 root]<span class=\"hljs-comment\"># rabbitmqctl cluster_status<\/span>\nCluster status of node rabbit@rabbit2 <span class=\"hljs-keyword\">...<\/span>\n[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},\n {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},\n {cluster_name,&lt;&lt;<span class=\"hljs-string\">\"rabbit@rabbit2\"<\/span>&gt;&gt;},\n {partitions,[]}]\n\n<\/code><\/pre>\n<h1 class=\"ui dividing header\">M\u00f4 h\u00ecnh load balancing v\u1edbi rabbitmq cluster<\/h1>\n<div class=\"fluidbox__wrap\"><a class=\"fluidbox fluidbox__instance-3 fluidbox--initialized fluidbox--closed fluidbox--ready\" href=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-04%2012%3A07%3A05.png_sickk69b9b\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"fluidbox__thumb\" src=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-04%2012%3A07%3A05.png_sickk69b9b\" alt=\"alt text\" title=\"\"><\/a><\/div>\n<p>N\u1ebfu b\u1ea1n c\u1ea5u h\u00ecnh HA queue, queue data gi\u1eefa c\u00e1c node s\u1ebd \u0111\u01b0\u1ee3c \u0111\u1ed3ng b\u1ed9 (Trong ph\u1ea7n t\u1edbi t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y c\u00e1ch c\u1ea5u hinh HA cho queue). Nghe c\u00f3 v\u1ebb r\u1ea5t gi\u1ed1ng mysql replication ph\u1ea3i kh\u00f4ng. Nh\u01b0ng th\u1ef1c t\u1ebf th\u00ec kh\u00f4ng gi\u1ed1ng v\u1eady. Trong h\u1ec7 rabbitmq cluster, khi \u00e1p d\u1ee5ng HA policy, m\u1ed9t queue s\u1ebd c\u00f3 master v\u00e0 c\u00e1c slave. Queue \u0111\u01b0\u1ee3c t\u1ea1o ra tr\u00ean node n\u00e0o th\u00ec queue \u0111\u00f3 s\u1ebd l\u00e0 master c\u00e1c replicate c\u1ee7a queue \u0111\u00f3 tr\u00ean c\u00e1c node c\u00f2n l\u1ea1i s\u1ebd l\u00e0 slave queue. T\u00ednh ch\u1ea5t master-slave kh\u00f4ng \u00e1p d\u1ee5ng tr\u00ean c\u1ee5 th\u1ec3 m\u1ed9t node m\u00e0 tr\u00ean c\u1ee5 th\u1ec3 m\u1ed9t queue. M\u1ed9t node c\u00f3 th\u1ec3 l\u00e0 master v\u1edbi queue n\u00e0y nh\u01b0ng l\u1ea1i l\u00e0 slave v\u1edbi queue kh\u00e1c. \u0110i\u1ec3m th\u00fa v\u1ecb l\u00e0 request \u0111\u1ebfn queue \u0111i t\u1eeb client qua load balancer s\u1ebd \u0111\u01b0\u1ee3c chuy\u1ec3n h\u01b0\u1edbng \u0111\u1ebfn node m\u00e0 ch\u1ee9a master queue<\/p>\n<p>Xem h\u00ecnh minh h\u1ecda \u1edf d\u01b0\u1edbi<\/p>\n<div class=\"fluidbox__wrap\"><a class=\"fluidbox fluidbox__instance-4 fluidbox--initialized fluidbox--closed fluidbox--ready\" href=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-04%2012%3A25%3A47.png_125uaz66w\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"fluidbox__thumb\" src=\"https:\/\/s3-ap-southeast-1.amazonaws.com\/kipalog.com\/Screenshot%20from%202015-06-04%2012%3A25%3A47.png_125uaz66w\" alt=\"alt text\" title=\"\"><\/a><\/div>\n<p>Master queue n\u1eb1m tr\u00ean node 2 (n\u01a1i queue \u0111\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra). Request t\u1eeb client \u0111\u1ebfn queue \u0111\u00f3 \u0111i qua load balancer \u0111\u1eadp v\u00e0o node 3 nh\u01b0ng node 3 s\u1ebd thay v\u00ec t\u1ef1 ph\u1ee5c v\u1ee5 lu\u00f4n th\u00ec chuy\u1ec3n h\u01b0\u1edbng request \u0111\u1ebfn node 2 (n\u01a1i ch\u1ee9a master queue). V\u00ec nguy\u00ean t\u1eafc h\u1ecdat \u0111\u1ed9ng n\u00e0y m\u00e0 HA policy tr\u00ean rabbitmq kh\u00f4ng gi\u00fap chia t\u1ea3i tr\u00ean c\u00e1c node \u0111\u01b0\u1ee3c m\u00e0 ch\u1ec9 cho ph\u00e9p \u0111\u1ea3m b\u1ea3o d\u1ecbch v\u1ee5 v\u1eabn v\u1eadn h\u00e0nh khi c\u00f3 s\u1ef1 c\u1ed1. Khi node ch\u1ee9a master queue b\u1ecb down, rabbitmq cluster s\u1ebd promote node ch\u1ee9a slave queue c\u00f3 th\u1eddi gian ho\u1ea1t \u0111\u1ed9ng l\u00e2u nh\u1ea5t l\u00ean l\u00e0m master.<\/p>\n<p>V\u1eady c\u00f3 c\u00e1ch n\u00e0o kh\u1eafc ph\u1ee5c \u0111\u1ec3 chia t\u1ea3i gi\u1eefa c\u00e1c node kh\u00f4ng ?<\/p>\n<ul class=\"ui list\">\n<li>B\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o queue \u0111\u1ec1u tr\u00ean t\u1ea5t c\u1ea3 c\u00e1c node trong cluster do v\u1eady c\u00e1c master queue s\u1ebd tr\u1ea3i \u0111\u1ec1u tr\u00ean to\u00e0n b\u1ed9 cluster n\u00ean h\u1ea1n ch\u1ebf c\u00e1c extra network hop gi\u1ed1ng nh\u01b0 trong h\u00ecnh minh h\u1ecda. C\u00e1ch n\u00e0y b\u1ea1n v\u1eabn c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng load balancer \u0111\u1ec3 \u0111i\u1ec3m trup c\u1eadp t\u1eeb client \u0111\u01b0\u1ee3c t\u1eadp trung.<\/li>\n<li>Client c\u00f3 m\u1ed9t danh s\u00e1ch c\u00e1c queue v\u00e0 bi\u1ebft \u0111\u01b0\u1ee3c master queue n\u1eb1m tr\u00ean node n\u00e0o \u0111\u1ec3 truy c\u1eadp tr\u1ef1c ti\u1ebfp. C\u00e1ch n\u00e0y s\u1ebd kh\u00f4ng c\u00f2n c\u1ea7n \u0111\u1ebfn load balancer n\u1eefa.<\/li>\n<\/ul>\n<p><strong>V\u1ea5n \u0111\u1ec1 timeout<\/strong><\/p>\n<p>B\u1ea3n th\u00e2n client s\u1ebd lu\u00f4n gi\u1eef k\u1ebft n\u1ed1i \u0111\u1ebfn rabbitmq. S\u1ebd kh\u00f4ng c\u00f3 timeout n\u1ebfu nh\u01b0 b\u1ea1n k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp nh\u01b0ng khi qua m\u1ed9t proxy th\u00ec v\u1ea5n \u0111\u1ec1 xu\u1ea5t hi\u1ec7n. Proxy s\u1ebd kh\u00f4ng gi\u1eef k\u1ebft n\u1ed1i li\u00ean t\u1ee5c gi\u1eefa client v\u00e0 backend n\u00ean trong qu\u00e1 tr\u00ecnh s\u1eed d\u1ee5ng b\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y hi\u1ec7n t\u01b0\u1ee3ng client b\u1ecb m\u1ea5t k\u1ebft n\u1ed1i sau m\u1ed9t qu\u00e3ng th\u1eddi gian kh\u00f4ng s\u1eed d\u1ee5ng. \u0110\u00e1ng ti\u1ebfc rabbitmq client kh\u00f4ng c\u00f3 c\u01a1 ch\u1ebf reconnect l\u1ea1i.<\/p>\n<p>M\u1ed9t linux client c\u00f3 c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng g\u1eedi l\u1ea1i keep-alive packet \u0111\u1ec3 duy tr\u00ec k\u1ebft n\u1ed1i nh\u01b0ng qu\u00e3ng th\u1eddi gian n\u00e0y qu\u00e1 l\u00e2u.<span class=\"Apple-converted-space\">\u00a0<\/span><code>cat \/proc\/sys\/net\/ipv4\/tcp_keepalive_time<\/code><span class=\"Apple-converted-space\">\u00a0<\/span>tr\u1ea3 v\u1ec1 gi\u00e1 tr\u1ecb 7200 ngh\u0129a l\u00e0 c\u1ee9 sau 2 ti\u1ebfng m\u1edbi c\u00f3 m\u1ed9t c\u00fa g\u1eedi keep-alived. Mu\u1ed1n proxy duy tr\u00ec k\u1ebft n\u1ed1i th\u00ec keep-alived packet ph\u1ea3i \u0111\u01b0\u1ee3c g\u1eedi tr\u01b0\u1edbc khi timeout c\u1ee7a proxy k\u1ebft th\u00fac. Trong tr\u01b0\u1eddng h\u1ee3p c\u1ee7a t\u00f4i proxy l\u00e0 haproxy. T\u00f4i \u0111i\u1ec1u ch\u1ec9nh ch\u00fat \u00edt v\u1ec1 c\u1ea5u h\u00ecnh. T\u00f4i b\u1ed5 sung ba d\u00f2ng sau v\u00e0o c\u1ee5m backend rabbitmq<\/p>\n<pre><code class=\"ui segment hljs applescript\"><span class=\"hljs-keyword\">timeout<\/span> client  <span class=\"hljs-number\">3<\/span>h\n<span class=\"hljs-keyword\">timeout<\/span> server  <span class=\"hljs-number\">3<\/span>h\noption          clitcpka\n<\/code><\/pre>\n<p>K\u1ebft th\u00fac ph\u1ea7n hai. Trong ph\u1ea7n t\u1edbi, t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y v\u1ec1 network partition trong rabbitmq cluster<\/p>\n<p><strong>Ngu\u1ed3n tham kh\u1ea3o:<\/strong><br \/>\n<a href=\"http:\/\/insidethecpu.com\/2014\/11\/17\/load-balancing-a-rabbitmq-cluster\/\" target=\"_blank\" rel=\"noopener\">http:\/\/insidethecpu.com\/2014\/11\/17\/load-balancing-a-rabbitmq-cluster\/<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/10461808\/how-to-load-distribution-in-rabbitmq-cluster\" target=\"_blank\" rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/10461808\/how-to-load-distribution-in-rabbitmq-cluster<\/a><br \/>\n<a href=\"https:\/\/deviantony.wordpress.com\/2014\/10\/30\/rabbitmq-and-haproxy-a-timeout-issue\/\" target=\"_blank\" rel=\"noopener\">https:\/\/deviantony.wordpress.com\/2014\/10\/30\/rabbitmq-and-haproxy-a-timeout-issue\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trong ph\u1ea7n 1, t\u00f4i \u0111\u00e3 gi\u1edbi thi\u1ec7u v\u1ec1 s\u01a1 l\u01b0\u1ee3c rabbitmq, vai tr\u00f2 c\u1ee7a rabbitmq trong h\u1ec7 th\u1ed1ng ph\u00e2n t\u00e1n v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e0i \u0111\u1eb7t. Trong ph\u1ea7n n\u00e0y, t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y c\u00e1ch v\u1ec1 cluster&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-373","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/comments?post=373"}],"version-history":[{"count":0,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/posts\/373\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/media?parent=373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/categories?post=373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asianux.org.vn\/index.php\/wp-json\/wp\/v2\/tags?post=373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}