; mysql主从复制及zabbix监控从服务器 | Linux运维部落

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做几项修改

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表的起始位置

[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

生成的文件说明:

[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/       //应用日志,该提交提交该回滚回滚

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

此处特别注意:

在/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

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

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

     

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;

查看从服务器状态

开启从服务器

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;

验证:

设置从服务器为只读

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

 

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;

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

开启半同步复制

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

查看是否有从节点:

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

 

从节点:

[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';

启动服务

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;

             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 *

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

 

从节点:

[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复制到从服务器的目录下

更改从节点配置文件:

[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';

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”)

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

 

关联一个账户

定义动作:

 

 

测试:

从服务器添加一个读锁

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

主服务器做操作

 

 

原创文章,作者:landanhero,如若转载,请注明出处:/60147

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达主管  万达娱乐招商QQ  万达登录  万达娱乐开户  万达娱乐主管  万达娱乐平台  万达注册  万达娱乐招商  万达招商  万达娱乐注册