TiDB高可用实施指南

网友投稿 326 2024-03-27



TiDB 中的高可用实践

一、Haproxy+keepalive 方式的TiDB高可用实践

1.1 拓扑图

ip作用192.168.31.100虚拟出来的漂移IP(连接tidb 入口IP)192.168.31.141真实服务器1,已经部署Haproxy+keepalived ,虚拟IP(192.168.31.100)192.168.31.142真实服务器2,已经部署Haproxy+keepalived,虚拟IP(192.168.31.100)192.168.31.143真实服务器3,已经部署TiDB集群应用tidb-server1 :4000tidb-server2 :4001tidb-server3 :4002

1.2 安装虚拟机haproxy-1

从纯净版的Centos7.3的虚拟机导出,再导入新建虚拟机 haproxy-1

TiDB高可用实施指南

(导入时,选择vmdk,修改mac地址)

1.2.1 准备工作

进入虚拟机 修改hostname

hostnamectl set-hostname haproxy-1 hostnamectl set-hostname haproxy-2 hostnamectl set-hostname tidb-cluster 手动更新/etc/hosts vim /etc/hosts echo "127.0.0.1 haproxy-1">>/etc/hosts echo "192.168.31.141 haproxy-1">>/etc/hosts echo "127.0.0.1 haproxy-2">>/etc/hosts echo "192.168.31.142 haproxy-2">>/etc/hosts echo "127.0.0.1 tidb-cluster">>/etc/hosts echo "192.168.31.143 tidb-cluster">>/etc/hosts

修改IP为固定IP 桥接网卡IP(192.168.31.141,192.168.31.142,192.168.31.143)

ifconfig

vim /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE="eth1" BOOTPROTO="static" IPADDR="192.168.31.141" ONBOOT="yes" TYPE="Ethernet" PERSISTENT_DHCLIENT="yes" IPV6INIT = no DEVICE=eth0 #虚拟机网卡名称。 TYPE=Ethernet #类型为以太网 ONBOOT=yes #开机启用网络配置。 NM_CONTROLLED=yes #是否可以由 Network Manager 工具托管 BOOTPROTO=static #static:静态 ip,dhcp:自动获取 ip 地址, #none:无(不指定) IPADDR=192.168.80.111 #IP 地址 NETMASK=255.255.255.0 #子网掩码,和物理主机一样就可以了。 GATEWAY=192.168.80.2 #网关(与VMnet8段位一致) DNS1=192.168.80.2 #DNS 与网关 ip 一致 HWADDR=00:0c:29:22:05:4c#MAC 地址 IPV6INIT=no #IPv6 没有启动 USERCTL=no #不允许非 root 用户控制此网卡

vim /etc/sysconfig/network-scripts/ifcfg-eth0

本地双网卡:NAT分别使用10.0.2.13,10.0.2.14,10.0.2.15

name="eth0" DEVICE="eth0" BOOTPROTO="static" IPADDR="10.0.2.13" ONBOOT="yes" TYPE="Ethernet" IPV6INIT = no

systemctl restart network

1.2.2 遇到的问题# centos 虚拟机 Name or service not known 解决方法 vimifcfg-eth0#增加网关 NETMASK=255.0.0.0 GATEWAY=10.255.255.255 DNS1= 8.8.8.8 DNS2=8.8.8.4

1.3 安装Haproxy

1.3.1 下载安装Haproxy

***:https://src.fedoraproject.org/repo/pkgs/haproxy/ 选择一个版本进行下载,这里我用的是haproxy-1.8.25.tar.gz版本。

# 需要不能放到vbox格式的磁盘里, cp ./haproxy-1.8.25.tar.gz /usr/local0/software/ cd /usr/local0/software/ tar-xvf haproxy-1.8.25.tar.gzcd haproxy-1.8.25 make TARGET=linux31 # uname -r 查看下内核版本,centos7.x是linux31、centos6.x是linux26 sudo make install PREFIX=/usr/local0/haproxy # 安装到指定路径 cd /usr/local0/haproxy mkdir conf pid # 分别用来存放配置、进程文件 1.3.2 配置Haproxy

vim /usr/local0/haproxy/conf/haproxy.cfg

global log 127.0.0.1 local0 debug maxconn 4096 daemon nbproc 1 # 进程数,创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃 #nbthread 1 # 最大线程数。线程数的上限与 CPU 数量相同。 pidfile /usr/local0/haproxy/pid/haproxy.pid defaults log global # 日志继承全局配置段的设置。 retries 3 # 连接后端服务器失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用 timeout connect 2s timeout client 30000s timeout server 30000s timeout check 5s # 接入配置 listen tidb-cluster # 配置 database 负载均衡。 bind 0.0.0.0:4000 # 浮动 IP 和 监听端口。 mode tcp # HAProxy 要使用第 4 层的传输层。 balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于启动慢的服务器,服务器权重会在运行中作调整。 server tidb-4000 192.168.31.143:4000 check inter 2000 rise 2 fall 3 # 检测 4000 端口,检测频率为每 2000 毫秒一次。如果 2 次检测为成功,则认为服务器可用;如果 3 次检测为失败,则认为服务器不可用。 server tidb-4001 192.168.31.143:4001 check inter 2000 rise 2 fall 3 server tidb-4002 192.168.31.143:4002 check inter 2000 rise 2 fall 3 # 监控页面 listen admin_stats bind 0.0.0.0:11001 mode http option httplog # 开始启用记录 HTTP 请求的日志功能。 maxconn 10 # 最大并发连接数。 stats refresh 30s stats uri /admin stats realm welcome login\ Haproxy stats auth admin:admin123 stats hide-version # 隐藏监控页面上的 HAProxy 版本信息。 stats admin if TRUE # 通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器1.3.3 启动Haproxy/usr/local0/haproxy/sbin/haproxy -f /usr/local0/haproxy/conf/haproxy.cfg netstat -tpln kill -9 $PID

查看监控页面

http://192.168.31.141:11001/admin输入前面listen部分配置的账号密码登录。

1.4 安装 Keepalive

***:https://www.keepalived.org/download.html 选择一个版本进行下载,这里我用的是keepalived-1.4.5版本。

tar -xvf keepalived-1.4.5.tar.gz cd keepalived-1.4.5 ./configure --prefix=/usr/local0/keepalived # 如果出现问题 可能缺少组件 # !!! OpenSSL is not properly installed on your system. !!! #执行yum -y install openssl-devel解决 # *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS. # 执行yum -y install libnl libnl-devel解决。 # configure: error: libnfnetlink headers missing #执行yum install -y libnfnetlink-devel解决。 # 把缺少的组件一起安装 yum -y install openssl-devel libnl libnl-devel libnfnetlink-devel # 安装好组件后重新 configure ./configure --prefix=/usr/local0/keepalived make && make install #centos7 修改yum源为阿里源 # 1.安装base reop源 cd /etc/yum.repos.d # 接着备份旧的配置文件 mv CentOS-Base.repo CentOS-Base.repo.bak #下载阿里源的文件 wget-O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repocurl -o CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #2 安装epel repo源: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #3.清理缓存yum clean all# 4.重新生成缓存 yum makecache yum repolist all

查看监控

http://192.168.31.141:11001/admin

输入前面listen部分配置的账号密码登录(admin=admin123)。

1.4.1 注册Keepalived为系统服务cp /usr/local0/keepalived/sbin/keepalived /usr/sbin/ # 以下拷贝的原路径要替换成实际安装包解压后的路径 cp/data0/webserver/haproxy/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/cp /data0/webserver/haproxy/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/ # 赋予可执行权限 chmod +x /etc/init.d/keepalived # 重启系统服务 systemctl daemon-reload # 启动|停止|重启|状态查看 systemctl start|stop|restart|status keepalived # 开机自动运行 systemctl enable keepalived # 关闭开机自动运行systemctl disable keepalived1.4.2 配置Keepalived

这里只贴出keepaliaved抢占式配置,非抢占式没有主备之分,全部都为BACKUP,并且配置文件中添加nopreempt,用来标识为非抢占式。

Keepalived`默认读取配置的路径为`/etc/keepalived/keepalived.conf vim /etc/keepalived/keepalived.conf#主机配置 global_defs { router_id haproxy1 # 虚拟路由名称 } # HAProxy健康检查配置 vrrp_script chk_haproxy { script "killall -0 haproxy" # 使用killall -0检查haproxy实例是否存在,性能高于ps命令 interval 2 # 脚本运行周期,秒 } # 虚拟路由配置 vrrp_instance VI_1 { state MASTER # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP interface eth1 # 本机网卡名称,使用ifconfig命令查看 virtual_router_id 51 # 虚拟路由编号,主备机保持一致 priority 101 # 本机初始权重,备机请填写小于主机的值(例如99) advert_int 1 # 争抢虚地址的周期,秒 authentication { auth_type PASS auth_pass 4gjfethTonUY7kXU # 认证类型和密码主备一样,要不然无法互相认证 } virtual_ipaddress { 192.168.31.100 # 虚地址IP,主备机保持一致 } track_script { chk_haproxy # 对应的健康检查配置 } }# 备用机1配置 global_defs { router_id haproxy2 # 虚拟路由名称 } # HAProxy健康检查配置 vrrp_script chk_haproxy { script "killall -0 haproxy" # 使用killall -0检查haproxy实例是否存在,性能高于ps命令 interval 2 # 脚本运行周期,秒 } # 虚拟路由配置 vrrp_instance VI_1 { state BACKUP # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP # interface ens33 # 本机网卡名称,使用ifconfig命令查看 interface eth1 # 本机网卡名称,使用ifconfig命令查看 virtual_router_id 51 # 虚拟路由编号,主备机保持一致 priority 99 # 本机初始权重,备机请填写小于主机的值(例如99) advert_int 1 # 争抢虚地址的周期,秒 authentication { auth_type PASS auth_pass 4gjfethTonUY7kXU # 认证类型和密码主备一样,要不然无法互相认证 } virtual_ipaddress { 192.168.31.100 # 虚地址IP,主备机保持一致 } track_script { chk_haproxy # 对应的健康检查配置 } }1.4.3 启动Keepalived# 启动Keepalived systemctl start keepalived # 查看是否有虚拟ip # ip addr sh ens33 # ens33是具体网卡名称,可以通过ifconfig查看 ip addr sh eth1 # eth1是具体网卡名称,可以通过ifconfig查看 # 备份的keepalived 使用ip addr sh eth1 没有看到 192.168.31.100的虚拟ip1.4.4 脚本检测扩展# vi /etc/keepalived/chk_haproxy.sh #!/bin/bash A=`ps -C haproxy --no-header |wc -l` if [ $A -eq 0 ];then # su - haproxy -c "/usr/local/haproxy/sbin/haproxy -f /usr/local0/haproxy/conf/haproxy.cfg" /usr/local0/haproxy/sbin/haproxy -f /usr/local0/haproxy/conf/haproxy.cfg sleep 10 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then systemctl stop keepalived fi fi # 更改健康检查配置 # HAProxy健康检查配置 vrrp_script chk_haproxy { script "/etc/keepalived/chk_haproxy.sh" # 执行自定义脚本 interval 2 # 脚本运行周期,秒 }

1.5 部署haproxy-2

1)复制虚拟机haproxy-1 2)启动虚拟机,修改host,ip,重启主机 3)修改keepalived配置

1.5.1 负载&高可用测试# 1)虚拟ip是否生效 # 2)是否起到负载的效果 客户端通过虚拟ip 192.168.31.100访问主机上的haproxy端口,能访问成功说明虚拟ip已经生效, 此时访问192.168.31.100和访问192.168.31.141效果是一样的。 # 3)故障发生是否发生漂移,并且不影响前端的访问杀死主机的haproxy进程,如果VIP发生漂移,查看备用机持有VIP就说明主备配置已经生效了。 客户端还是能通过192.168.31.100这个虚拟ip进行服务访问,这就是高可用。

1.6 安装tidbCluster311

1.6.1 TiDB-Cluster311.yml# cluster311.yml global: user: "tidb" ssh_port: 22 deploy_dir: "/tidb-deploy311" data_dir: "/tidb-data311" server_configs: tidb: log.slow-threshold: 300 tikv: readpool.storage.use-unified-pool: false readpool.coprocessor.use-unified-pool: true pd: replication.max-replicas: 1 pd_servers: - host: 127.0.0.1 client_port: 2379 peer_port: 2380 tidb_servers: - host: 127.0.0.1 port: 4000 status_port: 10080 # 2 - host: 127.0.0.1 port: 4001 status_port: 10081 # 3 - host: 127.0.0.1 port: 4002 status_port: 10082 tikv_servers: - host: 127.0.0.1 port: 20160 status_port: 201801.6.2 安装TiDB-cluster311 # 安装tiup curl --proto =https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh ```shell # 1、加载tiup组件 source /root/.bash_profile # 2、安装cluster组件 tiup cluster # 更新tiup、更新cluster tiup update --self && tiup update cluster # 3、安装cluster111 tiup cluster check ./cluster311.yml --user root -p # 4、修复部分参数 tiup cluster check --apply ./cluster311.yml --user root -p tiup cluster deploy cluster311 v5.3.0 ./cluster311.yml --user root -p #会提示输入密码 #提示输入y/n # 预估约10多分钟可以安装完毕 # 如果中间有终端可以重复执行 tiup cluster deploy cluster111 v5.3.0 ./cluster111.yml --user root -p # 提示 “Cluster `cluster111` deployed successfully, you can start it with command: `tiup cluster start cluster111 --init`” 表示安装成功 # 4、通过命令查看集群 tiup cluster list # 5、初始化集群 不带--init tiup cluster start cluster311 tiup cluster display cluster311 1.6.3 测试TiDB-Custer311

1、dashboard

http://192.168.31.143:2379/dashboard/#/overview

1、连接 192.168.31.143 :4000,4001,4002

1)正常连接4000

mysql -h 192.168.31.143 -P 4000 -uroot

2)正常连接4001

mysql -h 192.168.31.143 -P 4001 -uroot

3)正常连接4002

mysql -h 192.168.31.143 -P 4002 -uroot

4)haproxy的真实ip可以访问这块需要处理,只运行通过浮动ip访问

mysql -h 192.168.31.141 -P 4000 -uroot

mysql -h 192.168.31.142 -P 4000 -uroot

2、连接 192.168.31.100:4000端口

mysql -h 192.168.31.100 -P 4000 -uroot

3、查看haproxy监控

http://192.168.31.100:11001/admin输入前面listen部分配置的账号密码登录。

4、在一个Haproxy节点和多个tidb-server节点挂掉的情况下都可以正常访问TiDB数据库

通过浮动ip访问TIDB

mysql -h 192.168.31.100 -P 4000 -uroot -e "select SESSION_USER();"

二、***CLB(原SLB)做内网Tidb高可用实践

使用***的SLB来构建内网负载均衡,免去了自己搭建高可用负载均衡服务器的环节

1、购买***CLB(原SLB)

2、创建实例

3、配置实例和规则(配置TCP监听)

具体参考:

三、总结与思考

总结

本篇文章主要讲了TiDB在生产中多种高可用方案中的自己用到过的2种(HA+Keepalive与CLB)

Tidb的高可用方案本质是对tidb-server的负载和中间件本身的高可用,实现tidb高可用的方案还有很多,这里不再说明。

文辞简陋有一些描述不到位的地方,还请多多指教。

思考

1、从虚拟IP(192.168.31.100)访问Tidb时,如何从sql命令端知道连接的哪个 tidb-server节点?

从下面的官方信息中没有查到相关的命令

https://docs.pingcap.com/zh/tidb/stable/information-functions#信息函数

类似的命令有mysql -h 192.168.31.100 -P 4000 -uroot -e "select SESSION_USER();" 但是这个查到的是 HaProxy机器的信息不是预期的某个tidb-server节点的信息。如果哪个大神了解这个方面的信息,麻烦不吝赐教!

本文到此结束了,谢谢! 最后想对自己说的是要抽时间看一下tidb源码。

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

上一篇:TiDB跨版本升级流程概述
下一篇:TiEM 的初次体验
相关文章