2017 11-12 MySQL应用3

一.半同步复制

(1)半同步复制作用

相比较于同步复制和异步复制来说,半同步复制的工作原理是当主库执行完客户端的提交的事务后并不是马上返还给客户端,而是要至少等待一个从库将事务接收到并将内容写入relay_log中。这样做的好处是提高了数据的安全性,但是也会造成一些延迟,所以半同步复制也主要应用在延迟较小的网络环境中

(2)简单配置实现半同步复制

首先准备两个虚拟机,一个作为主库,一个作为从库
开启mysql数据库
配置两台虚拟机为主从复制的关系
主库上

《2017 11-12 MySQL应用3》 搜狗截图20171113211010.png

从库上

《2017 11-12 MySQL应用3》 搜狗截图20171113211034.png

在主库中设置 grant replication client ,replication slave on
. to ‘repluser’@’172.18.%.%’ identified by ‘replpass’;

flush privileges;

《2017 11-12 MySQL应用3》 搜狗截图20171113211708.png

在主库上安装插件

install plugin rpl_semi_sync_master SONAME ‘semisync_master’;

《2017 11-12 MySQL应用3》 搜狗截图20171113212102.png

《2017 11-12 MySQL应用3》 搜狗截图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

《2017 11-12 MySQL应用3》 搜狗截图20171113212641.png

在从节点上安装插件

install plugin rpl_semi_sync_slave SONAME ‘semisync_slave’;

《2017 11-12 MySQL应用3》 搜狗截图20171113212802.png

分别在主从节点上开启半同步复制的功能

set @@global.rpl_semi_sync_master_enabled=ON;

《2017 11-12 MySQL应用3》 搜狗截图20171113213042.png

《2017 11-12 MySQL应用3》 搜狗截图20171113213059.png

set @@global.rpl_semi_sync_slave_enabled=ON;

《2017 11-12 MySQL应用3》 搜狗截图20171113213339.png

stop slave;

start slave;

show global status like ‘%rpl%’;

《2017 11-12 MySQL应用3》 搜狗截图20171113213438.png

此时在主服务器上

《2017 11-12 MySQL应用3》 搜狗截图20171113213850.png

create database youdb;

use youdb;

create table hi values(id int,name char(30));

查看后表创建成功

《2017 11-12 MySQL应用3》 搜狗截图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状态

《2017 11-12 MySQL应用3》 搜狗截图20171113214847.png

此时在主服务上对youdb数据库做一些修改
use database youdb;

insert into hi values(2,’wanghai’);
《2017 11-12 MySQL应用3》 搜狗截图20171113215119.png

在从服务器上去查看

《2017 11-12 MySQL应用3》 搜狗截图20171113215211.png

注意小细节:在主服务器上

《2017 11-12 MySQL应用3》 搜狗截图20171113215313.png

在从服务上

《2017 11-12 MySQL应用3》 搜狗截图20171113215326.png

这说明虽然从服务器也是从相同位置读取数据,但是并没有对数据进行复制

(4)复制的监控和维护

1.理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr };

《2017 11-12 MySQL应用3》 搜狗截图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,下载对应版本。该软件特点是高性能,高可用
其他软件:mysql-proxy ,oneproxy,maxscale
(2)接下来使用proxysql来实现读写分离的目的
步骤:在官网上下载好对应版本后,通过yum install proxysql-1.4.2-1-centos67.x86_64.rpm
下载好之后可以先查看一下该软件的相关信息

《2017 11-12 MySQL应用3》 搜狗截图20171114095759.png

进入配置文件进行配置

《2017 11-12 MySQL应用3》 搜狗截图20171114100230.png

《2017 11-12 MySQL应用3》 搜狗截图20171114101134.png

hostgroup=0代表主数据库,hostgroup=1代表从数据库

创建用户配置段设置

《2017 11-12 MySQL应用3》 搜狗截图20171114101646.png

设置查询规则

《2017 11-12 MySQL应用3》 搜狗截图20171114102048.png

调度读写分离

《2017 11-12 MySQL应用3》 搜狗截图20171114102328.png

实验进行验证读写分离是否生效

在proxysql服务器上以dbadmin身份登录数据库

《2017 11-12 MySQL应用3》 搜狗截图20171114102806.png

通过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.各节点之间要做解析

《2017 11-12 MySQL应用3》 搜狗截图20171114150920.png

3.主节点的配置文件进行设置

《2017 11-12 MySQL应用3》 搜狗截图20171114151119.png

4.从节点配置文件进行设置

《2017 11-12 MySQL应用3》 搜狗截图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 ”

《2017 11-12 MySQL应用3》 搜狗截图20171114154816.png

cd.ssh

ssh-copy-id -i ./id_
rsa.pub root@node3

分别将id_rsa 和id_rsa.pub复制到各个节点上

《2017 11-12 MySQL应用3》 搜狗截图20171114155135.png

ssh 验证
《2017 11-12 MySQL应用3》 搜狗截图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

《2017 11-12 MySQL应用3》 搜狗截图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);

《2017 11-12 MySQL应用3》 搜狗截图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

《2017 11-12 MySQL应用3》 搜狗截图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;

《2017 11-12 MySQL应用3》 搜狗截图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));

《2017 11-12 MySQL应用3》 搜狗截图20171114203658.png

    原文作者:楠人帮
    原文地址: https://www.jianshu.com/p/ca4d250b862c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞