华为云用户手册

  • 可能原因 Linux操作系统云服务器中限制资源使用的配置文件是/etc/security/limits.conf和/etc/security/limits.d/目录,/etc/security/limits.d/目录中的配置优先级高于/etc/security/limits.conf的配置。 如果修改/etc/security/limits.conf文件,重启后不生效,则可能是由于limits.conf中的修改被/etc/security/limits.d/目录中配置项的值所覆盖。
  • 解决方法 使用远程桌面连接功能后,禁用redirect local drives功能。 打开“运行”窗口。 输入“mstsc”,并单击“确定”。 系统打开“远程桌面连接”窗口。 单击左下角的“选项”,并选择“本地资源”页签。 在“本地设备和资源”栏,单击“详细信息”。 在“本地设备和资源”窗口中,取消勾选“驱动器”。 单击“确定”保存修改。 图1 禁用redirect local drives功能
  • 问题描述 安装Python库软件时,需配置pip源。以中国科技大学镜像源为例: [root@test home]# cat /root/.pip/pip.conf [global]index-url = https://pypi.mirrors.ustc.edu.cn/simple/trusted-host = pypi.mirrors.ustc.edu.cn 安装过程中,系统报错"command ´gcc´ failed with exit status 1",如图1所示。但是,在用pip安装Python库软件之前,确认已经使用yum命令安装了gcc。 图1 安装报错
  • 操作步骤 登录Linux云服务器,执行以下命令编辑云服务器SSH连接方式。 vi /etc/ssh/sshd_config 修改如下配置项: 把PasswordAuthentication yes改为PasswordAuthentication no 重启sshd使修改生效。 service sshd restart 重启云服务器,使用SSH密码方式连接云服务器,如果提示“Disconnected:No supported authentication methods available”,说明已成功禁用SSH密码访问方式。
  • 操作步骤 使用密钥登录Linux云服务器,设置root密码。 sudo passwd root 若密钥文件丢失或损坏,请参考Linux云服务器如何进入单用户模式重置root密码,重置root密码。 使用root身份编辑云服务器的ssh登录方式。 su root vi /etc/ssh/sshd_config 修改如下配置项: 把PasswordAuthentication no 改为 PasswordAuthentication yes 或去掉PasswordAuthentication yes 前面的#注释掉。 把PermitRootLogin no 改为 PermitRootLogin yes 或去掉PermitRootLogin yes 前面的#注释掉。 重启sshd使修改生效。 service sshd restart 重启云服务器就可以使用root用户和新设置的密码登录了。 防止非授权用户使用原来的密钥文件访问Linux云服务器,请将/root/.ssh/authorized_keys文件删除或清空authorized_keys文件内容。
  • 已删除文件因句柄被占用未释放导致相应空间未释放 登录服务器,执行df -h查看磁盘block空间使用率为100%。 执行df -i查看磁盘inode空间使用率较低,如下截图所示,本例inode空间使用率为1%。 执行du -sh查看文件占用空间和磁盘可用空间相差较大。 解决方案: 执行以下命令,查找当前分区是否存在未被清除句柄的文件。 lsof |grep delete 执行以下命令,结束进程释放磁盘空间。 kill -9 进程编号
  • fs.inotify.max_user_watches值耗尽 Linux操作系统云服务器提示空间不足:No space left on device 解决方案: 执行以下命令,编辑/etc/sysctl.conf文件。 vi /etc/sysctl.conf 补充如下信息: fs.inotify.max_user_watches = 524288 执行以下命令使修改生效。 sysctl -p Inotify用于监视文件系统事件, 默认情况下可监视的每个真实用户ID创建的文件数量 上限为8192,可以通过执行以下命令获取当前的inotify文件监视限制。 cat /proc/sys/fs/inotify/max_user_watches 如果此限制不足以监视所有文件,必须增加限制以使正常工作。
  • 处理方法 登录弹性云服务器。 执行以下命令,编辑hosts文件。 vi /etc/hosts 按“i”,进入编辑模式。 在hosts文件最后添加一行内容,写入IP地址和主机名。 私有IP地址 主机名 示例: 假设弹性云服务器的主机名为“hostname”,私有IP地址为“192.168.0.1”,则需添加的语句为: 192.168.0.1 hostname 按“Esc”退出编辑模式。 执行以下命令,保存并退出。 :wq 针对镜像为Ubuntu、Debian的弹性云服务器,如果需要更新主机名,需将/etc/cloud/cloud.cfg中的manage_etc_hosts参数设置为false,同时将新设置的主机名更新至/etc/hosts中。编辑/etc/hosts文件时,请勿删除127.0.0.1所在行语句,否则会出现非root用户切换root超时问题。
  • 操作步骤 关闭原弹性云服务器,卸载其系统盘,并将系统盘挂载到临时弹性云服务器。 原弹性云服务器关机,进入详情页,并选择“云硬盘”页签。 原弹性云服务器关机时,请勿执行强制关机操作,否则可能引起重置密码操作失败。 单击系统盘所在行的“卸载”,卸载该系统盘。 展开临时弹性云服务器的详情页,并选择“云硬盘”页签。 单击“挂载磁盘”,在“挂载磁盘”对话框中,选择1.b中卸载的系统盘,将其挂载到临时弹性云服务器上。 远程登录临时弹性云服务器,并重置密码。 在临时弹性云服务器的“操作”列下,单击“远程登录”。 执行以下命令,查看原弹性云服务器上卸载的系统盘在临时弹性云服务器上的目录。 fdisk -l 图1 查看系统盘所在的目录 创建临时目录并挂载。 mkdir /aaz mount /dev/vdb1 /aaz 切换至挂载目录。 chroot /aaz 图2 切换至挂载目录 执行以下命令,根据系统提示输入新设置的密码。 passwd 图3 设置新密码 系统显示如下回显信息时,说明密码设置成功。 all authentication tokens updated successfully. 关闭临时弹性云服务器,卸载原弹性云服务器的系统盘,并将其重新挂载回原弹性云服务器后执行重启操作。 临时弹性云服务器关机,并进入详情页,选择“云硬盘”页签。 单击“卸载”,卸载1中临时挂载的数据盘。 展开原Linux弹性云服务器的详情页,选择“云硬盘”页签。 单击“挂载磁盘”,在“挂载磁盘”对话框中,选择3.b中卸载的数据盘,并设置挂载点为“/dev/sda”。 重启原弹性云服务器。
  • 可能原因 ECS实例的网络配置为DHCP(Dynamic Host Configuration Protocol,动态主机设置协议)方式。 以CentOS 7的ECS为例,如果网络配置为DHCP方式,当ECS实例启动时,Linux系统的NetworkManager服务会启动dhclient进程,dhclient进程会向DHCP服务器请求分配IP地址,并获得IP地址租约到期时间。 正常情况下,dhclient进程会定期向DHCP服务器更新租约到期时间,以确保实例IP地址的可用性,如下图: 图2 正常情况 当用户误操作停止了NetworkManager服务,并清理了dhclient进程时,会导致ECS实例无法自动更新IP地址的续租到期时间。当租约到期后,ECS实例的IP地址会被释放,导致网络不通。
  • 解决方案 远程登录ECS实例。 执行以下命令,重启NetworkManager服务,并设置为开启自启动。 systemctl restart NetworkManager systemctl enable NetworkManager 执行以下命令,查看NetworkManager服务状态。 systemctl status NetworkManager 图3 查看NetworkManager服务状态 执行以下命令,查看网络状态。 ip ad 图4 查看网络状态 若出现如图4所示结果,表示ECS实例的网络恢复正常。
  • 附录 常见操作系统的默认网络服务配置,建议不修改,直接采用默认值。 表1 常见操作系统的默认网络服务配置 操作系统 网络服务 是否内置DHCP功能 CentOS 6 Network 否,有单独的dhclient进程 CentOS 7 NetworkManager 否,有单独的dhclient进程 CentOS 8 NetworkManager 是 Ubuntu 16.04 NetworkManager 否,有单独的dhclient进程 Ubuntu 18.04 NetworkManager 否,有单独的dhclient进程 Ubuntu 20.04 NetworkManager 是 Ubuntu 22.04 NetworkManager 是
  • 问题描述 Linux操作系统的ECS实例内存充足,但是在执行命令或启动服务时,出现错误提示“Cannot allocate memory”。 命令及执行结果如下: root@localhost:~# free -m total used free shared buffers/cached availableMem: 3890 125 3179 2 504 3463Swap: 0 0 0root@localhost:~# uname -a-bash: fork: Cannot allocate memory
  • 问题描述 执行chmod -R 777 / 导致CentOS云服务器根目录权限设置成777,系统中的大部分服务以及命令无法使用。此时可通过系统自带的getfacl命令来拷贝和还原系统权限,本节操作介绍误操作导致根目录设置成777权限的补救措施。 对文件或目录设置777权限代表它将对所有用户都是可读、可写和可执行的,根目录设置777权限后存在安全风险。本节操作是临时的补救措施,恢复目录权限后,建议您备份数据,重装操作系统,避免777权限后续带来的安全风险问题。
  • 解决方案 远程登录ECS实例。 执行以下命令,查看ECS实例内核参数kernel.unknown_nmi_panic的值。 sysctl -n kernel.unknown_nmi_panic 如果内核参数的取值为1,说明是由于内核参数配置错误引起的ECS实例异常重启。 图1 排查结果 执行以下命令,查看是否存在内核参数kernel.unknown_nmi_panic相关配置。 vim /etc/sysctl.conf 在/etc/sysctl.conf文件中,排查是否存在kernel.unknown_nmi_panic的相关配置。 如果存在kernel.unknown_nmi_panic=1的配置,将该配置改为kernel.unknown_nmi_panic=0 如果不存在kernel.unknown_nmi_panic=1的配置,增加kernel.unknown_nmi_panic=0 图2 查看/etc/sysctl.conf文件 按“Esc”,输入:wq保存并退出。 执行以下命令,使配置生效。 sysctl –p 图3 配置生效 该修复方案热生效,无需重启ECS。
  • 防火墙添加例外端口 CentOS 6添加防火墙例外端口。 以添加23端口为例,执行以下命令,添加防火墙例外端口:tcp协议23端口。 iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT 保存新配置。 service iptables save (可选)设置防火墙开机自启动。 chkconfig iptables on 可执行以下命令关闭防火墙开机自启动。 chkconfig iptables off CentOS 6启动防火墙时可能会出现"iptables"no config file"错误 ,原因是未找到配置文件iptables。解决方法如下: 新建一条规则。 iptables -P OUTPUT ACCEPT 保存配置。 service iptables save 再次启动防火墙。 service iptables start 以CentOS 7添加防火墙例外端口及防火墙常用操作。 查看防火墙状态。 systemctl status firewalld 或 firewall-cmd --state 如果防火墙关闭可以执行以下命令开启。 systemctl start firewalld 如果开启命令执行后提示“Failed to start firewalld.service: Unit is masked.”请执行以下命令后再重新执行开启防火墙的命令。systemctl unmask firewalld 重新检查防火墙状态是否打开。 firewall-cmd --state 回显信息: [root@ecs-centos7 ~]# firewall-cmd --staterunning 以添加23端口为例,执行以下命令,添加防火墙例外端口:tcp协议23端口。 firewall-cmd --zone=public --add-port=23/tcp --permanent 回显信息如下说明设置成功: [root@ecs-centos7 ~]# firewall-cmd --zone=public --add-port=23/tcp --permanentsuccess 重新加载策略配置,使新配置生效。 firewall-cmd --reload 可以执行以下命令查看开启的所有端口。 firewall-cmd --list-ports [root@ecs-centos7 ~]# firewall-cmd --list-ports23/tcp (可选)设置防火墙开机自启动。 systemctl enable firewalld.service 查看防火墙设置开机自启是否成功。 systemctl is-enabled firewalld.service;echo $? 回显信息如下说明已设置成功: [root@ecs-centos7 ~]# systemctl is-enabled firewalld.service;echo $?enabled0 可执行以下命令关闭防火墙开机自启动。 systemctl disable firewalld.service
  • 问题描述 Linux操作系统的ECS实例发生异常重启事件,错误提示如下: Kernel panic - not syncing: NMI: Not continuing 同时,内核日志打印如下信息: [645683.754132] Uhhuh. NMI received for unknown reason 20 on CPU 1.[645683.754133] Do you have a strange power saving mode enabled?[645683.754133] Kernel panic - not syncing: NMI: Not continuing
  • 可能原因 如果Linux操作系统ECS实例的内核参数kernel.unknown_nmi_panic配置为1,则ECS会在系统收到NMI中断时主动通过panic系统重启。 通常情况下,内核参数kernel.unknown_nmi_panic配置为1的目的是为了通过触发NMI中断主动通过panic系统进行定位。由于个别型号的CPU会在正常业务流程中产生NMI中断,在这种情况下如果将内核参数kernel.unknown_nmi_panic配置为1,将会导致ECS产生非预期的异常重启事件。
  • 处理方法 建议不要安装来源不明的软件,使用正版软件,推荐使用Windows2012操作系统。 如果是通过外部镜像创建的服务器,请参考《镜像服务用户指南》中“优化Windows私有镜像”章节优化私有镜像。 排查是否是因为CPU占用过高导致的蓝屏,如果是请参考以下操作降低CPU使用率: 可以通过把一些暂时不使用的进程关掉后再尝试。 或者可以尝试重启云服务器。 如果重装系统,请先备份重要数据。 如果服务器有重要数据不能重装,可以通过挂载磁盘方式拷贝数据,需要先备份,再卸载磁盘,然后挂载盘拷贝数据。 如果需要分析蓝屏原因,需要确认是否有配置内存转储文件(crash dump)的收集,系统会自动生成蓝屏dump日志到指定的目录。 由于蓝屏日志的分析非常耗时,建议客户在遇到蓝屏的情况,重启云服务器后,参考如上的可能原因进行排查。一般第三方杀毒软件、系统故障和CPU占用过高是导致云服务器蓝屏最常见的原因。
  • 配置新用户并加入远程桌面用户组 如果配置“多个用户同时登录的多用户登录”,那么在创建完新用户后需要将其加入远程桌面用户组。本小节操作介绍创建新用户并添加用户到远程桌面用户组的操作步骤。 在运行中输入lusrmgr.msc,打开本地用户和组,进行新用户创建。 图15 lusrmgr.msc 单击“用户”,在空白处右键选择新用户。 图16 选择新用户 填写新用户信息,单击“创建”。 图17 填写新用户信息 单击“组”,双击打开Remote Desktop Users组,单击“添加”。 图18 Remote Desktop Users组 进入选择用户界面,单击“高级”。 图19 选择用户界面 在新的选择用户界面,单击“立即查找”,在下方搜索结果中选中需要远程登录的用户,并单击“确定”,完成添加,即可远程登录。 图20 选择用户 单击“确定”,添加用户到Remote Desktop Users组。 图21 确认成员信息
  • 操作须知 请确保云服务器带宽资源充足,避免由于多用户同时操作负载过高导致云服务器卡顿或登录异常。 所在安全组入方向已开放云服务器登录使用的端口,默认使用3389端口。 云服务器已经绑定弹性公网IP。 配置多用户登录后,不同的用户登录云服务器操作互相之间无影响。 Windows Server 2012版本操作系统安装桌面会话主机和远程桌面授权时操作步骤与Windows Server 2008版本不同,如果您使用的是Windows Server 2012操作系统请参考Windows云服务器如何配置多用户登录?(Windows 2012)。 完成本节操作的配置后可以实现多个用户同时远程登录或同一用户多个远程登录。但是远程桌面授权仅支持120天,过期后将因缺失远程桌面授权服务器许可证而导致多用户登录无法使用。如需激活远程桌面授权请参考申请多用户会话授权的license并激活云服务器。 远程桌面授权仅支持120天,过期后远程连接服务器时会提示“没有远程桌面授权服务器可以提供许可证”,请参考远程连接Windows云服务器云主机报错:没有远程桌面授权服务器可以提供许可证,删除远程桌面服务。 配置多用户登录后,可能会出现多用户登录Windows主机时无法打开浏览器的问题,解决方法请参考多用户登录Windows主机时无法打开浏览器。
  • 什么是心跳 RabbitMQ实例提供了心跳功能,以确保应用程序层及时发现中断的连接和完全无响应的对端。心跳还可以防止某些网络设备在一段时间内由于没有活动而中断TCP连接。开启心跳的方法为在连接上指定心跳超时时间。 心跳超时时间定义了对等TCP连接在多长时间后被服务端和客户端视为关闭。服务端和客户端会对配置的心跳超时时间进行协商,客户端必须配置该值来发送心跳。RabbitMQ官方团队维护的3个客户端(Java、.NET、Erlang语言)的心跳超时时间协商逻辑如下: 服务端和客户端设置的心跳超时时间都不为0时,两者间较小的值生效。 服务端和客户端任意一端设置的心跳超时时间为0,另一端不为0时,非0的值生效。 服务端和客户端的心跳超时时间都设置为0时,表示禁用心跳。 配置心跳超时时间后,RabbitMQ服务端和客户端都会向对方发送AMQP心跳帧作为心跳,发送的时间间隔为心跳超时时间的一半。客户端在两次错过心跳后,会被认为是不可达的,TCP连接将被关闭。当客户端检测到服务端由于心跳而无法访问时,需要重新连接。 一些客户端(如C语言客户端)没有发送心跳的逻辑,即使配置了心跳超时时间,开启了心跳,仍然无法发送心跳。此时需要额外启动一个线程,编写发送心跳的逻辑。
  • LVS的心跳超时时间 RabbitMQ集群实例使用LVS进行负载均衡,如图1所示,单节点实例不涉及LVS。 图1 集群实例的负载均衡 LVS对客户端连接设置了心跳超时时间,默认为90秒。如果客户端在90秒内没有向LVS发送心跳(AMQP心跳帧或消息收发),LVS会主动断开与客户端的连接,此时客户端需要重新连接。 如果存在消息收发时间间隔大于90秒的场景,请在客户端开启心跳并设置小于90秒的心跳超时时间。
  • 客户端如何配置心跳超时时间 在Java客户端配置心跳超时时间。 在创建连接前使用ConnectionFactory#setRequestedHeartbeat进行设置,示例如下: ConnectionFactory cf = new ConnectionFactory(); // 将心跳超时时间设置为60秒cf.setRequestedHeartbeat(60); 在.NET客户端配置心跳超时时间,示例如下。 var cf = new ConnectionFactory();// 将心跳超时设置为60秒cf.RequestedHeartbeat = TimeSpan.FromSeconds(60); 在Python pika客户端配置心跳超时时间,示例如下。 # 设置心跳时间为60秒params = pika.ConnectionParameters(host='host', heartbeat=60, credentials=pika.PlainCredentials('username', 'passwd'))connection = pika.BlockingConnection(params)while True: channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") # 生产者需要使用connection.sleep()才能触发心跳,使用time.sleep()不会触发心跳 connection.sleep(200)
  • 命令行模式连接实例 登录弹性云服务器。 安装Java JDK或JRE,并配置JAVA_HOME与PATH环境变量。在用户家目录下修改.bash_profile,添加如下行,路径以实际为准。 export JAVA_HOME=/opt/java/jdk1.8.0_151 export PATH=$JAVA_HOME/bin:$PATH 执行source .bash_profile命令使修改生效。 ECS虚拟机默认自带的JDK可能不符合要求,例如OpenJDK,需要配置为Oracle的JDK,可至Oracle官方下载页面下载Java Development Kit 1.8.111及以上版本。 下载RabbitMQ-Tutorial.zip示例工程代码。 $ wget https://dms-demo.obs.cn-north-1.myhuaweicloud.com/RabbitMQ-Tutorial.zip 解压RabbitMQ-Tutorial.zip压缩包。 $ unzip RabbitMQ-Tutorial.zip 进入RabbitMQ-Tutorial目录,该目录下包含预编译好的jar文件。 $ cd RabbitMQ-Tutorial 运行生产消息示例。 $ java -cp .:rabbitmq-tutorial.jar Send host port user password 其中,host表示RabbitMQ实例的连接地址,port为RabbitMQ实例的监听端口(默认为5672),user表示RabbitMQ用户名,password表示用户名对应的密码。 图1 运行生产消息示例 使用Ctrl+C命令退出。 运行消费消息示例。 $ java -cp .:rabbitmq-tutorial.jar Recv host port user password 其中,host表示RabbitMQ实例的连接地址,port为RabbitMQ实例的监听端口(默认为5672),user表示RabbitMQ用户名,password表示用户名对应的密码。 图2 运行消费消息示例 如需停止消费使用Ctrl+C命令退出。
  • 示例代码(Java) 连接实例并生产消息 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); 连接实例并消费消息 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer);
  • 命令行模式连接实例 登录弹性云服务器,如开启公网访问,则直接登录执行主机。 安装Java JDK或JRE,并配置JAVA_HOME与PATH环境变量,使用执行用户在用户家目录下修改.bash_profile,添加如下行,路径以实际为准。 export JAVA_HOME=/opt/java/jdk1.8.0_151 export PATH=$JAVA_HOME/bin:$PATH 执行source .bash_profile命令使修改生效。 ECS虚拟机默认自带的JDK可能不符合要求,例如OpenJDK,需要配置为Oracle的JDK,可至Oracle官方下载页面下载Java Development Kit 1.8.111及以上版本。 下载RabbitMQ-Tutorial-SSL.zip示例工程代码。 $ wget https://dms-demo.obs.cn-north-1.myhuaweicloud.com/RabbitMQ-Tutorial.zip 解压RabbitMQ-Tutorial-SSL.zip压缩包。 $ unzip RabbitMQ-Tutorial-SSL.zip 进入RabbitMQ-Tutorial-SSL目录,该目录下包含预编译好的jar文件。 $ cd RabbitMQ-Tutorial-SSL 运行生产消息示例。 $ java -cp .:rabbitmq-tutorial-sll.jar Send host port user password 其中,host表示RabbitMQ实例的连接地址,port为RabbitMQ实例的监听端口(默认为5671),user表示RabbitMQ用户名,password表示用户名对应的密码。 图1 生产消息示例 使用Ctrl+C命令退出。 运行消费消息示例。 $ java -cp .:rabbitmq-tutorial-sll.jar Recv host port user password 其中,host表示RabbitMQ实例的连接地址,port为RabbitMQ实例的监听端口(默认为5671),user表示RabbitMQ用户名,password表示用户名对应的密码。 图2 消费消息示例 如需停止消费使用Ctrl+C命令退出。
  • 示例代码(Java) 连接实例并生产消息 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); factory.useSslProtocol(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); 连接实例并消费消息 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); factory.useSslProtocol(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer);
  • 使用场景 默认情况下,RabbitMQ生产者生产的消息存储在内存中,当需要释放内存时,会将内存中的消息换页至磁盘中。换页操作会消耗较长的时间,且换页过程中队列无法处理消息。 如果生产速度过快(例如执行批处理任务),或者消费者由于各种原因(例如消费者下线、宕机)长时间内无法消费消息,导致消息大量堆积,使得内存使用率过高,换页频繁,可能会影响其他队列的消息收发。这种场景下,建议您启用惰性队列。 惰性队列(Lazy Queue)会尽可能的将消息存入磁盘中,在消费者消费到相应的消息时才会被加载到内存中,这样可以减少内存的消耗,但是会增加I/O的使用,影响单个队列的吞吐量。惰性队列的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储/消息堆积。 在以下情况下,推荐使用惰性队列: 队列可能会产生消息堆积 队列对性能(吞吐量)的要求不是非常高,例如TPS 1万以下的场景 希望队列有稳定的生产消费性能,不受内存影响而波动 处于以下情况时,无需使用惰性队列: RabbitMQ需要高性能的场景 队列总是很短(即队列中没有消息堆积) 设置了最大长度策略 更多关于惰性队列的说明,请参考Lazy Queues。
  • 操作步骤 登录RabbitMQ实例的Web UI。 在菜单栏,选择“Admin”。 图1 选择Admin菜单 (可选)选择右侧导航栏“Virtual Hosts”,然后输入“Name”,单击“Add virtual host”,创建Vhost。 如果您需要设置指定Vhost,请执行本步骤;如果不需要,请直接执行4。 图2 创建Vhost 选择右侧导航栏“Policies”,为Vhost设置规则。 如果为指定的Vhost设置,请在“Virtual Host”选择3创建的Vhost;如果没有,则默认为“/”。 图3 设置Vhost规则 参数解释如下: Name: policy的名称,用户自定义。 Pattern: queue的匹配模式(正则表达式)。 Definition: 镜像定义,包括三个部分ha-sync-mode、ha-mode、ha-params。 ha-sync-mode: 表示镜像队列中消息的同步方式,有效取值范围为:automatic和manually。 automatic:表示自动向master同步数据。 manually:表示手动向master同步数据。 ha-mode: 指明镜像队列的模式,有效取值范围为:all、exactly和nodes。 all:表示在集群所有的节点上进行镜像。 exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定。 nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定。 ha-params: ha-mode模式需要用到的参数。 Priority: 可选参数,policy的优先级。 单击“Add policy”。 规则添加成功后如下图所示。 图4 Vhost规则
共100000条