mysql主从复制及zabbix监控从服务器

Mysql备份

备份系统的构建,要注意的要点:

第一:能容忍最多丢失多少数据;

第二:恢复数据需要在多长时间内完成;

第三:需要恢复哪些数据:备份时要考虑备份完整;

(1)必须做还原测试,用于测试备份的可用性;

(2)还原演练;不是一个人能够完成的;

备份类型:

完全备份:就是备份整个数据集,是从时间轴上划分的,完整数据集;;

部分备份:只备份数据子集;

      增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据;备份的是从上一次备份为起点到备份时的变化的数据;问题是还原起来比较麻烦;但很节约空间;是从时间轴上的变化量来备份的;是相对上一次的数据变化;

差异备份:仅备份最近一次完全备份以来变化的数据;起点都是从完全备份到备份时的差异部分;还原时用完全备份+最后一个差异就ok了;

注意:在实际使用备份策略时,应该使用完全备份+差异备份,或完全备份+增量备份

 

根据备份时的业务系统能否在线分为:

热备:备份过程中读写操作均可执行;技术复杂;

温备:读操作可执行,但写操作不成;

冷备:读写操作均不可执行;

MyISAM存储引擎:可温备,不能热备;

InnoDB存储引擎:可热备;内部支持快照;

      InnoDB实现热备是,当打算开始备份时,对整个数据做一次阻断;内部做一个快照,而后就针对这个快照做备份就行了,InnoDB支持,因为它的每一次数据修改都有一个lsn日志序列号,但是MyISAM存储引擎没有,所以MyISAM存储引擎就不能执行热备;备份技术都跟存储引擎是有关系的;

 

根据备份的方式分为:

物理备份:直接复制数据文件进行备份;

使用cp、tar命令复制数据;

逻辑备份:从数据库中导出数据另存而进行的备份;

逻辑备份会转换为文本数据后会丢失精度,占用更多空间,需要专用的客户端才能进行;

物理备份,逻辑备份:与存储引擎无关;

 

备份工具:

mysqldump

逻辑备份工具,适用于所有存储引擎,支持温备不支持热备;可用于完全备份、部分备份

对InnoDB存储引擎支持热备;是通过启动一个大事务进行的,可能会备份一天一夜,由于时间长会导致严重的资源竞争;

cp,tar等复制归档工具:

备份容易实现,但是物理备份工具,适用于所有存储引擎;只适用于冷备,可做完全备份、部分备份;

lvm的快照:

可实现几乎热备,借助于文件系统管理工具进行备份;

Mysqlhotcopy

几乎冷备;仅适用于MyISAM存储引擎;

mysql自带的程序

现在除了mysql自己的库使用MyISAM存储引擎,其它很少有人使用了;

 

备份工具的选择:

方案一:mysqldump+复制binlog:可进行远程备份;

mysqldump:做完全备份;

复制binlog中指定时间范围内的event;做增量备份;

 

说明:如果数据集很小(几十兆到几百兆),每周可使用mysqldump进行一次完全备份,然后每一天(每1或2小时等根据需要)使用start-datetime和stop-datatime中间,取得binlog中的事件导出保存在一个sql文件中,这样来备份;也可从上一个完全备份开始一直到现在,就能实现差异,如果是从上一次完全备份或增量开始就能实现增量;这种方案一般比较慢,但支持远程备份;

因为mysqldump是myslq协议的客户端工具;mysqlbinlog又可以远程读取事件,就意味着,备份过程就可以远程进行了;mysql就自带了这些工具;所以,在较小的数据集范围内,对数据精度要求不是特别苛刻,而且对于备份和恢复过程又要求不是特别严格场景中,开使用这个两个工具做备份;

 

mysqldump命令:

客户端命令,支持通过mysql协议连接至mysqld服务器;

事实上就是向mysql服务器发起一个全量查询操作,把所有数据拿到本地以后,并且将读取到的数据保存在文件中,从而完成备份操作的;

-A –all-databases:备份所有库;

-B –databases:指明备份的哪个库

 

mysqldump [OPTIONS] database [tables]

备份指定库中的表,没有生成create database语句

 [root@centos7clean ~]# mysqldump -uroot -hlocalhost -p hellodb > ./hellodb

Enter password:   

MyISAM存储引擎:支持温备,备份时要锁定表

      -x, –lock-all-tables:锁定所有库的所有表,读锁;

mysqldump [OPTIONS] –all-databases [OPTIONS]

[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x –all-databases > ./hellodb4

Enter password:         //输入mysql的密码

      -l, –lock-tables:锁定指定库所有表;

mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]

[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -l –databases hellodb > ./hellodb3

Enter password:

InnoDB存储引擎:支持温备和热备;

      –single-transaction:创建一个事务,基于此快照执行备份;

[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p –single-transaction –databases hellodb > ./hellodb2

Enter password:

注意:必须使用加锁的方式进行备份,否则会造成数据不一致,使备份无法可用

其它必给选项

      –databases指定备份是数据库一个或多个;
          
–all-databases备份所有数据库;
          
–events, -E备份指定数据库相关的所有event scheduler;
          
–routines, -R备份指定数据库相关的所有存储过程和存储函数;
          
–triggers备份表相关的触发器;
          
–skip-triggers不备份触发器;

–master-data[=#]

      0:表示不记录

      1:记录为CHANGE MASTER TO语句,此语句不被注释;

      2:记录为CHANGE MASTER TO语句,此语句被注释;

                     

      –flush-logs:锁定表完成后,即进行日志刷新操作;

 

 

 

实验1::做一次mysqldump的备份及还原完全步骤:

1、先做一侧完全备份

[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x -A -R -E –master-data=2 –flush-logs –triggers > ./hellodb $(date +%F-%T)

Enter password:

mysql主从复制及zabbix监控从服务器

在mysql做几项修改

MariaDB [hellodb]> insert into students (name) values ('wang4');

Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [hellodb]> drop table students;

Query OK, 0 rows affected (0.02 sec)

2、还原二进制日志:

[root@centos7clean ~]# mysqlbinlog /var/lib/mysql/master-log.000008   //查看drop表的起始位置

mysql主从复制及zabbix监控从服务器

[root@centos7clean ~]# mysqlbinlog –stop-position 481 /var/lib/mysql/master-log.000008 > /root/binlog.sql      //导出二进制日志在481的地方结束

MariaDB [hellodb]> set sql_log_bin = off;     //还原时不记录二进制文件中

MariaDB [hellodb]> \. /root/hellodb2016-11-19-14:21:01         //还原完全备份

MariaDB [hellodb]> \. /root/binlog.sql         //还原二进制备份

MariaDB [hellodb]> set sql_log_bin = on;     //开启记录二进制文件中

方案二:lvm2快照+复制binlog:不常用了解

lvm2快照:使用cp或tar等做物理备份;做完全备份;

复制binlog中指定时间范围内的event;做增量备份;

这其实就是物理+逻辑的方式实现;因为cp是物理备份,而复杂binlog中的event在还原时是逻辑还原的,备份出来的数据也是逻辑的;

实验步骤:

前提:数据目录位于逻辑卷,包含了数据文件和事务日志;

            (1) 请求锁定所有表;

                 mysql> FLUSH TABLES WITH READ LOCK;

           (2) 记录二进制文件事件位置;

                 mysql> FLUSH LOGS;

                 mysql> SHOW MASTER STATUS;

      mysql  -e  'SHOW MASTER STATUS;' >> /PATH/TO/SOME_POS_FILE

           (3) 创建快照卷

                 lvcreate  -L # -s -p r – SNAM-NAME /dev/VG-NAME/LV-NAME

           (4) 释放锁

                 mysql> UNLOCK TABLES

           (5) 挂载快照卷,并执行备份,备份完成后删除快照卷;

           (6) 周期性备份二进制日志;

 

基于lvm备份具体步骤:
     
对整个逻辑卷做一个快照,快照卷里面没有内容,快照之后所有对原卷的修改时,需要先将原卷内容复制一份到快照卷上,再在原卷上修改;通过快照卷访问的数据,如果原卷没改仍然通过原卷来访问,如果原卷改了的,将通过快照卷复制原卷修改之前的副本来访问;

1.连接到mysql上,请求锁定所有表:
      > FLUSH TABLES WITH READ LOCK;
     
施加读锁,把所有表中的数据从内存同步到磁盘上;如果能请求到读锁,其它线程只能读操作;如果此时,正有人在执行一个大事务,且正在做写操作,此时就可能会等很长时间才能请求到读锁;
>    SHOW MASTER STATUS;

2.锁定后,滚动一次二进制日志;记录二进制日志文件及事件位置:
      > FLUSH LOGS;
      # mysql -e 'SHOW MASTER STATUS' > /root/pos.`date +%F`

      注意:二进制日志文件要从原卷中备份:
      # cp -a /data/mysql/binlogs/ /tmp

3.为逻辑创建快照:
      # lvcreate -L 2G -n mydata-snap -s -p r /dev/myvg/mydata

4.释放全局读锁
      > UNLOCK TABLES;
     
模拟数据库变化,做些修改操作;
           > USE hellodb;
           > DELETE FROM students WHERE StuID=5;
           > DELETE FROM students WHERE StuID=6;
           > DELETE FROM students WHERE StuID=11;
           > SELECT * FROM students;

5.挂载快照卷并备份
挂载快照卷:
      # mount -r /dev/myvg/mydata-snap /mnt
      备份数据文件
      # cp -a mysql/ /tmp
      注意:二进制日志文件要从原卷中备份:

6.删除快照卷
     # umount /mnt
      # lvremove /dev/myvg/mydata-snap
     

模拟数据库服务器崩溃:
      # systemctl stop mariadb.service
      # rm -rf /data/mysql/*
      模拟数据文件崩溃;
      # rm -rf /data/binlogs/*
      模拟二进制日志文件崩溃;

 

演示基于lvm还原:
1.还原数据文件:
      # cp -a /tmp/mysql/* /data/mysql/
     
还原数据文件;即直接拷贝回来;
      确保复制回来以后,文件的属主、属组是mysql;
2.启动服务

# systemctl start mariadb.service
           > SHOW BINARY LOGS;
           > USE hellodb;
           > SELECT * FROM students;
          
崩溃前的数据;

3.读取二进制日志文件中备份的事件位置
      # cat /pos-2016-06-05
      File Position Binlog_Do_DB Binlog_Ignore_DB
      mysql-bin.000004 245

4、在备份的二进制日志文件中找到mysql-bin.000004文件,从245位置后面,读出所有事件,然后保存在一个sql文件中;
      # mysqlbinlog –start-position=245 mysql-bin.000004 > recovery.sql

5.重放事件:
      # mysql < recovery.sql

方案三:xtrabackup:支持完全备份、增量备份;

由percona提供的支持InnoDB做热备,是物理备份的工具;

可以理解为复制底层数据块,而非简单的复制文件

MyISAM:温备,不支持增量备份;

      InnoDB:热备,增量;

实验2.1:

1、安装xtrabackup

[root@centos7clean ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm

2、新建目录并备份

[root@centos7clean ~]# mkdir /mydata

[root@centos7clean ~]# innobackupex –user=root –password= /mydata

mysql主从复制及zabbix监控从服务器

生成的文件说明:

mysql主从复制及zabbix监控从服务器

[root@centos7clean 2016-11-19_15-19-55]# cat backup-my.cnf

备份了还原时的基本特性

 [mysqld]

innodb_checksum_algorithm=innodb

innodb_log_checksum_algorithm=innodb

innodb_data_file_path=ibdata1:10M:autoextend

innodb_log_files_in_group=2

innodb_log_file_size=5242880

innodb_page_size=16384

innodb_log_block_size=512

innodb_undo_directory=.

innodb_undo_tablespaces=0

[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_binlog_info

master-log.000008     594      //备份时那一刻二进制文件和position

 

[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_info

备份时程序自己的一些相关信息

uuid = 864f15ea-acec-11e6-89ee-000c299ef417

name =

tool_name = innobackupex         //备份的程序

tool_command = –user=root –password=… /mydata       //账号等信息

tool_version = 2.3.2               //程序的版本号

ibbackup_version = 2.3.2

server_version = 5.5.44-MariaDB-log

start_time = 2016-11-19 15:19:56      //启动时间

end_time = 2016-11-19 15:19:58       //结束时间

lock_time = 0

binlog_pos = filename 'master-log.000008', position '594'

innodb_from_lsn = 0

innodb_to_lsn = 9375874

partial = N

incremental = N

format = file

compact = N

compressed = N

encrypted = N

 

[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_checkpoints

文件的核查点

backup_type = full-backuped           //备份的类型

from_lsn = 0

to_lsn = 9375874

last_lsn = 9376086

compact = 0

recover_binlog_info = 0

 

 

 

 

 

3、还原到10.1.72.50

开启mariadb服务

50:[root@localhost ~]# systemctl stop mariadb    //在目标主机上还原明mysql不能启动

[root@ ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm

60:[root@ mydata]# scp -rp 2016-11-19_15-19-55/ 10.1.72.50:/mydata

[root@ ~]# scp percona-xtrabackup-2.3.2-1.el7.x86_64.rpm  10.1.72.50:/root

——————

[root@localhost mysql]# innobackupex –apply-log /mydata/2016-11-19_15-19-55/       //应用日志,该提交提交该回滚回滚

mysql主从复制及zabbix监控从服务器

[root@localhost mydata]# innobackupex –copy-back /mydata/backup/2016-11-19_15-19-55/

mysql主从复制及zabbix监控从服务器

此处特别注意:

在/etc/my.cnf中必须指定、datadir=要恢复的目录

4、更改mysql数据目录的属主属组

[root@localhost mydata]# chown -R mysql.mysql /var/lib/mysql/

5、修改my.cnf

由xtrabackup还原后innodb事务日志的大小改为48m,原mysql默认为5m

不匹配,所以要修改innodb_log_file_size参数

-rw-r—– 1 mysql mysql 50331648 Nov  6 21:44 ib_logfile0

-rw-r—– 1 mysql mysql 50331648 Nov  6 21:44 ib_logfile1

[root@localhost mysql]# vim /etc/my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

symbolic-links=0

innodb_log_file_size = 50331648

——————-

实验2.2

MariaDB [hellodb]> insert into students (name) values ('wang5');

Query OK, 1 row affected, 1 warning (0.01 sec)

 

1.做增量备份

[root@centos7clean mydata]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_15-19-55

      –incremental:明确指明做增量备份

      –incremental-basedir:基于上次备份的哪个目录做增量备份

[root@centos7clean 2016-11-19_17-11-32]# less xtrabackup_checkpoints

mysql主从复制及zabbix监控从服务器

2.再次修改数据

MariaDB [hellodb]> delete from students where stuid=31;

Query OK, 1 row affected (0.01 sec)

3.再做一次增量备份

[root@centos7clean 2016-11-19_17-11-32]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_17-11-32

查看记录到哪个binlog

[root@centos7clean 2016-11-19_17-21-22]# less xtrabackup_binlog_info

master-log.000008       1029

4.再做修改

MariaDB [hellodb]> insert into students (name) value ('wang6');

Query OK, 1 row affected, 1 warning (0.30 sec)

5.导出二进制文件

[root@centos7clean mysql]# mysqlbinlog –start-position=1029 master-log.000008 > /mydata/binlog.sql

mysql主从复制及zabbix监控从服务器

6.还原:

[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/

–redo-only:只提交不回滚

7.合并第一次增量

[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-11-32 //

 

 

8.合并第二次增量

[root@localhost mydata]# innobackupex –apply-log  2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-21-22

注意:这是redo-only不写

9.复制文件:

[root@localhost mydata]# innobackupex –copy-back /mydata/2016-11-19_15-19-55/

10.导入二进制sql语句

MariaDB [hellodb]> \. /mydata/binlog.sql

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Mysql复制:

1.主/从架构:

           异步复制:

           半同步复制:

           一主多从;

           一从一主;

           级联复制;

           循环复制;

           双主复制;

1.1配置在主服务器上

      1.同步时间

[root@localhost mydata]# ntpdate 10.1.0.1

      2. 修改mysql配置文件

[root@centos7clean ~]# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

server_id=1

log_bin=master-log

mysql主从复制及zabbix监控从服务器

      mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

3.配置一个从服务器的授权

MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

 

 

1.2在从服务器上

[root@localhost mydata]# !vim

vim /etc/my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

symbolic-links=0

innodb_log_file_size = 50331648

server_id=2

relay_log=slave-log

innodb_file_per_table=on

启动服务

指明主服务器:

MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;

查看从服务器状态

mysql主从复制及zabbix监控从服务器

开启从服务器

MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;

MariaDB [(none)]>start slave;

验证:

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

设置从服务器为只读

MariaDB [hellodb]> set @@global.read_only=1;

mysql主从复制及zabbix监控从服务器

 

2、主主模式

互为主从:两个节点各自都要开启binlog和relay log;

           1、数据不一致;

           2、自动增长id;

                 定义一个节点使用奇数id

                      auto_increment_offset=1

                      auto_increment_increment=2

 

                 另一个节点使用偶数id

                      auto_increment_offset=2

                      auto_increment_increment=2

节点1:

[root@centos7clean ~]# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server_id=1

log_bin=master-log

relay_log=relay-log

auto_increment_offset=1

auto_increment_increment=2

授权

MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;

指向另一个节点为主:

MariaDB [(none)]> change master to master_host='10.1.72.50',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;

MariaDB [(none)]> start slave;

 

节点2:

[root@centos ~]# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server_id=1

log_bin=master-log

relay_log=relay-log

auto_increment_offset=2

auto_increment_increment=2

授权:

MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.60' identified by '123';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;

指向另一台为主:

MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;

MariaDB [(none)]> start slave;

 

复制时应该注意的问题:                    

      1、尽量确保复制时的事务安全

           在master节点启用参数:

                 sync_binlog = ON

                 立刻将二进制日志写入磁盘中

           如果用到的是InnoDB存储引擎:

                 innodb_flush_logs_at_trx_commit=ON将事务日志写入磁盘

                 innodb_support_xa=ON支持分布式事务

      2、从服务器意外中止时尽量避免自动启动复制线程

                     

      3、从节点:设置参数

           sync_master_info=ON

           sync_relay_log_info=ON

声明:最好不要使用主主模式

 

3、半同步复制

      支持多种插件:/usr/lib64/mysql/plugins/

主节点:

[root@centos7clean ~]# vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server_id=1

log_bin=master-log

[root@centos7clean ~]# systemctl start mariadb

[root@centos7clean ~]# mysql

MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.%' identified by '123';

MariaDB [(none)]> flush privileges;

安装插件

MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';

MariaDB [(none)]> show plugins;

mysql主从复制及zabbix监控从服务器

MariaDB [(none)]> show global variables like 'rpl_semi%';

mysql主从复制及zabbix监控从服务器

开启半同步复制

MariaDB [(none)]> set @@global.rpl_semi_sync_master_enabled=on;

查看是否有从节点:

MariaDB [(none)]> show global status like '%semi%';

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

 

从节点:

[root@localhost mydata]# vim /etc/my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock

server_id=2

relay_log=slave-log

[root@localhost mydata]# systemctl start mariadb

[root@localhost mydata]# mysql

MariaDB [(none)]> change master to master_host='10.1.72.60' ,master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=486;

MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave status\G;

安装插件

MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

mysql主从复制及zabbix监控从服务器

启动服务

MariaDB [(none)]> set @@global.rpl_semi_sync_slave_enabled = on;

停止服务

Stop slave;

开启服务

Start slave;

 

复制过滤器:

      仅复制有限一个或几个数据库相关的数据,而非所有;由复制过滤器进行;

      有两种实现思路:

           (1) 主服务器

                 主服务器仅向二进制日志中记录有关特定数据库相关的写操作;

                 问题:其它库的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=    

将这些参数写入到配置文件中即可;

半同步复制哪些参数想重启生效,也要写入到配置文件中

复制的监控和维护:

      (1) 清理日志:PURGE

           PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };

示例:

MariaDB [(none)]> purge binary logs to 'master-log.000003';

表示mysql-bin.03之前的所有日志都被清理;

MariaDB [(none)]> PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26' ;表示2008-04-02 22:46:26这个时间点之前的所有事件都被清理;

      (2) 复制监控

            MASTER:

                 SHOW MASTER STATUS;

                 SHOW BINLOG EVENTS;

                 SHOW BINARY LOGS;

           SLAVE:

                 SHOW SLAVE STATUS;

           判断从服务器是否落后于主服务器:

MariaDB [(none)]> show slave status\G;

mysql主从复制及zabbix监控从服务器             Seconds_Behind_Master: 0

      (3) 如何确定主从节点数据是否一致?

           通过表的CHECKSUM检查;

           使用percona-tools中pt-table-checksum;

      (4) 主人数据不一致时的修复方法?

           重新复制;

 

 

 

 

 

 

 

 

 

 

 

综合实验:

主节点:

创建CA证书

[root@centos7clean CA]# (umask 077;openssl genrsa -out private/cakey.pem)

[root@centos7clean CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem

[root@centos7clean mysql]# cd ssl/

[root@centos7clean ssl]# (umask 077;openssl genrsa -out mysql.key)

[root@centos7clean ssl]# openssl req -new -key mysql.key -out mysql.csr

[root@centos7clean ssl]# openssl ca -in mysql.csr -out mysql.crt

vim /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server_id=1

log_bin=master-log

innodb_file_per_table = on

ssl

ssl_ca = /etc/pki/CA/cacert.pem

ssl_cert = /var/lib/mysql/ssl/mysql.crt

ssl_key = /var/lib/mysql/ssl/mysql.key

改变属主属组

[root@centos7clean ssl]# chown -R mysql.mysql *

mysql主从复制及zabbix监控从服务器

MariaDB [(none)]> show variables like '%ssl%';

mysql主从复制及zabbix监控从服务器

 

从节点:

[root@localhost ssl]# (umask 066;openssl genrsa -out mysql.key)

[root@localhost ssl]# openssl req -new -key mysql.key -out mysql.csr

[root@localhost ssl]# ls

mysql.csr  mysql.key

[root@localhost ssl]# scp mysql.csr 10.1.72.60:/root

 

 

 

主节点签署并发还从节点,更改属主属组

[root@localhost ssl]# chown mysql.mysql *

[root@localhost ssl]# ll

total 8

-rw-r–r– 1 mysql mysql   0 Nov 20 10:46 mysql.crt

-rw-r–r– 1 mysql mysql 643 Nov 20 10:37 mysql.csr

-rw——- 1 mysql mysql 887 Nov 20 10:37 mysql.key

将证书的公钥cacert.pem复制到从服务器的目录下

mysql主从复制及zabbix监控从服务器

更改从节点配置文件:

[root@localhost ssl]# vim /etc/my.cnf

[mysqld]

socket=/var/lib/mysql/mysql.sock

datadir=/var/lib/mysql

symbolic-links=0

innodb_log_file_size = 50331648

server_id=2

ssl

ssl_ca=/etc/pki/CA/cacert.pem

ssl_cert=/var/lib/mysq/ssl/mysql.crt

ssl_key=/var/lib/mysql/ssl/mysql.key

relay_log=slave-log

启动服务,主节点授权

MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123' require ssl;

MariaDB [(none)]> flush privileges;

 

 

备份主节点数据到从节点:

主:

备份数据

[root@centos7clean ~]# innobackupex –user='root' –password= /mydata

 

 

 

从:

停止服务,还原数据:

[root@localhost mysql]# innobackupex –apple-log /mydata/2016-11-20_11-13-51/

[root@localhost mysql]# rm -rf *

[root@localhost mysql]# innobackupex –copy-back /mydata/2016-11-20_11-13-51/

注意:恢复数据的时候是基于unix套接字的,所以要先创建mysql.sock

启动服务,并指明主服务器

MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000011',master_log_pos=499,master_ssl=1,master_ssl_ca='/etc/pki/CA/cacert.pem',master_ssl_key='/var/lib/mysql/ssl/mysql.key',master_ssl_cert='/var/lib/mysql/ssl/mysql.crt';

mysql主从复制及zabbix监控从服务器

Query OK, 0 rows affected (0.05 sec)

可以用[root@localhost ssl]# mysql –ssl -uuser -h10.1.72.60 -p123测试

 

MariaDB [(none)]> show slave status\G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.1.72.60

                  Master_User: user

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master-log.000012

          Read_Master_Log_Pos: 245

               Relay_Log_File: slave-log.000007

                Relay_Log_Pos: 530

        Relay_Master_Log_File: master-log.000012

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 245

              Relay_Log_Space: 1357

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: Yes

           Master_SSL_CA_File: /etc/pki/CA/cacert.pem

           Master_SSL_CA_Path:

              Master_SSL_Cert: /var/lib/mysql/ssl/mysql.crt

            Master_SSL_Cipher:

               Master_SSL_Key: /var/lib/mysql/ssl/mysql.key

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

1 row in set (0.00 sec)

 

 

 

 

 

实验:使用zabbix监控从服务器 

实验要求:
·
监控过滤Seconds_Behind_Master: 0,如果不等于0,则表示从服务器落后于主服务器,则发送警报并执行操作,在从服务器上执行命令:(mysql  -e “stop slave io_thread;start slave io_thread”)

mysql主从复制及zabbix监控从服务器

10.1.72.40:安装zabbix

[root@localhost ~]#yum -y install ./zabbix-get-3.0.2-1.el7.x86_64.rpm ./zabbix-server-mysql-3.0.2-1.el7.x86_64.rpm ./zabbix-web-3.0.2-1.el7.noarch.rpm ./zabbix-web-mysql-3.0.2-1.el7.noarch.rpm

[root@localhost ~]#yum -y install php httpd php-mysql mariadb-server

[root@localhost ~]#vim /etc/zabbix/zabbix_server.conf

DBName=zabbix

DBUser=zabbix

DBPassword=123

Agent端安转并启动服务,配置自定义key

[root@localhost mysql]# vim /etc/zabbix/zabbix_agentd.conf

# UserParameter=

 UserParameter=Seconds_Behind_Master,mysql -uroot -hlocalhost  -e 'show slave status\G;'|awk -F':' '/Seconds/ {print $2}'

 

 

添加主机,并建立一个item

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

 

关联一个账户

mysql主从复制及zabbix监控从服务器

定义动作:

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

 

 

测试:

从服务器添加一个读锁

MariaDB [(none)]> flush tables with read lock;

主服务器做操作

mysql主从复制及zabbix监控从服务器

mysql主从复制及zabbix监控从服务器

 

 

原创文章,作者:landanhero,如若转载,请注明出处:http://www.178linux.com/60147

(0)
landanherolandanhero
上一篇 2016-12-05
下一篇 2016-12-05

相关推荐

  • 我的第一篇博客

    Hello,大家好,以后我也是博客中的一员了,希望能和大家共同进步。

    Linux干货 2017-07-11
  • 命令组合

    1 取出当前已登陆的用户名 2 取出最后登录用户的相关信息 3 取出默认shell最多的的类型   4 转移    [redsun@jiange root]$ sort -t: -k3 -n -r  /etc/passwd | sed -n "1,+3p" | tr 'a-z' …

    Linux干货 2016-11-13
  • bash的基础特性[更新中]

    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    2018-03-17
  • 20160804课堂作业

    grep正则表达式课堂作业 1、用正则表达式表示IP地址 #grep -E "(\<[1-9]|[1-9][[:digit:]]|1[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[0-5]\>)\.(\<[[:digit:]]|[1-9][[:digit:]]|1[[:digit:]] [[…

    Linux干货 2016-08-05
  • M20 – 1- 第二周博客(1):帮助手册查询的使用

    Linux系统中存在诸多的命令,而这些命令分为内键命令和外部命令。如何查询命令属于内部还是外部呢。前一篇博客已经介绍type命令,type命令可以区分命令属于内部还是外部,下面举个例子: 为什么这一期博客还重复讲如何区分内部与外部命令呢,因为在man手册查询中,内部命令并不是使用man查询帮助手册,仅仅使用与外部命令,那内键命令如何查询呢,接下来要讲的就是h…

    Linux干货 2016-08-02
  • 马哥教育网络班21期+第5周课程练习

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@centos ~]# grep "^[[:space:]]\+" /boot/grub/grub.conf  root (hd0,0) kernel /vmlinuz-2.6.3…

    Linux干货 2016-07-29