使用 NGINX 构建 TiDB 负载均衡的步骤与技巧

网友投稿 432 2024-03-31



前言

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

使用 NGINX 构建 TiDB 负载均衡的步骤与技巧

环境说明

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简单好用。

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用 Jmeter 对 TiDB 进行压力测试
下一篇:使用 Spring Boot 构建基于TiDB的应用程序
相关文章