mycat

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值