Mycat之——高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/76397064

本文是在博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》的基础上,实现高可用负载均衡,若还没有阅读博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》,请先阅读博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》。

一、本文要解决的问题


在博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》中,我们的架构图如下:

由上图可以看出,HAProxy存在单点隐患,一旦这个HAProxy服务宕机,那么整个服务架构将不可用。那么,如何解决HAProxy存在的单点隐患问题呢?这就是这篇博文要解决的问题。

二、软件版本


操作系统:CentOS-6.5-x86_64
JDK版本:jdk1.7.0_80
HAProxy版本:haproxy-1.5.19.tar.gz
Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-Linux.tar.gz (自行下载源码编译)
keepalived版本:keepalived-1.2.18.tar.gz
MySQL版本:mysql-5.6.32.tar.gz

三、部署规划


四、 Mycat 高可用负载均衡集群部署架构图

图解说明:
(1) HAProxy 实现了 Mycat 多节点的集群高可用和负载均衡, 而 HAProxy 自身的高可用则可以通过Keepalived 来实现。 因此, HAProxy 主机上要同时安装 HAProxy 和 Keepalived, Keepalived 负责为该服务器抢占 vip(虚拟 ip,图中的 192.168.209.130),抢占到 vip 后,对该主机的访问可以通过原来的 ip(192.168.209.135)访问,也可以直接通过 vip(192.168.209.130)访问。
(2) Keepalived 抢占 vip 有优先级, 在 keepalived.conf 配置中的 priority 属性决定。但是一般哪台主机上的 Keepalived服务先启动就会抢占到 vip,即使是 slave,只要先启动也能抢到(要注意避免 Keepalived的资源抢占问题)。
(3) HAProxy 负责将对 vip 的请求分发到 Mycat 集群节点上, 起到负载均衡的作用。 同时 HAProxy 也能检测到 Mycat 是否存活, HAProxy 只会将请求转发到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用集群中的一台服务器宕机, 集群中另外一台服务器上的 Keepalived会立刻抢占 vip 并接管服务, 此时抢占了 vip 的 HAProxy 节点可以继续提供服务。
(5) 如果一台 Mycat 服务器宕机, HAPorxy 转发请求时不会转发到宕机的 Mycat 上,所以 Mycat 依然可用。
综上: Mycat 的高可用及负载均衡由 HAProxy 来实现,而 HAProxy 的高可用,由 Keepalived 来实现。

五、 HAProxy 节点 2 的部署


HAProxy 主机 2(liuyazhuang136, 192.168.209.136)的安装部署请参考博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》,注意配置文件的调整:
多节点部署时 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相应调整。

HAProxy 主机 2(liuyazhuang136, 192.168.209.136)上的HAProxy配置如下:

## 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 liuyazhuang136 ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时

description liuyazhuang136 ## 当前实例的描述信息

## 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 ##统计页面

stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可

mode http

option httplog ## 启用日志记录HTTP请求

## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用

listen mycat_servers

bind :3307 ## 绑定端口

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.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 <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:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,

#####其将被放置于请求队列,以等待其他连接被释放


HAProxy 节点 1 的状态信息页:http://192.168.209.135:48800/admin-status

HAProxy 节点 2 的状态信息页:http://192.168.209.136:48800/admin-status

六、 Keepalived 介绍


官网: http://www.keepalived.org/

Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Haproxy 可以实现 web 前端服务的高可用。Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生。 MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。

七、 Keepalived 的安装(192.168.209.135、 192.168.209.136)


Keepalived (http://www.keepalived.org/download.html )

1、 上传或下载 keepalived
上传或下载 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目录

2、解压安装
安装 keepalived 需要用到 openssl

yum install gcc gcc-c++ openssl openssl-devel
cd /usr/local/src
tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install


3、 将 keepalived 安装成 Linux 系统服务
因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作
复制默认配置文件到默认路径

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/


复制 keepalived 服务脚本到默认的地址

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/


设置 keepalived 服务开机启动

chkconfig keepalived on


4、 修改 Keepalived 配置文件
(1) MASTER 节点配置文件(192.168.209.135)

! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
    router_id liuyazhuang135 ## 标识本节点的字条串,通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,
    ## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备
    interface eth3 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth3
    virtual_router_id 35 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,
    ## 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    priority 120 ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高
    nopreempt ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用
    advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s
    ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111 ## 真实生产,按需求对应该过来
    }
    ## 将 track_script 块加入 instance 配置块
    track_script {
        chk_haproxy ## 检查 HAProxy 服务是否存活
    }
    ## 虚拟 IP 池, 两个节点设置必须一样
    virtual_ipaddress {
        192.168.209.130 ## 虚拟 ip,可以定义多个,每行一个
    }
}
(2)BACKUP 节点配置文件(192.168.209.136) 
! Configuration File for keepalived
global_defs {
    router_id liuyazhuang136
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth3
    virtual_router_id 35
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.209.130
    }
}


特别注意: 如果非抢占模式不生效, 在 Keepalived 的故障节点恢复后会再次导抢占 vip,从而因 vip 切换而闪断带来的风险(视频解说)。 按以上配置,配置了 Keepalived 非抢占模式, 配置及注意点如下:
(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 主设备、从设备中都不要配置 mcast_src_ip (本机 IP 地址)
(3) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否则非抢占不起作用
(4) 防火墙配置允许组播(主、备两台设备上都需要配置, keepalived 使用 224.0.0.18 作为 Master 和Backup 健康检查的通信 IP)

iptables -I INPUT -i eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -I OUTPUT -o eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT


(eth3 为主机的网卡设备名称,生产环境服务器可以用独立网卡来处理组播和心跳检测等)

service iptables save


重启防火墙:

service iptables restart


5、 编写 Haproxy 状态检测脚本
我们编写的脚本为/etc/keepalived/haproxy_check.sh (已在 keepalived.conf 中配置)
脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。

# mkdir -p /usr/local/keepalived/log
# vi /etc/keepalived/haproxy_check.sh

haproxy_check.sh脚本内容如下:

#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi


保存后,给脚本赋执行权限: 

chmod +x /etc/keepalived/haproxy_check.sh


6、 启动 Keepalived

service keepalived start


Starting keepalived: [ OK ]
Keepalived 服务管理命令:
停止: service keepalived stop
启动: service keepalived start
重启: service keepalived restart
查看状态: service keepalived status

八、MyCat的安装


1、设置MyCat的主机名和IP与主机名的映射

vi /etc/sysconfig/network


NETWORKING=yes
HOSTNAME=liuyazhuang133

vi /etc/hosts


127.0.0.1 liuyazhuang133
192.168.209.131 liuyazhuang131
192.168.209.132 liuyazhuang132
192.168.209.133 liuyazhuang133


2、配置Java环境变量
因为MyCat是用Java开发的,因此MyCat运行需要安装JDK(准确来说是JRE就够了),并且需要JDK1.7或以上版本

vi /etc/profile
## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
source /etc/profile
java -version


3、上传安装包
上传Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz 到 MyCat服务器中的/home/mycat目录,并解压并移动到 /usr/local/mycat目录

tar -zxvf Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz
mv /home/mycat/mycat  /usr/local/
cd /usr/local/mycat/
ll

 

4、设置Mycat的环境变量
 

vi /etc/profile

 

## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

 

source /etc/profile、


四、配置MyCat


1、确认MySQL主从复制正常
在配置MyCat前,请确认MySQL的主从复制安装配置已完成并正常运行。MySQL主从数据的同步在MySQL中配置,MyCat不负责数据同步的问题。
补充:
(1) MySQL主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客户端中设置 set global log_bin_trust_function_creators = 1;
(2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。
(3) Linux版本的MySQL,需要设置为MySQL大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。
2、配置MyCat的schema.xml
schema.xml是MyCat最重要的配置文件之一,用于设置MyCat的逻辑库、表、数据节点、dataHost等内容,

[root@liuyazhuang133 conf]$ cd /usr/local/root/conf/
[root@liuyazhuang133 conf]$ vi schema.xml

 

<?xml version="1.0"?>
 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 
<mycat:schema xmlns:mycat="http://org.opencloudb/">
 
      <!-- 定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->
 
      <!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema -->
 
        <!--schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema-->
 
      <schema name="lyz_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn1"></schema>
 
      <schema name="lyz_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn2"></schema>
 
        <!-- 其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.edu_user,此时会自动过滤TESTDB,SQL变为select * from edu_user,若不会出现上述写法,则可以关闭属性为false -->
 
        <!--sqlMaxLimit默认返回的最大记录数限制,MyCat1.4版本里面,用户的Limit参数会覆盖掉MyCat的sqlMaxLimit默认设置-->
 
      <!-- 定义MyCat的数据节点 -->
 
      <dataNode name="lyz_dn1" dataHost="dtHost2" database="lyzdb1" />
 
      <dataNode name="lyz_dn2" dataHost="dtHost2" database="lyzdb2" />
 
    <!-- dataNode 中的 name 数据表示节点名称, dataHost表示数据主机名称, database表示该节点要路由的数据库的名称 -->
 
 
 
      <!-- dataHost配置的是实际的后端数据库集群(当然,也可以是非集群) -->
 
      <!-- 注意:schema中的每一个dataHost中的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象 -->
 
      <!-- 定义数据主机dtHost1,只连接到MySQL读写分离集群中的Master节点,不使用MyCat托管MySQL主从切换 -->
 
      <!--
      <dataHost name="dtHost1" maxCon="500" minCon="20" balance="0"
           writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
           <heartbeat>select user()</heartbeat>
           <writeHost host="hostM1" url="192.168.1.205:3306" user="root" password="lyz" />
      </dataHost>
      -->
 
      <!-- 使用MyCat托管MySQL主从切换 -->
 
      <!-- 定义数据主机dtHost2,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->
 
      <dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"
 
           writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
 
           <!-- 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->
 
           <heartbeat>show slave status</heartbeat>
 
           <!-- can have multi write hosts -->
 
           <writeHost host="hostM2" url="192.168.209.131:3306" user="root" password="root" />
 
           <writeHost host="hostS2" url="192.168.209.132:3306" user="root" password="root" />
 
      </dataHost>
 
      <!-- 参数balance决定了哪些MySQL服务器参与到读SQL的负载均衡中 -->
 
        <!-- balance="0",为不开启读写分离,所有读操作都发送到当前可用的writeHost上-->
 
      <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
 
      <!-- balance="2",所有读操作都随机的在writeHost、readHost上分发-->
 
      <!-- MyCat1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在MyCat里配置为两个writeHost并设置balance="1" -->
 
      <!-- writeType="0",所有写操作都发送到可用的writeHost上 -->
 
      <!-- writeType="1",仅仅对于galera for mysql集群这种多主多节点都能写入的集群起效,此时Mycat会随机选择一个writeHost并写入数据,对于非galera for mysql集群,请不要配置writeType=1,会导致数据库不一致的严重问题 -->
 
</mycat:schema>


MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
MyCat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性:switchType="2" 与 slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,MyCat心跳机制通过检测 show slave status 中的
"Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master 大于slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。
3、配置 server.xml
server.xml 主要用于设置系统变量、管理用户、设置用户权限等。

[root@liuyazhuang133 conf]$ vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE mycat:server SYSTEM "server.dtd">
 
<mycat:server xmlns:mycat="http://org.opencloudb/">
 
      <system>
 
        <property name="defaultSqlParser">druidparser</property>
 
        <property name="charset">utf8mb4</property>
 
          <!-- <property name="useCompression">1</property>-->
 
          <!--1为开启mysql压缩协议-->
 
          <!-- <property name="processorBufferChunk">40960</property> -->
 
          <!--
          <property name="processors">1</property>
          <property name="processorExecutor">32</property>
           -->
 
               <!--默认是65535 64K 用于sql解析时最大文本长度 -->
 
               <!--<property name="maxStringLiteralLength">65535</property>-->
 
               <!--<property name="sequnceHandlerType">0</property>-->
 
               <!--<property name="backSocketNoDelay">1</property>-->
 
               <!--<property name="frontSocketNoDelay">1</property>-->
 
               <!--<property name="processorExecutor">16</property>-->
 
               <!-- <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
                      <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
                     <property name="processors">32</property> <property name="processorExecutor">32</property>
                     <property name="serverPort">8066</property> <property name="managerPort">9066</property>
                     <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
                     <property name="frontWriteQueueSize">4096</property>
                <property name="processors">32</property>
               -->
 
          </system>
 
          <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为MySQL主从复制配置中的Master节点,没实现读写分离,读写都在该Master节点中进行  -->
 
          <!--
          <user name="user1">
               <property name="password">roncoo.1</property>
               <property name="schemas">rc_schema1,pay_schema1</property>
          </user>
          -->
 
          <!-- 用户2,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->
 
          <user name="lyz">
 
               <property name="password">lyz.123</property>
 
               <property name="schemas">lyz_schema1,lyz_schema2</property>
 
          </user>
 
          <!-- 用户3,只读权限-->
 
          <user name="userlyz">
 
               <property name="password">lyz.123</property>
 
               <property name="schemas">lyz_schema1,lyz_schema2</property>
 
               <property name="readOnly">true</property>
 
          </user>
 
</mycat:server>


4、防火墙中打开8066和9066端口
MyCat的默认数据端口为8066,mycat通过这个端口接收数据库客户端的访问请求。
管理端口为9066,用来接收mycat监控命令、查询mycat运行状况、重新加载配置文件等。

[root@liuyazhuang133 mycat] vi /etc/sysconfig/iptables


增加:

## MyCat
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT


重启防火墙:

[root@liuyazhuang133 mycat] service iptables restart


5、修改log日志级别为debug
修改log日志级别为debug,以便通过日志确认基于MyCat的MySQL数据库集群读写分离的数据操作状态(可以在正式上生产前改成info级别)

[root@liuyazhuang133 conf]$ vi /usr/local/mycat/conf/log4j.xml

6、启动root

[root@liuyazhuang133 bin]$ cd /usr/local/root/bin/


(1) 控制台启动,这种启动方式在控制台关闭后,root服务也将关闭,适合调试使用:

[root@liuyazhuang133 bin]$ ./root console


(2) 可以采用以下后台启动的方式:

[root@liuyazhuang133 bin]$ ./root start


Starting root-server...
(对应的,重启: root restart , 关闭: root stop )
7、MyCat连接测试
(1) 如果本地Windows安装有MySQL,可以使用已有的mysql客户端远程操作Mycat


(2) Nativecat连接Mycat

8、读写分离测试
(1) 监听MyCat日志

[root@liuyazhuang133 ~]$ cd /usr/local/mycat/logs/
[root@liuyazhuang133 logs]$ tail -f mycat.log


(2) 读测试

$ mysql -uuserlyz -plyz.123 -h192.168.209.233 -P8066
mysql> show databases;

mysql> use lyz_schema2;

mysql> show tables;

mysql> select * from lyz_user_02;

执行上面的查询语句,此时对应的MyCat日志信息如下:


多次执行 select * from lyz_user_02 语句,Mycat打印出来的日志信息显示读操作请求都是路由到Slave节点(192.168.209.132)

(2) 写测试

mysql> insert into lyz_user_02 (userName, pwd) values('liuyazhuang', 'lyz。123');

执行上面的新增插入语句后,此时对应的Mycat日志信息如下:

多次执行以上插入语句,发现新增数据都是从 Master节点(192.168.209.131)插进入的,并且Slave节点通过Binlog同步了Master节点中的数据。

 

九、 Keepalived + Haproxy 的高可用测试


1、 关闭 192.168.209.135 中的 Haproxy, Keepalived 会将它重新启动

service haproxy stop

2、 关闭 192.168.209.135 中的 Keepalived, VIP(192.168.209.130) 会被 192.168.209.136 抢占

service keepalived stop

由上图可知:Keepalived 停止后, 192.168.209.135 节点的网络接口中的 VIP(192.168.209.130) 将消失

此时,由上图可知:在192.168.209.136节点的网络接口中会出现 VIP(192.168.209.130)。

查看此时 VIP 对应的 MAC, Windows 下使用 CMD 命令查看: 


说明此时 VIP 已经漂移到物理主机 192.168.209.136上了

再通过 VIP(192.168.209.130) 来访问 Haproxy 集群, 访问到的也是 192.168.209.136

3、 重新启动 192.168.209.135 中的 Keepalived
重新启动 192.168.209.135 中的 Keepalived, vip(192.168.209.130)保留在 192.168.209.136 主机上, 不会出现 135 启动抢占 vip 的情况。

service keepalived start

4、 模拟抢占了 vip 的节点(192.168.209.136) 中的 HAProxy 故障或启动失败


方式:把 192 节点中的 haproxy.cfg 文件重命名为 haproxy.cfg_bak, 并把 haproxy 服务进行 kill 掉,此时 keepalived 会尝试去启动 haproxy,会由于找不到配置文件而启动失败,此时就会进行 haproxy_check.sh脚本中的 killall keepalived 命令,结束 keepalived 进行。随后就是 192.168.209.135 节点重新抢占 vip


说明此时 VIP 已经漂移到物理主机 192.168.209.135上了

再通过 VIP(192.168.209.130) 来访问 Haproxy 集群, 访问到的也是 192.168.209.135

十、 通过 vip 访问数据库、验证 vip 切换后的数据库访问


1、命令行访问数据库


2、Navicat访问数据库

至此,Mycat高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)搭建完毕

十一、温馨提示


大家可以到链接http://download.csdn.net/detail/l1028386804/9915621下载搭建Mycat高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)使用的Keepalived


--------------------- 
作者:冰 河 
来源:CSDN 
原文:https://blog.csdn.net/l1028386804/article/details/76397064

原文:https://blog.csdn.net/l1028386804/article/details/75269196  
版权声明:本文为博主原创文章,转载请附上博文链接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章