为什么需要使用mycat?
当随着系统数据量指数级增长后,数据库可能会出现宕机的情况。为了防止这种情况的发生,我们采用mysql的主从复制为基础,mycat实现分库分表保存数据,读写分离减轻主数据库的负载。
mysql主从复制
原理
一共由三个线程完成
- 主服务将数据的更新记录保存到二进制日志--主服务器进程
- 从服务将主服务的二进制日志复制到本地中继日志--从服务IO进程
- 从服务读取中继日志,更新本地数据--从服务SQL进程
配置主服务器
打开配置文件vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id,必须唯一 复制
create user 'user'@'10.168.1.249' identified by 'password';
# 授权,只授予复制和客户端访问权限
grant replication slave on *.* to 'user'@'10.168.1.249';#分配权限
# 查看主服务状态
show master status
配置从服务器
打开配置文件vi /etc/my.cnf
[mysqld]
server-id=2 #设置server-id,必须唯一 复制
#执行复制主服务器语句
#启动从服务器同步进程
start slave
#查看slave状态
当Slave_IO_Running与Slave_SQL_Running都为yes时,复制同步成功。
异常情况处理:
- Slave_IO_Running为NO表示无法正常连接主服务器,检查用户名及密码
- Slave_SQL_Running为NO一般由事务回滚造成,按以下步骤解决:
- stop slave
- set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
- start slave
mycat配置
# Java Application 配置jdk
wrapper.java.command=/lib/jvm/bin/java
wrapper.working.dir=..
server.xml
中定义用户以及系统相关变量,如端口等
以上定义一个用户,用户名为root,密码为qwer~!@#,可访问的schema为test_schema一个逻辑库。
schema.xml
中定义逻辑库,表、分片节点等内容
schema标签,划分不同的逻辑库
dataNode标签,用于绑定逻辑库某个具体的database
balance属性:
负载均衡类型,目前的取值有 4 种:
- balance=0,不开启读写分离机制,所有读操作都发送到当前可用的 write Host 上
- balance=1,所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost
- balance=2,所有的读操作都随机发送到所有的writeHost,readHost上
- balance=3,所有的读操作都只发送到writeHost的readHost上
writeType属性:
- writeType=0,所有写操作发送到配置的第一个 write Host
- writeType=1,所有写操作都随机的发送到配置的 write Host
rule.xml
中定义分片规则
启动mycat
/usr/local/mycat/bin
./mycat start
服务端口:8066
客户端端口:9066