写点什么

TiDB 中的高可用实践

  • 2022 年 7 月 11 日
  • 本文字数:6754 字

    阅读完需:约 22 分钟

作者: 边城元元原文来源:https://tidb.net/blog/d05a479d

TiDB 中的高可用实践

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

1.1 拓扑图


1.2 安装虚拟机 haproxy-1

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

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

1.2.1 准备工作
  • 进入虚拟机 修改 hostname

  • 修改 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
  >
  >
  > ```
  >
  > ```yaml
  > 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
  >
  > ```yaml
  >
  > name="eth0"
  > DEVICE="eth0"
  > BOOTPROTO="static"
  > IPADDR="10.0.2.13"
  > ONBOOT="yes"
  > TYPE="Ethernet"
  > IPV6INIT = no
  > ```

  > systemctl restart network



##### 1.2.2 遇到的问题


shell

centos 虚拟机 Name or service not known 解决方法


vim ifcfg-eth0 # 增加网关


NETMASK=255.0.0.0GATEWAY=10.255.255.255DNS1= 8.8.8.8DNS2=8.8.8.4



### 1.3 安装Haproxy
##### 1.3.1 下载安装Haproxy
> 下载地址:<https://src.fedoraproject.org/repo/pkgs/haproxy/>> 选择一个版本进行下载,这里我用的是`haproxy-1.8.25.tar.gz`版本。

复制代码


shell

需要不能放到 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.25make TARGET=linux31 # uname -r 查看下内核版本,centos7.x 是 linux31、centos6.x 是 linux26sudo make install PREFIX=/usr/local0/haproxy # 安装到指定路径 cd /usr/local0/haproxymkdir conf pid # 分别用来存放配置、进程文件



##### 1.3.2 配置Haproxy
> vim /usr/local0/haproxy/conf/haproxy.cfg

复制代码


yaml


global log 127.0.0.1 local0 debug maxconn 4096 daemon nbproc 1 # 进程数,创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃 #nbthread 1 # 最大线程数。线程数的上限与 CPU 数量相同。 pidfile /usr/local0/haproxy/pid/haproxy.piddefaults 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

复制代码


shell/usr/local0/haproxy/sbin/haproxy -f /usr/local0/haproxy/conf/haproxy.cfg


netstat -tplnkill -9 $PID



查看监控页面
> `http://192.168.31.141:11001/admin`输入前面`listen`部分配置的账号密码登录。
### 1.4 安装 Keepalive
> 下载地址:[https://www.keepalived.org/download.html](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.keepalived.org%2Fdownload.html)> 选择一个版本进行下载,这里我用的是`keepalived-1.4.5`版本。

复制代码


shelltar -xvf keepalived-1.4.5.tar.gzcd 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




复制代码


shell#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.repocurl -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为系统服务

复制代码


shellcp /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 keepalived



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

复制代码


Keepalived默认读取配置的路径为/etc/keepalived/keepalived.conf


vim /etc/keepalived/keepalived.conf




复制代码


yaml# 主机配置


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 # 对应的健康检查配置 }}




复制代码


yaml

备用机 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

复制代码


shell

启动 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 的虚拟 ip


##### 1.4.4 脚本检测扩展

复制代码


shell

vi /etc/keepalived/chk_haproxy.sh

#!/bin/bashA=ps -C haproxy --no-header |wc -lif [ $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 fifi




复制代码


shell

更改健康检查配置

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 负载&高可用测试

复制代码


shell

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

复制代码


yaml

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.1port: 4001status_port: 10081

  • 3


  • host: 127.0.0.1port: 4002status_port: 10082


tikv_servers: - host: 127.0.0.1 port: 20160 status_port: 20180



##### 1.6.2 安装TiDB-cluster311
````shell
# 安装tiupcurl --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 -ptiup 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 监听)


具体参考:https://help.aliyun.com/document_detail/85995.htm?spm=a2c4g.11186623.0.0.69ed72b46Eje3q#task-1563673

三、总结与思考

总结

  • 本篇文章主要讲了 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 源码。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB 中的高可用实践_实践案例_TiDB 社区干货传送门_InfoQ写作社区