一、MyCat介绍和安装

一、什么是分库分表?

分库分表指的是对数据库数据的拆分;
分库分表分为两种:水平拆分和垂直拆分;
一种是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面,这种拆分称之为数据的水平拆分,也可以称为横向切分,通俗来说就是把一张表的数据拆成多张表来存储;
一种是按照不同的表来切分到不同的数据库服务器之上,这种切可以称之为数据的垂直切分,也可以称为纵向切分,通俗来说,就是把一个数据库中的所有表进行分类整理,拆分成多个数据库来存储这些表;
在这里插入图片描述

二、为什么要分库分表?

主要原因是数据库的性能瓶颈;
产生数据库性能瓶颈有如下几个关键点:
1、数据库连接数建立太多;
mysql 5.5、mysql 5.6、mysql 5.7:默认的最大连接数都是151个,上限为:100000 个;mysql5.0版本:默认的最大连接数为100,上限为16384;
查看mysql的最大连接数:
show variables like ‘%max_connections%’;
查看当前连接数:
show global status like ‘max_used_connections’;
2、表数据量太大
检索数据时,命中不了索引,全表的扫描,很慢;
检索数据时,命中了索引,但是数据量比较大,索引也是存储在磁盘的,它是从根节点找叶子节点,一直往下找,也是大量的磁盘 IO操作; Btree
用户数:2亿;
订单数:11亿;
商品数:8亿
月增长:用户表20W+,订单表2000W+,商品表:2500W+

3、服务器硬件资源的限制
单台数据库服务器的Cpu、磁盘、内存等的限制;
数据库性能瓶颈解决方案:
SQL优化
索引
缓存
搜索引擎
读写分离
分库分表
读写分离
使用多数据源方式区分读和写;
数据的存储(增删改)指定写数据源,数据的查询指定读数据源;
(读写分离会基于主从复制,写主库,读丛库) 在这里插入图片描述
MySQL主从复制方式
在这里插入图片描述
分库分表在这里插入图片描述
垂直拆分
1,每个数据库连接数会减少
2,硬件资源限制;
水平拆分
1,表数据量大的问题,存储空间也解决了;
2,数据库连接数会减少
,3,硬件资源限制
MySQL环境部署
Linux下MySQL 5.7.x版本为例
下载mysql,去官网下载;(我们已经下载好)https://www.mysql.com
检查Linux环境(CentOS 7为例)
检查Linux是否安装了mariadb数据库,mariadb数据库是mysql的分支,执行命令:
yum list installed | grep mariadb
如果Linux中安装了mariadb数据库,先卸载掉,mariadb数据库与安装mysql会发生冲突,执行命令:
yum -y remove mariadb-libs.x86_64
安装
(1)、解压下载下来的mysql软件压缩包,执行命令:
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
(2)、将解压后的mysql-5.7.24-linux-glibc2.12-x86_64改名为mysql-5.7.24 或者 mysql
mv mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz mysql-5.7.24
(3)、在mysql-5.7.24文件夹目录下创建一个/data/3306文件夹,切换到mysql-5.7.24目录,执行命令;
mkdir data,然后再data目录下再创建 3306 文件夹
(4)、添加mysql用户及用户组,执行命令:
groupadd mysql
useradd mysql -g mysql
-g: 是指定用户所在组
(5)、切换到mysql-5.7.24/bin目录下执行:
./mysqld --initialize-insecure --user=mysql --datadir=/usr/local/mysql-5.7.24/data/3306 --basedir=/usr/local/mysql-5.7.24
其中 --initialize-insecure 表示不生成临时密码
(6)、在mysql-5.7.24/bin目录下执行命令:
./mysql_ssl_rsa_setup --datadir=/usr/local/mysql-5.7.24/data/3306
7、更改mysql-5.7.24整个文件夹目录权限所属,执行命令:
chown -R mysql:mysql /usr/local/mysql-5.7.24
配置:
8、在mysql-5.7.24/data/3306 目录下创建my.cnf文件;
[client]
port = 3306
socket = /usr/local/mysql-5.7.24/data/3306/mysql.sock
default-character-set=utf8

[mysqld]
port = 3306
socket = /usr/local/mysql-5.7.24/data/3306/mysql.sock
datadir = /usr/local/mysql-5.7.24/data/3306
log-error = /usr/local/mysql-5.7.24/data/3306/error.log
pid-file = /usr/local/mysql-5.7.24/data/3306/mysql.pid

character-set-server=utf8
lower_case_table_names=1
autocommit = 1

至此MySQL安装完成;
启动MySQL服务
在mysql-5.7.24/bin目录下执行命令:
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/3306/my.cnf &
(其中 & 符号表示后台启动)
修改密码
1、登录进入mysql,在mysql-5.7.18/bin目录下执行命令:
./mysql -uroot -p -P3306 -h127.0.0.1
2、修改mysql的密码,执行:
alter user ‘root’@‘localhost’ identified by ‘123456’;
(其中123456是我们设置的密码)
远程访问
1、授权远程访问,执行命令:(这样远程客户端才能访问)
grant all privileges on . to root@’%’ identified by ‘123456’;
其中*.* 的第一个表示所有数据库名,第二个表示所有的数据库表;
root@’%’ 中的root表示用户名,%表示ip地址,%也可以指定具体的ip地址,比如root@localhost,root@192.168.10.130
2、执行以下如下命令刷新权限:
flush privileges;
3、如果上面授权远程访问执行之后依然远程连接不上mysql,可能是Linux上防火墙拦截了,可以将防火墙先关闭;
关闭防火墙命令:
systemctl stop firewalld (该命令是临时关闭防火墙,重启centos后失效)
systemctl disable firewalld (把防火墙置为不可用)
在实际公司里面不要这么做,我们自己测试为了方便可以直接关闭;
防火墙开放端口命令:firewall-cmd --zone=public --add-port=3306/tcp --permanent
在这里插入图片描述
重新加载防火墙配置:firewall-cmd --reload在这里插入图片描述
重启防火墙:systemctl restart firewalld
命令含义:
–zone #作用域:查看当前的区域:firewall-cmd --get-default-zone
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
取消端口开放:
firewall-cmd --permanent --zone=public --remove-port=3306/tcp
查询端口号8080 是否开启:
firewall-cmd --query-port=8080/tcp在这里插入图片描述
查询有哪些端口是开启的:
firewall-cmd --list-port在这里插入图片描述
关闭MySQL服务
在mysql-5.7.24/bin目录下执行:
./mysqladmin -uroot -p -P3306 -h127.0.0.1 shutdown在这里插入图片描述
一台Linux搭建多个MySQL
1、在MySQL安装主目录下创建 /data/4406目录;
2、执行数据库初始化,在MySQL的/usr/local/mysql-5.7.24/bin目录下执行命令:
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.24 --datadir=/usr/local/mysql-5.7.24/data/4406 --user=mysql
其中 initialize-insecure 表示不生成MySQL数据库root用户的随机密码,即root密码为空;
3、在/data/4406目录下创建一个my.cnf文件;
4、配置MySQL数据库服务的my.cnf文件
[client]
port = 4406
socket = /usr/local/mysql-5.7.24/data/4406/mysql.sock
default-character-set=utf8

[mysqld]
port = 4406
socket = /usr/local/mysql-5.7.24/data/4406/mysql.sock
datadir = /usr/local/mysql-5.7.24/data/4406
log-error = /usr/local/mysql-5.7.24/data/4406/error.log
pid-file = /usr/local/mysql-5.7.24/data/4406/mysql.pid

character-set-server=utf8
lower_case_table_names=1
autocommit = 1
至此在同一台Linux上就搭建了第二个数据库实例;
在一个linux上,只需要安装一份mysql程序,但是可以部署多个mysql服务实例;
启动第二个MySQL服务
切换到/usr/local/mysql-5.7.24/bin目录下,使用 msyqld_safe 命令指定配置文件并启动MySQL服务:
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/4406/my.cnf &
其中 --defaults-file 是指定配置文件,& 符合表示后台启动;
1、登录进入mysql,在mysql-5.7.24/bin目录下执行命令:
使用用端口、主机登录 ./mysql -uroot -p -P4406 -h127.0.0.1 登录进入MySQL
2、修改mysql的密码,执行:
alter user ‘root’@‘localhost’ identified by ‘123456’;
(其中123456是我们设置的密码)
3、授权远程访问,执行命令:(这样远程客户端才能访问)
grant all privileges on . to root@’%’ identified by ‘123456’;
4、执行以下如下命令刷新权限:
flush privileges;
如果为了平时操作方便,可以把mysql的命令加入到path下:在这里插入图片描述
在这里插入图片描述
一主一从环境部署
MySQL主从复制工作原理在这里插入图片描述
从上层来看,复制分成三步:
MySQL的主从复制将经过如下步骤:
1、当 master 主服务器上的数据发生改变时,则将其改变写入二进制事件日志文件中;
2、salve 从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测,探测其是否发生过改变,如果探测到 master 主服务器的二进制事件日志发生了改变,则开始一个 I/O Thread 请求 master 二进制事件日志;
3、同时 master 主服务器为每个 I/O Thread 启动一个dump Thread,用于向其发送二进制事件日志;
4、slave 从服务器将接收到的二进制事件日志保存至自己本地的中继日志文件中;
5、salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;
6、最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒;
主从环境配置(一主一从)
配置主从MySQL配置文件my.cnf
主(3306)里面加入
#表示启用二进制日志
log-bin=mysql-bin
#表示server编号,编号要唯一
server-id=3306
从(4406)里面加入
#表示server编号,编号要唯一
server-id=4406
#表示只读
read_only=1
主从服务启动
进入/usr/local/mysql-5.7.24/bin目录,重启两个MySQL服务,启动时指定配置文件启动:
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/3306/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/4406/my.cnf &

至此,我们的两个MySQL只有主从角色,它们之间还没有建立主从关系;
主从设置 (真正建立主从关系)
1、在主服务器上创建复制数据的账号并授权:
grant replication slave on . to ‘copy’@’%’ identified by ‘123456’;
2、在主服务器上执行命令,查看主服务器状态:
show master status;
如果主服务状态不是初始状态,建议重置状态,执行命令:reset master;
初始状态:
日志文件是:mysql-bin.000001
偏移坐标:154

下面开始对从库做一些操作:
1、查看从服务器状态:show slave status;
2、如果从服务器不是初始状态,建议重置一下:
丛库的初始状态是:(什么也没有就是初始状态)
在这里插入图片描述
stop slave; --停止复制
reset slave; --重置从机器状态
3、在从服务器上执行命令,设置从服务器的master服务器
change master to master_host=‘192.168.10.132’,master_user=‘copy’,
master_port=3306,master_password=‘123456’,
master_log_file=‘mysql-bin.000001’,master_log_pos=154;
4、在从机器上执行开始复制命令:
start slave;
至此一个一主一从搭建完成;
主从验证
检查从服务器复制功能状态:
show slave status \G
如果 Slave_IO_Running 和 Slave_SQL_Running 均为 YES,则表示主从关系正常;
在主服务器上创建数据库、表、数据,然后在从服务器上查看是否已经复制
以上操作过程若显示正常,则主从服务器配置完成;
查看主从复制binlog日志文件内容,可执行:
show binlog events in ‘mysql-bin.000001’;
Seconds_Behind_Master 通过该参数验证有误复制延迟,该参数需要主从服务器时间要同步,Linxu时间同步可以采用ntp实现一下(运维);
MyCAT运行环境部署及日常操作
Mycat是开源的分布式数据库中间件,基于阿里开源的cobar之上,它处于数据库服务与应用服务之间,是应用服务访问数据库服务的中间代理层;
通俗来说,应用层可以将它看作是一个数据库的代理或者直接看成加强版的数据库;
在这里插入图片描述
在这里插入图片描述
MyCAT本身是一个Java语言开发的服务器;
MyCAT的主要用途:
数据库的读写分离;
数据库分库分表;
Mycat安装
官网:http://mycat.io
1、下载: wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
2、下载后解压即可:
tar –zxvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz –C /usr/local
解压后即安装完成;
Mycat目录在这里插入图片描述
bin 程序目录,存放了可执行文件
./mycat {start|restart|stop|status…}
conf 目录下存放配置文件,
server.xml 是 Mycat 服务器参数设置和用户账号权限设置的配置文件;
schema.xml 是逻辑库定义、读写分离、分库分表的核心配置文件;
rule.xml 是分库分表分片规则的配置文件;
log4j2.xml配置logs目录下mycat日志输出;
wrapper.conf 配置相关JVM参数;
lib 目录下主要存放 mycat 依赖的 jar包;
logs目录日志存放日志文件
Mycat启动
切换到mycat的bin路径下
./mycat start
./mycat restart --重启
Mycat关闭
切换到mycat的bin路径下
./mycat stop
Mycat安装好之后,需要把底层的数据库配置好,才能真正去使用,否则你启动的也是连不上的,即便是连上了也会报一些错;
Mycat命令行
登录mycat,可以使用mysql的命令行工具来操作:
./mysql -umycat -p -P8066 -h127.0.0.1
mycat默认数据访问端口是8066
MyCat配置文件
1、server.xml
主要用于配置mycat的服务器信息、账号、安全认证;(使用时再详细介绍)
2、schema.xml
配置读写分离、分库分表信息;(使用时再详细介绍)
Mycat读写分离
配置server.xml文件
设置连接mycat时的用户名和密码, 逻辑库:

123456
MYCATDB

配置schema.xml文件
1、配置schema
作用:schema用于配置逻辑库
只做读写分离,不做分库分表,则schema标签里面不用配置table;
给schema标签加上属性dataNode,配置dataNode的名字(name);
最终配置如下:

2、配置dataNode
作用:dataNode定义了MyCat中的数据节点,也就是我们通常说所的数据分片,一个dataNode标签就是一个独立的数据分片,通俗理解,一个分片就是一个物理数据库;
最终配置如下:

3、配置dataHost
作用:定义具体的数据库实例、读写分离配置和心跳语句;
balance属性
负载均衡类型,目前的取值有4种:

  1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上;
  2. balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发;
  4. balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力;
    推荐balance设置为1;
    switchType属性
    用于指定主服务器发生故障后的切换类型:
    -1 表示不自动切换
    1 默认值,自动切换
    2 基于MySQL主从同步的状态决定是否切换
    3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)
    heartbeat标签
    用于和后端数据库进行心跳检查的语句
    当switchType为1时,mysql心跳检查语句是select user()
    switchType为2时,心跳检查语句是show slave status
    writeHost与readHost标签
    writeHost指定写库、readHost指定读库,组合这些读写实例来满足系统的要求。
    在一个dataHost内可以定义多个writeHost和readHost。如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另外,由于writeHost宕机系统会自动被检测到,将自动切换到备用的writeHost上去;
    测试读写分离
    配置好MySQL主从复制并启动主从MySQL;
    启动Mycat:/usr/local/mycat/bin/mycat start 
    登录Mycat:mysql -uroot -p -P8066 -h127.0.0.1
    mycat默认数据访问端口是8066
    use mycatdb;
    创建表,插入数据,观察MySQL数据的情况;
    insert into users (phone) values (‘13700000000’);
    Select * from users; 可以正常查询;
    当把从库关闭宕机,验证是否可以再查询,如果不能查询,表示已经实现了读写分离;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值