一.半同步复制
(1)半同步复制作用
相比较于同步复制和异步复制来说,半同步复制的工作原理是当主库执行完客户端的提交的事务后并不是马上返还给客户端,而是要至少等待一个从库将事务接收到并将内容写入relay_log中。这样做的好处是提高了数据的安全性,但是也会造成一些延迟,所以半同步复制也主要应用在延迟较小的网络环境中
(2)简单配置实现半同步复制
首先准备两个虚拟机,一个作为主库,一个作为从库
开启mysql数据库
配置两台虚拟机为主从复制的关系
主库上
从库上
在主库中设置 grant replication client ,replication slave on . to 'repluser'@'172.18.%.%' identified by 'replpass';
flush privileges;
在主库上安装插件
install plugin rpl_semi_sync_master SONAME 'semisync_master';
在从节点上
开启数据库
执行 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
在从节点上安装插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave';
分别在主从节点上开启半同步复制的功能
set @@global.rpl_semi_sync_master_enabled=ON;
set @@global.rpl_semi_sync_slave_enabled=ON;
stop slave;
start slave;
show global status like '%rpl%';
此时在主服务器上
create database youdb;
use youdb;
create table hi values(id int,name char(30));
查看后表创建成功
(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状态
此时在主服务上对youdb数据库做一些修改
insert into hi values(2,'wanghai');
use database youdb;
在从服务器上去查看
注意小细节:在主服务器上
在从服务上
这说明虽然从服务器也是从相同位置读取数据,但是并没有对数据进行复制
(4)复制的监控和维护
1.理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
一般情况下最好不要删除二进制文件,如果非要删除,也应该先将二进制文件复制到别的地方,再进行删除
例:如图如果想删除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,下载对应版本。该软件特点是高性能,高可用
其他软件:mysql-proxy ,oneproxy,maxscale
(2)接下来使用proxysql来实现读写分离的目的
步骤:在官网上下载好对应版本后,通过yum install proxysql-1.4.2-1-centos67.x86_64.rpm
下载好之后可以先查看一下该软件的相关信息
进入配置文件进行配置
hostgroup=0代表主数据库,hostgroup=1代表从数据库
创建用户配置段设置
设置查询规则
调度读写分离
实验进行验证读写分离是否生效
在proxysql服务器上以dbadmin身份登录数据库
通过proxysql代理将数据库代理到主数据库上,此时写操作都调度主数据库上,而读的内容到调度到从数据库上
注意细节:不要忘了在从服务器上设置复制过滤器,否则读写分离的效果无法生效
三.MHA的应用实现
(1)关于MHA的介绍
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.主节点的配置文件进行设置
4.从节点配置文件进行设置
注意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 ''
cd.ssh
ssh-copy-id -i ./id_rsa.pub root@node3
分别将id_rsa 和id_rsa.pub复制到各个节点上
ssh 验证
各个节点都交叉进行验证
(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
配置完成后进行检查检验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);
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
(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;
同样用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));