写点什么

通过 NGINX 搭建 TiDB 负载均衡

  • 2023-10-27
    北京
  • 本文字数:2788 字

    阅读完需:约 9 分钟

作者: 像风一样的男子原文来源:https://tidb.net/blog/f60f0e67

前言

  目前TIDB的负载均衡官网推荐使用HAProxy,社区主流也是HAProxy,本文尝试使用nginx四层代理tidb提供 TCP 协议下的负载均衡能力,因为nginx安装编译需要自己添加模块,很多小伙伴觉得麻烦,本文使用基于 Nginx的openresty来安装,可以实现一键安装并打包各个模块,快速方便。
复制代码

环境说明

TiDB 版本:V5.4.3


Openresty 版本:1.21.4.2


OS 环境:Centos 7.9

安装 openresty

yum 安装

# add the yum repo:


wget https://openresty.org/package/centos/openresty.repo


sudo mv openresty.repo /etc/yum.repos.d/openresty.repo


# update the yum index:


sudo yum check-update


sudo yum install openresty


启动 nginx 服务


/usr/local/openresty/nginx/sbin/nginx


查看 nginx 版本和默认安装的模块


[root@binlog-drainer conf]# /usr/local/openresty/nginx/sbin/nginx -V


nginx version: openresty/1.21.4.2


built by gcc 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)


built with OpenSSL 1.1.1s 1 Nov 2022


TLS SNI support enabled


configure arguments: --prefix=/usr/local/openresty/nginx --with-cc-opt='-O2 -DNGX_LUA_ABORT_AT_PANIC -I/usr/local/openresty/zlib/include -I/usr/local/openresty/pcre/include -I/usr/local/openresty/openssl111/include' --add-module=../ngx_devel_kit-0.3.2 --add-module=../echo-nginx-module-0.63 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.33 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.09 --add-module=../srcache-nginx-module-0.33 --add-module=../ngx_lua-0.10.25 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.34 --add-module=../array-var-nginx-module-0.06 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.9 --add-module=../ngx_stream_lua-0.0.13 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -L/usr/local/openresty/zlib/lib -L/usr/local/openresty/pcre/lib -L/usr/local/openresty/openssl111/lib -Wl,-rpath,/usr/local/openresty/zlib/lib:/usr/local/openresty/pcre/lib:/usr/local/openresty/openssl111/lib' --with-cc='ccache gcc -fdiagnostics-color=always' --with-pcre-jit --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_v2_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_auth_request_module --with-http_secure_link_module --with-http_random_index_module --with-http_gzip_static_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-threads --with-compat --with-stream --with-http_ssl_module



可以看到四层代理需要用的 stream 模块也默认添加了。

添加代理配置

修改配置文件 /usr/local/openresty/nginx/conf/nginx.conf



增加配置:


stream {


upstream stream_tidb {


server 10.20.10.104:4000 max_fails=3 fail_timeout=30s;


server 10.20.10.111:4000 max_fails=3 fail_timeout=30s;


server 10.20.10.120:4000 max_fails=3 fail_timeout=30s;


}


server {


listen 4001 so_keepalive=30m::10;


proxy_pass stream_tidb;


}


}


这里实现了三台 tidbserver 的 4000 端口代理到本地的 4001 端口。


max_fails=3 fail_timeout=30s:在 30 秒内某一应用失败 3 次, 认为该应用宕机, 后等待 30 秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,等待的这 30 秒时间到后再有请求进来继续尝试连接宕机应用且仅尝试 1 次,如果还是失败,则继续等待 30 秒 … 以此循环,直到恢复。


当有访问后,会发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx 依然将请求转交给故障的节点, 然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率, 因为多了一次转发, 而且自带模块无法做到预警。


 so_keepalive=on 表示开启 tcp 探活,并且使用系统内核的参数。


编辑 vim /etc/sysctl.conf


添加 net.ipv4.tcp_keepalive_time = 30


sysctl -p 生效 。


 so_keepalive=30m::10 表示开启 tcp 探活,30 分钟后伍数据会发送探活包,时间间隔使用系统默认的,发送 10 次探活包。  


修改完配置文件后重载 nginx


/usr/local/openresty/nginx/sbin/nginx -s reload


现在可以使用工具连接 TIDB



工具访问数据库正常



sql 执行正常


编译安装 openresty

openresty 软件包下载 


wget http://nginx.p2hp.com/download/openresty-1.21.4.2.tar.gz


解压:


tar -zxvf openresty-1.21.4.2.tar.gz


安装所需依赖依赖


gcc openssl-devel pcre-devel zlib-devel


安装:


yum install gcc openssl-devel pcre-devel zlib-devel postgresql-devel


进入到目录


cd openresty-1.21.4.2


然后输入以下命令配置:


./configure


默认, –prefix=/usr/local/openresty 程序会被安装到 /usr/local/openresty 目录。


可以指定各种选项,比如:


./configure –prefix=/opt/openresty \


            –with-luajit \


            –without-http_redis2_module \


            –with-http_iconv_module \


            –with-http_postgres_module


试着使用 ./configure –help 查看更多的选项。


安装


make && make install


启动 nginx


/usr/local/openresty/nginx/sbin/nginx


配置文件和上文一致。

keepalived 安装、配置

 keepalived 实现 HA 功能社区里已经有好多案例,专栏也有好几篇了,这里就不再赘述了。

总结

Nginx 的定位是一个 server,Haproxy 的定位是一个 load balancer。


Nginx 通过各种 plugin module 可以支持 Load balance 的功能,而且性能不弱于 haproxy 太多,所以总有人拿来将两个东西比较。其实 Apache 也可以通过相关模块做 load balancer,只不过性能差得多而已所以没人用而已。


Nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级,Nginx 处理所有流量所以受限于机器 IO 和配置。Haproxy 的优点其实是转发性能稍高,因为 haproxy 追求 zero copy 的 forward 流程,所以代码都倾向于优化在这一点上。


Nginx 的主动健康检查功能也没有 Haproxy 简单好用。


如果社区的小伙伴有更好更简单的方案,欢迎提出来一起交流学习!


发布于: 刚刚阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
通过NGINX搭建TiDB负载均衡_安装 & 部署_TiDB 社区干货传送门_InfoQ写作社区