消息队列的高可用性对于现代分布式系统至关重要。以下是几种在Linux上实现高可用消息队列的方案:
# 安装Erlang和RabbitMQ
sudo apt-get install -y erlang rabbitmq-server # Debian/Ubuntu
sudo yum install -y erlang rabbitmq-server # CentOS/RHEL
# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management
.erlang.cookie
文件内容一致# 在节点2上执行
sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster rabbit@node1
sudo rabbitmqctl start_app
# 设置所有队列镜像
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
# 在每个节点上
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -xzf apache-zookeeper-3.6.3-bin.tar.gz
cd apache-zookeeper-3.6.3-bin/conf
cp zoo_sample.cfg zoo.cfg
配置zoo.cfg
:
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
wget https://downloads.apache.org/kafka/2.8.1/kafka_2.13-2.8.1.tgz
tar -xzf kafka_2.13-2.8.1.tgz
cd kafka_2.13-2.8.1/config
配置server.properties
:
broker.id=1 # 每个节点唯一ID
listeners=PLAINTEXT://node1:9092
zookeeper.connect=node1:2181,node2:2181,node3:2181
default.replication.factor=3
min.insync.replicas=2
sudo apt-get install redis-server # Debian/Ubuntu
sudo yum install redis # CentOS/RHEL
在主节点redis.conf
:
bind 0.0.0.0
protected-mode no
在从节点redis.conf
:
replicaof <master-ip> 6379
sentinel.conf
:
sentinel monitor mymaster <master-ip> 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sudo apt-get install keepalived # Debian/Ubuntu
sudo yum install keepalived # CentOS/RHEL
配置/etc/keepalived/keepalived.conf
:
vrrp_script chk_mq {
script "/usr/bin/rabbitmqctl status"
interval 2
weight 2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_mq
}
}
监控工具:
定期维护:
# RabbitMQ
rabbitmqctl cluster_status
rabbitmqctl list_queues name messages messages_ready messages_unacknowledged
# Kafka
kafka-topics.sh --describe --zookeeper localhost:2181
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
备份策略:
选择哪种方案取决于您的具体需求、消息量、延迟要求和现有基础设施。对于大多数企业应用,RabbitMQ集群或Kafka集群都能提供良好的高可用性保证。