服务器IP | 主机名 |
192.168.112.32(Cetnos7.2) | HAProxy |
192.168.112.28(Cetnos7.2) | Mycat_01 |
192.168.112.29(Cetnos7.2) | Mycat_02 |
192.168.112.30(Cetnos7.2) | MySQL Master |
192.168.112.31(Cetnos7.2) | MySQL Slave |
Mycat_02节点与Mycat_01节点配置一样,具体可参考使用Mycat实现MySQL读写分离(MySQL主从复制)
需在Mycat服务器开放状态检测端口以及状态检测脚本,以提供给HAProxy对Mycat服务状态进行检测判断。这里我们采用xinetd实现,通过xinetd,HAProxy可以用httpchk来检测Mycat的存活状态。
(1)安装xinetd
# yum源安装xinetd yum install xinetd
如果无法访问互联网yum安装,可以下载rpm进行安装
(2)添加 includedir /etc/xinetd.d
在xinetd配置文件xinetd.conf末尾添加includedir /etc/xinetd.d
# 打开xinetd配置文件 vim /etc/xinetd.conf
(3)检查 /etc/xinetd.d 目录是否存在,不存在则创建
# 创建 xinetd.d 目录 mkdir /etc/xinetd.d
(4)编写Mycat存活状态检测服务脚本
# 在 /etc/xinetd.d/ 下添加 mycat_status 状态检测脚本 vim /etc/xinetd.d/mycat_status
mycat_status文件添加以下内容
service mycat_status { flags = REUSE ## 使用该标记的socket_type为stream,需要设置wait为no socket_type = stream ## 封包处理方式,Stream为TCP数据包 port = 48700 ## 服务监听端口 wait = no ## 表示不需等待,即服务将以多线程的方式运行 user = root ## 执行此服务进程的用户 server =/usr/local/bin/mycat_status ## 需要启动的服务脚本 log_on_failure += USERID ## 登录失败记录的内容 disable = no ## 要启动服务,将此参数设置为no }
(5)添加 /usr/local/bin/mycat_status 服务脚本
# 在 /usr/local/bin/mycat_status 下添加 mycat_status 状态检测脚本 vim /usr/local/bin/mycat_status
mycat_status文件添加以下内容
#!/bin/bash #/usr/local/bin/mycat_status.sh # This script checks if a mycat server is healthy running on localhost. # It will return: # "HTTP/1.x 200 OK\r" (if mycat is running smoothly) # "HTTP/1.x 503 Internal Server Error\r" (else) 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" fi
(6)给脚本赋予执行权限并把监听添加到services中
# 给新增脚本赋予可执行权限 chmod a+x /usr/local/bin/mycat_status # 在 /etc/services 中加入 mycat_status 服务 vim /etc/services 在末尾加入: mycat_status 48700/tcp # mycat_status # 重启xinetd服务 service xinetd restart # 验证mycat_status服务是否成功启动 netstat -antup|grep 48700
(7)关闭防火墙或者开放端口
关闭防火墙
# 查看防火墙状态 systemctl status firewalld # 关闭防火墙 systemctl stop firewalld
开放端口
# 查看防火墙所有开放的端口 firewall-cmd --zone=public --list-ports # 开放48700端口 firewall-cmd --zone=public --add-port=48700/tcp --permanent # 配置立即生效 firewall-cmd --reload
(8)测试脚本
# 测试刚刚添加的mycat监听脚本 /usr/local/bin/mycat_status
(1)下载HAProxy并解压,这里我直接将已经下载好的源码包放在服务器
# 解压 haproxy 包 tar -zxf haproxy-2.3.14.tar.gz # 切换至解压后的 haproxy 包中 cd haproxy-2.3.14/ # 创建 haproxy 安装目录 mkdir -p /usr/local/HAProxy # 编译 haproxy make TARGET=linux-glibc PREFIX=/usr/local/HAProxy SBINDIR=/usr/local/sbin ARCH=x86_64 # 安装 haproxy 并指定安装路径 make install PREFIX=/usr/local/HAProxy SBINDIR=/usr/local/sbin # 安装成功后可以查看是否安装在指定路径下 ls -l /usr/local/HAProxy/ ls -l /usr/local/sbin
(2)生成配置文件并配置启动脚本
默认情况下会加载/etc/haproxy/haproxy.cfg文件,也可以通过 -f 选项指定加载其他路径下的配置文件。在新版haproxy中,并不会给我们自动生成haproxy.cfg文件,我们把解压出来的haproxy源码包中的examples目录拷贝至/etc/haproxy/下
# 先创建 haproxy 配置目录 mkdir -p /etc/haproxy # 将 examples 下所有文件拷贝至 /etc/haproxy/ 下 # 需要首先切换到 haproxy 源码包解压后的路径下 这里安装自己的实际情况切换 cp -ar examples/* /etc/haproxy/ # 配置启动脚本 # 将 haproxy.init 复制到 /etc/init.d/haproxy下 cp examples/haproxy.init /etc/init.d/haproxy # 将 /etc/init.d/haproxy 文件赋权 chmod 755 /etc/init.d/haproxy # 由于我们编译指定了安装目录 这里需要修改一个配置 # 打开 haproxy 启动脚本 vim /etc/init.d/haproxy # 添加以下内容 BIN=/usr/local/sbin/$BASENAME
(3)修改配置文件
如果指定用户组、用户以及工作目录则根据自己需求执行以下代码
# 添加haproxy用户组和用户 groupadd haproxy useradd -g haproxy haproxy # 创建chroot运行的路径 mkdir /usr/share/haproxy
根据以上配置修改配置文件
#全局配置 global ## 定义全局的syslog服务器,最多可以定义2个 ### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别 log 127.0.0.1 local0 info ## 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行 ### chroot() 操作,可以提升 haproxy 的安全级别 chroot /usr/share/haproxy ## 同gid,不过这里为指定的用户组名 group haproxy ## 同uid,但这里使用的为用户名 user haproxy ## 设置haproxy后台守护进程形式运行 daemon ## 指定启动的haproxy进程个数, ### 只能用于守护进程模式的haproxy;默认为止启动1个进程, ### 一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式 nbproc 1 ## 设定每个haproxy进程所接受的最大并发连接数, ### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的 maxconn 4096 ## 进程文件(默认路径 /var/run/haproxy.pid) # pidfile /var/run/haproxy.pid ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时 ## node 、 description多节点是需根据实际情况进行修改 node haproxy_01 ## 当前实例的描述信息 description haproxy_01 #默认配置 defaults ## 继承global中log的定义 log global ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK) ### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接, #### 且不会对7层报文做任何类型的检查,此为默认模式 ### http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析, #### 所有不与RFC模式兼容的请求都会被拒绝 ### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接, #### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求 mode http #采用http日志格式 option httplog #当对server的connection失败后,重试的次数 retries 3 ## serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option redispatch ## 前端的最大并发连接数(默认为2000) ### 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列, ### 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。 ### 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB, ### 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 , ### 有着1GB的可用RAM空间时将维护40000-50000并发连接。 ### 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存, ### 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000 maxconn 2000 ## 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d) timeout connect 5000ms ## 客户端超时 timeout client 50000ms ## 服务器超时 timeout server 50000ms ## HAProxy的状态信息统计页面 listen admin_stats ## 绑定端口 bind :48800 ##统计页面 stats uri /admin-status ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可 stats auth admin:admin ## 监视器功能 ## 可使用 ip+port/monitoruri/ 进行访问 monitor-uri /monitoruri mode http ## 启用日志记录HTTP请求 option httplog ## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用 listen mycat_servers ## 绑定端口 bind :3307 mode tcp ## 记录TCP请求日志 option tcplog ## 是否允许向server和client发送keepalive option tcpka ## 后端服务状态检测 option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求 ### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用. ### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。 ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式 balance roundrobin server mycat_01 192.168.209.133:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 server mycat_02 192.168.209.134:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10 ## 格式:server
[:[port]] [param*] ### serser 在后端声明一个server,只能用于listen和backend区段。 ### 为此服务器指定的内部名称,其将会出现在日志及警告信息中 ### 此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址 ### [:[port]]指定将客户端连接请求发往此服务器时的目标端口,此为可选项 ### [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数: #### weight:权重,默认为1,最大值为256,0表示不参与负载均衡 #### backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server #### check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定 #### inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000, ##### 也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟 #### rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2) #### fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3) #### cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查, ##### 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久连接的功能 #### maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值, #####其将被放置于请求队列,以等待其他连接被释放
关闭防火墙
# 查看防火墙状态 systemctl status firewalld # 关闭防火墙 systemctl stop firewalld
开放端口
# 查看防火墙所有开放的端口 firewall-cmd --zone=public --list-ports # 开放48700端口 firewall-cmd --zone=public --add-port=48700/tcp --permanent # 配置立即生效 firewall-cmd --reload
默认情况下 haproxy是不记录日志的,如果需要记录日志,还需要配置系统的syslog,在linux系统中是rsyslog服务。syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。下面我们安装配置rsyslog服务,如果没有rsyslog服务需先安装该服务
# 通过yum安装rsyslog yum install rsyslog # 修改rsyslog配置文件 vim /etc/rsyslog.conf # 将以下配置注释打开 $ModLoad imudp $UDPServerRun 514 ##允许514端口接收使用UDP和TCP协议转发过来的日志, ##而rsyslog在默认情况下,正是在514端口监听UDP 确认 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf没有则增加上此配置
效果如下:
配置haproxy日志配置文件
# rsyslog服务会来此目录加载配置 cd /etc/rsyslog.d/ # 创建haproxy的日志配置文件 touch haproxy.conf # 打开haproxy.conf配置文件 vim /etc/rsyslog.d/haproxy.conf # 添加以下内容 # 如果不加上面的的"&~"配置则除了在/var/log/haproxy.log中写入日志外 # 也会写入/var/log/message文件中 local0.* /var/log/haproxy.log &~
效果如下:
# 配置保存后重启rsyslog服务 systemctl restart rsyslog.service # HAProxy服务启动后,日志会存储在/var/log/haproxy.log
配置系统内核的IP包转发功能
# 打开sysctl.conf配置文件 vim /etc/sysctl.conf net.ipv4.ip_forward = 1
效果如下:
# 使配置生效 sysctl -p
1首先需要启动haproxy服务
# 启动HAProxy service haproxy start # 使用MySQL客户端通过HAProxy连接Mycat mysql -uroot -p -h192.168.112.32 -P3307
2.如其他服务器或本地有MySQL,可通过已有的MySQL客户端进行连接测试
这里使用192.168.112.32服务器进行连接测试
3.通过Navicat工具进行测试
至此,Mycat连接测试完成,我们可以看到是可以正常连接的
并且可以通过haproxy负载均衡连接到mycat
# 切换至mycat日志目录
cd /usr/local/mycat/logs/
# 实时查看mycat日志
tail -f mycat.log
B服务器(192.168.112.28)连接Mycat服务器(192.168.112.29)
执行select查询语句,实时查看Mycat日志
多次测试,Mycat所打印的日志都显示读操作都路由到从节点(192.168.112.31)
执行insert插入语句,实施查看Mycat日志
多次测试,Mycat所打印的日志都显示写操作都路由到主节点(192.168.112.30)
http://192.168.112.32:48800/admin-status
账号密码为haproxy.cfg中配置的配置片段
listen admin_stats
## 绑定端口
bind :48800
##统计页面
stats uri /admin-status
## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats auth admin:admin
mode http
## 启用日志记录HTTP请求
option httplog
登录统计页面查看如下
至此。基于Haproxy负载均衡的Mycat读写分离配置全部完成。