黑马MySQL数据库从入门到精通-运维篇 1
黑马MySQL数据库从入门到精通-运维篇 1
智汇君黑马MySQL数据库从入门到精通-运维篇 1
日志
主从复制
概述
1 | 使得从库和主库的数据保持同步 |
1 | MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。 |
优点
1 | MySQL主从复制的优点主要包含以下三个方面: |
原理
1 | 从上图来看,主从复制分成三步: |
搭建
1 | 学习建议使用直接关闭防火墙,生产中使用开放端口 |
1 | systemctl stop firewall 关闭防火墙 |
1 | 准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备工作。 |
1 | 查看mysql服务运行是否正常 |
主库配置
修改配置文件
1 | 修改配置文件 /etc/my.cnf |
1 | 不配置下两项代表都同步 |
重启MySQL服务器
1 | systemctl restart mysqld |
登录mysql,创建远程连接的账号,并授予主从复制权限
1 | #创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务 |
通过指令,查看二进制日志坐标
1 | show master status; |
1 | 字段含义说明: |
从库配置
修改配置文件
1 | /etc/my.cnf |
重启MySQL服务器
1 | systemctl restart mysqld; |
登录mysql,设置主键配置
1 | CHANGE REPLICATON SOURCE TO SOURCE_HOST='xxxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx; |
开启同步操作
1 | start replica; |
查看主从同步状态
1 | show replica status; |
1 | 主要看标亮两个字段,代表前面说的两个线程 |
测试
创建数据库,表,插入数据
1 | 主库操作 |
1 | 从库操作 |
分库分表
介绍
问题分析
1 | 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: |
1 | 分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的 |
拆分策略
1 | 分库分表是拆分力度的问题 |
垂直拆分
垂直分库
1 | 垂直分库:以表为依据,根据业务将不同表拆分到不同库中 |
垂直分表
1 | 垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中 |
水平拆分
水平分库
1 | 水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中 |
水平分表
1 | 水平分表:以字段为依据,按照一定策略,将一表的数据拆分到多个表中。 |
实现技术
1 | 如何分库分表,如何访问对应的数据库 |
shardingJDBC
1 | shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析、改写、路由处理。需要自行编码配置实现,只支持java语言,性能较高。 |
MyCat
1 | MyCat: 数据库分库分表中间件,不用调整代码即可实现分库分表,支持多种语言,性能不及前者。 |
Mycat概述
介绍
1 | Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在 |
安装
1 | 现在用得多的还是1.6几版本,2.0用得少 |
1 | systemctl status mysqld |
1 | bin:存放可执行文件,用于启动停止mycat |
1 | lib目录下的mysql驱动包版本太低,安装的版本是8.几,对其进行替换 |
核心概念
概念介绍
1 | 逻辑结构部分不存储数据,物理结构部分对应mysql服务器 |
Mycat入门(水平分表)
需求
1 | 它这里要用水平分表 |
环境准备
1 | 先关闭防火墙(或者允许端口)。每台节点主机创建数据库 |
分片配置schema.xml
1 | schema.xml |
notepad直接操作linux文件
1 | 删除多余配置,修改后 |
分片配置(server.xml)
1 | 配置mycat的用户及用户的权限信息 |
测试
启动服务
1 | 切换到Mycat的安装目录,执行如下指令,启动Mycat: |
1 | 表明mycat运行正常 |
分片测试
1 | 通过如下指令,就可以连接并登陆MyCat。 |
1 | 然后就可以在MvCat中来创建表,并往表结构中插入数据,查看数据在MySQL中的分布情况。 |
1 | 但这时tb_order这张表这时逻辑存在,因为还未创建 |
1 | 因为是水平分表,所以三个数据库里的表结构一样 |
1 | 经查看数据只在其中一个节点上 |
分片规则
1 | 分片规则决定数据如何分放rule,然后在rule.xml里存在各种规则。然后具体的分片规则又与分片函数有关比如这里的range-long,然后range-long由于另一个文件有关联 |
1 | 这里表明id为0-5000000存放到0主机节点 |
1 | 15000000最大只能存储这么多条,下面报错,此时只能加数据节点 |
Mycat配置
Mycat配置1
1 | 配置文件已经学了 |
schema.xml
1 | schema.xml作为MyCat中最重要的配置文件之一,涵盖了MyCat的逻辑库、逻辑表、分片规则、分片节点及数据源的配置 |
schema标签
1 | schema标签用于定义MyCat实例中的逻辑库,一个MyCat实例中,可以有多个逻辑库,可以通过schema标签来划分不同的逻辑库。 |
1 | mycat中区分大小写 |
1 | 核心属性: |
1 | table标签定义了MyCat中逻辑库schema下的逻辑表,所有需要拆分的表都需要在table标签中定义。 |
datanode标签
1 | dataNode标签中定义了MyCat中的数据节点,也就是我们通常说的数据分片。一个dataNode标签就是一个独立的数据分片。 |
dataHost标签
1 | 该标签在MyCat逻辑库中作为底层标签存在,直接定义了具体的数据库实例、读写分离、心跳语句。 |
Mycat配置2
rule.xml
1 | rule.xml中定义所有拆分表的规则,在使用过程中可以灵活的使用分片算法,或者对同一个分片算法使用不同的参数,它让分片过程可配置化。主要包含两类标签:tableRule、Function: |
tableRule
1 | rule子标签下涉及到columns分片依据哪个字段,algorithm涉及到的分片函数 |
Function
1 | 分片函数下面的子标签class表示涉及到的分片类,property表示属性,有时也会向上面存在外部文件中 |
server.xml
1 | server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。 |
system
1 | 对应的系统配置项及其含义,参考资料。 |
user
1 | 如上面是上面的注释情况表示可以对指定逻辑库中所有表进行任何操作。上面对逻辑库和逻辑表都进行具体权限设置,则就近原则 |
1 | 增查修改都可以 |
1 | 删除报错 |
Mycat分片
垂直拆分(垂直分库)
场景
1 | 在业务系统中,涉及以下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分,原有的数据库表如下 |
1 | 由于有四类表,但这里只有三个主机节点,用户表中的地址表和省市区和关联所以放到一起 |
1 | 先在每个节点主句上创建shopping数据库 |
配置
schema.xlm
server.xml
1 | 伏笔这里把user用户配置错了 |
测试
1 | 上面的伏笔 |
1 | 在mycat的命令行中,通过source指令导入表结构,以及对应的数据,查看数据分布情况。 |
1 | mycat中间件节点执行上面的sql脚本后,会发现表落到了各自的主机节点。而逻辑库是在主机节点一个一个创建的 |
1 | 插入数据 |
1 | 查询每一笔订单及订单的收件地址信息(包含省、市、区) |
1 | 首先在其中一个主机节点执行,结果不成功 |
1 | 报错,因为在路由时第二个主机节点没有省市区相关表 |
全局表配置
1 | 对于省、市、区/县表tb_areas_provinces,tb_areas_city,tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。 |
schema.xml
1 | 配置修改后,停止mycat服务,删除每个主机节点上的所有表 |
1 | 然后启动mycat服务,重新登录mycat |
1 | 逻辑表存在 |
测试
全局表特性
1 | 所有表数据发生改变 |
水平分表
场景
1 | 在业务系统中,有一张表(日志表,,业务系统每天都会产生大量的日志数据,单台服务器的数据存储及处理能力是有限的,可以对数据库表进行拆分。 |
准备
1 | 在三个mysql服务器中创建数据库itcast |
配置
schema.xml
1 | mod-long |
1 | 3表示对id取模 |
server.xml
测试
1 | 在mycat的命令行中,执行如下SQL创建表、并插入数据,查看数据分布情况 |
1 | 创建实际的表 |
1 | 最后数据是按id对3取模分布,0,1,2分别对应1,2,3节点 |
分片规则
范围分片
1 | 根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。 |
1 | 配置范围如上图 |
取模分片
1 | 根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。 |
一致性hash算法(案例还是水平分表)
1 | 前两种适用于数值字段。这个适用于字符串字段 |
sharding-by-murmur
配置
schema.xml
测试
1 | 一样的先关闭mycat服务,再重新登录mycat |
1 | 创建实际表 |
1 | 插入数据 |
枚举分片(案例还是水平分表)
1 | 通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点让,本规则适用于按照省份、性别、状态拆分数据等业务。 |
sharding-by-intfile-enumstatus
配置
schema.xml
1 | 这里的sharding-by-intfile-enumstatus是对sharding-by-intfile的复制,是为了解决可能其它逻辑表也要用这个规则,且字段用的不一样 |
1 | 使用自己复制的 |
测试
1 | 前面步骤就不说了 |
1 | 插入的数据的status值为不是默认值 |
应用指定算法
1 | 运行阶段由应用自主决定路由到那个分片,直接根据字符子串(必须是数字)计算分片号 |
sharding-by-substring
配置
schema.xml
1 | rule.xml中默认没有这个funciton,需要复制进去。因此tablerule也需要添加 |
测试
1 | 略 |
固定hash算法
1 | 该算法类似于十进制的求模运算,但是为二进制的操作,例如,取id的二进制低10位与 1111111111进行位&运算。结果值范围为0-2^10-1=1023 |
sharding-by-long-hash
配置
schema.xml
测试
1 | 最后一条超过1023,位于运算最后落在第一个分片 |
字符串hash解析
1 | 截取字符串中的指定位置的子字符串,进行hash算法(也是要与1111111111进行位&运算),算出分片 |
sharding-by-stringhash
配置
schema.xml
1 | 也是需要自己复制一份tablerule和funcion |
测试
1 | 略 |
按天分片
sharding-by-date
配置
1 | 比如按照上面红色字体配置则会报错 |
schema.xml
1 | 也需要复制tablerule和function |
测试
1 | 先关闭mycat服务,重新登录,创建实际表,插入数据 |
1 | 31号是下一个周期,出现在第一个节点 |
按自然月分片
sharding-by-month
配置
schema.xml
测试
1 | 例如4月在第一个节点 |
1 | 上面配置为1月-12月时报错 |
mycat管理及监控
原理
insert
1 | 路由时会判断分片的字段 |
serch
1 | 查询时涉及到分片字段,则路由到相应节点,没有则所有。 |
1 | 结果设计合并,排序 |
mycat管理工具(命令行)
1 | Mycat默认开通2个端口,可以在server.xml中进行修改。 |
1 | mysql -h 192.168.200.210 -p 9066 -uroot -p123456 |
1 | 有了这个指令,修改配置文件后,不用像之前关闭和重新启动mycat |
mycat监控1(图形化界面)
介绍
1 | Mycat-web(Mycat-eye)是对mycat-server提供监控服务,功能不局限于对mycat-server使用。他通过JDBC连接对Mycat、Mysql监控,监控远程服务器(目前仅限于linux系统)的cpu、内存、网络、磁盘。 |
安装
zookeeper
mycat-web安装
访问
1 | mycat默认使用的是本机2181端口的zookeeper,刚好不用修改 |
mycat监控2(图形化界面)
读写分离
介绍
1 | 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 |
1 | 这种直接访问mysql的方式麻烦 |
1 | 通过中间件mycat |
1 | 通过mycat的两个组件readhost,writehost实现 |
一主一从
1 | 前面讲主从复制时已经搭建了 |
一主一从读写分离
配置
1 | MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。 |
1 | 一主一从情况下1,3一样的 |
schema.xml
1 | 这里有个困惑点就是实际的数据库itcast之前涉及到了水平分表,这里又用来读写分离 |
server.xml
1 | tb_user是之前已经存在了的表 |
验证读写分离的方法
1 | 验证读 |
存在的问题
1 | 问题:主节点Master宕机之后,业务系统就只能够读,而不能写入数据了 |
双主双从
介绍
1 | 一个主机 Master1用于处理所有写请求,它的从机 slave1和另一台主机 Master2还有它的从机 slave2 负贵所有读请求。当 Master1主机宕机后,Master2主机负责写请求,Master1、Master2互为备机。架构图如下: |
准备工作
双主双从搭建
修改配置文件/etc/my.cnf
重启mysql服务器
1 | 最后一项的意思是这个主节点作为从节点时有更新操作时是否另一个主节点同步 |
两台主库创建账户并授权
查看二进制坐标
从库配置
两台从库配置关联的主库
两台主库相互复制
配置master1
配置master2
测试
1 | 在211中创建db01数据库,在213,212,214中都能同步 |
1 | 建表,插入数据一样的 |
双主双从读写分离
配置
1 | MyCat控制后台数据库的读写分商和负载均衡由schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。 |
schema.xml
server.xml
测试
1 | 验证读 |
1 | 验证写 |
1 | 上面的特性与datahost里writehost,readhost的顺序有关,m2在下面所以写时默认不是它,度时会涉及到它。 |
1 | m1挂了,读时s1,s2,m2都会涉及 |























































































































































































































































