首页 > 系统相关 >通过NGINX搭建TiDB负载均衡

通过NGINX搭建TiDB负载均衡

时间:2023-11-14 10:33:45浏览次数:27  
标签:负载 nginx -- module NGINX usr openresty TiDB local

作者: 像风一样的男子



前言

目前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

通过NGINX搭建TiDB负载均衡_lua

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



添加代理配置

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

通过NGINX搭建TiDB负载均衡_Nginx_02

增加配置:

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

通过NGINX搭建TiDB负载均衡_Nginx_03

工具访问数据库正常

通过NGINX搭建TiDB负载均衡_lua_04

sql执行正常

通过NGINX搭建TiDB负载均衡_Nginx_05



编译安装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

相关文章

  • TiDB实践安装及性能测试(上)
    作者:TiDBer_小阿飞TIDB分布式数据库离线实施方案及相关测试(测试版)第一部分 ~~ ~~硬件资源一、硬件资源现有硬件资源环境统计如下|||||||||--|------------|---|-----|----|---------|-------------||序号|IP|CPU|存储|内存|Hostname......
  • TiDB实践安装及性能测试(下)
    作者:TiDBer_小阿飞第六部分 数据备份及数据迁移一、TiDBDataMigration(DM)安装部署TiDBDataMigration(DM)是一款便捷的数据迁移工具,支持从与MySQL协议兼容的数据库(MySQL、MariaDB、AuroraMySQL)到TiDB的全量数据迁移和增量数据同步。1.解压DM包在TOOLS的文件......
  • 记一次 TiDB v7.1 版本生产环境的完整搭建流程
    作者:随缘天空本文包含以下内容:1、安装的硬件要求2、安装前环境检查及系统优化3、集群搭建4、服务访问1、硬件要求tidb集群搭建对服务器的cpu和内存有要求,过低的配置可能会导致搭建失败或影响集群性能2、安装前环境检查及系统优化为了保证安装顺利和集群的性能,安装前我们需......
  • 三地五中心,TiDB POC最佳姿势探索
    POC测试背景在某地震多发省,为了避免地震造成的机房级灾难,或者城市级灾难,导致整个系统不可用,拟建设一套三地五中心五副本分布式高可用数据库系统,保证高可用需求。在该系统中需要接入不同地区的应用流量,且前期应用开发已经采用了百库百表的水平分库表策略。为尽可能减少应用~数据库......
  • 【运维实操】TIDB v6.1.1:全量备份、全量恢复和增量备份方法解析
    作者:Fly-bird背景:由于公司要求必须保证数据库的数据安全,我们生产环境的数据库采取全量备份+增量备份+实时同步从库的方式保证数据库的高可用,本文介绍我公司生产环境的数据库备份方式。注意:我们使用实时同步数据到从库的方式保障高可用(使用pump+drainer),同时支持恢复任意时刻数据的......
  • Linux多路径IO流量负载和单链路负载压测
     LinuxMultipath的IO流量多链路负载和单链路负载压测 再linux下,对于udev和multipath均能做到自定义并持久化设备名,其中udev还能做到更改设备权限。而multipath也能做到持久化设备名,但无法更改设备权限,但是multipath能够实现更多的功能,比如IO流量负载功能。 测试情况1......
  • Centos7 nginx反向代理gitea和grafana&钉钉告警
    1安装nginxyuminstall-ygccmakepcre-develzlib-developenssl-develwgethttps://nginx.org/download/nginx-1.20.1.tar.gztar-zxvfnginx-1.20.1.tar.gzcdnginx-1.20.1./configure--prefix=/usr/local/nginx--with-http_ssl_modulemakemakeinstallvi/etc/system......
  • nginx启动报错权限不够
    -bash:/u01/nginx/sbin/nginx:权限不够解决方案:这个错误提示表明你尝试执行/u01/nginx/sbin/nginx时没有足够的权限来执行该命令。这通常是因为当前用户对该文件没有执行权限。要解决这个问题,你可以使用sudo命令以超级用户的身份来执行该命令。比如:bashCopyCodesud......
  • Nginx - 配置
    Nginx-配置 1.发布静态网站(指定地址)server{listen8055;server_namelocalhost;location/{rootD:\IISPublish\stand;indexindex.htmlindex.htm;}} 2.  发......
  • docker Nginx ssl 配置
     nginx版本:1.21.1证书获取阿里云:_xxxx.xxxxx.com.pem、_xxxx.xxxxx.key域名:xxxx.xxxxx.com一、ssl 443端口二、非443端口 nginx.confserver{#监听端口,切记,12000后面必须加ssllisten12000ssl;#域名server_namexxxx.x......