
# 配置通过ELB访问ClickHouse
#### 操作场景
当前ClickHouse不管是多分片还是多副本都是以集群方式部署，如果对外直接提供服务，将暴露多个节点服务，没有统一的访问入口。ClickHouse官方虽然提供了BalancedClickhouseDataSource的驱动方案，可以支持多节点的随机分配，提供了一定程度的负载均衡能力，但其故障检测能力不足，而且在扩缩容时，需要客户端感知集群节点变化，易用性不佳。
针对上述风险，MRS服务提供了基于弹性负载均衡ELB的部署架构[图1]。基于ELB的部署架构，可以将用户访问流量自动均匀分发到多台后端节点，扩展系统对外的服务能力，实现更高水平的应用容错。当其中一台ClickHouse后端节点发生故障时，ELB通过故障转移方式正常对外提供服务。
图1通过弹性负载均衡访问ClickHouse   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724747305.png "点击放大")
ELB的部署架构对比BalancedClickhouseDataSource的优势可以参考[表1]说明。
 表1ELB和BalancedClickhouseDataSource两种负载均衡方案对比 
| 负载均衡方案                       | 方案对比                                                                                                                                                                                                                                                                         |
|:---|:---|
| ELB                          | - 支持多种请求策略  - 故障自动检测转移  - 后端ClickHouse扩容新增节点只需要修改ELB上的配置即可   |
| BalancedClickhouseDataSource | - 内部随机方式分发请求，可能会导致负载不均匀  - 故障检测能力不足                                                                             |
   
当前通过ELB访问ClickHouse支持的协议和端口请参考[表2]，请根据实际使用场景选择配置。
 表2通过ELB访问ClickHouse支持的协议和端口列表 
| 协议    | 端口   | 场景描述                                                                          |
|:---|:---|:---|
| TCP   | 9000 | 通过客户端请求到ELB连接ClickHouse场景时配置。例如使用**clickhouse client**命令连接，host参数为ELB的私有IP地址。 |
| HTTP  | 8123 | 发送http请求到ELB连接ClickHouse场景时配置。                                                |
| HTTPS | 8443 | 发送https请求到ELB连接ClickHouse场景时配置。                                               |
   
本章节演示如何实现客户端通过ELB访问ClickHouse。具体操作分为以下几个步骤：
- **步骤一：[购买ELB并获取其私有IP地址]**
- **步骤二：** [添加ELB监听器]
- **步骤三：[添加ClickHouse后端服务器]**
- **步骤四：[通过ELB访问ClickHouse]**
 
#### 前提条件
- MRS集群已创建，ClickHouse实例状态正常。
- 已安装MRS客户端，例如安装目录为"/opt/client"。以下操作的客户端目录只是举例，请根据实际安装目录修改。
 
 #### 购买ELB并获取其私有IP地址
详细操作步骤请参考[创建共享型负载均衡器](https://support.huaweicloud.com/usermanual-elb/zh-cn_topic_0015479967.html)。
1. 登录"弹性负载均衡器"控制台，在"负载均衡器"界面单击"购买弹性负载均衡"。
2. 在"购买弹性负载均衡"界面，"实例规格类型"选择"共享型"，"所属VPC"和"子网"参数需要和MRS集群保持一致，其他参数保持默认即可。
3. 单击"立即购买"，确认配置信息，并单击"提交"。
4. 创建完成后，在"负载均衡器"界面，选择对应的区域即可看到新建的负载均衡器。查看并获取该负载均衡器的私有IP地址。
   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676907826.png "点击放大")
   
   
 
 #### 添加ELB监听器
详细操作步骤请参考[添加监听器](https://support.huaweicloud.com/usermanual-elb/elb_ug_jt_0006.html)。
1. 在"负载均衡器"界面，单击需要添加监听器的负载均衡名称。
2. 选择"监听器 \> 添加监听器"。 
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724867169.png "点击放大")
   
   
3. 在"添加监听器"界面，根据界面提示完成具体配置。 
   1. 配置监听器。
      "前端协议/端口"选择"TCP"、端口填写"9000"，其他参数保持默认。配置完成单击"下一步"。
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      如果是通过HTTP请求访问，则"前端协议/端口"选择"HTTP"、端口填写"8123"。
      
   
   2. 配置后端服务器组。 "分配策略类型"参数选择"加权轮询算法"。单击"完成"，添加成功后，单击"确定"完成配置。
      
   
   
   
   
 
 #### 添加ClickHouse后端服务器
详细操作步骤请参考[添加后端服务器](https://support.huaweicloud.com/usermanual-elb/elb_ug_hd3_0003_01.html)。
1. 登录MRS控制台，单击要对接的MRS集群名称。
2. 在MRS集群页面，单击"节点管理"，在ClickHouse节点组名称下，获取ClickHouse实例节点名称和IP地址。
   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724747301.png "点击放大")
   
   
3. 登录"弹性负载均衡器"控制台，单击已创建的负载均衡器名称。
4. 单击"监听器"，在"监听器"界面选择"后端服务器组"页签，单击"添加"。 
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676907814.png "点击放大")
   
   
5. 在"添加后端服务器"界面，根据[2]中获取到的ClickHouse实例节点名称和IP地址勾选后端服务器，单击"下一步"。
6. "批量添加端口"参数填写为"9000"，单击"确定"。确认后端口配置无误后，单击"完成"。 
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   如果是通过HTTP请求访问，端口填写"8123"。
   
   
7. 后端服务器配置安全组。 
   配置完成后，在"监听器"界面的"后端服务器组"页签下，对应的后端服务器显示"健康检查结果"状态为"异常"。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676748122.png "点击放大")
   解决如上问题需要在ClickHouse后端服务器对应的安全组下放通"100.125.0.0/16"网段，具体操作如下：
   1. 在"监听器"界面的"后端服务器"页签下，单击任意一个服务器名称。
   
   2. 单击"安全组 \> 配置规则"，选择"入方向规则 \> 添加规则"。
   
   3. 在"添加入方向规则"界面添加协议为TCP，端口为9000，IP地址配置"100.125.0.0/16"。单击"确定"完成配置。
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      如果是通过HTTP请求访问，端口填写"8123"。
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676748118.png "点击放大")
      
   
   4. 重新进入到创建的负载均衡器，刷新浏览器页面，单击"监听器"界面中的"后端服务器组"页签，对应的后端服务器"健康检查结果"状态显示为"正常"。
   
   
   
   
 
 #### 通过ELB访问ClickHouse
1. 登录Manager页面选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置"，修改参数"SSL_NONESSL_BOTH_ENABLE"值为"true"。
2. 参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)使用客户端登录ClickHouse服务实例节点。**注意** ：客户端命令**clickhouse client** 中的host参数填写[4]中获取的ELB私有IP地址。
3. 在客户端界面查看通过ELB可以正常连接到ClickHouse实例节点。 
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   手工通过客户端命令连接时，因为并发请求数较少，ELB可能始终将请求发送给一个后端ClickHouse节点，属于正常现象。
   如果并发请求数多时，ELB会把请求轮询分配给多个后端ClickHouse节点。
   
   
 
