在Linux环境下设置高可用的消息中间件有多种选择,下面我将介绍几种主流方案,包括RabbitMQ、Apache Kafka和Apache Pulsar的高可用配置方法。
# Ubuntu/Debian
sudo apt-get install rabbitmq-server
# CentOS/RHEL
sudo yum install rabbitmq-server
# 在所有节点上停止服务
sudo systemctl stop rabbitmq-server
# 复制主节点.erlang.cookie到其他节点
sudo scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
sudo scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
# 启动服务
sudo systemctl start rabbitmq-server
# 在从节点上加入集群
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app
# 设置策略使所有队列镜像
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
使用HAProxy或Nginx作为负载均衡器:
frontend rabbitmq
bind *:5672
default_backend rabbitmq_nodes
backend rabbitmq_nodes
balance roundrobin
server node1 192.168.1.101:5672 check
server node2 192.168.1.102:5672 check
server node3 192.168.1.103:5672 check
# 在所有节点上
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
tar -xzf apache-zookeeper-3.7.0-bin.tar.gz
cd apache-zookeeper-3.7.0-bin/conf
cp zoo_sample.cfg zoo.cfg
编辑zoo.cfg:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
wget https://downloads.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
tar -xzf kafka_2.13-3.1.0.tgz
cd kafka_2.13-3.1.0/config
编辑server.properties:
broker.id=1 # 每个节点唯一
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://node1:9092
zookeeper.connect=node1:2181,node2:2181,node3:2181
default.replication.factor=3
min.insync.replicas=2
# 启动Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
# 启动Kafka
bin/kafka-server-start.sh config/server.properties
wget https://archive.apache.org/dist/pulsar/pulsar-2.9.1/apache-pulsar-2.9.1-bin.tar.gz
tar -xzf apache-pulsar-2.9.1-bin.tar.gz
cd apache-pulsar-2.9.1
编辑conf/zookeeper.conf:
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
编辑conf/bookkeeper.conf:
zkServers=node1:2181,node2:2181,node3:2181
编辑conf/broker.conf:
zookeeperServers=node1:2181,node2:2181,node3:2181
configurationStoreServers=node1:2181,node2:2181,node3:2181
clusterName=pulsar-cluster
# 启动Zookeeper
bin/pulsar-daemon start zookeeper
# 初始化集群元数据
bin/pulsar initialize-cluster-metadata \
--cluster pulsar-cluster \
--zookeeper node1:2181 \
--configuration-store node1:2181 \
--web-service-url http://node1:8080,node2:8080,node3:8080 \
--broker-service-url pulsar://node1:6650,node2:6650,node3:6650
# 启动BookKeeper
bin/pulsar-daemon start bookie
# 启动Broker
bin/pulsar-daemon start broker
定期进行故障转移测试: 1. 随机停止节点服务,验证自动恢复 2. 模拟网络分区,验证脑裂保护机制 3. 测试磁盘故障场景下的数据完整性
以上方案可根据您的具体需求、消息量级和团队熟悉程度进行选择。RabbitMQ适合传统企业应用,Kafka适合高吞吐场景,Pulsar则提供了更现代的云原生特性。