第十八节、MySQL主从原理配置及故障恢复

一、MySQL主从复制原理剖析
第十八节、MySQL主从原理配置及故障恢复_第1张图片
mysql主从.gif

简单的来说就是将主master上操作的任何语句同步到从slave上。
Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。

  1. 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。
  2. Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)
  3. Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
  4. Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
简述:
mysql的主从是一个异步复制的过程,总共会开启三个线程,master上开启I/O线程,slave上开启I/O线程和SQL线程,slave服务器启动后它的I/O线程会联系master,告知会从master服务器bin-log日志的某个point点开始读取数据,master接受到请求后,I/O线程会对slave服务器做出回应,将要求的bin-log文件内容发送回去,slave服务器接收的内容存放到中继日志relay-log中,同时生成文件master.info,将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;slave的SQL线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容(SQL语句),并在自身执行,这样主从服务器就保持一致了
二、MySQL主从服务器配置

都以yum安装为例

  • 主服务器master配置(192.168.15.142),修改配置文件,开启bin-log日志,设置server-id
[root@mini ~]# cat /etc/my.cnf 
[mysqld]    
datadir=/var/lib/mysql  
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 
log-bin=mysql-bin #开启bin-log日志,二进制文件记录数据库的操作,用于数据库的还原,起备份作用
server-id=1 #mysql服务ID
character-set-server=utf8 
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]   
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
replicate-do-db=all  #同步所有数据库,也可以具体到某几个数据库名字,主从可以不加
[client]   
default-character-set=utf8 
[mysql]   
default-character-set=utf8 
  • 从服务器slave配置(192.168.15.143),修改配置文件设置server-id,不能有重复id
[root@mini ~]# cat /etc/my.cnf 
[mysqld]    
datadir=/var/lib/mysql  
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 
character-set-server=utf8 
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]   
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
[client]   
default-character-set=utf8 
[mysql]   
default-character-set=utf8 
  • 设置完成后主从服务器重启mysqld服务
  • 在master上设置slave的权限grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
  • 在Master 数据库执行如下命令查看记录点position
    mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 |       98 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
  • slave服务器指定master IP和bin-log日志文件中最新的point点
    change master to master_host='192.168.15.103',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98;
  • 启动slave线程start slave;
  • 检查主从配置状态
    查看主从状态show slave status\G,还可以显示slave服务器的信息
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个状态为YES,代表slave已经启动两个线程,一个为IO线程,一个为SQL线程。

备注
数据库备份一般有完全备份和增量备份两种,增量备份的本质就是备份bin-log日志,记录对服务器的新操作命令.
bin-log日志以及master.info文件存放在目录/var/lib/mysql/
查看这些bin-log日志内容mysqlbinlog mysql-bin.000009|more
而且从服务器无法将主从关系创建之前的数据同步过来(例如同步是从point点34开始,那么之前的就没办法同步),想要从服务器和主服务器完全一致就要把主服务所有数据完全备份dump下来,还原到从服务器后再开启主从同步.

三、故障恢复

发生现象及原因:master上的数据库nagios是在主从服务器设置前就存在的,slave上并不存在该数据库,当master上对nagios进行操作时,slave就会报错,此时需要进行故障修复.
故障解决:首先可以用命令show slave status\G在slave上查看报错信息分析错误原因,
情况一、忽略错误继续同步,主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况,首先登录master锁住主库所有的表,只允许读取flush tables with read lock;,然后登录从库停住主从stop slave,跳过错误set global sql_slave_skip_counter =1;最后开启主从start slave,去主库解锁表unlock tables;
该办法一般不怎么使用.无法保证数据的一致性.
方法二、重新做主从,完全同步,先锁住主库完全备份导出文件,利用备份文件导入从库后保证主从数据库完全一致后重做主从后解锁主库.

四、监控mysql主从状态

可以利用shell脚本,本质就是利用mysql命令show slave status\G获取I/O及SQL线程状态为YES
外部执行mysql操作mysql -e "show slave status\G"|grep "Running"|grep -c "YES",先利用mysql命令的e参数外部执行获取从服务器状态,然后匹配关键词Running只获取两个线程所在行的状态,再利用grep的c参数统计两行是否有2个YES来监控主从状态,以后写入脚本执行返回值2作为zabbix监控的key值,如果不等于2就设置触发器报警。还可以利用wc来统计该数值
mysql -e "show slave status\G"|grep "Running"|grep "YES"|wc -l

你可能感兴趣的:(第十八节、MySQL主从原理配置及故障恢复)