mycat
linux下mysql安装
/opt 目录下创建mysql文件夹
mkdir mysql
解压mysql的压缩包至mysql文件夹下
tar xvf mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar -C mysql/
删除Mysql的MariaDB依赖
rpm -qa|grep mariadb [查找mariadb]
rpm -e mariadb包全名 --nodeps
mysql文件夹下依次安装mysql的rpm包(common,libs,client,server)
rpm -ivh mysql-community-common-5.7.20-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.20-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.20-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm
启动mysql
service mysqld start
查找初始密码
vim /var/log/mysqld.log 或 grep password /var/log/mysqld.log
连接mysql
mysql -u root -p
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Javasm123!';// 密码要求有大小写、数字、特殊字符
修改mysql访问权限
show databases; 查看库
use mysql; [进入mysql数据库]
show tables; 查看 库中有哪些表
update user set host='%' where user = 'root'; [更改用户的访问权限]
flush privileges; [刷新权限缓存]
3306加入白名单
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --reload
mycat安装,读写分离配置
- 从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的Server,前端用户可以把它看作是一个数据库代理。
- 其核心功能是读写分离,分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
- Mycat是一个Java应用,所以安装环境需要依赖JDK(1.7以上)
- 配置完成启动时,保证主从数据库都要有配置的库。
解压Mycat安装包
tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
将文件夹移至/usr/local/
mv mycat /usr/local/
修改server.xml(mycat/conf目录下)
修改schema.xml
schema配置文件是用来描述逻辑数据库中的数据节点和读写库配置信息。
mycat端口号加入白名单
firewall-cmd --permanent --zone=public --add-port=8066/tcp
firewall-cmd --reload
12
测试mycat
bin目录下Mycat 运行命令
- ./mycat start 启动
- ./mycat stop 停止
- ./mycat restart 重新启动
查看Mycat运行日志
- tail –f mycat.log
调整日志等级
- 修改log4j2.xml的日志等级为debug
使用mysql命令登入Mycat
- mysql -u root -p -P8066 -h 127.0.0.1
1234567891011
主从同步配置
设置主库mysql的配置文件
- 编辑/etc/my.cnf
添加服务id配置 在/etc/my.cnf里面加上:
server-id=1 (保证唯一)
开启二进制日志文件(通过日志控制同步) 在/etc/my.cnf里面加上:
log-bin=/var/lib/mysql/mysql-bin
- 重启mysql
service mysqld restart
- 连接数据库
mysql -u root -p
- 执行sql,复制File和Position的值,需要给slave(从库)使用
show master status;
设置从库mysql的配置文件
- 编辑/etc/my.cnf
添加服务id配置:
server-id=2(保证唯一)
- 重启mysql
- 连接数据库
- 执行指令
stop slave;
- 执行指令
change master to master_host='主库IP',
master_port=3306, master_user='主库用户名',
master_password='主库密码',
master_log_file='主库刚刚查到的File值',
master_log_pos= Position值;
- 执行指令
start slave;
- 查看slave状态
show slave status \G;
查看Slave_IO_Running=yes Slave_SQL_Running=yes
分库分表配置
同一个数据库下的分表操作
- navcat执行查询(编写一个创建表的存储过程函数)
DELIMITER $$
USE `crm`$$
DROP PROCEDURE IF EXISTS `pro_TableCreate`$$
CREATE DEFINER=`root`@`%` PROCEDURE `pro_TableCreate`(
)
BEGIN
DECLARE i INT;
DECLARE table_name VARCHAR(20);
SET i = 0;
WHILE i<100 DO
IF i<10 THEN
SET table_name = CONCAT('pn_book_0',i);
ELSE
SET table_name = CONCAT('pn_book_',i);
END IF;
SET @csql = CONCAT(
'CREATE TABLE ',table_name,'(
`bid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT "数据整合后,花生统一的图书id序列号",
`book_id` bigint(20) NOT NULL COMMENT "书籍ID",
`book_name` varchar(50) NOT NULL COMMENT "书籍名称",
`author_name` varchar(50) DEFAULT NULL COMMENT "作者名称",
`attribution` tinyint(4) DEFAULT NULL COMMENT "1.男频 2.女频 3.出版",
`ftype_id` int(11) DEFAULT NULL COMMENT "一级分类ID",
`stype_id` int(11) DEFAULT NULL COMMENT "二级分类ID",
`status` int(2) DEFAULT NULL COMMENT "书籍状态:1连载 2完本",
`is_vip` tinyint(1) DEFAULT NULL COMMENT "是否收费:0免费 1收费",
`description` varchar(1000) DEFAULT NULL COMMENT "图书简介",
`cover_url` varchar(100) DEFAULT NULL COMMENT "封面url地址",
`keyword` varchar(50) DEFAULT NULL COMMENT "图书关键字",
`word_count` varchar(20) DEFAULT NULL COMMENT "图书当前总字数",
`last_update_chapter_id` int(10) DEFAULT NULL COMMENT "最新章节ID",
`last_update_chapter_name` varchar(50) DEFAULT NULL COMMENT "最新章名",
`isRecommand` tinyint(1) NOT NULL DEFAULT "0" COMMENT "是否推荐首页:1推荐 0不推荐",
`bookPartner` bigint(20) DEFAULT "0" COMMENT "小说合作商户id",
`read_count` int(11) DEFAULT "1000" COMMENT "阅读人数",
PRIMARY KEY (`bid`),
KEY `bid` (`bid`,`book_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1001058 DEFAULT CHARSET=utf8 COMMENT="创别图书表";'
);
PREPARE create_stmt FROM @csql;
EXECUTE create_stmt;
SET i = i+1;
END WHILE;
END$$
DELIMITER ;
-
执行完成后,会新增有一个函数
-
右键运行函数
-
分表完成
- 如果配有主从同步,从库中也会有新增的分表。
- 在任一从库中新增分表,主库及其他从库均不会实时新增,函数也不会生成。
需要理解mycat的几个概念。
MyCAT目前通过配置文件的方式来定义逻辑库和相关配置:
MYCAT_HOME/conf/schema.xml中定义逻辑库,表、分片节点等内容;
MYCAT_HOME/conf/rule.xml中定义分片规则;
MYCAT_HOME/conf/server.xml中定义用户以及系统相关变量,如端口等。
mycat的好处就是你可以使用他就像使用真的mysq数据库一样,jdbc该怎么连,命令行该怎么敲就怎么敲,sql语句该怎么写就怎么写,它的出现让你的业务代码持久层不用动,而背后,却能帮搭建起mysql的分表,分库,读写分离,集群分布式。
下面就简单使用mycat来帮助我们将业务数据表进行垂直切分和水平切分
垂直切分搭建
垂直切分其实就是根据业务的不同,将不同业务的表放到不同的数据库中,例如我们订单表,用户表,用户评论表,因为他们业务的不同,可以将他们分别放到三个数据库中。好,那我们就使用三个数据库,分别安装三张表,使用mysql架构如下:
数据库水平切分
除了可以按照业务将数据表分配到不同的的数据库中做成垂直切分,很多时候,用户量大的时候,例如一张用户表有上亿条数据,那么一次性查数据肯定很慢,那么我们可以这样子,将这张表按照某种规则将数据存放到不同的数据库中,例如可以按照用户省份的不同,将数据切分到广东省,北京市,上海市等数据库中。下面假如我们有一张student表,因为数据量太多,就按照id的取余规则,将数据分别存放到俩个数据库中,架构如下:
垂直切分
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="javasm" checkSQLschema="false" sqlMaxLimit="100">
<!--menu_test表 会在dn1和dn2两个库中随机访问 -->
<table name="menu_test" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!--goods_test表 只访问dn1 -->
<table name="goods_test" primaryKey="ID" type="global" dataNode="dn1" />
</schema>
<!--database是必须真实存在的 库 上面配置的表 必须真实存在库里-->
<dataNode name="dn1" dataHost="localhost1" database="goods" />
<dataNode name="dn2" dataHost="localhost2" database="menu" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.173:3306" user="root"
password="Javasm123!">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.174:3306" user="root"
password="Javasm123!">
</writeHost>
</dataHost>
</mycat:schema>
水平切分
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="javasm" checkSQLschema="false" sqlMaxLimit="100">
<table name="goods_test" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="goods-1" />
<dataNode name="dn2" dataHost="localhost1" database="goods-2" />
<dataNode name="dn3" dataHost="localhost1" database="goods-3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.173:3306" user="root"
password="Javasm123!">
<readHost host="hostS2" url="192.168.12.174:3306" user="root" password="Javasm123!" />
</writeHost>
</dataHost>
</mycat:schema>