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所在服务器对应的i
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 数据类型