RabbitMQ 集群

rabbitmq集群环境搭建手册

整体要求

Rabbitmq 是用 erlang 语言写的,所以我们需要安装 Erlang,安装 erlang 又需要安装 Python 与 simplejson,如果linux预装的python版本过低,请先升级。

本节暂用预装python,以后需要,再行升级。

 

一、     erlang环境配置

首先进入到安装包所在目录

cd  /home/devapp/mq

然后依次执行如下:

1、sudo rpm -ivh tcp_wrappers-7.6-58.el6.x86_64.rpm

2、sudo rpm -ivh tcp_wrappers-libs-7.6-58.el6.x86_64.rpm

3、sudo rpm -ivh erlang-18.3-1.el6.x86_64.rpm

4、sudo rpm -ivh socat-1.7.2.1-1.el6.rf.x86_64.rpm

5、sudo rpm -ivh rabbitmq-server-3.6.3-1.noarch.rpm

 

这样基础环境基本安装完成

Erlang默认的安装目录为:/usr/lib64/erlang

Rabbitmq默认的安装目录:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.3

 

配置相关环境变量:

sudo vi/etc/profile

加入如下语句:

#set erlang environment

ERL_HOME=/usr/lib64/erlang/

PATH=$ERL_HOME/bin:$PATH

export ERL_HOME PATH

 

#set rabbitmq environment

export PATH=$PATH:/usr/lib/rabbitmq/bin

二、     Rabbitmq环境配置

A.      配置web插件管理界面

进入目录:

cd /usr/lib/rabbitmq/bin

执行:sudo rabbitmq-plugins enable rabbitmq_management

这里你可以随意增加管理的插件:sudo rabbitmq-plugins enable +plugins(rabbitmq支持的)。

 

启动rabbitmq:

sudo rabbitmq-server start &

 

到这里,理论上你已经可以通过http://25.0.88.54:15672/这个地址访问了,rabbitmq默认的用户名和密码为:guest/guest;

 

翻看官方的release文档后,得知由于账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆使用,并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq(该功能是在3.3.0版本引入的)

 

虽然可以以比较猥琐的方式:将ebin目录下rabbit.apploopback_users里的<<"guest">>删除, 并重启rabbitmq,可通过任意IP使用guest账号登陆管理控制台,但始终是违背了设计者的初衷。

B.      Web插件的用户配置管理

1.      用户管理

 

用户管理包括增加用户,删除用户,查看用户列表,修改用户密码,设置用户角色,权限等等。

 

(1)  新增一个用

 

rabbitmqctl  add_user  Username Password

 

(2) 删除一个用户

rabbitmqctl  delete_user  Username


(3) 修改用户的密码

rabbitmqctl  change_password Username  Newpassword


(4) 查看当前用户列表

rabbitmqctl  list_users

 

2.      用户角色

 

按照个人理解,用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。


(1)
超级管理员(administrator)

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2)
监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

(3)
策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)

administrator的对比,administrator能看到这些内容

(4)
普通管理者(management)

仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

(5)
其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。

 

设置用户角色的命令为:

rabbitmqctl  set_user_tags  User Tag


User为用户名, Tag为角色名(对应于上面的administratormonitoringpolicymakermanagement,或其他自定义名称)

也可以给同一用户设置多个角色,例如

rabbitmqctl  set_user_tags  hncscwc monitoring  policymaker


3.      用户权限


用户权限指的是用户对exchangequeue的操作权限,包括配置权限,读写权限。配置权限会影响到exchangequeue的声明和删除。读写权限影响到从queue里取消息,向exchange发送消息以及queueexchange的绑定(bind)操作。

例如:queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。详细请参考官方文档中"Howpermissions work"部分。

相关命令为:

(1)
设置用户权限

rabbitmqctl  set_permissions  -p VHostPath  User  ConfP  WriteP  ReadP


(2) 查看(指定hostpath)所有用户的权限信息

rabbitmqctl  list_permissions [-p  VHostPath]


(3) 查看指定用户的权限信息

rabbitmqctl  list_user_permissions User


(4)  清除用户的权限信息

rabbitmqctl  clear_permissions  [-pVHostPath]  User

 

4.      实际应用配置

根据以上讲解,进行用户的简单创建:

1、 sudo rabbitmqctl  add_user  admin  admin

2、  sudo rabbitmqctl set_user_tags  admin  administrator

3、  sudo rabbitmqctl list_users

4、  这是登录控制台管理页面:

C.       环境配置

一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:

一个是环境变量的配置文件 rabbitmq-env.conf ;

一个是配置信息的配置文件 rabbitmq.config;

注意,这两个文件默认是没有的,如果需要必须自己创建。

rabbitmq-env.conf

这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。

文件的内容包括了RabbitMQ的一些环境变量,常用的有:

#RABBITMQ_NODE_PORT=   //端口号

#HOSTNAME=

RABBITMQ_NODENAME=mq

RABBITMQ_CONFIG_FILE=       //配置文件的路径

RABBITMQ_MNESIA_BASE=/rabbitmq/data       //需要使用的MNESIA数据库的路径

RABBITMQ_LOG_BASE=/rabbitmq/log       //log的路径

RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins   //插件的路径

具体的列表见:http://www.rabbitmq.com/configure.html#define-environment-variables

rabbitmq.config

这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。

它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。

文件的内容详见:http://www.rabbitmq.com/configure.html#config-items

三、     Rabbitmq集群模式的配

A.      集群的简单介绍

了解集群中的基本概念:

RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的,一个例外是,那些当前只属于创建它的节点的消息队列,尽管它们可见且可被所有节点读取。rabbitmq节点可以动态的加入到集群中,一个节点它可以加入到集群中,也可以从集群环集群会进行一个基本的负载均衡。
集群中有两种节点:
1 内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)
2 磁盘节点:保存状态到内存和磁盘。
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了
如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

注:这里我们采用各个节点皆为磁盘节点。

 

普通模式:默认的集群模式。

对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。

当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。

该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。

如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了……

镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQHA方案

该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。

该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。

所以在对可靠性要求较高的场合中适用。

(目前我们搭建的环境属于该模式,但是他依赖与普通模式集群,所以我们一步一步来。)

B.      普通模式集群配置

由于我们上面已经将rabbitmq-server分别搭建在三台不同的物理机上,成为三个独立的应用。集群要做的就是将这三台独立的应用服务,以某种方式绑定在一起,实现信息共享,相辅相成。

三台机器分别为:后面是主机名

25.0.88.53  NBbyk388Eij1pxwdzIJUvJ1m

25.0.88.54  6oDVSazwJVrNyMhhZaToowLu

25.0.88.55  6QBCFIURM1JyeeO1rx5WM9c9

step1:

三台机器作为集群节点,我们先将三个应用服务启动起来: # sudo rabbitmq-server  start &

step2:

在安装好的三台节点服务器中,分别修改 sudovi /etc/hosts文件,指定535455hosts,如:

25.0.88.53  NBbyk388Eij1pxwdzIJUvJ1m

25.0.88.54  6oDVSazwJVrNyMhhZaToowLu

25.0.88.55  6QBCFIURM1JyeeO1rx5WM9c9

 

还有hostname文件也要正确,分别是NBbyk388Eij1pxwdzIJUvJ1m6oDVSazwJVrNyMhhZaToowLu6QBCFIURM1JyeeO1rx5WM9c9,如果修改hostname建议安装rabbitmq前修改。

请注意RabbitMQ集群节点必须在同一个网段里,如果是跨广域网效果就差。

step3:设置每个节点Cookie

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件必须是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。

将其中一台节点上的.erlang.cookie的文件内容复制下来保存到其他节点上。记住这里是覆盖。但是要注意文件的权限和属主属组。

为了安全起见我们先将文件备份:#sudo cp /var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/erlang.cookie.back

然后,修改下文件权限,#sudo chmod777  /var/lib/rabbitmq/.erlang.cookie

然后,#sudo vi /var/lib/rabbitmq/.erlang.cookie 把内容清空,然后把复制的值粘贴到里面,记得保存,退出。使得三台机器的.erlang.cookie内容一致,该文件是集群节点进行通信的验证密钥,这样才能保证erlang节点进行通讯。

最后,别忘记还原.erlang.cookie的权限,否则可能会遇到错误# sudo chmod 400/var/lib/rabbitmq/.erlang.cookie

设置好cookie后先将三个节点的rabbitmq重启

# sudo rabbitmqctl stop

# sudo rabbitmq-server start &

step4:

停止所有节点RabbitMq服务,然后使用detached参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序

     [devapp@NBbyk388Eij1pxwdzIJUvJ1m~]#sudo  rabbitmqctl stop

    [devapp@6oDVSazwJVrNyMhhZaToowLu ~]# sudo  rabbitmqctl stop
     [devapp@6QBCFIURM1JyeeO1rx5WM9c9 ~]# sudo  rabbitmqctlstop

 

    [devapp@NBbyk388Eij1pxwdzIJUvJ1m ~]# sudo  rabbitmq-server -detached

    [devapp@6oDVSazwJVrNyMhhZaToowLu ~]# sudo rabbitmq-server -detached
     [devapp@6QBCFIURM1JyeeO1rx5WM9c9 ~]# sudo rabbitmq-server-detached

 

分别查看下每个节点

[devapp@6oDVSazwJVrNyMhhZaToowLu ~]# sudo rabbitmqctlcluster_status

 

 

Step5:

将53、55作为集群节点与54连接起来,在panyuntao1上,执行如下命令:

55# sudo rabbitmqctl stop_app

55# sudo rabbitmqctl join_cluster --ram rabbit@6oDVSazwJVrNyMhhZaToowLu

55# sudo rabbitmqctl start_app

53# sudo rabbitmqctl stop_app

53# sudo rabbitmqctl join_cluster --ram rabbit@6oDVSazwJVrNyMhhZaToowLu

53# sudo rabbitmqctl start_app

上述命令先停掉rabbitmq应用,然后调用cluster命令,使两者成为一个集群,最后重启rabbitmq应用。在这个cluster命令下,5355是内存节点,54是磁盘节点(RabbitMQ启动后,默认是磁盘节点)。

54 如果要使5355在集群里也是磁盘节点,join_cluster 命令去掉--ram参数即可

      #rabbitmqctljoin_cluster rabbit@queue   

只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。

Step6:

      此时,在查看各个集群节点的状态信息:

55# sudo rabbitmqctl cluster_status

每一个节点应该都是一样的信息,并且都是磁盘节点。

Step7:

往任意一台集群节点里写入消息队列,会复制到另一个节点上,我们看到两个节点的消息队列数一致:

      这个时候我们登陆控制台如下图:

会出现三个节点信息。

然后,我们随便在一台机器上创建一个测试queue,你会发现不管queue被创建在哪台机器上,两台机器监听的queue是一致的。

[devapp@6oDVSazwJVrNyMhhZaToowLu rabbitmq]$sudo rabbitmqctl list_queues

 

 

这样RabbitMQ集群就正常工作了。

这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。  

为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。理由如下:

1. storage space: If every cluster node had a full copy ofevery queue, adding nodes wouldn’t give you more storage capacity. For example,if one node could store 1GB of messages, adding two more nodes would simplygive you two more copies of the same 1GB of messages.

2. performance: Publishing messages would require replicatingthose messages to every cluster node. For durable messages that would requiretriggering disk activity on all nodes for every message. Your network and diskload would increase every time you added a node, keeping the performance of thecluster the same (or possibly worse).

当然RabbitMQ新版本集群也支持队列复制(有个选项可以配置)。比如在有五个节点的集群里,可以指定某个队列的内容在2个节点上进行存储,从而在性能与高可用性之间取得一个平衡。

C.       镜像模式集群的配置

上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。

我们看看如何镜像模式来解决复制的问题,从而提高可用性。

镜像模式集群配置方式有两种:一种是通过控制台配置,另一种是通过命令行配置。

1.      控制台配置

·        登录控制台

·        Navigate to Admin > Policies > Add/ update a policy.

·        Enter "ha-nodes" next to Nameand "^nodes\." next to Pattern.

·        Enter "ha-mode" ="nodes" in the first line next to Policy, then "ha-params"in the second line, set the second line's type to "List", and thenenter "rabbit@nodeA" and "rabbit@nodeB" in the sublistwhich appears.

·        Click Add policy.

·        填写信息如下:

 

这样你会发现所有符合规则的queues会出现如下状况

满足条件的队列会进行镜像复制。

2.      命令行配置

使用Rabbit镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为

cluster中任意节点启用策略,策略会自动同步到集群节点

# sudo rabbitmqctlset_policy -p hrsystem ha-allqueue "^"'{"ha-mode":"all"}'

这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,

策略正则表达式为 “^” 表示所有匹配所有队列名称。

例如rabbitmqctl set_policy -p hrsystem ha-allqueue"^message" '{"ha-mode":"all"}'

注意:"^message" 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"

官方set_policy说明参见

set_policy [-p vhost]{name} {pattern} {definition} [priority]

-p vhost :  可选参数,针对指定Vhost下的queue进行设置

Name   :  policy的名称

Patten  :  queue的匹配模式(正则表达式)

Definition:  镜像定义,包括三部分ha-modeha-paramsha-sync-mode

                ha-mode:指明镜像队列的模式,有效值all/exactly/nodes

                              all:表示在集群所有节点上进行镜像

         exactly:表示在指定个数的节点上进行镜像,节点个数由ha-params决定

         nodes:表示在指定节点上进行镜像,节点名称通过ha-params指定

                ha-params:ha-mode模式需要用到的参数

                ha-sync-mode:镜像队列中消息同步方式,有效值automaticmanually

priority:可选参数,policy的优先级。

 

Demo:队列名称以hello开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为:

#sudo rabbitmqctlset_policy hello-ha “^hello” ‘{“ha-mode”:”exactly”,”ha-params”:2,”ha-sync-mode”:”automatic”}’

http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

ha-mode:

ha-mode

ha-params

Result

all

(absent)

Queue is mirrored across all nodes in the cluster. When a new node is added to the cluster, the queue will be mirrored to that node.

exactly

count

Queue is mirrored to count nodes in the cluster. If there are less than count nodes in the cluster, the queue is mirrored to all nodes. If there are more than count nodes in the cluster, and a node containing a mirror goes down, then a new mirror will not be created on another node. (This is to prevent queues migrating across a cluster as it is brought down.)

nodes

node names

Queue is mirrored to the nodes listed in node names. If any of those node names are not a part of the cluster, this does not constitute an error. If none of the nodes in the list are online at the time when the queue is declared then the queue will be created on the node that the declaring client is connected to.

创建队列时需要指定ha 参数,如果不指定x-ha-prolicy 的话将无法复制

ConsumerCancellation

Clientsthat are consuming from a mirrored queue may wish to know that the queue fromwhich they have been consuming has failed over. When a mirrored queue failsover, knowledge of which messages have been sent to which consumer is lost, andtherefore all unacknowledged messages are redelivered with theredelivered flag set. Consumers may wish to know this is going to happen.

Ifso, they can consume with the argument x-cancel-on-ha-failover set to true. Their consuming will then be cancelled on failover and a consumer cancellationnotification sent. It is then theconsumer's responsibility to reissue basic.consume to start consuming again.

Forexample (in Java):

Channel channel = ...;
Consumer consumer = ...;
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-cancel-on-ha-failover", true);
channel.basicConsume("my-queue", false, args, consumer);

Thiscreates a new consumer with the argument set.

Someexamples

Policy where queues whose names begin with "ha." aremirrored to all nodes in the cluster:

rabbitmqctl

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

rabbitmqctl (Windows)

rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"

HTTP API

PUT /api/policies/%2f/ha-all {"pattern":"^ha\.", "definition":{"ha-mode":"all"}}

Web UI

·         Navigate to Admin > Policies > Add / update a policy.

·         Enter "ha-all" next to Name, "^ha\." next to Pattern, and "ha-mode" = "all" in the first line next to Policy.

·         Click Add policy.

Policywhere queues whose names begin with "two." are mirrored to any two nodes in the cluster, with automaticsynchronisation:

rabbitmqctl

rabbitmqctl set_policy ha-two "^two\." \
   '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

rabbitmqctl (Windows)

rabbitmqctl set_policy ha-two "^two\." ^
   "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}"

HTTP API

PUT /api/policies/%2f/ha-two
{"pattern":"^two\.", "definition":{"ha-mode":"exactly", "ha-params":2,"ha-sync-mode":"automatic"}}

Web UI

·         Navigate to Admin > Policies > Add / update a policy.

·         Enter "ha-two" next to Name and "^two\." next to Pattern.

·         Enter "ha-mode" = "exactly" in the first line next to Policy, then "ha-params" = 2 in the second line, then "ha-sync-mode" = "automatic" in the third, and set the type on the second line to "Number".

·         Click Add policy.

Policy where queues whose names begin with "nodes." are mirrored tospecific nodes in the cluster:

rabbitmqctl

rabbitmqctl set_policy ha-nodes "^nodes\." \
   '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

rabbitmqctl (Windows)

rabbitmqctl set_policy ha-nodes "^nodes\." ^
   "{""ha-mode"":""nodes"",""ha-params"":[""rabbit@nodeA"", ""rabbit@nodeB""]}"

HTTP API

PUT /api/policies/%2f/ha-nodes
{"pattern":"^nodes\.", "definition":{"ha-mode":"nodes", "ha-params":["rabbit@nodeA", "rabbit@nodeB"]}

Web UI

·         Navigate to Admin > Policies > Add / update a policy.

·         Enter "ha-nodes" next to Name and "^nodes\." next to Pattern.

·         Enter "ha-mode" = "nodes" in the first line next to Policy, then "ha-params" in the second line, set the second line's type to "List", and then enter "rabbit@nodeA" and "rabbit@nodeB" in the sublist which appears.

·         Click Add policy.

PerformanceImprovements since RabbitMQ 3.6.0

WithRabbitMQ 3.6.0 we introduced a new policy that can be configured with mirroredqueues:ha-sync-batch-size. Bysynchronising messages in batches, the synchronisation process can be sped upconsiderably.

You can determine which slaves are synchronised with the followingrabbitmqctl invocation:

rabbitmqctl list_queues name slave_pidssynchronised_slave_pids

You can manually synchronise a queue with:

rabbitmqctl sync_queue name

And you can cancel synchronisation with:

rabbitmqctl cancel_sync_queue name

These features are also available through the management plugin.

注:如有任何问题,详情参考官网:http://www.rabbitmq.com/ha.html

四、     Rabbitmq日志追踪设置

首先添加日志追踪插件

执行:sudo rabbitmq-plugins enable rabbitmq_tracing

控制台出现如下页面:

安装插件后:

会发现多了两个exchange amq.rabbitmq.traceamq.rabbitmq.log 类型均为topic

队列会相应增加一个queueamq.gen-字符串

日志的默认存储路径为:/var/tmp/rabbitmq-tracing/

 

注:日志追踪是按virtual host进行日志传输,进行日志追踪的virtual host必须具有guest用户权限。

五、     HAProxy集成rabbitMQ

首先,rabbitmq镜像集群已经安装完成,通过HA对其进行代理,做负载均衡就很简单了,只需要配置一些配置文件即可。

那么我们现在最先需要做的就是安装HAProxy代理服务器。

有两种方式进行安装:

A.      用yum方式安装

首先执行:# sudo yum clean all    做一下清理工作。

然后执行:# sudo yum install gcc   如果系统已经安装,忽略此步。

最后执行:# sudo yum install haproxy   待安装完成后,haproxy就算安装完成了,是不是很简单。

这样,可以通过执行:#haproxy –v 查看ha的版本号,

启动# /usr/sbin/haproxy-D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid

可以看出haproxy的配置文件默认在/etc/haproxy/下,/usr/sbin/haproxy为可执行文件,所有ha进程执行行为都在/var/run/haproxy.pid这个里。

重新启动:#sudo service haproxy restart * Restarting haproxy haproxy

 

如果为了方便管理与查找,或者是觉得自定义安装的版本太低,也可以自己下载haproxy源码自己编译安装,我这里用的是下面这种。

B.      下载HAProxy源码编译安装

还是执行前两步:

首先执行:# sudo yum clean all    做一下清理工作。

然后执行:# sudo yum install gcc   如果系统已经安装,忽略此步。

1.      下载源码haproxy安装包

这里我下载了:haproxy-1.6.3.tar.gz

上传文件到根目录/home/devapp/

然后执行:

#sudo mv /home/devapp/haproxy-1.6.3.tar.gz /data1/haproxy-1.6.3.tar.gz

将文件移动到/data1/目录下

2.      安装haproxy

首先执行:#sudo tar  –zxvf  haproxy-1.6.3.tar.gz    解压文件

            #sudo mv  haproxy-1.6.3  haproxy       将文件重命名

然后执行:# sudo make TARGET=generic PREFIX=/data1/haprpxy

            #make install PREFIX=/data1/haproxy       等待安装完成

最后执行:#sudo vi /data1/haproxy/haproxy.cfg

新建配置文件haproxy.cfg内容如下

3.      配置haproxy.cfg

###########全局配置#########

global

log /data1/dev/log    local0

log /data1/dev/log    local1 notice

# 改变当前工作目录

chroot /var/lib/haproxy

# 创建监控所用的套接字目录

stats socket /data1/run/haproxy/admin.sock mode660 level admin

# haproxypid存放路径,启动进程的用户必须有权限访问此文件

pidfile /var/run/haproxy.pid 

# 最大连接数,默认4000

maxconn 4000  

# 默认用户

user  haproxy

# 默认用户组

group haproxy 

# 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon

# Default SSL material locations

daemon       

#ca-base /etc/ssl/certs

#crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabledlistening sockets.

# For more information, see ciphers(1SSL). Thislist is from:

#https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/

#ssl-default-bind-ciphersECDH+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

###########默认配置#########

defaults

log global

# 默认的模式mode {tcp|http|health }tcp4层,http7层,health

#只会返回OK

mode   http

# 采用http日志格式

option httplog

# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器

# 或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某

#固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;

# 官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用

# 该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来

option dontlognull                                                                       

 

timeout connect 5000   # 连接超时时间

timeout client 50000   # 客户端连接超时时间

timeout server 50000  # 服务器端连接超时时间

option httpclose        # 每次请求完毕后主动关闭http通道

option httplog          # 日志类别http日志格式

#option forwardfor     # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip 

option redispatch       # serverId对应的服务器挂掉后,强制定向到其他健康的服务器

timeout connect 10000  # default 10 second timeout if a backend isnot found

maxconn    60000     # 最大连接数

retries    3             # 3次连接失败就认为服务不可用,也可以通过后面设置

#errorfile 400 /etc/haproxy/errors/400.http

#errorfile 403 /etc/haproxy/errors/403.http

#errorfile 408 /etc/haproxy/errors/408.http

#errorfile 500 /etc/haproxy/errors/500.http

#errorfile 502 /etc/haproxy/errors/502.http

#errorfile 503 /etc/haproxy/errors/503.http

#errorfile 504 /etc/haproxy/errors/504.http

##################################################################

listen http_front

      bind0.0.0.0:1080            #监听端口 

      statsrefresh 30s             #统计页面自动刷新时间 

      statsuri /haproxy?stats      #统计页面url 

      statsrealm Haproxy Manager #统计页面密码框上提示文本 

      statsauth admin:admin      #统计页面用户名和密码设置 

#stats hide-version           #隐藏统计页面上HAProxy的版本信息

#####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################

listen rabbitmq_admin

    bind0.0.0.0:8004

   server node1 25.0.88.53:15672

   server node2 25.0.88.54:15672

   server node3 25.0.88.55:15672

##################################################################

listen rabbitmq_cluster

    bind0.0.0.0:5678

   option tcplog

    modetcp

   timeout client  3h

   timeout server  3h

      option  clitcpka

      #负载均衡算法(#banlance roundrobin 轮询,balancesource

      #session值,支持static-rrleastconnfirsturi等参数)

      #balanceurl_param useri

      #balanceurl_param session_id check_post 64

   #balance hdr(User-Agent)

   #balance hdr(host)

   #balance hdr(Host) use_domain_only

   #balance rdp-cookie

   #balance leastconn

   #balance source //ip

      balanceroundrobin     

#check inter 2000 是检测心跳频率,rise 22次正确认为服务器可#用,fall 33次失败认为服务器不可用

   server   node1 25.0.88.53:5672check inter 5s rise 2 fall 3

   server   node2 25.0.88.54:5672check inter 5s rise 2 fall 3

server   node325.0.88.55:5672 check inter 5s rise 2 fall 3

 

######至此,haproxy.cfg配置完成,重新启动haproxy服务即可######

 

Haproxy的当前工作目录

/var/lib/haproxy

haproxypid存放路径,启动进程的用户必须有权限访问此文件

pidfile /var/run/haproxy.pid

 

注:以上配置文件中的路径不存在的别忘记自行创建。

 

启动:#sudo /data1/haproxy/sbin/haproxy –f  /data1/haproxy.cfg

 

4.      Web控制台介绍

首先可以通过控制台查看haproxy的监控管理:

访问地址:http://25.0.88.53:1080/haproxy?stats

通过控制台可以看出,代理应用端口的输入输出量,以及应用的健康检查,应用状态等参数。

这里我对rabbitmq的控制台管理也做了代理:

通过访问地址:http://25.0.88.53:8004/  可以随机查看rabbitmq的控制台管理,而不用一个登陆具体应用地址。

 

注:可以通过trace追踪日志,查看具体消息的走向,即通过代理端口转发至哪个应用,做消息处理。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值