2017 11-12 MySQL应用3
一.半同步复制
(1)半同步复制作用
相比较于同步复制和异步复制来说,半同步复制的工作原理是当主库执行完客户端的提交的事务后并不是马上返还给客户端,而是要至少等待一个从库将事务接收到并将内容写入relay_log中。这样做的好处是提高了数据的安全性,但是也会造成一些延迟,所以半同步复制也主要应用在延迟较小的网络环境中
(2)简单配置实现半同步复制
首先准备两个虚拟机,一个作为主库,一个作为从库
搜狗截图20171113211010.png
开启mysql数据库
配置两台虚拟机为主从复制的关系
主库上
从库上
搜狗截图20171113211034.png
在主库中设置 grant replication client ,replication slave on . to 'repluser'@'172.18.%.%' identified by 'replpass';
flush privileges;
搜狗截图20171113211708.png
在主库上安装插件
install plugin rpl_semi_sync_master SONAME 'semisync_master';
搜狗截图20171113212102.png
搜狗截图20171113212218.png
在从节点上
开启数据库
执行 change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='master-log.000003' master_log_pos=245;
start slave;
show slave status\G
搜狗截图20171113212641.png
在从节点上安装插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave';
搜狗截图20171113212802.png
分别在主从节点上开启半同步复制的功能
set @@global.rpl_semi_sync_master_enabled=ON;
搜狗截图20171113213042.png
搜狗截图20171113213059.png
set @@global.rpl_semi_sync_slave_enabled=ON;
搜狗截图20171113213339.png
stop slave;
start slave;
show global status like '%rpl%';
搜狗截图20171113213438.png
此时在主服务器上
搜狗截图20171113213850.png
create database youdb;
use youdb;
create table hi values(id int,name char(30));
查看后表创建成功
搜狗截图20171113214132.png
(2)使用复制过滤器
1.概念:仅复制有限一个或几个数据库相关的数据,而非所有;由复制过滤器进行;
2.两种实现思路
(1) 主服务器
主服务器仅向二进制日志中记录有关特定数据库相关的写操作;
问题:其它库的time-point recovery将无从实现;
binlog_do_db=
binlog_ignore_db=
(2) 从服务器
从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;
问题:网络IO和磁盘IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
权衡利弊与实际需要做好采用从服务器实现
(3)实现过程
在从服务器上
stop slave;
set @@global.replicate_ignore_db=youdb;——将youdb数据库过滤不会对其内容进行复制
start slave;
查看slave状态
搜狗截图20171113214847.png
此时在主服务上对youdb数据库做一些修改
insert into hi values(2,'wanghai'); 搜狗截图20171113215119.png
use database youdb;
在从服务器上去查看
搜狗截图20171113215211.png
注意小细节:在主服务器上
搜狗截图20171113215313.png
在从服务上
搜狗截图20171113215326.png
这说明虽然从服务器也是从相同位置读取数据,但是并没有对数据进行复制
(4)复制的监控和维护
1.理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
搜狗截图20171113215730.png
一般情况下最好不要删除二进制文件,如果非要删除,也应该先将二进制文件复制到别的地方,再进行删除
例:如图如果想删除000003以前的日志但不包括000003日志就可以执行 purge binary logs to 'master-log.000003';
2.复制监控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判断从服务器是否落后于主服务器:
Seconds_Behind_Master: 0
3.如何确定主从节点数据是否一致?
通过表的CHECKSUM检查;
使用percona-tools中pt-table-checksum;
4.主从数据不一致时的修复方法?
重新复制;
二.主从复制的读写分离
(1)常用的软件是proxysql——下载地址www.proxysql.com,下载对应版本。该软件特点是高性能,高可用
搜狗截图20171114095759.png
其他软件:mysql-proxy ,oneproxy,maxscale
(2)接下来使用proxysql来实现读写分离的目的
步骤:在官网上下载好对应版本后,通过yum install proxysql-1.4.2-1-centos67.x86_64.rpm
下载好之后可以先查看一下该软件的相关信息
进入配置文件进行配置
搜狗截图20171114100230.png
搜狗截图20171114101134.png
hostgroup=0代表主数据库,hostgroup=1代表从数据库
创建用户配置段设置
搜狗截图20171114101646.png
设置查询规则
搜狗截图20171114102048.png
调度读写分离
搜狗截图20171114102328.png
实验进行验证读写分离是否生效
在proxysql服务器上以dbadmin身份登录数据库
搜狗截图20171114102806.png
通过proxysql代理将数据库代理到主数据库上,此时写操作都调度主数据库上,而读的内容到调度到从数据库上
注意细节:不要忘了在从服务器上设置复制过滤器,否则读写分离的效果无法生效
三.MHA的应用实现
(1)关于MHA的介绍
搜狗截图20171114150920.png
MHA(Master HA)是一款开源的Mysql的高可用程序,它为Mysql的主从复制架构提供了自动监测机制,当MHA监测到master主节点出现故障后,它会提升和主节点复制信息内容最接近的slave节点作为新的主节点,并且MHA还会通过获取其他从节点的信息来避免一些一致性方面的问题。MHA还能提供master在线切换主从节点的功能。
MHA有两种角色
1.MHA Manager(管理节点):通常单独的存在于一台服务器上管理多个master/slave集群,每个集群称为一个application
2.MHA node(数据节点):该数据节点主要工作在每一个MYSQL服务器上,它通过监控具有解析和清理logs日志功能的脚本来加快故障转移
(2)准备MHA环境
1.本次实验要有四个节点
一个节点作为master节点
两个节点作为slave节点
一个节点作为MHA节点
2.各节点之间要做解析
3.主节点的配置文件进行设置
搜狗截图20171114151119.png
4.从节点配置文件进行设置
搜狗截图20171114151241.png
注意server_id不要相同
5.设置完成后主从节点开启Mysql
在主节点上进行授权
show master status\G;
grant all on . to 'mhaadmin'@'172.18.%.%' identified by
'mhapass';
flush privileges;
在从节点上执行
change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='master-log.000004',master_log_pos=245;
start slave;
show slave status\G
在另一个从节点上做相同操作
复制集群配置完成
6.准备基于SSH互相通信的环境
在其中一个节点上
执行ssh-keygen-id -t rsa -P ''
搜狗截图20171114154816.png
cd.ssh
ssh-copy-id -i ./id_rsa.pub root@node3
分别将id_rsa 和id_rsa.pub复制到各个节点上
搜狗截图20171114155135.png
ssh 验证 搜狗截图20171114155359.png
各个节点都交叉进行验证
(7)安装MHA
在node4上进行安装
lftp 172.18.0.1/pub
cd Source
cd 6.x86_64
mget mhamysql-manager-0.56-0.e16.noarch.rpm
mhamysql-node-0.56-0.e16.noarch.rpm
在主从点上安装mhamysql-node-0.56-0.e16.noarch.rpm即可
(8)对MHA进行的配置文件进行配置
mkdir /etc/masterha
vim /etc/masterha/app1.cnf
搜狗截图20171114161350.png
配置完成后进行检查检验ssh通信是否成功
master_check_ssh --conf=/etc/masterha/app1.cnf
主从复制集群是否成功
mhamysql-node-0.56-0.e16.noarch.rpm
注意:要在从节点上手动执行flush privileges;
否则监测结果为Health is not ok
检查成功后启动MHA
masterha_manger --conf=/etc/masterha/app1.cnf
(9)模拟主节点故障
关闭主节点数据库,然后在MHA服务器上重新执行
mhamysql-node-0.56-0.e16.noarch.rpm
监测结果为Health is not ok
此时在从节点上(172.18.25.62)变为主节点
show slave status\G;
内容为空,证明此时该节点为主节点
show master status\G;
变为新的主节点
如果想要原来的主节点上线,就要在原来的主节点的配置文件文件中加入relay_log_purge=OFF relay_only=ON
重新启动该数据库,并导入
change master to master_host='172.18.25.62',master_user='repluser',master_password='replpass',master_log_file='master-log.000003',master_log_pos=395;
start slave;
show slave status\G;
上线成功
注意:启动MHA也可以执行后台运行机制
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/data/master/app1/manager.log &
四.表分区的建立
(1)根据范围进行划分
打开数据库
选择hellodb数据库
创建一个表
CREATE TABLE students (id INT, name VARCHAR(100), age TINYINT UNSIGNED NOT NULL, gender ENUM('F','M')) PARTITION BY range(age)(partition youngman values less than (40), partition middleman values less than (70), partition oldman values less than maxvalue);
搜狗截图20171114201947.png
for语句生成表内容
gender=('F' 'M')
echo ${gender[0]}
echo ${gender[1]}
for i in {1..1000};do mysql -e "insert into hellodb.students2 values ($i,'stu$i',$[RANDOM%100+18],'${gender[$RANDOM%2]}');" -uroot -pmagedu;done
搜狗截图20171114202754.png
(2)按hash划分表
创建一个新的表
CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M')) PARTITION BY hash(id) PARTITIONS 6;
搜狗截图20171114203016.png
同样用for语句创建表的内容
for i in {1..1000};do mysql -e "insert into hellodb.students values ($i,'stu$i',$[RANDOM%100+18],'${gender[$RANDOM%2]}');" -uroot -pmagedu;done
(3)按照List来划分表
CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M'),majorid tinyint unsigned not null) partition by list(majorid) (partition apr0 values in (1,4,7),partition par1 values in (2,5,8),partition par2 values in (3,6,9));
搜狗截图20171114203658.png