主从复制的原理
2019年11月18日
14:19
1.原理结构
主节点:
开启一个二进制文件log-bin,记录所有的写操作的日志信息,以position记录的操作指针位置
从节点slave:
I/O线程: 登录主节点,监听二进制日志文件,通过position的值是否发生变化来判断是否需要抓取新的内容
中继日志 rey-log : 记录了I/O线程抓取的内容,判断是否有更新的写操作需要执行,从而将I/O抓取的所有内容在从节点执行一遍,保持和主节点的同步
SQL线程: 监听slave节点内部中中级日志,判断是否由更新的写操作需要执行,从而将I/O抓取的所有内容在从节点执行一遍,保持和主节点的同步
linux安装Percona的mysql
2019年9月27日
10:11
1.搭建安装linux的mysql
1.1获取安装包解压
创建管理目录
[root@10-9-104-184 ~]# mkdir /home/software
获取安装包
[root@10-9-104-184 software]# cp /home/resources/Percona-Server-5.6.24-72.2-r8d0f85b-el6-x86_64-bundle.tar ./
[root@10-9-104-184 software]# mkdir percona
[root@10-9-104-184 software]# mv Percona-Server-5.6.24-72.2-r8d0f85b-el6-x86_64-bundle.tar percona/
解压tar包
[root@10-9-104-184 percona]# tar -xf Percona-Server-5.6.24-72.2-r8d0f85b-el6-x86_64-bundle.tar
1.2rpm安装Percona数据库
需要从rpm中选择四个基本的包进行安装
Percona-Server-56-debuginfo-5.6.24-rel72.2.el6.x86_64.rpm
Percona-Server-shared-56-5.6.24-rel72.2.el6.x86_64.rpm
Percona-Server-client-56-5.6.24-rel72.2.el6.x86_64.rpm
Percona-Server-server-56-5.6.24-rel72.2.el6.x86_64.rpm
[root@10-9-104-184 percona]# rpm -ivh Percona-Server-56-debuginfo-5.6.24-rel72.2.el6.x86_64.rpm
[root@10-9-104-184 percona]# rpm -ivh Percona-Server-shared-56-5.6.24-rel72.2.el6.x86_64.rpm
[root@10-9-104-184 percona]# rpm -ivh Percona-Server-client-56-5.6.24-rel72.2.el6.x86_64.rpm
常见问题
linux创建之初搭建了mysql的软件,所以导致Percona安装失败
解决办法:
1 直接使用已有的mysql(5.5以上)
2 将你安装的不同版本的mysql清空,重新安装percona
1.3验证安装是否成功
开启服务,判断成功失败
#service mysql start/stop/restart
1.4Percona的删除
使用yum命令将Percona内容清掉重新安装等后续才能执行
[root@10-9-104-184 percona]# yum -y remove Percona-Server*
对应的各种文件清空
rm -f /etc/my.cnf
rm -f /var/lib/mysql
2.调试环境
2.1本地登录没有用户名密码
mysql.user表格中没有提供user用户root password是root的配置,远程无法访问
给当前localhost用户添加一个登录的用户名,密码root/root
在linux执行mysqladmin命令添加一行用户信息在user表格中
[root@10-9-104-184 /]# mysqladmin -u root password root
2.2开放远程登录权限
mysql.user表格中添加一行数据
host:% 表示客户端的登录ip地址 可以是所有
linux中登录到mysql客户端执行grant命令
gruant 权限 on 数据库.表格 to '登录用户名'@'客户端ip地址' identified by '登录密码'
mysql> grant all on *.* to 'root'@'%' identified by 'root';
2.3为mycat连接做准备
sqlYog登录到2个云主机的数据库中,实现将user表格中所有的root用户的密码修改为加密的'root'
主从结构配置
2019年11月18日
14:33
1.主节点
1.1观察配置文件
常见问题:
/etc/my.cnf mysql安装完毕后这个文件自动创建生成
问题: percona也能登陆,也能使用,但是文件不存在
解决办法:将任意的正常数据库中的/etc/my.conf拷贝到不存在节点
远程拷贝: scp /etc/my.cnf root@ip地址:/etc
1.2开启主节点的二进制日志文件
vim打开文件 my.cnf
在空白处添加两行配置
server-id=1: 定义了集群(主从)当前节点的id值,不能在同一个主从中定义相同id
log-bin=mysql-log : 主节点开启二进制日志文件的名称
常见问题:
my.cnf中key值名称不是mysql读取的规定内容报错:
1.3重启观察主节点的状态
重启数据库的服务 : mysql restart
登录主节点客户端,显示主节点信息: show master status\G;
file : 二进制日志文件名称,000001后缀为自增的编号,文件达到一定程度,和重启服务是,文件名称自增1的连个相连的文件间.
position是连续的,前一个文件的position指向后一个position起始值,不会由于文件名称的变动导致抓取是失败,文件名精华层修改也被记录到二进制中
position: 指针的值
2.从节点的配置
2.1配置my.cnf
添加两行配置内容:
server-id=2 : 集群d和其他节点不同
log-bin=mysql-log :从节点角色不需要开启二进制文件,为后面双机热备做准备
2.2重启服务
命令:
重启mysql服务: service mysql restart
[root@10-9-100-26 home]# service mysql restart
Shutting down MySQL (Percona Server).... SUCCESS!
Starting MySQL (Percona Server). SUCCESS!
[root@10-9-100-26 home]#
2.3挂接主节点
- 配置参数,将slave表格中的内容填写完整
CHANGE MASTER TO
MASTER_HOST='10.9.104.184',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='mysql-log.000002',
MASTER_LOG_POS=120
- 启动从节点的角色:
START SLAVE:启动io sql线程
STOP SLAVE:关闭io sql线程
3.主从测试
3.1测试同步数据
在从节点创建数据库和表格,写入一些数据,观察主从原理相关内容
3.2从节点中写数据
通过原理判断现象
从节点在mysql技术端不限制写操作,但是由于数据的同步原理,可能造成读取更新的同步主节点sql语句与从节点执行语句冲突,不可以在从节点写数据(从节点只能负责读取数据)
3.3重新挂接
- 保证数据双反一致
- 停止从节点进程(生成slave表格的数据,不关闭无法修改)
stop slave
- 重新挂接 change to master
- 重新启动从节点: start slave
3.4故障转移
数据库主从结构只负责数据同步复制,并不能实现主节点宕机,从节点顶替,至少需要在spring框架中管理多个datasource的逻辑
可以使用中间件管理数据库集群
中间件管理数据库集群的概念
2019年11月18日
15:30
1.故障转移
在分布式高可用数据库集群中,可以引用中间件的计数实现集群的管理
2.读写分离
中间件可以实现对数据库的朱从节点分别进行读写的分离操作,当有客户端访问中间件时,可以根据sql语句判断读写的区别,连接底层的不同节点不同的分片操作读写 ------这种计算叫做读写分离
3.分片的计算
中间件支持多种对数据进行不同分片计算逻辑,表格中有非常多的不同种类型的数据类型,日期,大字段(int/bigint,char/varchar)
常用两种分片:
- 整数范围约束(第一个分片 0-500万,第二个分片 500万-1000万)
- hash一致性(对分片定义的名称进行计算的过程,自定义使用不同字段名称)
4.热备模式
故障转移是热备模式的一种实现,当集群正在提供服务的节点宕机,有备用的选择使用,导致集群正常提供服务----热备
以数据库的主从结构
单机热备: 单方向的主从复制,档主节点宕机从节点顶替(一次性顶替)
双机热备: 双方向的主从复制,互为主从,当主节点宕机,从节点顶替,当顶替的宕机,被顶替的恢复后继续顶替(只要两个节点不同时失效,就可以无限制的相互顶替)
双机热备是数据库集群中数据分片高卡用的基础结构,一般数据库集群中一个数据分片的高可用只需要配置双机热备
mycat中间件
2019年11月18日
15:43
1.介绍mycat
2011年mycat横空出世,从cobar作为前身实现后端连接数据库,解决了假死问题,慢慢发展被ali维护更新,是中国性能较高的开源数据库中间件
2.特点
2.1支持水平分片百亿-千亿 超过千亿使用大数据处理
水平分片,计算能力高
2.2支持数据的整合输入输出
2.3高性能的读写分离
管理的后端数据库集群可以根据客户端读写要求访问不同的数据进行读写的单独处理
3.原理结构(假死)
3.1mycat通过拦截原理执行后端sql语句
3.2主要优势: 实现了后端的NIO
同类产品
ameoba: 最早的中间件(不更新了,读写分离的高性能计算)
cobar: amoeba之后的中间件,早期版本中后端连接数据库有高并发的假死现象,导致中间件瓶颈比较低
mycat: 前身是cobar,开发团队有一部分来自cobar.创建mycat后实现了后端nio的编码逻辑,结局了高并发假死现象
假死:
当中间件计算完分片,读写分离逻辑之后,开启后端连接对象时,connection连接数量过大,导致线程用完,后续的请求计算完毕后没有可用的线程,将会错误的判断由于后端数据库宕机导致的不可连接------假死
总结: 什么是假死?
中间件技术中后端连接数据库使用时,如果是阻塞线程逻辑,容易造成高并发假死,连接数据库的每个线程被每个sql任务阻塞占用,占满后新的sql请求将无法创建后端连接,中间件判断后端服务节点宕机,实际是由于没有线程执行连接任务导致的
安装mycat及测试用例
2019年11月18日
16:47
1.安装mycat
需要基于mysql运行环境(mysql命令脚本支持)
基于jdk运行环境1.5版本mycat jdk1.8
1.1获取安装包解压
获取安装包
[root@10-9-104-184 software]# cp /home/resources/Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz ./
解压安装包
1.2软件结构
bin:命令脚本所在
catlet:插件
conf:配置文件
server.xml,schema.xml rule.xml 等等
lib:依赖jar包库
logs:日志 wrapper.log启动日志
1.3测试启动(能启动但是无法使用)
bin目录下找到mycat脚本文件
#mycat start 后台启动
#mycat console 控制台打印日志
2.入门案例
2.1准备一个双机热备的双向主从结构
- 原来的slave查看master status
- 原来的主节点挂接到原来的从节点
- 原来的主节点启动从节点的角色
2.2入门案例需求
实现了一个非分片表的单节点处理
2.3mycat中表格和库的概念
逻辑库: 包装了后端多个数据库,是一个真实的虚拟展示逻辑库,给客户端使用时,客户端就像使用了真实库一样去操作
逻辑表: 虚拟表,给客户端展示使用的,看成熟逻辑库中数据结构的细化体现
- 非分片表,数据量不大,完全额可以来自于一个分片中的真实表格
- 分片表: 数据量非常大,需要多个后端分片提供数据
2.4配置文件详解
- server.xml: 使用mycat的服务有关配置
- 标签结构
system标签: 配置当前mycat的各种资源,配置占用,如端口号,底层数据包的大小,线程连接的上限数量.
user标签: 定义mycat可以登录的用户信息和用户可以访问的逻辑库
quarantine标签:访问安全有关
子标签
whitehost ip白名单
blacklist sql黑名单
- 标签属性:
- user标签
- name:登录用户名
- password: 密码
- schemas: 可以访问的逻辑库,多个逻辑库可以使用逗号隔开
- readOnly : 当前用户的权限是否是只读的,true只能读操作,false能读能写
- whiteHost: ip白名单(只有在名单中的IP地址和用户可以访问mycat)
- host: 允许的客户端IP地址
- user : 允许登录的用户
- blackList: sql黑名单
- check: 是否对提供的sql设置黑名单
- user标签
<blacklist check="true">selelctAllow</blacklist>
登录的所有客户端无法执行select语句
- schema.xml: 逻辑库逻辑表分片等详细配置文件
- 标签结构
schema: 逻辑库标签,可以配置多个
table: 逻辑表,可以配置多个
chidTable: 子表,可以配置多个
dataNode :分片标签,用来计算分片
dataHost : 管理数据库节点的集群,连接,监听,读写分离,故障转移的标签
heartbeat: 心跳检测的sql语句
writeHost: 写节点标签(只能配置主节点)
readHost: 读节点标签(主从都能配置)
- 标签属性
schema: name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
name: 逻辑库名称,可以和真实库相同,也可以不同
checkSQLSchema: true 表示自动检测苦命,false表示不自动检测,sql: select * from user use easydb,自动监测是否在执行sql中根据访问的逻辑库拼接库名
select * from user-->select * from easydb.user.true sqlYog能操作更多的按钮
sqlMaxLimit: 保护机制.防止有的sql语句查询大表时误操作,返回过多数据
table:逻辑表的配置
name:逻辑表名称 要保持和真实表格一致user
primaryKey:主键字段名称,默认ID
dataNode:当前表格使用的分片名称,分片名称必须在当前配置文件中具有同名的dataNode标签
dataNode:计算分片使用的虚拟的概念
name:分片代号
localhost:dataHost标签的名称
database:当前分片中使用的真实库名称
dataHost
name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"
name:名称,和dataNode标签中绑定
maxCon:连接真实库的最大连接
minCon:最小连接
balance:
writeType:
switchType:
dbType:默认是使用mysql作为后端数据库的技术类型
dbDriver:不同类型不同驱动 mysql-native,使用别的类型必须提供全路径名称
slaveThreshold:判断从节点的延迟时间,超过延迟时间,读写分离时不会从该节点读取数据(只有你的sql心跳语句使用show slave status才生效)
writeHost:提供链接数据库的具体信息
host:代号名称 hostM1 hostM2 hostM3
url:ip:port
user:登录后端数据库的用户
password:后端数据库的密码
2.5上传配置文件启动mycat
容易出现的问题:
mycat链接不上后端数据库
原因:
1开启外届访问权限没有配置root全部用户的密码
2writeHost url user password配置错误
2.6启动链接访问mycat
- 启动
确定上传的文件没有(0)后缀
#bin/mycat console
没有看到异常证明xml没有语法错误
- 登录mycat
sqlYog登录
linux登录mycat
#mysql -uroot -proot -P8066 -h10.9.104.184(mycat所在的ip地址)