通过 NGINX 搭建 TiDB 负载均衡
作者: 像风一样的男子原文来源:https://tidb.net/blog/f60f0e67
前言
环境说明
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 简单好用。
如果社区的小伙伴有更好更简单的方案,欢迎提出来一起交流学习!
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/da37408c18a0c84c3c4fbaf8c】。文章转载请联系作者。
评论