mirror of
https://github.com/marcel-dempers/docker-development-youtube-series.git
synced 2025-06-06 17:01:30 +00:00
rabbitmq on k8s
This commit is contained in:
parent
ac1743d0d4
commit
e8c05bbe4e
@ -1,5 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
@ -13,11 +14,9 @@ var rabbit_user = os.Getenv("RABBIT_USERNAME")
|
|||||||
var rabbit_password = os.Getenv("RABBIT_PASSWORD")
|
var rabbit_password = os.Getenv("RABBIT_PASSWORD")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
consume()
|
consume()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func consume() {
|
func consume() {
|
||||||
|
|
||||||
conn, err := amqp.Dial("amqp://" + rabbit_user + ":" +rabbit_password + "@" + rabbit_host + ":" + rabbit_port +"/")
|
conn, err := amqp.Dial("amqp://" + rabbit_user + ":" +rabbit_password + "@" + rabbit_host + ":" + rabbit_port +"/")
|
||||||
@ -76,8 +75,4 @@ func consume() {
|
|||||||
|
|
||||||
fmt.Println("Running...")
|
fmt.Println("Running...")
|
||||||
<-forever
|
<-forever
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
62
messaging/rabbitmq/applications/publisher/deployment.yaml
Normal file
62
messaging/rabbitmq/applications/publisher/deployment.yaml
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq-publisher
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
RABBIT_USERNAME: Z3Vlc3Q=
|
||||||
|
RABBIT_PASSWORD: Z3Vlc3Q=
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq-publisher
|
||||||
|
labels:
|
||||||
|
app: rabbitmq-publisher
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: rabbitmq-publisher
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: rabbitmq-publisher
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: rabbitmq-publisher
|
||||||
|
image: aimvector/rabbitmq-publisher:v1.0.0
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
env:
|
||||||
|
- name: RABBIT_HOST
|
||||||
|
value: "rabbitmq-0.rabbitmq.rabbits.svc.cluster.local"
|
||||||
|
- name: RABBIT_PORT
|
||||||
|
value: "5672"
|
||||||
|
- name: RABBIT_USERNAME
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: rabbitmq-publisher
|
||||||
|
key: RABBIT_USERNAME
|
||||||
|
- name: RABBIT_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: rabbitmq-publisher
|
||||||
|
key: RABBIT_PASSWORD
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq-publisher
|
||||||
|
labels:
|
||||||
|
app: rabbitmq-publisher
|
||||||
|
spec:
|
||||||
|
type: LoadBalancer
|
||||||
|
selector:
|
||||||
|
app: rabbitmq-publisher
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
name: http
|
||||||
|
port: 80
|
||||||
|
targetPort: 80
|
@ -12,7 +12,6 @@ COPY publisher.go /src
|
|||||||
|
|
||||||
RUN go build publisher.go
|
RUN go build publisher.go
|
||||||
|
|
||||||
|
|
||||||
FROM alpine as runtime
|
FROM alpine as runtime
|
||||||
|
|
||||||
COPY --from=build /src/publisher /app/publisher
|
COPY --from=build /src/publisher /app/publisher
|
||||||
|
@ -15,6 +15,7 @@ var rabbit_user = os.Getenv("RABBIT_USERNAME")
|
|||||||
var rabbit_password = os.Getenv("RABBIT_PASSWORD")
|
var rabbit_password = os.Getenv("RABBIT_PASSWORD")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
router := httprouter.New()
|
router := httprouter.New()
|
||||||
|
|
||||||
router.POST("/publish/:message", func(w http.ResponseWriter, r *http.Request, p httprouter.Params){
|
router.POST("/publish/:message", func(w http.ResponseWriter, r *http.Request, p httprouter.Params){
|
||||||
@ -25,11 +26,11 @@ func main() {
|
|||||||
log.Fatal(http.ListenAndServe(":80", router))
|
log.Fatal(http.ListenAndServe(":80", router))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func submit(writer http.ResponseWriter, request *http.Request, p httprouter.Params) {
|
func submit(writer http.ResponseWriter, request *http.Request, p httprouter.Params) {
|
||||||
message := p.ByName("message")
|
message := p.ByName("message")
|
||||||
|
|
||||||
fmt.Println("Received message: " + message)
|
fmt.Println("Received message: " + message)
|
||||||
|
|
||||||
conn, err := amqp.Dial("amqp://" + rabbit_user + ":" +rabbit_password + "@" + rabbit_host + ":" + rabbit_port +"/")
|
conn, err := amqp.Dial("amqp://" + rabbit_user + ":" +rabbit_password + "@" + rabbit_host + ":" + rabbit_port +"/")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -37,16 +38,18 @@ func submit(writer http.ResponseWriter, request *http.Request, p httprouter.Para
|
|||||||
}
|
}
|
||||||
|
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
||||||
ch, err := conn.Channel()
|
ch, err := conn.Channel()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("%s: %s", "Failed to open a channel", err)
|
log.Fatalf("%s: %s", "Failed to open a channel", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer ch.Close()
|
defer ch.Close()
|
||||||
|
|
||||||
q, err := ch.QueueDeclare(
|
q, err := ch.QueueDeclare(
|
||||||
"publisher", // name
|
"publisher", // name
|
||||||
false, // durable
|
true, // durable
|
||||||
false, // delete when unused
|
false, // delete when unused
|
||||||
false, // exclusive
|
false, // exclusive
|
||||||
false, // no-wait
|
false, // no-wait
|
||||||
@ -72,5 +75,4 @@ func submit(writer http.ResponseWriter, request *http.Request, p httprouter.Para
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("publish success!")
|
fmt.Println("publish success!")
|
||||||
|
|
||||||
}
|
}
|
7
messaging/rabbitmq/config/rabbit-1/rabbitmq.conf
Normal file
7
messaging/rabbitmq/config/rabbit-1/rabbitmq.conf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
loopback_users.guest = false
|
||||||
|
listeners.tcp.default = 5672
|
||||||
|
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
|
||||||
|
cluster_formation.classic_config.nodes.1 = rabbit@rabbit-1
|
||||||
|
cluster_formation.classic_config.nodes.2 = rabbit@rabbit-2
|
||||||
|
cluster_formation.classic_config.nodes.3 = rabbit@rabbit-3
|
7
messaging/rabbitmq/config/rabbit-2/rabbitmq.conf
Normal file
7
messaging/rabbitmq/config/rabbit-2/rabbitmq.conf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
loopback_users.guest = false
|
||||||
|
listeners.tcp.default = 5672
|
||||||
|
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
|
||||||
|
cluster_formation.classic_config.nodes.1 = rabbit@rabbit-1
|
||||||
|
cluster_formation.classic_config.nodes.2 = rabbit@rabbit-2
|
||||||
|
cluster_formation.classic_config.nodes.3 = rabbit@rabbit-3
|
7
messaging/rabbitmq/config/rabbit-3/rabbitmq.conf
Normal file
7
messaging/rabbitmq/config/rabbit-3/rabbitmq.conf
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
loopback_users.guest = false
|
||||||
|
listeners.tcp.default = 5672
|
||||||
|
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
|
||||||
|
cluster_formation.classic_config.nodes.1 = rabbit@rabbit-1
|
||||||
|
cluster_formation.classic_config.nodes.2 = rabbit@rabbit-2
|
||||||
|
cluster_formation.classic_config.nodes.3 = rabbit@rabbit-3
|
19
messaging/rabbitmq/kubernetes/rabbit-configmap.yaml
Normal file
19
messaging/rabbitmq/kubernetes/rabbit-configmap.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq-config
|
||||||
|
data:
|
||||||
|
enabled_plugins: |
|
||||||
|
[rabbitmq_federation,rabbitmq_management,rabbitmq_peer_discovery_k8s].
|
||||||
|
rabbitmq.conf: |
|
||||||
|
loopback_users.guest = false
|
||||||
|
listeners.tcp.default = 5672
|
||||||
|
|
||||||
|
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
|
||||||
|
cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
|
||||||
|
cluster_formation.k8s.address_type = hostname
|
||||||
|
cluster_formation.node_cleanup.only_log_warning = true
|
||||||
|
##cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
|
||||||
|
##cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-0.rabbitmq.rabbits.svc.cluster.local
|
||||||
|
##cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-1.rabbitmq.rabbits.svc.cluster.local
|
||||||
|
##cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-2.rabbitmq.rabbits.svc.cluster.local
|
32
messaging/rabbitmq/kubernetes/rabbit-rbac.yaml
Normal file
32
messaging/rabbitmq/kubernetes/rabbit-rbac.yaml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq
|
||||||
|
---
|
||||||
|
kind: Role
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- endpoints
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- watch
|
||||||
|
---
|
||||||
|
kind: RoleBinding
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq
|
||||||
|
namespace: rabbits
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: rabbitmq
|
||||||
|
namespace: rabbits
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: rabbitmq
|
8
messaging/rabbitmq/kubernetes/rabbit-secret.yaml
Normal file
8
messaging/rabbitmq/kubernetes/rabbit-secret.yaml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: rabbit-secret
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
# echo -n "cookie-value" | base64
|
||||||
|
RABBITMQ_ERLANG_COOKIE: V0lXVkhDRFRDSVVBV0FOTE1RQVc=
|
101
messaging/rabbitmq/kubernetes/rabbit-statefulset.yaml
Normal file
101
messaging/rabbitmq/kubernetes/rabbit-statefulset.yaml
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq
|
||||||
|
spec:
|
||||||
|
serviceName: rabbitmq
|
||||||
|
replicas: 4
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: rabbitmq
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: rabbitmq
|
||||||
|
spec:
|
||||||
|
serviceAccountName: rabbitmq
|
||||||
|
initContainers:
|
||||||
|
- name: config
|
||||||
|
image: busybox
|
||||||
|
command: ['/bin/sh', '-c', 'cp /tmp/config/rabbitmq.conf /config/rabbitmq.conf && ls -l /config/ && cp /tmp/config/enabled_plugins /etc/rabbitmq/enabled_plugins']
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: /tmp/config/
|
||||||
|
readOnly: false
|
||||||
|
- name: config-file
|
||||||
|
mountPath: /config/
|
||||||
|
- name: plugins-file
|
||||||
|
mountPath: /etc/rabbitmq/
|
||||||
|
containers:
|
||||||
|
- name: rabbitmq
|
||||||
|
image: rabbitmq:3.8-management
|
||||||
|
ports:
|
||||||
|
- containerPort: 4369
|
||||||
|
name: discovery
|
||||||
|
- containerPort: 5672
|
||||||
|
name: amqp
|
||||||
|
env:
|
||||||
|
- name: RABBIT_POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
apiVersion: v1
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: RABBIT_POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
- name: RABBITMQ_NODENAME
|
||||||
|
value: rabbit@$(RABBIT_POD_NAME).rabbitmq.$(RABBIT_POD_NAMESPACE).svc.cluster.local
|
||||||
|
- name: RABBITMQ_USE_LONGNAME
|
||||||
|
value: "true"
|
||||||
|
- name: RABBITMQ_CONFIG_FILE
|
||||||
|
value: "/config/rabbitmq"
|
||||||
|
- name: RABBITMQ_ERLANG_COOKIE
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: rabbit-secret
|
||||||
|
key: RABBITMQ_ERLANG_COOKIE
|
||||||
|
- name: K8S_HOSTNAME_SUFFIX
|
||||||
|
value: .rabbitmq.$(RABBIT_POD_NAMESPACE).svc.cluster.local
|
||||||
|
volumeMounts:
|
||||||
|
- name: data
|
||||||
|
mountPath: /var/lib/rabbitmq
|
||||||
|
readOnly: false
|
||||||
|
- name: config-file
|
||||||
|
mountPath: /config/
|
||||||
|
- name: plugins-file
|
||||||
|
mountPath: /etc/rabbitmq/
|
||||||
|
volumes:
|
||||||
|
- name: config-file
|
||||||
|
emptyDir: {}
|
||||||
|
- name: plugins-file
|
||||||
|
emptyDir: {}
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: rabbitmq-config
|
||||||
|
defaultMode: 0755
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
spec:
|
||||||
|
accessModes: [ "ReadWriteOnce" ]
|
||||||
|
storageClassName: "standard"
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 50Mi
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: rabbitmq
|
||||||
|
spec:
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- port: 4369
|
||||||
|
targetPort: 4369
|
||||||
|
name: discovery
|
||||||
|
- port: 5672
|
||||||
|
targetPort: 5672
|
||||||
|
name: amqp
|
||||||
|
selector:
|
||||||
|
app: rabbitmq
|
60
messaging/rabbitmq/kubernetes/readme.md
Normal file
60
messaging/rabbitmq/kubernetes/readme.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# RabbitMQ on Kubernetes
|
||||||
|
|
||||||
|
Create a cluster with [kind](https://kind.sigs.k8s.io/docs/user/quick-start/)
|
||||||
|
|
||||||
|
```
|
||||||
|
kind create cluster --name rabbit --image kindest/node:v1.18.4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Namespace
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl create ns rabbits
|
||||||
|
```
|
||||||
|
|
||||||
|
## Storage Class
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get storageclass
|
||||||
|
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
|
||||||
|
standard (default) rancher.io/local-path Delete WaitForFirstConsumer false 84s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl apply -n rabbits -f .\kubernetes\rabbit-rbac.yaml
|
||||||
|
kubectl apply -n rabbits -f .\kubernetes\rabbit-configmap.yaml
|
||||||
|
kubectl apply -n rabbits -f .\kubernetes\rabbit-secret.yaml
|
||||||
|
kubectl apply -n rabbits -f .\kubernetes\rabbit-statefulset.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Access the UI
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl -n rabbits port-forward rabbitmq-0 8080:15672
|
||||||
|
```
|
||||||
|
Go to htttp://localhost:8080 <br/>
|
||||||
|
Username: `guest` <br/>
|
||||||
|
Password: `guest` <br/>
|
||||||
|
|
||||||
|
# Message Publisher
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
cd messaging\rabbitmq\applications\publisher
|
||||||
|
docker build . -t aimvector/rabbitmq-publisher:v1.0.0
|
||||||
|
|
||||||
|
kubectl apply -f rabbits deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
# Automatic Synchronization
|
||||||
|
|
||||||
|
https://www.rabbitmq.com/ha.html#unsynchronised-mirrors
|
||||||
|
|
||||||
|
```
|
||||||
|
rabbitmqctl set_policy ha-fed \
|
||||||
|
".*" '{"federation-upstream-set":"all", "ha-sync-mode":"automatic", "ha-mode":"nodes", "ha-params":["rabbit@rabbitmq-0.rabbitmq.rabbits.svc.cluster.local","rabbit@rabbitmq-1.rabbitmq.rabbits.svc.cluster.local","rabbit@rabbitmq-2.rabbitmq.rabbits.svc.cluster.local"]}' \
|
||||||
|
--priority 1 \
|
||||||
|
--apply-to queues
|
||||||
|
```
|
@ -2,44 +2,17 @@
|
|||||||
|
|
||||||
Docker image over [here](https://hub.docker.com/_/rabbitmq)
|
Docker image over [here](https://hub.docker.com/_/rabbitmq)
|
||||||
```
|
```
|
||||||
|
# run a standalone instance
|
||||||
docker network create rabbits
|
docker network create rabbits
|
||||||
docker run -d --rm --net rabbits -e RABBITMQ_ERLANG_COOKIE=DSHEVCXBBETJJVJWTOWT --hostname rabbit-1 --name rabbit-1 rabbitmq:3.8
|
docker run -d --rm --net rabbits --hostname rabbit-1 --name rabbit-1 rabbitmq:3.8
|
||||||
docker run -d --rm --net rabbits -e RABBITMQ_ERLANG_COOKIE=DSHEVCXBBETJJVJWTOWT --hostname rabbit-2 --name rabbit-2 rabbitmq:3.8
|
|
||||||
docker run -d --rm --net rabbits -e RABBITMQ_ERLANG_COOKIE=DSHEVCXBBETJJVJWTOWT --hostname rabbit-3 --name rabbit-3 rabbitmq:3.8
|
|
||||||
|
|
||||||
# how to grab existing erlang cookie
|
# how to grab existing erlang cookie
|
||||||
docker exec -it rabbit-1 cat /var/lib/rabbitmq/.erlang.cookie
|
docker exec -it rabbit-1 cat /var/lib/rabbitmq/.erlang.cookie
|
||||||
DSHEVCXBBETJJVJWTOWT
|
|
||||||
|
|
||||||
|
# clean up
|
||||||
docker rm -f rabbit-1
|
docker rm -f rabbit-1
|
||||||
docker rm -f rabbit-2
|
|
||||||
docker rm -f rabbit-3
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
|
||||||
docker exec -it rabbit-1 rabbitmqctl cluster_status
|
|
||||||
|
|
||||||
#join node 2
|
|
||||||
|
|
||||||
docker exec -it rabbit-2 rabbitmqctl stop_app
|
|
||||||
docker exec -it rabbit-2 rabbitmqctl reset
|
|
||||||
docker exec -it rabbit-2 rabbitmqctl join_cluster rabbit@rabbit-1
|
|
||||||
docker exec -it rabbit-2 rabbitmqctl start_app
|
|
||||||
docker exec -it rabbit-2 rabbitmqctl cluster_status
|
|
||||||
|
|
||||||
|
|
||||||
#join node 3
|
|
||||||
docker exec -it rabbit-3 rabbitmqctl stop_app
|
|
||||||
docker exec -it rabbit-3 rabbitmqctl reset
|
|
||||||
docker exec -it rabbit-3 rabbitmqctl join_cluster rabbit@rabbit-1
|
|
||||||
docker exec -it rabbit-3 rabbitmqctl start_app
|
|
||||||
docker exec -it rabbit-3 rabbitmqctl cluster_status
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Management
|
# Management
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -63,11 +36,130 @@ docker exec -it rabbit-3 rabbitmq-plugins enable rabbitmq_management
|
|||||||
# Message Publisher
|
# Message Publisher
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run -it --rm --net rabbits -e RABBIT_HOST=rabbit-1 -e RABBIT_PORT=5672 -e RABBIT_USERNAME=guest -e RABBIT_PASSWORD=guest -p 80:80 publisher
|
|
||||||
|
cd messaging\rabbitmq\applications\publisher
|
||||||
|
docker build . -t aimvector/rabbitmq-publisher:v1.0.0
|
||||||
|
|
||||||
|
docker run -it --rm --net rabbits -e RABBIT_HOST=rabbit-1 -e RABBIT_PORT=5672 -e RABBIT_USERNAME=guest -e RABBIT_PASSWORD=guest -p 80:80 aimvector/rabbitmq-publisher:v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
# Message Consumer
|
# Message Consumer
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run -it --rm --net rabbits -e RABBIT_HOST=rabbit-1 -e RABBIT_PORT=5672 -e RABBIT_USERNAME=guest -e RABBIT_PASSWORD=guest consumer
|
|
||||||
|
docker build . -t aimvector/rabbitmq-consumer:v1.0.0
|
||||||
|
docker run -it --rm --net rabbits -e RABBIT_HOST=rabbit-1 -e RABBIT_PORT=5672 -e RABBIT_USERNAME=guest -e RABBIT_PASSWORD=guest aimvector/rabbitmq-consumer:v1.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Clustering
|
||||||
|
|
||||||
|
https://www.rabbitmq.com/cluster-formation.html
|
||||||
|
|
||||||
|
## Note
|
||||||
|
|
||||||
|
Remember we will need the Erlang Cookie to allow instances to authenticate with each other.
|
||||||
|
|
||||||
|
# Manual Clustering
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
docker exec -it rabbit-1 rabbitmqctl cluster_status
|
||||||
|
|
||||||
|
#join node 2
|
||||||
|
|
||||||
|
docker exec -it rabbit-2 rabbitmqctl stop_app
|
||||||
|
docker exec -it rabbit-2 rabbitmqctl reset
|
||||||
|
docker exec -it rabbit-2 rabbitmqctl join_cluster rabbit@rabbit-1
|
||||||
|
docker exec -it rabbit-2 rabbitmqctl start_app
|
||||||
|
docker exec -it rabbit-2 rabbitmqctl cluster_status
|
||||||
|
|
||||||
|
#join node 3
|
||||||
|
docker exec -it rabbit-3 rabbitmqctl stop_app
|
||||||
|
docker exec -it rabbit-3 rabbitmqctl reset
|
||||||
|
docker exec -it rabbit-3 rabbitmqctl join_cluster rabbit@rabbit-1
|
||||||
|
docker exec -it rabbit-3 rabbitmqctl start_app
|
||||||
|
docker exec -it rabbit-3 rabbitmqctl cluster_status
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Automated Clustering
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run -d --rm --net rabbits `
|
||||||
|
-v ${PWD}/config/rabbit-1/:/config/ `
|
||||||
|
-e RABBITMQ_CONFIG_FILE=/config/rabbitmq `
|
||||||
|
-e RABBITMQ_ERLANG_COOKIE=WIWVHCDTCIUAWANLMQAW `
|
||||||
|
--hostname rabbit-1 `
|
||||||
|
--name rabbit-1 `
|
||||||
|
-p 8081:15672 `
|
||||||
|
rabbitmq:3.8-management
|
||||||
|
|
||||||
|
docker run -d --rm --net rabbits `
|
||||||
|
-v ${PWD}/config/rabbit-2/:/config/ `
|
||||||
|
-e RABBITMQ_CONFIG_FILE=/config/rabbitmq `
|
||||||
|
-e RABBITMQ_ERLANG_COOKIE=WIWVHCDTCIUAWANLMQAW `
|
||||||
|
--hostname rabbit-2 `
|
||||||
|
--name rabbit-2 `
|
||||||
|
-p 8082:15672 `
|
||||||
|
rabbitmq:3.8-management
|
||||||
|
|
||||||
|
docker run -d --rm --net rabbits `
|
||||||
|
-v ${PWD}/config/rabbit-3/:/config/ `
|
||||||
|
-e RABBITMQ_CONFIG_FILE=/config/rabbitmq `
|
||||||
|
-e RABBITMQ_ERLANG_COOKIE=WIWVHCDTCIUAWANLMQAW `
|
||||||
|
--hostname rabbit-3 `
|
||||||
|
--name rabbit-3 `
|
||||||
|
-p 8083:15672 `
|
||||||
|
rabbitmq:3.8-management
|
||||||
|
|
||||||
|
#NODE 1 : MANAGEMENT http://localhost:8081
|
||||||
|
#NODE 2 : MANAGEMENT http://localhost:8082
|
||||||
|
#NODE 3 : MANAGEMENT http://localhost:8083
|
||||||
|
|
||||||
|
# enable federation plugin
|
||||||
|
docker exec -it rabbit-1 rabbitmq-plugins enable rabbitmq_federation
|
||||||
|
docker exec -it rabbit-2 rabbitmq-plugins enable rabbitmq_federation
|
||||||
|
docker exec -it rabbit-3 rabbitmq-plugins enable rabbitmq_federation
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Basic Queue Mirroring
|
||||||
|
|
||||||
|
```
|
||||||
|
docker exec -it rabbit-1 bash
|
||||||
|
|
||||||
|
# https://www.rabbitmq.com/ha.html#mirroring-arguments
|
||||||
|
|
||||||
|
rabbitmqctl set_policy ha-fed \
|
||||||
|
".*" '{"federation-upstream-set":"all", "ha-mode":"nodes", "ha-params":["rabbit@rabbit-1","rabbit@rabbit-2","rabbit@rabbit-3"]}' \
|
||||||
|
--priority 1 \
|
||||||
|
--apply-to queues
|
||||||
|
```
|
||||||
|
|
||||||
|
# Automatic Synchronization
|
||||||
|
|
||||||
|
https://www.rabbitmq.com/ha.html#unsynchronised-mirrors
|
||||||
|
|
||||||
|
```
|
||||||
|
rabbitmqctl set_policy ha-fed \
|
||||||
|
".*" '{"federation-upstream-set":"all", "ha-sync-mode":"automatic", "ha-mode":"nodes", "ha-params":["rabbit@rabbit-1","rabbit@rabbit-2","rabbit@rabbit-3"]}' \
|
||||||
|
--priority 1 \
|
||||||
|
--apply-to queues
|
||||||
|
```
|
||||||
|
|
||||||
|
# Further Reading
|
||||||
|
|
||||||
|
https://www.rabbitmq.com/ha.html
|
||||||
|
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
|
||||||
|
```
|
||||||
|
docker rm -f rabbit-1
|
||||||
|
docker rm -f rabbit-2
|
||||||
|
docker rm -f rabbit-3
|
||||||
|
```
|
||||||
|
|
||||||
|
# RabbitMQ on Kubernetes
|
||||||
|
|
||||||
|
Checkout the Kubernetes walkthrough [here](./kubernetes/readme.md)
|
Loading…
x
Reference in New Issue
Block a user