# 在BM站點啟動多個LB Broker並搭配域名

## 目標

![](https://3639912965-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4wburGGKab7MC2oOVd%2F-MCuz-ouv20Eq9GTBjLR%2F-MCuzipnrQJs4sjm5FCX%2Fimage.png?alt=media\&token=950580eb-7283-42e3-a5df-2d2f215bbe32)

* 希望讓kafka cluster外的client能用一組固定的host去訪問kafka cluster, 相同host不同port
  * ex.&#x20;

```
kafka.bm.wise-paas.com.cn:19092,kafka.bm.wise-paas.com.cn:19093,kafka.bm.wise-paas.com.cn:19094
```

* 且不要像NodePort那樣, 還要在每個client主機上的hosts手動加上resolve record

## 前置作業 - 請BM站點維運同仁幫忙映射LB和域名

* 目前是要找陳磊
* 要跟他說, 請把這3個要暴露的url
  * kafka.bm.wise-paas.com.cn:19092
  * kafka.bm.wise-paas.com.cn:19093
  * kafka.bm.wise-paas.com.cn:19094
* 映射到下面這3個LoadBalancer service
  * roykfk-0-external
  * roykfk-1-external
  * roykfk-2-external
* 要跟他確認LB EXTERNAL-IP/Port的組合為何, 這樣才能在我們的deploy.sh陣列裡配置正確
  * ex. 是將172.21.92.212:19092映射到kafka.bm.wise-paas.com.cn:19092, 以此類推
  * 注意, 是映射LB svc的EXTERNAL-IP和Port, 不是LB svc的nodePort喔

![](https://3639912965-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4wburGGKab7MC2oOVd%2F-MCupEH7o7QIwN0gAa9e%2F-MCuwoB28TpCxG03fjc7%2Fimage.png?alt=media\&token=991c02ea-56d7-4ad5-be32-2e842b22c7c6)

## 設定方式 (deploy.sh)

* `export SERVICE_TYPE="LoadBalancer"`
  * bm站點是私有雲的關係, 要映射域名只能用LB, 其他站點不一定
* `export FIRST_LISTENER_PORT=19092`
  * 起始的port要跟暴露的第一個port相同, chart裡有邏輯會跑迴圈對每個broker設定
* `export LB_EXTERNAL_ADVERTISED_LISTENERS={"kafka.bm.wise-paas.com.cn:19092"\,"kafka.bm.wise-paas.com.cn:19093"\,"kafka.bm.wise-paas.com.cn:19094"}`
  * 這個值會在內部chart做陣列處理, 將每個url分別帶進broker裡
* `export EXTERNAL_LOAD_BALANCER_IP={"172.21.92.212"\,"172.21.92.213"\,"172.21.92.214"}`
  * 這個是LoadBalancer EXTERNAL-IP, 此順序必須跟平台那邊映射域名的ip:port組合相同
  * 平台的人幫忙做的映射可能是172.21.92.212:19092,172.21.92.213:19093,172.21.92.214:19094
    * 那此陣列第一個元素就不能是172.21.92.213, 否則會組成172.21.92.213:9092

## 驗證方式

### 用Conductor測基本連線

但Conductor就只能測到如此而已, 因為multibroker要收費, 沒辦法測收發訊息

![](https://3639912965-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4wburGGKab7MC2oOVd%2F-MCuz-ouv20Eq9GTBjLR%2F-MCv06kbdtTfA2tjZt93%2Fimage.png?alt=media\&token=6b06e267-2414-49e2-8154-95bff9cceeda)

### 自己寫Code測連線還送資料

```javascript
const { Kafka } = require('kafkajs');

const kafka = new Kafka({
  clientId: 'my-app',
  brokers: ['kafka.bm.wise-paas.com.cn:19092', 'kafka.bm.wise-paas.com.cn:19093', 'kafka.bm.wise-paas.com.cn:19094'],

  sasl: {
    mechanism: 'scram-sha-256', // scram-sha-256 or scram-sha-512
    username: 'admin',
    password: 'admin-secret'
  }
});

const producer = kafka.producer();

const run = async () => {
  let charLength = 524288;
  let fakemsg = genData(charLength);
  let topic = 'roy';

  await producer.connect();
  console.log('connected');

  let sendDataParams = [topic, fakemsg];

  setInterval(sendData, 300, ...sendDataParams);
};

function genData (charLenth) {
  let fakemsg = '';
  for (let i = 0; i < charLenth; i++) {
    fakemsg += 'a';
  }
  return fakemsg;
}

async function sendData (topic, data) {
  await producer.send({
    topic: topic,
    messages: [
      { value: data }
    ]
  });
  console.log('send done');
}

run().catch(console.error);

```

用這段code測負載平衡時, 請配合MP monitor觀察pod networking和disk用量是否有平均分配到多個broker

![](https://3639912965-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4wburGGKab7MC2oOVd%2F-MCuz-ouv20Eq9GTBjLR%2F-MCv2oNL_VHmBUid4goX%2Fimage.png?alt=media\&token=0a6d8c39-c47c-4375-9b14-d3b07ce832ed)

![](https://3639912965-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4wburGGKab7MC2oOVd%2F-MCuz-ouv20Eq9GTBjLR%2F-MCv2w246jpWWcKLOKF3%2Fimage.png?alt=media\&token=3bad2268-6c0f-4482-b7ef-5c264068091f)

## helm chart修改幅度

* 為了能實現相同host不同port的機制, 有去改原本chart裡的template和values
* 主要是想辦法讓每個broker的advertised.listener都吃到正確的EXTERNAL URL
  * 原本的chart提供的方法是不同host相同port, 跟我們需求不同 (跟cloud kafka一樣)
