TiDB 中的高可用实践
作者: 边城元元原文来源: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
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 # 分别用来存放配置、进程文件
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 # 通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器
shell/usr/local0/haproxy/sbin/haproxy -f /usr/local0/haproxy/conf/haproxy.cfg
netstat -tplnkill -9 $PID
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
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
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 # 对应的健康检查配置 }}
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
shell
vi /etc/keepalived/chk_haproxy.sh
#!/bin/bashA=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 fifi
shell
更改健康检查配置
HAProxy 健康检查配置
vrrp_script chk_haproxy { script “/etc/keepalived/chk_haproxy.sh” # 执行自定义脚本 interval 2 # 脚本运行周期,秒}
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 进行服务访问,这就是高可用。
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
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
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 源码。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/3a46f1a762c54835859789f2e】。文章转载请联系作者。
评论