mycat和mysql搭建高可用企业数据库集群
mycat 基础
mycat 作用
当 mysql 为 1主一从的时候,mycat 支持写DB高可用,即当主挂了,那么可以写入从数据库中
将数据库看出一个蛋糕: 垂直切分,类似 上下切,水平就是 左右切
每个数据库库连接数是有限的,如果连接满了之后,那么后续的连接就连接不上了。用了mycat 之后,mycat 有一个 总的连接池,
可以很好的控制连接数量,让应用更加的稳定。
mycat 的基本元素
ER关系表就是 mycat 特有的表 。 即用于 将 主表与 子表的 有关联的数据都 存在同一个库里面,比如 订单表与订单明细表
mycat 安装
http://www.mycat.org.cn/
http://dl.mycat.org.cn/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
下载解压之后, 启动之前可以在 conf 下面进行配置vi wrapper.conf 比如配置内存大小等
wrapper.java.additional.5=-XX:MaxDirectMemorySize=800M
还有就是配置环境变量 如上图
启动: mycat start
mycat 核心配置
配置文件关系
server.xml
即 配置访问真实数据库的用户名密码等的配置
同一个用户配置多个数据库, 在 schemas 配置多个即可:
授予用户某些表的访问权限:
dml 的值 有1 就是对应的有权限,否则就是没有权限
执行加密,将加密串放入配置文件的密码里面即可。这样密码就不显示明文密码了 。
0 表示通过mycat 访问的都加密,即 前端加密。 如下配置:
log4j2.xml
rule.xml
property 就是对应分片算法的执行的 参数
常用分片算法
即某些列的值不少整数,因此转为 正数 这样就是 简单的取模算法一样了
比如:可以用于 按地区 存入不同数据库中
partition-hash-int.txt 位于 conf 目录里面 。数据库索引从0开始
即取 字母的 阿斯特码的值来进行计算的
patternValue 取模基数
schema.xml
一个逻辑库 可能 对应 多个真实的物理数据库,可以看作为其视图
即如果查询的SQL 没有 加上 limit ,那么mycat 会自动加上 limit 来限制返回的行数
mycat 是推荐 checkSQLschema 设置为true的,即mycat 不支持 跨多个 数据库 查询的。比如 select db01.cat, db02.cat
即 可能 库名加上 表名方式查询 可能会报错的 .如果 checkSQLschema=true 那么mycat 会自动将 sql 中带上 库名+表名的 方式 给去调 库名
table 标签
逻辑表的主键 就是对应数据库表的主键名
dataNode 多个 以逗号分隔,索引从 0开始, 一旦配置好之后,就不要进行修改了,否则 容易产生数据混乱
dataNode 标签
dataHost 标签
dataHost 就是一组的 数据库集群
stand by writeHost 即双主 数据库(比如 互为主从) 这种情况
switchType 开可用 配置 ,1 当数据库某个挂了,自动切换 。 -1 就不自动切换
writeType 写操作类型 : 0,1 。 当是0 就是 所有写请求由第一个 writeHost 来执行,除非第一个挂了,才会切换到其他可以写的 主机上。 1就是随机发生写请求到writeHost . 一般设置为0 ,除非是支持多写的数据库集群类型
heartbeat 标签
心跳检查的语句 。
writehost 标签
writehost 一般是 主, readHost 一般是从
这里还不支持加密的密码
schema demo
在 dataHost 中,1.3 与1.4 是主从关系, 当 1.3 挂了,那么1.4 就可以处理读写请求了 。否则 1.3 负责写请求,1.4 负责读请求
垂直分库
一般是先垂直分库,后续数据量还是太大就进行水平 分库
一般是 写负载大,才有必要进行垂直分库的
mysql 复制的步骤
备份
将备份的数据库SQL 在新的 数据库里面比如 order_db 里面 执行。
接着 在原数据库 建立主从同步账号,同步数据到 新的order_db 里面 。 这样可以切换的更快,而不让数据库停止服务太久
接着 在 新的数据库比如 order_db 里面,建立 同步数据传输链路
-- CHANGE MASTER TO MASTER_LOG_FILE="mysql-bin.000001", MASTER_LOG_POS=4532519;
可以在 之前的原数据库的备份sql文件 可以找到
因为 原来的数据库名是 imooc_db 与 新的order_db 名称不一样,要主从同步数据,还得建立 主从复制过滤,
接着启动复制链路
备份复制总结
master-data 就是 备份对应 事务级别的数据
垂直切分步骤
schema :
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
<!-- 逻辑表名必须与实际表名一样 . 只能一张一张表的配置 -->
<table name="order_master" dataNode="orderdb" primaryKey="order_id" />
<table name="product_info" dataNode="productdb" primaryKey="product_id" />
<table name="customer_login" dataNode="customerdb" primaryKey="customer_id" />
</schema>
<dataNode name="orderdb" dataHost="mysqlorder" database="mycat_order_db" />
<dataNode name="productdb" dataHost="mysqlproduct" database="mycat_product_db" />
<dataNode name="customerdb" dataHost="mysqlcustomer" database="mycat_customer_db" />
<dataHost name="mysqlorder" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="mysqlproduct" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<!-- 读写都是使用这个数据库 -->
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
server:
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">64k</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</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="charset">utf8</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">imooc_db</property>
</user>
</mycat:server>
启动mycat ,然后就可以 通过 mysql 客户端连接mycat 进行测试查询了
https://blog.csdn.net/qq_35890572/article/details/81162110
但是垂直分库的查询, 是不支持 跨库 多表查询的 。
那么如果要跨库 多表查询,要么就 把表都搞到同一个库里面,
要么 就 配置全局表(比如 字典表,及全局表都存在所有的 数据库里面,mycat 会进行维护的,采用多写方式保证每个库的全局表数据一致) 。
清理多余数据
当 配置并启动了 使用了mycat 之后,就得停止 主从同步了
在 order db , product db ,coustomer db 的数据库中,删除 其他不相关的表,比如 order db删除 用户表。
跨分片(跨库查询): 配置全局表
全局表适合于小表,如果是大表,那么维护麻烦,且查询性能也不会高
在 schema.xml 中 配置 region_info 作为全局表 比如
<table name="region_info" primaryKey="region_id"
dataNode="orderdb,productdb,customerdb" type="global"
/>
也就是 region_info 表需要在所有的分库里面
UPDATE region_info set region_name="中华" where region_id=1;
经过使用mycat 更新全局表发现 每个 分库的表都更新了,即mycat 维护了全局表
垂直切分的优缺点
水平分库
水平切分,一般是 对某个表或者某些相关的表 进行水平切分就解决问题了 。 很少表才需要切分而已(一般是大表,且读写非常频繁的) 。
(某些表数据很大,可以将其数据放入历史表中进行归档即可,就不用水平切分了)
水平切分比垂直切分复杂多了
分片步骤
如何选择分片键
很少用订单id 去查询订单信息,因此不作为分配键
部署分片集群步骤
rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="order_master">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
</mycat:rule>
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<!-- 序列号类型值: 0,1 ,2,3,4
0 就是以本地文件的方式生成全局序列号
1 就是数据库方式
2 就是时间戳的方式
3 就是 zookeeper 的方式
-->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1开启 0关闭
-->
<property name="useOffHeapForMerge">1</property>
<!--
单位为m
-->
<property name="memoryPageSize">64k</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</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="charset">utf8</property>
</system>
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">imooc_db</property>
</user>
</mycat:server>
schema.xml :
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
<!-- 逻辑表名必须与实际表名一样 . 只能一张一张表的配置 -->
<table name="order_master" dataNode="orderdb01,orderdb02" primaryKey="order_id"
rule="order_master" />
<table name="product_info" dataNode="productdb" primaryKey="product_id" />
<table name="customer_login" dataNode="customerdb" primaryKey="customer_id" />
<table name="region_info" primaryKey="region_id"
dataNode="orderdb,productdb,customerdb" type="global"
/>
</schema>
<dataNode name="orderdb" dataHost="mysqlorder" database="mycat_order_db" />
<dataNode name="productdb" dataHost="mysqlproduct" database="mycat_product_db" />
<dataNode name="customerdb" dataHost="mysqlcustomer" database="mycat_customer_db" />
<dataNode name="orderdb01" dataHost="mysqlorder" database="mycat_order_db01" />
<dataNode name="orderdb02" dataHost="mysqlproduct" database="mycat_order_db02" />
<dataHost name="mysqlorder" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="mysqlproduct" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
mycat 全局自增id 配置
比如订单表分表之后,由于订单id是自增的,因此有id 重复的数据,因此可以采用mycat 的全局自增id 去避免
在server.xml 中
<!-- 序列号类型值: 0,1 ,2,3,4
0 就是以本地文件的方式生成全局序列号
1 就是数据库方式
2 就是时间戳的方式
3 就是 zookeeper 的方式
-->
<property name="sequnceHandlerType">1</property>
这里以数据库的方式来使用
在 mycat 的conf 下面有 dbseq.sql 就是用到 自增功能的建表语句,执行它 。mycat_sequence 就是用到的辅助表
在 schema.xml 中配置 辅助表用到逻辑库
<dataNode name="mycat" dataHost="mycatIDAuto" database="mycat_sequence" />
<dataHost name="mycatIDAuto" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
接着 在conf 下修改 vi sequence_db_conf.properties
#sequence stored in datanode
# 注意 key 使用大写字母
GLOBAL=mycat
ORDER_MASTER=mycat
接着在 自增用到的数据库里面 增加一条记录 , name 对应配置文件的key
这样自增就取name = ORDER_MASTER 的 这条记录开始了
在 schema.xml 中配置 用到全局自增id的表 autoIncrement="true"
<table name="order_master" dataNode="orderdb01,orderdb02" primaryKey="order_id"
rule="order_master" autoIncrement="true" />
插入订单表数据的时候, order_id 就生效了全局id 了
ER分片
分片之后,联合查询 不行,因此 得配置 订单的 明细表 order_detail 的ER分片关系才行。即对 order_detail 也得配置分片
在schema.xml 中
<table name="order_master" dataNode="orderdb01,orderdb02" primaryKey="order_id"
rule="order_master" autoIncrement="true" >
<childTable name="order_detail" primaryKey="order_detail_id" joinKey="order_id"
parentKey="order_id" autoIncrement="true" >
</childTable>
</table>
当然 order_detail 配置的全局自增方式与 order_master 一样
重启之后,测试,就发现 保存 订单明细的时候,会根据 订单id 存入对应的分片库里面,即和 订单表所在的数据存在一起
mycat 其他常用功能
sql 拦截
SQL防火墙
上图中, 白名单里面的意思就是 规定root 用户只能在 当前机器登录,其他机器不用使用root 登录
mycat 高可用集群
一台机器部署多实例mycat : https://blog.csdn.net/tqs314/article/details/102407043
使用ZK记录mycat 配置
初始化ZK并配置mycat 支持zk
先将之前配置好的mycat 内容 覆盖到 mycat的zkconf 配置内容
在mycat 的bin 下 执行初始化 zk 的数据
./init_zk_data.sh
可以去zookeeper查看 是否成功 将信息给加载到了zk
接着在 每台mycat 里面conf配置 myid.properties
loadZk=true # 这样其他mycat 就可以加载zk 上面的配置信息并启动了
启动全部zk 和mycat
haproxy 部署
haproxy 与 nginx 区别
https://www.cnblogs.com/EasonJim/p/7629888.html
https://blog.csdn.net/hellojoy/article/details/80805328
https://www.yht7.com/wenda/detail/456168
https://zhuanlan.zhihu.com/p/115092359
Haproxy 与 Keepalived 一定要部署和mycat 在同一台服务器上。
即 通过keepatlive 提高 的虚假IP 给 前端用户去访问
haproxy 安装
https://blog.csdn.net/xianglingchuan/article/details/82218469
https://zhuanlan.zhihu.com/p/23893787
手动安装:
https://jingyan.baidu.com/article/4dc408486bb9e7c8d946f12b.html
https://blog.csdn.net/qq_28710983/article/details/82194404
https://blog.csdn.net/keil_wang/article/details/89712380
https://www.jianshu.com/p/edf2c8c7d83f
开启打印日志 https://www.cnblogs.com/liuxia912/p/11078172.html
上图就是 haproxy 配置的mycat 的负载均衡
haproxy.cfg 完整:
global
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option abortonclose
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
balance roundrobin
log 127.0.0.1 local0 info
listen admin_status
bind *:48800 ##VIP
stats uri /admin-status ##统计页面
stats auth admin:admin
listen allmycat_service
bind *:8096 ##转发到mycat的应用端口,即mycat的服务端口
mode tcp
option tcplog
balance roundrobin
server mycat_132 10.102.13.2:3306 check port 48700 inter 5s rise 2 fall 3
server mycat_135 10.102.13.5:8066 check port 48700 inter 5s rise 2 fall 3
listen allmycat_admin
bind *:8097 ##转发到mycat的管理端口,及mycat的管理控制台端口
mode tcp
option tcplog
balance roundrobin
server mycat_132 10.102.13.2:9066 check port 48700 inter 5s rise 2 fall 3
server mycat_135 10.102.13.5:9066 check port 48700 inter 5s rise 2 fall 3
这里有一个 检查端口 48700 , 因此安装 yum -y install xinetd
[root@node1 haproxy]# yum install xinetd -y
[root@node1 log]# vi /etc/xinetd.d/mycatchk
service mycatchk
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_status
log_on_failure += USERID
disable = no
}
###########################################
#增加/usr/local/bin/mycat_status脚本
#########################################
#!/bin/bash
#/usr/local/bin/mycat_status
# This script checks if a mycat server is healthy running on localhost. It will
# return:
#
# "HTTP/1.x 200 OK" (if mycat is running smoothly)
#
# "HTTP/1.x 503 Internal Server Error" (else)
mycat=`/usr/local/mycat/bin/mycat status |grep "not running"| wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -en "HTTP/1.1 200 OK
"
/bin/echo -en "Content-Type: text/plain
"
/bin/echo -en "Connection: close
"
/bin/echo -en "Content-Length: 40
"
/bin/echo -en "
"
/bin/echo -en "MyCAT Cluster Node is synced.
"
exit 0
else
/bin/echo -en "HTTP/1.1 503 Service Unavailable
"
/bin/echo -en "Content-Type: text/plain
"
/bin/echo -en "Connection: close
"
/bin/echo -en "Content-Length: 44
"
/bin/echo -en "
"
/bin/echo -en "MyCAT Cluster Node is not synced.
"
exit 1
fi
#########################################################
#在/etc/services中加入mycat_status服务
######################################################
[root@node1 bin]# vi /etc/services
mycatchk 48700/tcp # mycat check
#重启xinetd服务
centos6:[root@node1 bin]# service xinetd restart
centos7:[root@node1 bin]# systemctl restart xinetd
#验证mycatchk服务是否启动成功
[root@node1 bin]# netstat -nltp | grep 48700
#在node1节点绑定VIP
[root@node1 bin]# ifconfig eth0:1 10.102.13.248/24
#启动haproxy
[root@node1 xinetd.d]# haproxy -f /etc/haproxy/haproxy.cfg
#测试通过haproxy连接MyCAT
[root@node3 ~]# mysql -uroot -p -h10.102.13.248 -P8096
https://blog.csdn.net/lzghxjt/article/details/83018710
其实这里不用 xinetd 也是可以的,开发测试而已 . 生产环境一般都是使用 xinetd的
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系统的基础服务)
如果不配置使用xinetd 那么 配置haproxy 的配置代理需要配置 其他的时间参数,否则会代理失败: 比如 timeout 等相关的参数。
listen mycat # 监控配置
bind 0.0.0.0:8096 #监听端口 , 虚IP, 访问mycat
mode tcp
option tcplog
timeout connect 60s #连接超时
timeout client 30000 #客户端超时,
timeout server 30000
balance roundrobin
server mycat_fz_01 192.168.0.205:8066 check inter 5s rise 2 fall 3 weight 1
server mycat_fz_011 192.168.0.205:8066 check inter 5s rise 2 fall 3 weight 1
接着配置虚IP
之后就可以重启haproxy 了
其实可以不用配置虚拟IP的, 都配置成 0.0.0.0
keepalived 安装
用于 haproxy 的 高可用,即 使用虚IP来访问某一台 haproxy
yum -y install keepalived
配置文件目录 cd /etc/keepalived/
keepalived.conf配置内容:
! Configuration Fileforkeepalived
vrrp_script chk_http_port {
script"/etc/keepalived/check_haproxy.sh" # haproxy 的监控建表
interval 2 # 时间间隔
weight 2
}
vrrp_instance VI_1 {
state MASTER # 这里是master ,另一台服务器的 keepalived 是 slave ,主从配置
interface eth0 # 虚IP网卡
virtual_router_id 51 # 两台的 keepalived id 值必须一致
priority 150 # 优先级, master 的优先级 比较高,值越大 越会优先使用作为master keepalived
advert_int 1
auth_type PASS # keepalived 认证方式与密码
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.0.105 dev eth0 scope global # 虚IP
}
}
check_haproxy.sh : 检查haproxy 是否存活,没有启动就启动。如果启动失败或者haproxy 挂了,那么 虚IP就 就执行另一台的服务器的keepalived 与 haproxy
#!/bin/bash
STARTHAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg"
STOPKEEPALIVED="/etc/init.d/keepalived stop"
#STOPKEEPALIVED="/usr/bin/systemctl stop keepalived"
LOGFILE="/var/log/keepalived-haproxy-state.log"
echo "[check_haproxy status]" >> $LOGFILE
A=`ps -C haproxy --no-header |wc -l`
echo "[check_haproxy status]" >> $LOGFILE
date >> $LOGFILE
if [ $A -eq 0 ];then
echo $STARTHAPROXY >> $LOGFILE
$STARTHAPROXY >> $LOGFILE 2>&1
sleep 5
fi
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
exit 0
else
exit 1
fi
chmod a+x check_haproxy.sh 加上执行权限
启动keepalived
通过 ip addr 可以看到 虚IP已生效。 如果某一台挂了,那么虚IP就切换到另一台服务器了。
mysql 是不能频繁切换虚IP的,会产生数据异常。而haproxy 没有问题,因为它的连接是没有状态的。
mycat 读写分离
主要配置 dataHost 即可
<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
写, 主
<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
password="123456">
读 , 从
<readHost host="hostR" url="192.168.0.102:3306" user="root" password="123456" />
</writeHost>
当写挂了, 高可用,配置读作为读写
<writeHost host="hostRW" url="192.168.0.102:3306" user="root"
password="123456">
</writeHost>
</dataHost>
在 mycat的 conf下的 zkConf 修改配置之后, 执行 bin/init_zk_data.sh 就可以将修改的内容同步到zk 了。
这样其他 mycat 集群机器就可以同步配置了,即滚动应用mycat 配置 . 接着 一台一台启动mycat 即可,这样就不影响使用了
mycat 管理及监控
可以通过使用navicat 来连接mycat 来对 mycat 进行管理
重新加载配置:
常用于管理单台的mycat
mycat web 管理页面
http://dl.mycat.org.cn/mycat-web-1.0/ 下载 web
tar zxf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
mycat-web/mycat-web/WEB-INF/classes 里面 可以 修改 zookeeper的路径
启动 ./start.sh
端口 8082 : http://192.168.0.205:8082/mycat/
这样就可以对mycat 进行 监控和管理了
mycat 集群优化
linux 系统优化
以上就是一般的基于内存和网络的优化配置,参考
加上 两行即可 ,配置文件的最大打开数量
mycat 优化配置
mysql 优化配置
独占机器的mysql 对于 innodb_buffer_pool_size 为内存的 2/3 大小
mycat 限制
即 待 update或者delete 带limit的 不支持,否则会出现数据异常
即支持 XA的分布式事务: https://www.cnblogs.com/cxxjohnson/p/9145548.html
以上是 mycat和mysql搭建高可用企业数据库集群 的全部内容, 来源链接: utcz.com/z/535105.html