Mysql数据库集群及高并发(mycat)

时间:2021-12-07 18:02:10

MySQL数据库集群和高并发 Mycat

MyCat简介:
java编写的数据库中间件
运行环境需要JDK
是中间件,运行在代码应用和Mysql数据库之间的应用
前身:corba,是阿里开发的数据库中间件,实现mysql数据库分库分表集群管理的中间件
使用mycat之后,编写的所有SQL语句,必须严格遵守SQL标准规范
insert into table_name(column_name) values(column_value);
如图:


应用----->mycat中间件------>数据库1
------>数据库2

MyCat术语简介:
1.切分:
逻辑上的切分,在物理层面,是使用多库(database),多表(table)实现的切分
1.1纵向切分:
注:假设数据库test,将test切分为test1,test2....test1+test2...=test的数据总和
把一个数据库切分成多个数据库,配置方便,只能实现两张表的表连接查询
1.2横向切分:
注:假设表test,共有20个字段,一个字段是主键pk,剩余19个字段,将他分为3张表test1:7;test2:8;test3:7,test1+test2+test3=22,因为他们都有一个相同的字段pk,所以总和多出两个字段
把一个表切分成多个表,相比纵向切分配置麻烦,无法实现连接查询
2.逻辑库:
注:假设有逻辑库s,那么他的数据可能是在物理中db1和db2中表现的,而s实际上并不存在
MyCat中定义的database是逻辑上存在的,但是物理上未必存在,主要是针对纵向切分提供的概念
2.1逻辑表:
注:逻辑表a,可能他的数据是表现在物理上的表a1,a2,a3...上的,实际上并不存在
MyCat中定义的table是逻辑上存在,物理上未必存在,主要是针对横向切分提供的概念
3.默认端口:8066
4.数据主机--dataHost:
物理MySQL存放的主机地址,可以使用主机名,ip,域名定义
5.数据节点--dataNode:
注:物理上存在的database
物理的database是什么,数据保存的物理节点就是database
6.分片规则:
当控制数据的时候,如何访问物理database和table
就是访问dataHost和dataNode的算法
在Mycat处理器具体的数据CRUD的时候,如何访问dataHost和dataNode的算法,如哈希算法,crc16算法等
Mysql:
主从备份:
就是一种主备模式的数据库应用
主库(master[Innodb:保证事务的高效性])数据与备库(slave[MyISAM:保证读取的高效性])数据完全一致
实现数据的多重备份,保证数据的安全。
可以在Master和Slave中使用不同的数据库引擎,实现读写的分离
1.mysql5.5版本后本身支持主从备份
在老旧版的mysql中不支持主从备份,需要安装额外的rpm包
如果需要安装rpm,只能在一个位置节点安装
2.主从备份的目的
2.1 实现主备模式:
保证数据的安全,尽量避免数据的丢失
2.2 实现读写分离:
使用不同的数据库引擎,实现读写分离,提高所有的工作效率
InnoDB使用DML语法操作,MyISAM使用DQL语法操作
2.3 主从备份效果:
所有对Master的操作,都会同步到Slave中
如果Master和Slave天生上环境不同,那么对Master的操作可能会在Slave中出现错误
如:
在创建主从模式之前,Master有database:db1,db2,db3
Slave有database:db1,db2创建主从模式,现在的情况Masterhe
和slave天生不同
主从模式创建成功后,在master中drop database db3.Slave中抛出数据库SQL异常,后续所有的命令不能同步
一旦出现错误,只能重新实现主从模式
3.主从备份配置:
主要操作Master和slave中的配置文件和DBMS的配置
配置文件:定义主从模式的基础信息,如:日志,命令等
DBMS配置:提供主从访问的用户,基础信息(Master和Slave的位置,用户名,密码,日志文件名等)等
建议:建立主从备份的mysql,最好原始环境一致,Database,table,data完全一致

3.1 Master主库配置
/etc/my.cnf
>> cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak # 备份
>> cp /root/my.cnf /etc/mysql/my.cnf
>> vi /etc/mysql/my.cnf # 修改
1.server-id:
要求:MYSQL服务唯一标识,是数字,自然数,配置的时候有要求
2.单机使用:server-id任意配置,只要是数字即可
3.主从使用:server-id master标识数字必须小于slave唯一表示数字
3.2 开启日志
本环境中的log_bin值:master_log
日志文件命名,开启日志功能,记录的是主库中执行的所有SQL命令的
mysql的log_bin不是执行日志,状态日志,是操作日志,就是在DBMS中所有的SQL命令,log_bin日志不是必要的,只有配置主从备份时才必要
3.2.1 日志文件配置:
变量的值就是日志文件名称,是在日志文件名称的主体
mysql数据库自动增减文件名后缀和文件类型
>> service mysqld restart
>> mysql -uroot -p
# 创建用户
在MySQL数据库中为不存在的用户授权就是同步创建用户并授权,此用户是从库访问使用的用户
ip地址不能写为%,因为主从备份中,当前创建的用户,是给从库slave访问主库
master使用的用户必须有指定的访问地址,不能是通用地址
~grant all privileges on *.* to 'slave'@'192.168.205.10' identified by 'slave' with grant option;
~flush privileges;
# 查看用户
~use mysql;
~select user,host from user;
# 查看master信息
~show master status;
3.3 slave库配置
修改salve配置:/etc/my.cnf
server_id :2
log_bin:可以使用默认值,也可以注释掉
修改uuid:可选,主从模式要求多个MySQL物理名称不能相同。即安装
MySQL的过程中,linux自动生成的物理标志,唯一物理标志命名为uuid保存位置是MySQL数据库的数据存放位置,默认为/var/lib/mysql目录中,文件名是auto.cnf
修改auto.cnf文件中的uuid数据,随意修改不建议改变数据长度,建议改变数据内容
/var/lib/mysql/auto.cnf
>>mysql -uroot -p
>>stop slave # 5.5以上都默认有slave功能但是他的默认
信息都是无效的信息
配置主库信息:
需要修改的数据是依据master信息修改的,ip是master
所在物理机ip,用户名和密码是master提供的slave访问用户名和密码
,日志文件是在master中查看的主库信息提供的,在master中使用的命令show master status查看日志文件名称
~change master to master_host='192.168.43.234', master_user='root'
,master_password='root',master_log_file=' master_log.master_log.000008';
~start slave;
~show slave status\G;

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.43.234
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master_log.000005
Read_Master_Log_Pos: 154
Relay_Log_File: wgw10-relay-bin.000002
Relay_Log_Pos: 335
Relay_Master_Log_File: master_log.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0 # 最近一次错误的id
Last_Error: # 最近一次错误的基础描述信息
Skip_Counter: 0 # 中断了多少次
Exec_Master_Log_Pos: 154
Relay_Log_Space: 508
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 # 最近一次io读取错误的编号
Last_IO_Error: # 最近一次io读取错误的描述
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 2f311669-a086-11e9-90d7-000c2990e912
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0

测试主从:
1.主从模式下的逻辑图:
软件应用 ====>master slave<--->IO操作/SQL操作<--io读取日志内容/得到sql命令--->log_bin日志
2.测试:
master:
~ create database test charset=utf8;
~ use test;
~ create table test_t(id int auto_increment primary key, name varchar(32));
~ create table test_t(id int auto_increment primary key, name varchar(32));

slave:
~ show databases;
~ use test;
~ show tables;
~ desc test_t;
~ select * from test_t;

MyCat搭建:

1.安装JDK
2.搭建主从备份(完成)
3.安装mycat
Mycat-server-1.4-beta-20150604171601-linux.tar.gz
>> tar -zxf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
>> cd mycat
>> mysql -uroot -p
~ grant all privileges on *.* to 'mycat'@'%' identified by 'mycat' with grant option;
~ flush privileges;
4.master提供可被mycat访问的用户
在mycat中通过master数据库的root用户访问master数据库
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
5.上传mycat
6.解压缩
7.mycat配置详解:
mycat的所有配置文件都在conf目录中
7.1 rule.xml
用于定义分片规则的配置文件
主要是查看,很少修改
mycat默认的分片规则:以500万为单位,实现分片规则
逻辑库A对应的dataNode-db1和db2.1-500万保存在db1中,
501万-1000万保存在db2中,1001万-1500万保存在db1中,
依次类推
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
crc32slot规则:在crud操作时,根据具体数据的crc32算法计算,数据应该保存在哪一个dataNode中,算法类似模运算
<tableRule name="crc32slot">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
7.2schema.xml
用于定义逻辑库和逻辑表的配置文件,在配置文件中可以定义读写分离
,逻辑库,逻辑表,dataHost,dataNode等信息
配置文件解释:
7.2.1标签schema:配置逻辑库的标签
7.2.2属性name:逻辑库名称
7.2.3实行checkSQLschema:
是否检测SQL语法中的schema信息,如
Mycat逻辑库名称A,dataNode名称B
SQL:select * from A.table;
checkSQLschema值是true,Mycat发送到数据库的SQL
是select * from table;
checkSQLschema值是false,发送的数据库SQL是
select * from A.table;
7.2.4 sqlMaxLimit
Mycat在执行SQL的时候,如果sql语法中没有limit子句,
避免一次行得到过多的数据,影响效率,limit子句的限制数量
默认为100,如果SQL中有具体的limit子句,当前属性失效
SQL:select * from table.mycat
# 解析后:select * from table limit 100
SQL:select * from table limit 10.mycat
# 不做任何操作修改
7.2.5 标签table:定义逻辑表的标签,如果需要定义多个逻辑表,
编写多个table标签要求逻辑表的名和物理表(MYSQL数据库中真是存在的表)的表名一致

7.2.6 属性name:逻辑表名
7.2.7 属性dataNode:
数据节点名称,配置文件中后续需要定义的标签(即物理数据库中的database名称),多个名称
使用逗号分隔,多个database定义后,代表分库
7.2.8 属性rule:
分片规则名称,具体的规则名称参考rule.xml配置文件
sql语句发送到mysql中后,mysql如何计算,应该将当前的sql发送到哪一个物理数据库管理系统或物理database中
7.2.9 标签dataNode:
定义数据节点的标签,定义具体的物理database信息的
7.2.10 属性name:
数据节点名称,是定义的逻辑名称,对应具体的物理数据库database
7.2.11 属性dataHost:
引用dataHost标签的name值,代表使用的物理数据库所在位置和配置信息
7.2.12 属性database:
在dataHost物理机中,具体的物理数据库database名称
7.2.13 dataHost标签:
定义数据主机的标签,就是物理MYSQL真实安装的位置
7.2.14 属性name:
数据节点名称,是定义的逻辑名称,对应具体的物理数据库database
7.2.15 属性maxcon/mincon:
最大/最小连接数
7.2.16 属性dbType:
数据库类型:mysql数据库
7.2.17 属性dbDriver:
数据库驱动类型,native,使用mycat提供的本地驱动
7.2.18 dataHost子标签writeHost:
写数据的数据库定义标签,实现读写分离操作
7.2.19 属性host
数据库命名
7.2.20 属性url
数据库访问路径
7.2.21 heartbeat
7.3 server.xml
配置mycat的对外服务策略

启动mycat:
bin/mycat start
停止命令:
bin/mycat stop
重启命令:
bin/mycat restart
查看mycat状态:
bin/mycat status
jps
访问方式:
命令行或者客户端
连接成功后,因为mycat只能访问mysqlde schema(database),
)不能自动创建逻辑库对应的物理层,且不能创建逻辑表对应的物理表
必须人工连接master数据库,手动创建database,
表格可以在mycat控制台创建,注意,在mycat控制台创建的表
,必须是schema.xml配置文件中定义过的逻辑表
命令行访问:
mysql -u 用户名 -p 密码 -hmycat 主机 IP -P8066
mysql -uroot -p123456 -h192.168.43.2 -P8066
连接成功后,可以当作MYSQL数据库使用
1.表约束
不能创建围在schema.xml中配置的逻辑表
不能创建
2.DML约束
尤其是新增:必须在insert into 语法后携带所有的字段名称,
至少携带主键名称,因为分片规则绝大多数是通过主键字段计算数据分派你规则的
查看Mycat日志:

分库配置:
/mycat/conf/schemal.xml # 配置逻辑库和逻辑表(和物理库和物理表的对应关系)

/mycat/conf/server.xml # port ,用户验证,用户授权

 

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.43.234:3306" user="root"
password="root" />
</dataHost>
</mycat:schema>

/mycat/conf/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="serverPort">8806</property><!--mycat服务端口号-->
<property name="managerPort">9066</property><!--Mycat管理端口号-->
<user name="root"><!--mycat用户名-->
<property name="password">密码</property>
<property name="schemas">用户可访问的逻辑库名,如果有多个逻辑库用逗号分隔</property>
<!--表级DML权限设置-->
<!--不检查权限
<privileges check="false">
<schema name="逻辑库名" dml="0110">
<table name="逻辑表名" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
<privileges>
-->
</user>

<user name="user"><!--其他用户名-->
<property name="password">密码</property>
<property name="schemas">可访问逻辑库名</property>
<property name="readOnly">是否只读</property>
</user>
</mycat:server>
"""
示例:
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>


>> /bin/mycat start
>> /bin/mycat status
>> /bin/mycat console # 如果出错的话查看错误原因
>> mysql -uroot -p123456 -h192.168.43.2 -P8066 #此时对于数据表不能做任何操作,需要添加真实的物理库,物理表
>> mysql -uroot -p
~show databases;
~create database db1 charset utf8;
~create database db1 charset utf8;
~create database db1 charset utf8;

# 测试mycat
----创建表格t_user
create table t_user(
id int not null,
name varchar(32),
password varchar(32),
age int(3),
primary key (id)
);
-----测试表格数据存储,
# coding:utf8
import MySQLdb

def test(num):

db = MySQLdb.connect(host="192.168.43.2",port=8066,passwd="123456",db="TESTDB",charset="utf8")
cursor = db.cursor()
for i in range(1000000):
num += i
cursor.execute("insert into t_user(id,name,password,age) values(%d,'a','a',20);"%num)
db.commit()
db.close()

if __name__ == "__main__":
num = 497524
test(num)
MyCat读写分离:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.43.2:3306" user="root" password="root">
# 读写分离
<readHost host="hostS1" url="192.168.43.1:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
Mycat管理MySQL集群配置和负载均衡配置
所有的集群配置,都必须配置多主多从模式。即多个master节点相互之间配置主从,
如:master1和slave1为第一组主从,master2和slave2为第二组主从,master1和
master2互为对方的主从

注:此方案缺陷可能有IO延迟问题
master1<-----互为主从----->master2
^ ^
| |
| |
| |
主从 主从
| |
| |
slave1 slave2
注意:crc32slot分片规则,在使用的时候要求必须先设置好分片规则,在启动mycat,
如果先启动了mycat,在设置分片规则,会导致分片规则失效,需要删除conf目录中的ruledata子目录。ruledata目录中会记录crc32slot的分片节点,日治文件命名
规则为crc32slot_表名
balance="1" # 代表写操作走writeHost,读操作走readHost
writeType="0" # 代表如何写,等于零代表以第一个节点为主,当第一个节点宕机自动跳转到第二个节点

switchType="1" # 代表选择的策略
slaveThreshold="100"

数据库负载均衡策略:
第一种配置方案:
即上面的方案
balance:
0: 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:全部的readHost与stand by writeHost参与select语句的负载均衡(常用)
2:所有读操作都随机的在writeHost,readHost上分发
3:所有读请求随机的分发到writeHost对应的readHost执行writeHost不负担读压力
writeType:
0:所有写操作发送到配置的第一个writeHost,第一个挂了,切换到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties(datanode index)
1:所有写操作都随机的发送到配置的writeHost。1.5以后废弃不推荐
switchType:
也涉及到读写分离问题,可以解决IO延迟问题
-1:表示不自动切换:如M1宕机会一直卡死不会切换到M2
1:默认值,表示自动切换
2:基于mysql主从同步的状态决定是否切换读写主机,心跳语句为:show slave status,当心跳检测获取的数据发现了IO的延迟则读操作自动定位到writeHost中。如果心跳检测获取的数据没有IO延迟,则读操作自动定位到readHost中。建议为不同的表格定位不同的dataHost节点。
第二种配置方案:

<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot"/>
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot"/>

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost2" database="db4" />
<dataNode name="dn5" dataHost="localhost2" database="db5" />
<dataNode name="dn6" dataHost="localhost2" database="db6" />

 

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave staus</heartbeat>
# 这里没有readHost,主从是根据心跳检测来决定的
<writeHost host="hostM1" url="192.168.43.1:3306" user="root" password="root"/>
<writeHost host="hostsS1" url="192.168.43.2:3306" user="root" password="root"/>
</dataHost>


<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave staus</heartbeat>
<writeHost host="hostM2" url="192.168.43.3:3306" user="root" password="root"/>
<writeHost host="hostS2" url="192.168.43.4:3306" user="root" password="root"/>
</dataHost>

Haproxy+Keepalived+MyCat+MySQL实现高可用集群:

主机分配:
master1/mycat1 -192.168.199.184
slave1/mycat2 - 192.168.199.116

master2 - 192.168.199.212
slave2 - 192.168.199.157

haproxy1 - 192.168.199.157
haproxy2 - 192.168.199.102

VIP - 192.168.199.190


应用版本:
Haproxy:haproxy-1.7.1.tar.gz
Keepalived:keepalived-1.2.18.tar.gz
Mycat:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

结构图:
参考结构图

搭建步骤:
1.配置MyCat状态检查服务:
在所有MyCat(192.168.199.184/192.168.199.116)服务所在主句中增加状态检查服务脚本。此操作为Haproxy提供对Mycat服务状态检查的依据。本案例中使用xinetd实现。通过xinetd,HaProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon。xinetd是新一代的网络守护进程服务程序,又叫做超级Internet服务器。经常用来管理多种轻量级Internet服务,xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)
1.1 安装xinetd
yum install -y xinetd
1.2 添加includedir/etc/xinetd.d
检查/etc/xinetd.conf的末尾是否有includedir /etc/xinetd.d。没有就加上
1.3 创建/etc/xinetd.d 目录
vi /etc/xinetd.d/mycat_status
1.4 增加Mycat存活状态检测服务配置
添加以下内容:
service mycat_status
{
flags = REUSE
## 使用该标记的socket_type为stream,需要设置wait为no
socker_type=stream ## 封包处理方式,Stream为TCP数据包
port=48700##服务监听端口
wait=no ## 表示不许等待,即服务将以多线程的方式运行
user=root ## 执行此服务进程的用户
server=/usr/local/bin/mycat_status ## 需要启动的服务脚本
log_on_failure += USERID ## 登录失败记录的内容
disable = no ## 要启动的服务,将此参数设置为no
}
1.5添加 /usr/local/bin/mycat_status服务脚本
# !/bin/bash
Mycat = '/root/upload/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.6给新增脚本赋予可执行权限
chmod 755 /usr/local/bin/mycat_status
1.7在/etc/services中加入mycat_status服务
vi /etc/services
在末尾加入:
mycat_status 48700/tcp # mycat_status

重启xinetd服务:
service xinetd restart
netstat -antup|grep 48700
1.8 测试脚本是否有效
/usr/local/bin/mycat_status
2.安装HAProxy:
注:安装在haproxy1 和 haproxy2两个节点主机中
2.1上传haproxy-1.7.1.tar.gz到Linux并解压安装包
tar -zxf haproxy-1.7.1.tar.gz
2.2安装编译依赖
yum install -y gcc-c++ pcre-devel zlib zlib-devel openssl openssl-devel
2.3编译:
>> cd haproxy-1.7.1
>> 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 这三个包需要安装不然不支持
2.4 创建安装目录
mkdir /usr/local/haproxy
2.5 执行安装
make install PREFIX=/usr/local/haproxy
2.6创建配置文件目录:
mkdir -p /usr/local/haproxy/conf
mkdir -p /etc/haproxy
2.7 添加配置文件并创建软连接
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
vi /usr/local/haproxy/conf/haproxy.cfg
# 官方配置文件解释为/usr/local/haproxy/configuration.txt
先跳过后面配置
2.8 拷贝错误页面资源并创建软连接
cp -r /root/upload/haproxy-1.7.1/examples/errorfiles /usr/local/haproxy/
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
2.9 拷贝开机启动文件,并赋予权限
cp /root/upload/haproxy-1.7.1/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy
3.0 添加HAproxy 命令脚本软连接
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
3.1 设置HAProxy开机启动
chkconfig --add haproxy
chkconfig haproxy on
HAProxy配置MyCat负载均衡集群
1.修改配置文件haproxy.cfg
1.1 192.168.199.157 -haproxy1 服务器配置
vi /usr/local/haproxy/conf/haproxy.cfg

注:haproxy1和haproxy2都要配置
2.为haproxy添加linux系统用户
groupadd haproxy
useradd -g haproxy haproxy
2.1 创建chroot运行的路径
mkdir /usr/share/haproxy
2.2开启rsyslog的haproxy日志记录功能
默认情况下,haproxy是不记录日志的,如果需要记录日志,还需要配置
系统的syslog,在linux系统中是rsylog服务。syslog服务器可以用作一个网络中的日志监控中心,rsylog是一个开源工具,被广泛用于linux系统以通过tcp/ucp协议转发或接收日志消息。安装配置rsylog服务:
yum install -y rsyslog ## 没安装的情况下执行安装
vi /etc/rsyslog.conf
把$ModLoad imdup 和 $UDPServerRun 514 前面的 # 去掉
$ModLoad imdup ##是模块名,支持UDP协议
$UDPServerRun 514 ## 允许514端口接收使用UDP和TCP协议转发过来的日志,
##而rsyslog在默认情况下,正是在514端口监听UDP
确认 ####GLOBAL DIRECTIVES####段中是否有 #IncludeConfig /etc/rsyslog.d/*.conf没有则加上

rsyslog服务会来此

cd /etc/rsyslog.d/
创建haproxy的日志配置文件
vi /etc/rsyslog.d/haproxy.conf
local0.* /var/log/haproxy.log

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


配置保存后重启rsylog服务
service rsyslog restart
等到HAProxy服务启动后,就能在/var/log/haproxy.log中看到日志了

2.3配置系统内核IP包转发规则
vi /etc/sysctl.conf
修改如下内容:
net.ipv4.ip_forward=1
是配置生效
sysctl -p
2.4启动haproxy
service iptables stop # 关闭防火墙
service haproxy start
ps -ef|grep haproxy
2.5查看haproxy提供的web统计应用
http://192.168.199.157:48800/admin-status
http://192.168.199.102:48800/admin-status
用户名和密码都是admin,参考/usr/local/haproxy/conf/haproxy.cfg配置文件
注意:安装一个Haproxy之后,可以通过mysql命令控制台直接测试访问HAProxy。命令:mysql -uroot -p123456 -h192.168.199.157 -P3307
3.安装Keepalived