Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

时间:2023-12-13 09:09:32

文章目录

MyCat在MySQL主从复制的基础上实现读写分离

一、环境

操作系统:CentOS-6.6-x86_64-bin-DVD1.iso

JDK 版本:jdk1.7.0_45

MyCat 版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz

MyCat 节点 IP:192.168.1.203 主机名:edu-mycat-01 主机配置:4 核 CPU、4G 内存

MySQL 版本:mysql-5.6.26.tar.gz

主节点 IP:192.168.1.205 主机名:edu-mysql-01 主机配置:4 核 CPU、4G 内存

从节点 IP:192.168.1.206 主机名:edu-mysql-02 主机配置:4 核 CPU、4G 内存

二、依赖课程

《高可用架构篇–第 13 节–MySQL 源码编译安装(CentOS-6.6+MySQL-5.6)》 《高可用架构篇–第 14 节–MySQL 主从复制的配置(CentOS-6.6+MySQL-5.6)》 注意:上一节课中讲到的 MySQL 主从复制配置,在用 MyCat 做主从读写分离或其结合实际 项目场景应用中,主从复制配置还需要按实际需求情况进行调整。

(调整后的主从数据库 my.cnf 配置文件,随视频教程压缩包提供)

三、MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ )

MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 提供语句的分发 功能。MyCat1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠。

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

四、MyCat 的安装

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

# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=edu-mycat-01
# vi /etc/hosts
127.0.0.1 edu-mycat-01
192.168.1.203 edu-mycat-01
192.168.1.205 edu-mysql-01
192.168.1.206 edu-mysql-02

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

# vi /etc/profile
## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_72
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 用户并设置密码

# useradd mycat
# passwd mycat

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

$ tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

$ su root
Password:
# mv /home/mycat/mycat
# cd /usr/local/mycat/
# ll

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

5、设置 MyCat 的环境变量

# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile

五、配置 MyCat

1、在配置 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 等内容,

[mycat@edu-mycat-01 conf]$ cd /usr/local/mycat/conf/
[mycat@edu-mycat-01 conf]$ vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

//和mqsql中的database概念差不多,这里关联起来
<!-- 定义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="rc_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn2"></schema>
<schema name="pay_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn2"></schema>
<!-- 其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from
TESTDB.edu_user,此时会自动过滤TESTDB,SQL变为select * from edu_user,若不会出现上述写法,则可以关闭属性为false --> <!--sqlMaxLimit默认返回的最大记录数限制,MyCat1.4版本里面,用户的Limit参数会覆盖掉MyCat的sqlMaxLimit默认设置-->

//dataHost主机名字,database主机上的哪个数据库库
<!-- 定义MyCat的数据节点 -->
<!-- dataNode name="rc_dn1" dataHost="dtHost1" database="roncoo" / -->
<!-- dataNode name="pay_dn1" dataHost="dtHost1" database="edu_simple_pay" / -->
<dataNode name="rc_dn2" dataHost="dtHost2" database="roncoo"/>
<dataNode name="pay_dn2" dataHost="dtHost2" database="edu_simple_pay"/>
<!-- 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="www.roncoo.com" />
</dataHost>
-->

name名字maxCon最大连接数minCon最小连接数,其他参数,往下看,有解释
<!-- 使用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.1.205:3306" user="root" password="www.roncoo.com"/>
    <writeHost host="hostS2" url="192.168.1.206:3306" user="root" password="www.roncoo.com"/>
</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 主要用于设置系统变量、管理用户、设置用户权限等。

[wusc@edu-mycat-01 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="user2">
    <property name="password">roncoo.2</property>
    <property name="schemas">rc_schema2,pay_schema2</property>
</user>

//这里通过readOnly来限定只读权限
<!-- 用户3,只读权限-->
<user name="user3">
    <property name="password">roncoo.3</property>
    <property name="schemas">rc_schema2,pay_schema2</property>
    <property name="readOnly">true</property>
</user>
</mycat:server>

4、防火墙中打开 8066 和 9066 端口

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

[root@edu-mycat-01 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@edu-mycat-01 mycat]# service iptables restart

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

[mycat@edu-mycat-01 conf]$ vi /usr/local/mycat/conf/log4j.xml

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

6、启动 MyCat

[mycat@edu-mycat-01 bin]$ cd /usr/local/mycat/bin/

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

[mycat@edu-mycat-01 bin]$ ./mycat console

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

[mycat@edu-mycat-01 bin]$ ./mycat start
Starting Mycat-server...

(对应的,重启: mycat restart , 关闭: mycat stop )

7、MyCat 连接测试

(1) 如果本地Windows安装有MySQL,可以使用已有的mysql客户端远程操作MyCat

这里登录的用户是上面server.xml中定义的user2

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

(2) 如果为了方便,需要在MyCat主机上对MyCat进行操作(把MyCat当是本地MySQL来 操作),可以在 MyCat 节点主机上安装 MySQL 客户端:

[mycat@edu-mycat-01 bin]$ su root
[root@edu-mycat-01 bin]# yum install mysql

使用安装好的 mysql 客户端登录 MyCat

[mycat@edu-mycat-01 bin]$ mysql -uuser2 -proncoo.2 -h192.168.1.203 -P8066

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

[root@edu-mycat-01 mycat]# vi /etc/my.cnf
增加:
[client]
default-character-set=utf8

保存后再查询,乱码问题解决,如下:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

(3) 使用第三方MySQL管理客户端连接MyCat测试(navicat支持,MySQL-Front兼容性不太 好),以 navicat 为例:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

8、读写分离测试

(1) 监听 MyCat 日志

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

(2) 读测试

$ mysql -uuser2 -proncoo.2 -h192.168.1.203 -P8066
mysql> show databases;

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

mysql> use rc_schema2;

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

mysql> show tables;

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

mysql> select * from edu_user;

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

多次执行 select * from edu_user 语句,MyCat 打印出来的日志信息显示读操作请求都是路 由到 Slave 节点(192.168.1.206)。hosts2 即上面定义的dtHost2

(2) 写测试

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

综上,基于 MyCat 的读写分离集群配置成功

接下来计划课程:

MyCat 读写分离集群的主从容错(切换)、恢复;

MyCat 的高可用集群 HAProxy + Keepalived + MyCat;

敬请关注!

MyCat 集群部署(HAProxy + MyCat)

一、本节课程的依赖课程

《高可用架构篇–第 13 节–MySQL 源码编译安装(CentOS-6.6+MySQL-5.6)》 《高可用架构篇–第 14 节–MySQL 主从复制的配置(CentOS-6.6+MySQL-5.6)》 《高可用架构篇–第 15 节–MyCat 在 MySQL 主从复制基础上实现读写分离》

二、软件版本

操作系统: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.1.191 edu-haproxy-01 2 核、2G
MyCat 主机 1 192.168.1.203 edu-mycat-01 4 核、4G
MyCat 主机 2 192.168.1.204 edu-mycat-02 4 核、4G
MySQL 主节点 192.168.1.205 edu-mysql-01 4 核、4G
MySQL 从节点 192.168.1.206 edu-mysql-02 4 核、4G

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

图解说明:

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

五、MyCat 节点 2 的部署

MyCat 主机 2(edu-mycat-02,192.168.1.204)请参考《高可用架构篇–第 15 节–MyCat 在 MySQL 主 从复制基础上实现读写分离》进行对等部署和做相应配置。

注意:edu-mycat-01(192.168.1.203)和 edu-mycat-02(192.168.1.204) 中都要加上(或更新)主机名 映射配置。

# vi /etc/hosts
192.168.1.203 edu-mycat-01
192.168.1.204 edu-mycat-02
192.168.1.205 edu-mysql-01
192.168.1.206 edu-mysql-02

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

MyCat 服务主机(edu-mycat-01、edu-mycat-02)上需要增加 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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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,需要设置wait 为 no
socket_type	= stream ## 封包处理方式,Stream 为 TCP 数据包
port	= 48700 ## 服务监听端口
wait	= no	## 表示不需等待,即服务将以多线程的方式运行user
user    = root	## 执行此服务进程的用户
server	=/usr/local/bin/mycat_status	## 需要启动的服务脚本
log_on_failure += USERID	## 登录失败记录的内容
disable	= no	## 要启动服务,将此参数设置为 no
}

解释:

xinetd最终会监听端口48700,如果有请求就执行脚本/usr/local/bin/mycat_status

5、添加 /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没有启动就会返回1
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
//是0说明启动了
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、给新增脚本赋予可执行权限

# chmod a+x /usr/local/bin/mycat_status

7、在 /etc/services 中加入 mycat_status 服务

# vi /etc/services

在末尾加入:

mycat_status	48700/tcp
# mycat_status

保存后,重启 xinetd 服务

# service xinetd restart

8、验证 mycat_status 服务是否成功启动

# netstat -antup|grep 48700

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

9、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.1.191)

1、下载(或上传) haproxy-1.5.16.tar.gz 到 /usr/local/src,解压安装

[root@edu-haproxy-01 src]# cd /usr/local/src/
#wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.16.tar.gz
[root@edu-haproxy-01 src]# tar -zxvf haproxy-1.5.16.tar.gz
[root@edu-haproxy-01 src]# cd haproxy-1.5.16

2、如需了解安装注意点,可查看 HAProxy 的软件说明

[root@edu-haproxy-01 haproxy-1.5.16]# less README

3、安装编译所需的依赖包

# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

4、编译

# 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 这三个包需要安装不然不支持

5、创建安装目录 /usr/local/haproxy

# mkdir /usr/local/haproxy

6、执行安装

[root@edu-haproxy-01 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

7、创建配置文件目录

# mkdir -p /usr/local/haproxy/conf
//默认找配置文件是在/etc/haproxy/,将来通过软连接即可
# mkdir -p /etc/haproxy/

8、从配置文件模版复制配置文件,并添加配置文件软连接

# 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

9、拷贝错误页面,并添加目录软连接(HTTP 模式选配)

# cp -r /usr/local/src/haproxy-1.5.16/examples/errorfiles /usr/local/haproxy/
# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles

10、拷贝开机启动文件,并赋予可执行权限

# 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

11、添加 haproxy 命令脚本软连接

# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

12、设置 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
## 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),即图中的客户端request、dubbo服务等

### 其不能用于 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 请求

//这是设置当前HAproxy的端口为3306
//因为希望用户直接当做连接mysql
//这里指的前端后端,前端是客户端request、dubbo服务等,后端是指mycat
## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对 TCP 流量有用
listen mycat_servers
bind :3306 ## 绑定端口
mode tcp
option	tcplog	## 记录 TCP 请求日志
option	tcpka ## 是否允许向server 和client 发送 keepalive

/*
*重点,HAproxy是如何监控的
*/
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.1.203:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
server	mycat_02 192.168.1.204: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:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值, #####其将被放置于请求队列,以等待其他连接被释放



注意:多节点部署时 node 、 description 的值要做相应调整。

2、根据以上 HAProxy 配置文件要求做以下配置(1)添加 haproxy 用户组和用户

# groupadd haproxy
# useradd -g haproxy haproxy

(2)创建 chroot 运行的路径

# mkdir /usr/share/haproxy

(3)防火墙中打开 3306 端口和 48800 端口

3306是暴露给相对于前端,即客户端reqeust和dubbo访问的端口,48800是上面的配置中配置的,HAproxy的统计页面的端口。

# 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

3、开启 rsyslog 的 haproxy 日志记录功能

默认情况下 haproxy 是不记录日志的,如果需要记录日志,还需要配置系统的 syslog,在 linux 系统中是 rsyslog 服务。syslog 服务器可以用作一个网络中的日志监控中心,rsyslog 是一个开源工具,被广泛用于 Linux 系统以通过TCP/UDP 协议转发或接收日志消息。安装配置 rsyslog 服务:

# yum install rsyslog
## 没安装的情况下执行安装# vi /etc/rsyslog.conf

把 $ModLoad imudp 和 $UDPServerRun 514 前面的 # 去掉

$ModLoad imudp ## 是模块名,支持 UDP 协议
$UDPServerRun 514
##允许 514 端口接收使用UDP 和 TCP 协议转发过来的日志,
##而rsyslog 在默认情况下,正是在 514 端口监听UDP

确认 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf 没有则增加上此配置,增加后的效果:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

# cd /etc/rsyslog.d/		## rsyslog 服务会来此目录加载配置
# touch haproxy.conf	## 创建 haproxy 的日志配置文件
# vi /etc/rsyslog.d/haproxy.conf

增加以下内容:

//local0就是上面配置文件中的日志设备

local0.* /var/log/haproxy.log
&~
##如果不加上面的的"&~"配置则除了在/var/log/haproxy.log 中写入日志外,也会写入/var/log/message 文件中

配置保存后重启 rsyslog 服务

# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
(等到 HAProxy 服务启动后,就能在/var/log/haproxy.log 中看到日志了)

4、配置系统内核的 IP 包转发功能

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
使配置生效 # sysctl -p

5、启动 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

上面的/usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p 发现通过软连接找到了配置文件

6、使用 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;

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

写数据测试

mysql> insert into edu_user (userName, pwd) values('吴水成', 'roncoo.com');
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019032808021382.png)

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

8、登录 HAProxy 的状态信息统计页面http://192.168.1.191:48800/admin-status

用户名和密码都是 admin,对应的 haproxy.cfg 配置片段

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

十、MyCat 集群的高可用测试

(请看视频教程操作)

进入mycat的节点 /user/local/bin/mycat_status

发现两个mycat节点都是正常的

将203节点执行 mycat stop 关闭服务

再次执行 /user/local/bin/mycat_status 发现503 不可用了 ,另外一个还是可用的

通过HAproxy管理页面中可以看到503变成了红色的,宕掉了

将203 执行mycat start 重新启动

通过HAproxy管理页面中可以看到503变成了绿色的,恢复了

进入两个mycat节点的日志

tail -f mycat.log

在mysql执行写入操作,发现 204有日志变化,203没有,说明204在管理操作

关掉204

重复上一步操作,发现203日志有变化,说明到了203的mycat开始管理

至此说明HAproxy实现了mycat的高可用。

下一节课内容预告:

解决 HAProxy 节点的高可用问题:

MyCat 高可用负载均衡集群实现(HAProxy + Keepalived + MyCat),部署图如下:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

一、本节课程的依赖课程

《高可用架构篇–第 13 节–MySQL 源码编译安装(CentOS-6.6+MySQL-5.6)》 《高可用架构篇–第 14 节–MySQL 主从复制的配置(CentOS-6.6+MySQL-5.6)》 《高可用架构篇–第 15 节–MyCat 在 MySQL 主从复制基础上实现读写分离》 《高可用架构篇–第 16 节–MyCat 集群部署(HAProxy+MyCat)》

本节课程要解决的问题:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

二、软件版本

操作系统:CentOS-6.6-x86_64

JDK 版本:jdk1.7.0_72

Keepalived 版本:keepalived-1.2.18.tar.gz

HAProxy 版本:haproxy-1.5.16.tar.gz

MyCat 版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz MySQL 版本:mysql-5.6.26.tar.gz

三、部署环境规划

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

四、MyCat 高可用负载均衡集群部署架构图如下:

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

图解说明:

(1) HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡,而 HAProxy 自身的高可用则可以通过 Keepalived 来实现。因此,HAProxy 主机上要同时安装 HAProxy 和 Keepalived,Keepalived 负责为该服务 器抢占 vip(虚拟 ip,图中的 192.168.1.190),抢占到 vip 后,对该主机的访问可以通过原来的 ip (192.168.1.191)访问,也可以直接通过 vip(192.168.1.190)访问。

(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(edu-haproxy-02,192.168.1.192)请参考上一节课程《高可用架构篇–第 16 节-- MyCat 集群部署(HAProxy+MyCat)》对进行对等部署和做相应配置。

注意配置文件的调整:



多节点部署时 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相应调整。

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

六、Keepalived 介绍 (官网:http://www.haproxy.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.1.191、192.168.1.192) Keepalived ( http://www.keepalived.org/download.html

1、上传或下载 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.1.191)

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
router_id edu-haproxy-01 ## 标识本节点的字条串,通常为 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 {
//都设置为BACKUP,防止master节点宕掉重启后,重新抢占资源。
state BACKUP ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,
## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备 interface eth1 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1 virtual_router_id 91 ## 虚拟路由的 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.1.190 ## 虚拟 ip,可以定义多个,每行一个 }
}

(2)BACKUP 节点配置文件(192.168.1.192):

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
   router_id edu-haproxy-02
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 91
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.1.190
} }



特别注意:如果非抢占模式不生效,在 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)

这个ip不可用,keepalived之间的主从通讯就实现不了

# iptables -I INPUT -i eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth1 -d 224.0.0.0/8 -p vrrp -j ACCEPT
(eth1 为主机的网卡设备名称,生产环境服务器可以用独立网卡来处理组播和心跳检测等)
# 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
#!/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

八、Keepalived + Haproxy 的高可用测试

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

# service haproxy stop

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

2、关闭 192.168.1.191 中的 Keepalived,VIP(192.168.1.190)会被 192.168.1.192 抢占

# service keepalived stop

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

Keepalived 停止后,192.168.1.191 节点的网络接口中的 VIP(192.168.1.190)将消失

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

再通过 VIP 来访问Haproxy 集群,访问到的也是 192.168.1.192 http://192.168.1.190:48800/admin-status

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

3、重新启动 192.168.1.191 中的 Keepalived,vip(192.168.1.190)保留在 192.168.1.192 主机上,不会出现 191 启动抢占vip 的情况。

# service keepalived start

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

http://192.168.1.190:48800/admin-status

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

http://192.168.1.191:48800/admin-status

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

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

Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived