RabbitMQ运维篇之部署与用户管理(一)
一、认识RabbitMQ及用途
Message Queue(MQ)
相对于一些大点的公司都会使用这个MQ,比如像kafka,rabbitmq,activeMQ,rocketMQ主要用于系统与系统之间,或者程序与程序之间进行数据的传递,那么作为消息中间件,我们可以将它作为消息代理服务器,最主要的就是作用就是系统之间的信息进行"结藕",MQ是数据可靠性的重要保障。
那么说起mq的作用之前呢,比如我们以前会遇到什么问题?
1)比如说现在我们有两个系统,一个系统A,一个系统B,那么这两个系统可以把它理解成一个订单系统,一个是后台的支付系统,那么这两个系统之间,你调用我的,我调用你的,也就是数据之间进行一个相互的传递。 那么按照之前的做法来说,来回的传递,就出现问题了,比如说,不管是a系统还是b系统中间任何一个系统出现了问题,我们的消息就发送不出去了,那么像碰到这种情况下,我们就需要额外的去编写一些程序,来保证我们的消息成功送达,比如说增加缓存,增加重试次数,这就需要额外的编码,这就需要编码的工作量也是不小的。
2)另外就是数据传递过程中,这两个系统都是java开发的还好,比如一个是java开发的一个是python开发的,那么在这两个系统之间进行数据传递的过程中,那么麻烦就很大了,在这里面平台不一样语言不一样,进行传递的接口也不一样,这在我们无形中带来了很大的问题。
3)对于系统a与系统b之间如果系统出现了问题,我们甚至都不知道是什么原因造成的,比如系统a接口变了,导致系统b接收不到哪些,系统b不知道出现哪些问题,我们没办法对问题进行切全,那么在线上调试与运维的过程中,这也是一个必然灾难性的后果。
综上所述的话,直接调用的话称为藕严重的耦合,这两个缺了哪一个都不能正常工作,那么怎么解决呢,这个时候就需要mq去解决了。
所以mq叫做消息代理服务器,可以看到上面的mq的基本架构图系统a与系统b不再直接通信,中间增加了一台MQ的消息代理服务器,所有的消息都往这个消息代理服务器上去发送,那么这个消息代理服务器本身来说它具备了一些高可用,高并发的特性,可以估且的认为它是非常稳定的,至少比我们开发的系统来说要稳定的多的多,不用担心当机,无法提供服务,那么在这个基础之上,所有的系统把这个消息放出去,再由这个消息服务器,根据数据的情况分别的转发或者分发
那么我们数据传递的目的,那么这么做有这么一个好处
首先我们系统之间不再进行之间的通信,那么它就完成这个节藕的工作,它完全面向一个中间人来做
其二的话MQ它是一个国际的标准,它在底层遵循一个叫做amqp高级消息队列协议,那么在这个底层的话因为它是一个国际标准,因此系统a与系统b,我们不管是什么样的系统开发的,只要遵循了数据传输的规范,那么就可以在这里面完成通过mq进行数据的传递,这是数据统一的协议,另外就是数据切全的过程,那么在切全的过程中,你会发现,我们估且认为mq这是一个稳定的服务。系统a与系统b进行数据传输,如果系统a把数据,送到mq里面,那么系统a的任务就完成了,至于系统b把我们的数据拿走,那是系统b的事,那么系统a的事完成了,那么如果真的出现了问题,比如运维工程师发现这个程序没有执行,那么看着系统a发送成功了,那么剩下的问题就是连带mq,到系统b这一块进行一个处理与跟踪,那么mq并提供强大的图形化管理页面,我们可以轻易的将之前发送的数据进行跟踪与管理。这也是非常的重要
那么说到mq,它有这么一个好的特性,可以总结一句话,mq解决了在这个系统之间进行数据传递的耦合性问题,使用mq几乎适用于我们所有的系统调用或者是分布式项目
二、什么是RabbitMQ?
在我们市场上有各种各样的mq,但是rabbitmq是全世界最火的开源消息代理服务器,在全世界拥有超过35000个项目部署在rabbitmq,用的人多,而且解决一些相关的问题也就很快,这个rabbit英文翻译为兔子,这个也是一个整个消息中间件的龙头老大,也就是我们使用rabbitmq很多的方案不用自己去考虑,因为全世界的工程师都为这个rabbitmq添砖加瓦,那么这个rabbitmq的最新版本的是3.8.2
而且rabbitmq支持几乎所有的操作系统与编程语言,提供了高并发,高可用的成熟方案,支持多种消息协议,易于部署与使用
官方地址:https://www.rabbitmq.com/
Rabbitmq与其他MQ的对比
像activemq和kafka都是apache的子成员,而rocketmq是阿里巴巴推行的消息中间件,也是作为一个apache的子项目
从这张表看出这个rabbitmq是用的最多的这个毋庸置疑,一般使用中遇到的问题,在它们的论坛以及百度中都可以找到相关的解决方案,另外就是kafka由于大数据的应用也比较多,应用比较多,逐渐的也已经替代了activemq,像rocketmq一般应用的都在国内一般比较多,另外都支持这些数据保存到磁盘上,并发吞吐量就是每秒可以处理多少数据,在不同的设计与不同的背景当中,它的结果也是完全不同的,这里最高的是kafka,因为是大数据的领域,也是因为高性能引起了很多大数据工程师的注意,并发量在rocketmq中也是极高的,因为像双十一这么大的并发量rocket扛住了,它在底层的优化也是做的很好的,在并发吞吐量rabbitmq就稍微逊色一些,rabbitmq在数据可靠性的问题上做了很大的努力,它保证在这里数据是非常可靠的,也是极高的,另外就是生态完整度,在周边做了一些相关的,比如UI或者路由分发等,用户总量也是rabbitmq最多,其次就是kafka,应用场景,由于极高的数据可靠性,rabbitmq主要用于高可靠的交易系统当中,activemq用于一些比较传统的消息传递当中,kafka一般使用最多也是使用日志处理大数据应用这一块,而rocketmq一般主要用于阿里巴巴内部比较多一点,像双十一就是使用的rocketmq,主要适用于互联网高并发,高可用这一块,但是这一块,在阿里也开源了很多的比如dubbo,当时也停止更新了,然后恢复的,像这一块我们社区的完整性和开源是极其不利的,像阿里有款分布式数据库叫OceanBase,由淘宝核心系统研发部、运维、DBA、广告、应用研发等部门共同完成。也是对mysql数据库底层进行了二次开发,但是用着用着就闭源了,所以担心阿里会闭源rabbitmq,在国内的开源软件来说,现在能做的很好的不是特别多,对于rocketmq未来是闭源商用还是继续开源,那么现在还是属于一个观望的态度,现在目前看到rocketmq在apache的star是5000多星,只能说是中规中矩。
RabbitMQ的应用场景
异构系统的数据传递:什么叫异构系统,就是现在有两个系统彼此要传递数据,一个用java一个用c开发的,一¥个在天津一个在北京,像这种不在一个地区又是不同语言开发的系统叫做异构系统,像这种异构系统利用mq进行数据的传递是不错的选择,但是遇到海量的数据,但是不建议使用mq进行去传递,一般mq擅长传递小规模的数据。
高并发程序的流量控制:比如像阿里的双十一进行秒杀的时候或者进行系统最忙碌的时候,进行流量控制的时候,削峰,平谷,像这种应用用mq做肯定没问题,mq是采用对列的机制,那么只允许同一时间有多少人进去,那么在这里是使用mq进行控制的。
基于p2p,p2ppp的程序:mq本身支持定阅和发布的模式或者是进行点对点消费的模式,比如使用mq进行点对点的开发,比如像自己写的qq,像微信,点对点通信,我们可以使用mq进行分发,另外就是p2ppp的程序的话,也非常适合就像我们程序底层的时候,大家看过爱奇艺什么的,那么比如喜欢一个人的频道,直接点一下关注,那么到这个人节目有更新的时候,马上订阅的人都能收到它的最新的消息,这就是通过mq的订阅与发布,这些都是mq的天生所在。
分布式系统的事务一致性TCC:分布式事务是我们开发过程中最挠头的问题,比如说什么是分布式事务,现在有5个系统,这5个系统的话要完成大的业务,那么这个大的业务,这5个系统每一个系统都完成了一小块数据,现在有需求来了,这5个系统要么全部都处理成功,要么中间有任何一个出现问题,我要把之前的系统信息全部都回滚什么都没做过,那么这就是我们的说到的分布式事务,那么分布式事务底层的话我们的设计叫tcc,那么在这里面最核心的就是基于mq进行消息的分发,来通知我们的应用,它进行提交回滚。
高可靠的交易系统:在高可靠的交易系统中,rabbitmq最值得骄傲的是高可靠性,对于应用来说mq本身就是高可靠性,同时对数据也进行了高可靠的支持,几乎不会出现数据mq的层面上丢失的情况,那么在这种高可靠的交易系统来说,rabbitmq最适合不过了,任何一个多数据进行交互的两个以上三个以上项目,进行数据传递用mq作为系统节藕的服务器是再合适不过的。
三、Linux平台安装最新RabbitMQ
RabbitMQ使用Erlang开发
Erlang(['ə:læŋ])是一种通用的面向并发的编程语言, Erlang是一个结构化,动态类型编程语言,内建并行计算支持。
使用Erlang来编写分布式应用要简单的多,Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。
下载地址:https://www.rabbitmq.com/download.html
直接下载最新的rabbitmq到本地
rabbitmq还需要依赖erlang的运行环境
https://www.erlang-solutions.com/resources/download.html
选择centos,找到22.2.5最新的版本下载到本地
[root@zhaocheng ~]# mkdir rabbitmq
[root@zhaocheng rabbitmq]# ls
esl-erlang_22.2.5-2~centos~7_amd64.rpm rabbitmq-server-3.8.2-1.el7.noarch.rpm
--nodeps不检查依赖,去除依赖关系
[root@zhaocheng rabbitmq]# rpm -ivh --nodeps esl-erlang_22.2.5-2~centos~7_amd64.rpm
[root@zhaocheng rabbitmq]# rpm -ivh --nodeps rabbitmq-server-3.8.2-1.el7.noarch.rpm
[root@zhaocheng rabbitmq]# rabbitmq-plugins enable rabbitmq_management
启动控制台
[root@zhaocheng rabbitmq]# rabbitmq-server
访问http://ip:15672
登录的时候3.3以上的版本都会出现User can only log in via localhost,是因为禁止使用guest/guest权限通过除localhost外的访问
找到这个文件rabbit.app
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.7/ebin/rabbit.app
将:{loopback_users, [<<"guest">>]},
改为:{loopback_users, []},
重启服务
[root@zhaocheng ~]# rabbitmqctl stop
[root@zhaocheng ~]# rabbitmq-server
登录:guest
密码:guest
RabbitMQ常用命令
启动与关闭
rabbitmq-server 前台启动
rabbitmq-server -detached 后台启动
rabbitmqctl stop 停止服务/kill -9 rbbitmq的pid
终止与启动应用
rabbitmqctl start_app 启动应用
rabbitmqctl stop_app 终止应用
就是将我们的应用进行启动或者终止,这个不会对我们的进程产生影响,只是对我们的队列服务进行了暂停,比如像一个电厂将这个电厂看作一个进程,比如电厂进行升级改造,需要拉闸,那么相当于使用这个rabbitmqctl stop_app,恢复的话,使用start_app
用户管理
创建一个用户,比如叫kubernetes
格式:rabbitmqctl add_user {username} {password}
[root@zhaocheng ~]# rabbitmqctl add_user kubernetes 123456
Adding user "kubernetes" ...
删除用户
rabbitmqctl delete_user {username}
重置密码,一般的话在部署rabbitmq的时候进行对guest用户进行修改密码,因为这个权限是非常大的
[root@zhaocheng ~]# rabbitmqctl change_password guest 123456789
Changing password for user "guest" ...
格式:rabbitmqctl change_password {username} {newpassword}
授予用户角色(Tag),在rabbitmq中有四种基本的角色,对mq有不同的操作权限,这4种角色统一叫tag,可以针对我们创建的用户给它一定的权限,这个tag也就是包含了一定相关的策略信息。
格式:rabbitmqctl set_user_tags {username} {tag}
[root@zhaocheng ~]# rabbitmqctl set_user_tags kubernetes administrator
Setting tags for user "kubernetes" to [administrator] ...
查看对我们的kubernetes用户设置了权限为超级管理员
设置用户允许访问的vhost:访问的虚拟主机,相当于对应mysql中对应的数据库,mysql可以把数据放在不同对应的数据中,对数据进行分类,那么vhost也是一样,可以对不同的系统进行设置不同的虚拟主机,通过set_permissions规定哪个用户,可以访问哪些虚拟主机,后面的星是能够执行所有的权限,第一个是配置权限,读权限,写权限,-p是虚拟主机的路径
格式:rabbitmqctl set_permissions -p / user_admin '.' '.' '.'
给kubernetes用户一个默认的虚拟主机的操作权限,一般生产环境中会创建多个虚拟主机,进行一些相关的权限
[root@zhaocheng ~]# rabbitmqctl set_permissions -p / kubernetes '.' '.' '.'
Setting permissions for user "kubernetes" in vhost "/" ...
可以使用页面上直接添加用户
rabbitmq用户四种tag
超级管理员(administrator):也就是进行对所有的用户进行管理
可登陆管理控制台(启用management plugin的情况下),可查看所有 的信息,并且可以对用户,策略(policy)进行操作。
监控者(monitoring):可以查看rabbitmq节点的相关信息,是管理我们运行节点的运行状态的
登陆管理控制台(启用management plugin的情况下),同时可以查看
rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
策略制定者(policymaker):这个就无法查看我们节点的相关信息,但是可以进行一些策略的定制,比如在管理集群的时候,哪些队列可以进行复制,或者运行的规则,规定了我们的节点是怎么运行的
可登陆管理控制台(启用management plugin的情况下), 同时可以对
policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到 节点信息,也无法对策略进行管理。
还有一个就是什么都没写的时候,没有角色,连控制台都无法登录