作者: 像风一样的男子
前言
目前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简单好用。
如果社区的小伙伴有更好更简单的方案,欢迎提出来一起交流学习!
标签:负载,nginx,--,module,NGINX,usr,openresty,TiDB,local From: https://blog.51cto.com/tidb/8362745