目录
Mycat高级特性_搭建双主双从
Mycat分片技术_垂直拆分-分库
Mycat高级特性_搭建双主双从
环境准备
创建docker容器
#启动第一台
docker run -d -p 3350:3306 -e
MYSQL_ROOT_PASSWORD=123456 --name=master1
mysql:5.7
#启动第二台
docker run -d -p 3360:3306 -e
MYSQL_ROOT_PASSWORD=123456 --name=slave1
mysql:5.7
#启动第三台
docker run -d -p 3370:3306 -e
MYSQL_ROOT_PASSWORD=123456 --name=master2
mysql:5.7
#启动第四台
docker run -d -p 3380:3306 -e
MYSQL_ROOT_PASSWORD=123456 --name=slave2
mysql:5.7
修改容器内MySQL配置文件
1、修改master1配置文件
[mysqld]
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
2、修改master2配置文件
[mysqld]
#主服务器唯一ID
server-id=3 #启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
#指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
3、修改slave1配置文件
[mysqld]
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
4、修改slave2配置文件
[mysqld]
#从服务器唯一ID
server-id=4 #启用中继日志
relay-log=mysql-relay
双主双从重启服务
systemctl restart mysql
配置数据库
1、分别在两个主库中执行创建从库连接账号命令
GRANT replication SLAVE ON *.* TO 'slave' @'%' IDENTIFIED BY '123456';
2、查看两个主库的master状态
show master status;
两个从库连接到主库
change master to
master_host='192.168.66.101',
master_user='slave',
master_port=3350,
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=438;
参数:
master_host:这里的ip就是mysql所在服务器对应的ip
master_user:就是在第一步配置的账号
master_port:mysql的端口
master_password:配置的密码
master_log_file:file参数
master_log_pos:Position参数
两个从库启动复制功能
start slave;
查看连接状态
show slave status \G;
两个主库再互相成为对方的从库
# 在master1上执行
CHANGE MASTER TO master_host = '192.168.66.101',
master_user = 'slave',
master_password = '123456',
master_port = 3370,
master_log_file = 'mysql-bin.000001',
master_log_pos = 154;
# 在master2上执行
CHANGE MASTER TO master_host = '192.168.66.101',
master_user = 'slave',
master_password = '123456',
master_port = 3350,
master_log_file = 'mysql-bin.000001',
master_log_pos = 154;
两个主库启动复制功能
start slave;
查看连接状态
show slave status \G;
双主双从配置MyCat
vim schema.xml
<dataNode name="db_node" dataHost="db_host" database="test" />
<dataHost name="db_host" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql"
dbDriver="native" switchType="1" slaveThreshold="100" >
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.140.128:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.140.127:3306" user="root" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.140.126:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.140.125:3306" user="root" password="123456" />
</writeHost>
</dataHost>
注意:
- writeType="0":所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二 个riteHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties.
- writeType="1":所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
- switchType="-1" :表示不自动切换 mysql 实例
- switchType="1" :默认值,自动切换
Mycat分片技术_垂直拆分-分库
前沿
目前很多互联网系统都存在单表数据量过大的问题,这就降低了查询速度,影响了客户体验。为了提高查询速度,我们可以优化sql语句,优化表结构和索引,不过对那些百万级千万级的数据库表,即 便是优化过后,查询速度还是满足不了要求。
垂直分割
垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张 表。表的记录并不多,但是字段却很长,表占用空间很大,检索表 的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段 拆分到另一个表,并且该表与原表是一对一的关系。
拆分原则:
把不常用的字段单独放在一张表
把text,blob等大字段拆分出来放在附表中
经常组合查询的列放在一张表中
举个例子
拆分思路: 如果我们只想查询id为8的学生的分数:select 分数 from 答题 表 where id = 8;虽然知识查询分数,但是题目和回答这两个大字段也是要被扫描的,很消耗性能。但是我们只关心分数,并 不想查询题目和回答。这就可以使用垂直分割。
实现分库
修改schema.xml配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 数据库配置 与server.xml 中的数据库对应 -->
<schema name="db_test" checkSQLschema="false" dataNode="dn1" sqlMaxLimit="100">
<table name="customer" dataNode="dn2"/>
</schema>
<!-- 两个数据库嘛 hadoop01,2 上都要创建 orders 数据库 -->
<dataNode name="dn1" dataHost="host1" database="orders" />
<dataNode name="dn2" dataHost="host2" database="orders" />
<!-- 两个数据库 肯定两个 dataHost -->
<dataHost name="host1" 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.66.101:3350" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0"
dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="192.168.66.102:3350" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
新增两个空白库
分库操作不是在原来的老数据库上进行操作,需要准备两台机器分别安装新的数据库
#在数据节点 dn1、dn2 上分别创建数据库 orders
CREATE DATABASE orders;
启动Mycat
./mycat console
Mycat进行分库
创建表
mysql> use TESTDB;
# 使用 mycat 创建四个表
create table customer(
id int auto_increment,
name varchar(200),
primary key(id)
);
create table orders(
id int auto_increment,
order_type int,
customer_id int,
amount decimal(10,2),
primary key(id)
);
create table orders_detail(
id int auto_increment,
order_id int,
detail varchar(200),
primary key(id)
);
create table dict_order_type(
id int auto_increment,
order_type varchar(200),
primary key(id)
);
实时学习反馈
1.Mycat技术中垂直拆分主要解决___问题。
A 性能
B 安全
C 兼容
D 并发
2.Mycat技术中不属于垂直拆分原则___。
A 把不常用的字段单独放在一张表
B 大字段拆分出来
C 经常组合查询的列放在一张表中
D 数据类型