04_MyCat 集群部署( HAProxy + MyCat)

二、 软件版本

操作系统: CentOS-6.6-x86_64
JDK 版本: jdk1.7.0_72
HAProxy 版本: haproxy-1.5.16.tar.gz
MyCat 版本: Mycat-server-1.4-release-20151019230038-linux.tar.gz
MySQL 版本: mysql-5.6.26.tar.gz

三、 部署环境规划

名称 IP 主机名 配置
HAProxy 主机 1 192.168.175.202 mini2 -
MyCat 主机 1 192.168.175.200 huachao -
MyCat 主机 2 192.168.175.201 mini1 -
MySQL 主节点 192.168.175.200 huachao -
MySQL 从节点 192.168.175.201 mini1 -

四、MyCat 集群部署架构图如下:


图解说明:
  HAProxy 负责将请求分发到 MyCat 上, 起到负载均衡的作用,同时 HAProxy 也能检测到 MyCat 是否存
活, HAProxy 只会将请求转发到存活的 MyCat 上。如果一台 MyCat 服务器宕机, HAPorxy 转发请求时不会转
发到宕机的 MyCat 上,所以 MyCat 依然可用。

五、 MyCat 节点 2 的部署

MyCat 主机 2( mini1, 192.168.175.201) 请参考02_MySQL主从复制 进行对等部署和做相应配置。
注意: huachao( 192.168.175.200) 和 mini1( 192.168.175.201) 中都要加上(或更新) 主机名映射配置

六、 配置 MyCat 状态检查服务( 在 MyCat 节点主机上配置)

  MyCat 服务主机( huachao、 mini1) 上需要增加 mycat 服务的状态检测脚本,并开放相应的检测端口,以提供给 HAProxy 对 MyCat 的服务状态进行检测判断。可以使用 xinetd 来实现,通过 xinetd,HAProxy 可以用 httpchk 来检测 MyCat 的存活状态。( xinetd 即 extended internet daemon, xinetd 是新一代的网络守护进程服务程序,又叫超级 Internet 服务器。经常用来管理多种轻量级 Internet 服务。xinetd 提供类似于 inetd+tcp_wrapper 的功能,但是更加强大和安全。 xinetd 为 linux 系统的基础服务)

  1. 如果 xinetd 还没有安装,可使用如下命令安装:
    # yum install xinetd
  2. 检查/etc/xinetd.conf 的末尾是否有 includedir /etc/xinetd.d ,没有就加上
    # vi /etc/xinetd.conf
  3. 检查 /etc/xinetd.d 目录是否存在,不存在刚创建
    # mkdir /etc/xinetd.d/
  4. 增加 MyCat 存活状态检测服务配置
    # touch /etc/xinetd.d/mycat_status
    # vi /etc/xinetd.d/mycat_status
    增加以下内容:
service mycat_status
{
  flags                 = REUSE
  socket_type           = stream
  port                  = 48700
  wait                  = no
  user                  = root
  server                =/usr/local/bin/mycat_status
  log_on_failure        += USERID
  disable               = no
}

各项配置解释如下,不能把下面带注释的配置复制到/etc/xinetd.d/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
}
  1. 添加 /usr/local/bin/mycat_status 服务脚本
    # touch /usr/local/bin/mycat_status
    # vi /usr/local/bin/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
  1. 给新增脚本赋予可执行权限
    # chmod a+x /usr/local/bin/mycat_status

  2. 在 /etc/services 中加入 mycat_status 服务
    # vi /etc/services
    在末尾加入:
    mycat_status 48700/tcp # mycat_status
    保存后, 重启 xinetd 服务
    # service xinetd restart

  3. 验证 mycat_status 服务是否成功启动
    # netstat -antup|grep 48700


    能看到上图这样的信息,说明服务配置成功。

  4. MyCat 服务主机的防火墙上打开 48700 端口
    # vi /etc/sysconfig/iptables
    增加:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 48700 -j ACCEPT
    保存后重启防火墙
    # service iptables restart
    脚本测试:
    # /usr/local/bin/mycat_status

七、 HAProxy 介绍

  HAProxy 官网: http://www.haproxy.org/
  HAProxy 各版本的官方文档: http://cbonte.github.io/haproxy-dconv/index.html
  HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
  HAProxy 目前主要有三个版本: 1.4、 1.5、 1.6, CentOS6.6 自带的 RPM 包为 1.5 的。
  HAProxy1.5 版开始, 支持 SSL、 DDoS 防护等功能,可看官网说明:version 1.5 : the most featureful version, supports SSL, IPv6, keep-alive, DDoS protection,etc...
  MyCat 官方推荐使用 HAProxy 做 MyCat 的高可用负载均衡代理。

八、 HAProxy 的安装( 192.168.175.202)

  1. 下载( 或上传) haproxy-1.5.16.tar.gz/usr/local/src, 解压安装
[root@mini2 ~]# cd /usr/local/src/
#wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.16.tar.gz
[root@mini2 src]# ll
total 1328
-rw-r--r--. 1 root root 1359008 Mar 16  2016 haproxy-1.5.16.tar.gz
[root@mini2 src]# tar -zxf haproxy-1.5.16.tar.gz 
[root@mini2 src]# ll
total 1332
drwxrwxr-x. 9 root root    4096 Mar 13  2016 haproxy-1.5.16
-rw-r--r--. 1 root root 1359008 Mar 16  2016 haproxy-1.5.16.tar.gz
[root@mini2 src]# cd haproxy-1.5.16
[root@mini2 haproxy-1.5.16]# less README
  1. 如需了解安装注意点,可查看 HAProxy 的软件说明
    [root@edu-haproxy-01 haproxy-1.5.16]# less README
    注意:按Q退出less命令

  2. 安装编译所需的依赖包
    # yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

  3. 编译
    # make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy
    ## TARGET 是指定内核版本,高于 2.6.28 的建议设置为 linux2628, Linux 操作系统内核版本查看命令# uname -r, ARCH 指定系统架构, openssl pcre zlib 这三个包需要安装不然不支持

  4. 创建安装目录 /usr/local/haproxy
    # mkdir /usr/local/haproxy

  5. 执行安装
    [root@mini2 haproxy-1.5.16]# make install PREFIX=/usr/local/haproxy

install -d "/usr/local/haproxy/sbin"
install haproxy "/usr/local/haproxy/sbin"
install -d "/usr/local/haproxy/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1
install -d "/usr/local/haproxy/doc/haproxy"
for x in configuration architecture haproxy-en haproxy-fr; do \
              install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \
      done
  1. 创建配置文件目录
    # mkdir -p /usr/local/haproxy/conf
    # mkdir -p /etc/haproxy/
  2. 从配置文件模版复制配置文件,并添加配置文件软连接
    # cp /usr/local/src/haproxy-1.5.16/examples/haproxy.cfg /usr/local/haproxy/conf/
    # ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
  3. 拷贝错误页面, 并添加目录软连接( HTTP 模式选配)
    # cp -r /usr/local/src/haproxy-1.5.16/examples/errorfiles /usr/local/haproxy/
    # ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
  4. 拷贝开机启动文件,并赋予可执行权限
    # cp /usr/local/src/haproxy-1.5.16/examples/haproxy.init /etc/rc.d/init.d/haproxy
    # chmod +x /etc/rc.d/init.d/haproxy
  5. 添加 haproxy 命令脚本软连接
    # ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
  6. 设置 HAProxy 开机启动
    # chkconfig --add haproxy
    # chkconfig haproxy on

九、 HAProxy 配置 MyCat 负载均衡集群

  HAProxy 支持 TCP(第四层)和 HTTP(第七层)应用的代理, 本节课程我们使用 HAProxy 来做 MyCat的负载均衡代理使用的是 TCP 模式。在 4 层模式下 HAProxy 仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy 会自动将该服务器摘除, 故障恢复后会自动将该服务器加入进来。

  1. 修改 haproxy.cfg 配置文件
    具体参数说明可参考官方配置文档 /usr/local/haproxy/doc/haproxy/configuration.txt 或 GitHub 连接: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
    # vi /usr/local/haproxy/conf/haproxy.cfg
###################################################################################################
##
## 龙果学院 http://www.roncoo.com , 《基于Dubbo的分布式系统架构视频教程》
## 吴水成,840765167@qq.com
##
###################################################################################################

## global配置中的参数为进程级别的参数,通常与其运行的操作系统有关
global
    log 127.0.0.1   local0  info ## 定义全局的syslog服务器,最多可以定义2个
    ### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别
    #log 127.0.0.1  local1 info
    chroot /usr/share/haproxy   ## 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行
                                ### chroot() 操作,可以提升 haproxy 的安全级别
    group   haproxy ## 同gid,不过这里为指定的用户组名
    user    haproxy ## 同uid,但这里使用的为用户名
    daemon  ## 设置haproxy后台守护进程形式运行
    nbproc  1   ## 指定启动的haproxy进程个数,
                ### 只能用于守护进程模式的haproxy;默认为止启动1个进程,
                ### 一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式
    maxconn 4096    ## 设定每个haproxy进程所接受的最大并发连接数,
                    ### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的
    # pidfile   /var/run/haproxy.pid    ## 进程文件(默认路径 /var/run/haproxy.pid)
    node    edu-haproxy-01  ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
    description edu-haproxy-01  ## 当前实例的描述信息

## defaults:用于为所有其他配置段提供默认参数,这默认配置参数可由下一个"defaults"所重新设定
defaults
    log global  ## 继承global中log的定义
    mode    http    ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK) 
    ### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接,
    #### 且不会对7层报文做任何类型的检查,此为默认模式
    ### http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析,
    #### 所有不与RFC模式兼容的请求都会被拒绝
    ### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接,
    #### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求
    option  httplog
    retries 3
    option redispatch   ## serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    maxconn 2000    ## 前端的最大并发连接数(默认为2000)
    ### 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,
    ### 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。
    ### 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB,
    ### 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 ,
    ### 有着1GB的可用RAM空间时将维护40000-50000并发连接。
    ### 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存,
    ### 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000
    timeout connect 5000ms  ## 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d)
    timeout client  50000ms ## 客户端超时
    timeout server  50000ms ## 服务器超时

## HAProxy的状态信息统计页面
listen admin_stats 
    bind    :48800  ## 绑定端口
    stats   uri /admin-status   ## 统计页面URI
    stats   auth admin:admin    ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
    mode    http
    option  httplog ## 启用日志记录HTTP请求

## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用
listen  mycat_servers
    bind    :3306  ## 绑定端口
    mode    tcp
    option  tcplog  ## 记录TCP请求日志
    option  tcpka   ## 是否允许向server和client发送keepalive
    option  httpchk OPTIONS * HTTP/1.1\r\nHost:\ www    ## 后端服务状态检测
    ### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求
    ### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用.
    ### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。
    balance roundrobin  ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式
    server  mycat_01 192.168.175.200:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
    server  mycat_02 192.168.175.201:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
    ## 格式:server <name> <address>[:[port]] [param*]
    ### serser 在后端声明一个server,只能用于listen和backend区段。
    ### <name>为此服务器指定的内部名称,其将会出现在日志及警告信息中
    ### <address>此服务器的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:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,
    #####其将被放置于请求队列,以等待其他连接被释放
  1. 根据以上 HAProxy 配置文件要求做以下配置
    (1)添加 haproxy 用户组和用户
    # groupadd haproxy
    # useradd -g haproxy haproxy
    (2)创建 chroot 运行的路径
    # mkdir /usr/share/haproxy
    (3)防火墙中打开 3306 端口和 48800 端口
    # vi /etc/sysconfig/iptables
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 48800 -j ACCEPT
    重启防火墙
    # service iptables restart

  2. 开启 rsyslog 的 haproxy 日志记录功能
      默认情况下 haproxy 是不记录日志的,如果需要记录日志,还需要配置系统的 syslog, 在 linux 系统中是 rsyslog 服务。 syslog 服务器可以用作一个网络中的日志监控中心, rsyslog 是一个开源工具,被广泛用于 Linux 系统以通过 TCP/UDP 协议转发或接收日志消息。 安装配置 rsyslog 服务:
    # yum install rsyslog ## 没安装的情况下执行安装
    # vi /etc/rsyslog.conf
    (1)把 $ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉
    $ModLoad imudp ## 是模块名,支持 UDP 协议
    $UDPServerRun 514
    允许 514 端口接收使用 UDP 和 TCP 协议转发过来的日志,而 rsyslog 在默认情况下,正是在 514 端口监听 UDP
    (2)确认 #### GLOBAL DIRECTIVES ####段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf 没有则增加上此配置, 增加后的效果:


    (3)# cd /etc/rsyslog.d/ ## rsyslog 服务会来此目录加载配置
    # touch haproxy.conf## 创建 haproxy 的日志配置文件
    # vi /etc/rsyslog.d/haproxy.conf
    增加以下内容:

local0.* /var/log/haproxy.log
&~

如果不加上面的的"&~"配置则除了在/var/log/haproxy.log 中写入日志外,也会写入/var/log/message文件中
(4)配置保存后重启 rsyslog 服务
# service rsyslog restart

Shutting down system logger: [ OK ]
Starting system logger: [ OK ]

(等到 HAProxy 服务启动后,就能在/var/log/haproxy.log 中看到日志了)

  1. 配置系统内核的 IP 包转发功能
    # vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    使配置生效
    # sysctl -p

  2. 启动 HAProxy
    # service haproxy start
    # ps -ef | grep haproxy

haproxy 23921 1 0 23:27 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p
/var/run/haproxy.pid
root 23924 23179 0 23:27 pts/1 00:00:00 grep haproxy
  1. 使用 MySQL 客户端通过 HAProxy 连接 MyCat
E:\MySQL-5.6.17-winx64\bin>mysql -uuser2 -proncoo.2 -h192.168.1.191 -P3306
mysql> show databases;
mysql> use rc_schema2;
mysql> show tables;
mysql> select * from edu_user;

写数据测试

mysql> insert into edu_user (userName, pwd) values('吴水成', 'roncoo.com');

然后查看 MySQL 中的数据库插入及数据同步情况。

  1. 登录 HAProxy 的状态信息统计页面
    http://192.168.175.202:48800/admin-status
    用户名和密码都是 admin, 对应的 haproxy.cfg 配置片段

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容