目录
一、理论
1.高可用
2.部署高可用
二、实验
1.Mycat+HAProxy+Keepalived实现高可用
三、问题
1.开启HA-Proxy失败
2. VMware 克隆linux 网卡UUID重复问题
3.keepalived状态报错
四、总结
(1)概述
①Mycat
在实际项目中,Mycat
服务也需要考虑高可用性,如果Mycat
所在服务器出现宕机,或Mycat
服务故障,需要有备机提供服务,需要考虑Mycat
集群。
②HAProxy
HAProxv足一个使用C语言编写的自由及开放源代码软件,共提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxv运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连按数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处埋数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就足为什么他们必须进行
优化以使每个CPU时间片(Cycle)做更多的工作。
③Keepalived
Keepalived是一款专为LVS和HA设计的一款健康检查工具;支持故障自动切换、支持节点健康状态检查。
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群中各个服务节点的状态,后来又加入了可实现高可用VRRP功能。因此,Keepalived除了能够管理LVS集群外,还可以为其他服务(例如:Nginx、Haproxy、MySQL等)实现高可用。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRP出现的目的就是为了解决静态路由单点故障的问题,它能够保证当个别节点宕机时,整个网络可以不间断的运行
Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用。
(2)方案
使用HAProxy
+ Keepalived
配合两台Mycat
搭起Mycat
集群,实现高可用性。HAProxy
实现了Mycat
多节点的集群高可用和负载均衡,而HAProxy
自身的高可用则可以通过Keepalived
来实现。
(1)部署 HAProxy服务器
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
redispatch
option http-server-close
#option forwardfor except 127.0.0.0/8
option redispatch
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 60s
timeout server 60s
timeout http-keep-alive 10s
timeout check 10s
timeout tunnel 1h
timeout client-fin 30s
maxconn 3000
# contimeout 5000
# clitimeout 50000
# srvtimeout 50000
# 绑定到keep1主机的本地网卡上,该页面为haproxy的统计页面,用于查看请求转发等状态
listen admin_status 0.0.0.0:48800 ##VIP
stats uri /admin-status ##统计页面
stats auth admin:123456
mode http
option httplog
# 转发到mycat 8066业务端口,服务绑定在VIP上
listen allmycat_service 192.168.204.23:8066 ##转发到 mycat 的 8066 端口,即 mycat 的服务端口
mode tcp
option tcplog
option tcpka
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_1 192.168.204.250:8066 check inter 5s rise 2 fall 3
server mycat_2 192.168.204.251:8066 check inter 5s rise 2 fall 3
# 转发到mycat 9066管理端口,服务绑定在VIP上
listen allmycat_admin 192.168.204.23:9066 ##转发到 mycat 的 9066 端口,及 mycat 的管理控制台端口
mode tcp
option tcplog
option tcpka
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
# 为mycat主机提供状态check服务,5s检查一次
server mycat_1 192.168.204.250:9066 check inter 5s rise 2 fall 3
server mycat_2 192.168.204.251:9066 check inter 5s rise 2 fall 3
#timeout server 20000isten appli1-rewrite 0.0.0.0:10001
(2)重新定义Haproxy集群的日志
默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。
① #修改haproxy主配置文件
vim /etc/haproxy/haproxy.cfg
-----------------------------------修改以下内容
global
log /dev/log local0 info
log /dev/log local0 notice
------------------------------------
② #重启服务
service haproxy restart
需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
③ #修改rsyslog配置文件
vim /etc/rsyslog.d/haproxy.conf
---------------------------------------------------------------------添加如下内容
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
--------------------------------------------------------------------------
这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
④ #创建目录、重启服务、查看验证
mkdir /var/log/haproxy/
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息
(3)配置负载调度器(主keepalived服务器:192.168.204.70)
① #关闭防火墙
systemctl stop firewalld.service
setenforce 0
② #安装服务
yum install ipvsadm keepalived -y
③ #修改配置文件keeplived.conf
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_01
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
--23行--修改,指定优先级,数值越大优先级越高,主为100,备为99
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123123
}
virtual_ipaddress { #指定群集vip地址
192.168.204.23
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.204.23 8066 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式(NAT)
lb_kind NAT
persistence_timeout 50 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.204.70 8066 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
#connect_port 8066 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.204.100 8066 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
#connect_port 8066
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
④ #启动服务、查看虚拟网卡vip
systemctl start keepalived
ip addr show dev ens33
(4)配置负载调度器(备keepalived服务器:192.168.204.100)
配置与主服务器相似
① #关闭防火墙
systemctl stop firewalld.service
setenforce 0
② #安装服务
yum install ipvsadm keepalived -y
③ #修改配置文件keeplived.conf
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_02
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state BACKUP
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
--23行--修改,指定优先级,数值越大优先级越高,主为100,备为99
priority 99
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
--27行--修改,指定验证密码,主备服务器保持一致
auth_pass 123123
}
virtual_ipaddress { #指定群集vip地址
192.168.204.23
}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.204.23 8066 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,NAT
lb_kind NAT
persistence_timeout 50 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.204.70 8066 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
#connect_port 8066 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.204.100 8066 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
#connect_port 8066
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
##删除后面多余的配置##
④ #启动服务、查看虚拟网卡vip
systemctl start keepalived
ip addr show dev ens33
(5)配置节点服务器(maycat1服务器:192.168.204.250)
① 解压
cd /opt
tar zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
cp -r mycat /usr/local/
②配置环境变量
vim ~/.bash_profile
export MYCAT_HOME=/usr/local/mycat
置并刷新环境变量使得mycat可以补全
echo 'PATH=/usr/local/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh
mycat start
③启动mycat
mycat start
④ 启动成功日志末尾会出现successfully,mycat只能通过查看日志的方式判断是否启动成功
tail -f /usr/local/mycat/logs/wrapper.log
⑤ 配置schema.xml
select user()
⑥ 配置server.xml
123456
mycatdb1,mycatdb2,mycatdb3
user
mycatdb1,mycatdb2,mycatdb3
true
⑦修改MyCat日志级别
vim log4j2.xml
第25行 level="debug"
⑧ 启动成功
tail -f /usr/local/mycat/logs/wrapper.log
⑨ 查看端口
netstat -an|grep 8066
⑩查看mycat进程
ps -ef|grep mycat
⑪登录mysql,查看逻辑库
[root@localhost ~]# mysql -uroot -p123456 -P8066 -h 192.168.204.250
mysql> show databases;
mysql> use mycatdb1;
mysql> show tables;
mysql> select * from t11;
(6)配置节点服务器(maycat2服务器:192.168.204.251) maycat2服务器与mycat服务器基本一致 如需监控,以下配置文件需要修改:
vim /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties
show.period=3000000
sqlonline.passwd=123456
zookeeper=192.168.204.251\:2181
sqlonline.user=root
sqlonline.server=192.168.204.251
mycat_warn_mail=[{"cc"\:"[email protected]","index"\:1,"mangerPort"\:"465","smtpHost"\:"smtp.139.com","smtpPassword"\:"123456","smtpProtocol"\:"smtp","smtpUser"\:"[email protected]","to"\:"[email protected]"}]
(7)安装并配置xinetd服务
需要在安装HAProxy的服务器上,安装xinetd服务来开启48700端口。
(1)在服务器命令行执行如下命令安装xinetd服务,如下所示。
yum install xinetd -y
(2)编辑/etc/xinetd.conf文件,如下所示。
vim /etc/xinetd.conf
检查文件中是否存在如下配置。
includedir /etc/xinetd.d
如果/etc/xinetd.conf文件中没有以上配置,则在/etc/xinetd.conf文件中添加以上配置;如果存在以上配置,则不用修改。
(3)创建/etc/xinetd.d目录,如下所示。
mkdir /etc/xinetd.d
注意:如果/etc/xinetd.d目录已经存在,创建目录时会报如下错误。
mkdir: cannot create directory `/etc/xinetd.d': File exists
可不必理会此错误信息。
(4)在/etc/xinetd.d目录下添加Mycat状态检测服务器的配置文件mycat_status,如下所示。
touch /etc/xinetd.d/mycat_status
(5)编辑mycat_status文件,如下所示。
vim /etc/xinetd.d/mycat_status
编辑后的mycat_status文件中的内容如下所示。
service mycat_status
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_check.sh
log_on_failure += USERID
disable = no
}
部分xinetd配置参数说明如下所示。
socket_type:表示封包处理方式,Stream为TCP数据包。
port:表示xinetd服务监听的端口号。
wait:表示不需等待,即服务将以多线程的方式运行。
user:运行xinted服务的用户。
server:需要启动的服务脚本。
log_on_failure:记录失败的日志内容。
disable:需要启动xinted服务时,需要将此配置项设置为no。
(6)在/usr/local/bin目录下添加mycat_check.sh服务脚本,如下所示。
touch /usr/local/bin/mycat_check.sh
(7)编辑/usr/local/bin/mycat_check.sh文件,如下所示。
vim /usr/local/bin/mycat_check.sh
编辑后的文件内容如下所示。
#!/bin/bash
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ "$mycat" = "0" ]; then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
/usr/local/mycat/bin/mycat start
fi
为mycat_check.sh文件赋予可执行权限,如下所示。
chmod a+x /usr/local/bin/mycat_check.sh
(8)编辑/etc/services文件,如下所示。
vim /etc/services
在文件末尾添加如下所示的内容。
mycat_status 48700/tcp # mycat_status
其中,端口号需要与在/etc/xinetd.d/mycat_status文件中配置的端口号相同。
(9)重启xinetd服务,如下所示。
service xinetd restart
(10)查看mycat_status服务是否成功启动,如下所示。
netstat -antup|grep 48700
结果显示,两台服务器上的mycat_status服务器启动成功。
至此,xinetd服务安装并配置成功,即Mycat状态检查服务安装成功。
(1)实验环境
HAProxy(master)、Keepalived(master):192.168.204.70
HAProxy(backup)、Keepalived(backup):192.168.204.100
Mycat1服务器:192.168.204.250,jdk1.6、Mycat-server-1.6.7.6 ,centos7
Mycat2服务器:192.168.204.251,jdk1.6、Mycat-server-1.6.7.6 ,centos7
Master 服务器:192.168.204.10,mysql5.7
Slave1 服务器:192.168.204.11,mysql5.7
Slave2 服务器:192.168.204.12,mysql5.7
(2)安装并配置xinetd服务
①在服务器命令行执行如下命令安装xinetd服务,如下所示。
②编辑/etc/xinetd.conf文件,如下所示。
检查文件中是否存在如下配置
③ 创建/etc/xinetd.d目录,如下所示。
注意:如果/etc/xinetd.d目录已经存在,创建目录时会报如下错误。
④在/etc/xinetd.d目录下添加Mycat状态检测服务器的配置文件mycat_status,如下所示。
编辑mycat_status文件,如下所示。
编辑后的mycat_status文件中的内容如下所示。
⑤ 在/usr/local/bin目录下添加mycat_check.sh服务脚本,如下所示。
编辑后的文件内容如下所示。
⑥为mycat_check.sh文件赋予可执行权限,如下所示。
编辑/etc/services文件,如下所示。
⑦ 重启xinetd服务,如下所示。
⑧查看mycat_status服务是否成功启动,如下所示。
(3)启动HAProxy
HAProxy(master)192.168.204.70
HAProxy(backup)192.168.204.100
(4)启动Keepalived
Keepalived(master)192.168.204.70
Keepalived(backup)192.168.204.100
(5)启动Mycat
Mycat1服务器:192.168.204.250
Mycat2服务器:192.168.204.251
(6)远程登录验证
HAProxy(master)、Keepalived(master):192.168.204.70
HAProxy(backup)、Keepalived(backup):192.168.204.100
(7)查看高可用
http://192.168.204.70:48800/admin-status
写入数据观察变化
关闭mycat1,观察变化
(1)报错
开启 失败,错误描述:Failed to start SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularl
(2)原因分析
忘记注释该服务自设置的根目录
(3)解决方法
为了确定是否文件格式还存在问题,输入下面的命令:
[root@localhost run]# haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
①注释该服务自设置的根目录
②依然报错,检查网卡配置是否添加虚拟地址
#配置虚拟IP地址(VIP:192.168.204.23)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
#删除UUID,dns与网关,注意子网
NAME=ens33:0
DEVICE=ens33:0
IPADDR=192.168.204.23
NETMASK=255.255.255.255
#重启网络服务、启动网卡
systemctl restart network
ifup ifcfg-ens33:0
③ Haproxy误报"xxx has no server available!"的消息
网络参数方面主要就是生产环境的内核TCP参数做过优化,生产环境之前在/etc/sysctl.conf 文件中做了如下优化:
[root@localhost haproxy]# vim /etc/sysctl.conf
看来这个是导致Haproxy在做健康检查时误报的原因,于是去掉上面的配置,重启生产环境的服务器,一切正常了。
④ 检查配置文件,注释
⑤创建/var/lib/haproxy/stats文件
[root@localhost run]# mkdir -p /var/lib/haproxy
[root@localhost run]# touch /var/lib/haproxy/stats
再次启动,成功
[root@localhost run]# systemctl start haproxy
[root@localhost run]# ps -ef | grep -i haproxy
nobody 3762 1 0 11:25 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
root 3852 1988 0 11:32 pts/0 00:00:00 grep --color=auto -i haproxy
添加开机自启
(1)问题
当使用 VMware 克隆 linux 主机时会发生克隆主机和原主机网卡 UUID 重复的问题,这样会对网络通信产生影响。
(2)原因分析
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
只要保证每台主机的UUID独一无二即可,即为新的主机绑定新的 UUID。
(3)解决方法
生成新的uuid替换掉文件里的uuid号。
第一步:生成新的uuid
[root@localhost /]# uuidgen
第二步:替换网卡信息里的uuid号
[root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
第三步:重启服务
[root@localhost /]# systemctl restart network
第四步:使用nmcli工具验证
[root@localhost /]# nmcli connection show
新UUID生效
(1)报错
status keepalived.service
(2)原因分析
If you want to allow /usr/sbin/haproxy to bind to network port 8066
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 1080如果你先允许绑定到网络端口8066, 需要修改端口类型, 如下
semanage port -a -t PORT_TYPE -p tcp 8066 # 其中 PORT_TYPE 可选值为:commplex_main_port_t, http_cache_port_t, http_port_t.
(3)解决方法
# 在这里, 我们使用 http_port_t 类型, 即执行下面命令即可semanage port -a -t http_port_t -p tcp 8066
然后重启haproxy 即可
[root@localhost keepalived]# semanage port -a -t http_port_t -p tcp 8066
[root@localhost keepalived]# service keepalived status
[root@localhost keepalived]# service haproxy restart
HA-Proxy配置文件及启动:
#配置文件
vim /etc/haproxy/haproxy.cfg
#重启服务
service haproxy restart
#查看状态
systemctl status haproxy.service
#添加开机自启
chkconfig --add haproxy
chkconfig --list haproxy
keepalived配置文件及启动:
#配置文件
vim /etc/keepalived/keepalived.conf
#启动服务
systemctl start keepalived
#查看状态
service keepalived status
mycat补全命令及查看日志:
echo 'PATH=/usr/local/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
source /etc/profile.d/mycat.sh
mycat start
tail -f /usr/local/mycat/logs/wrapper.log