mysql的主从构架,复制,半同步,SSL加密复制的实现

mysql主从构架及复制的实现

在企业应用中,mysql经常采用主从构架,或者主主架构,这样可以实现mysql服务器的负载均衡,提升mysql服务器的性能。而关键是,可以实现mysql的数据同步复制功能,来为企业数据备份提供一种方便的机制。

一.首先了解下mysql的复制功能:

1)支持一主多从的机制,数据通过同步从主服务器复制都从服务器里

2)支持多级结构,主从 从从  主主(互为主从)

3)支持过滤的功能(可以只复制主服务的部分数据而非全部)

二.关于主从构架的mysql,为了数据的一致性,修改数据只能在主服务器上执行,我们来了解一下它的复制类型

1)基于语句的复制:把在主服务上执行的语句,在从服务器上在执行一次。

这种方式有缺陷,如果是像updata t1 SET SALRIS=SALARIS+1000,那么对每个需要更改的数据执行1000次,而不是基于行,大量浪费了系统资源。

2)基于行的复制Row:改变以后的内容复制过去,而不是重新执行一遍。

update t1 SET SALARIS=SALARIS+1000          

3)混合类型复制:语句+行

优先使用语句复制,如果语句复制的内容和数据精确,启用行复制

但是想象一下,这种构架的复制单主服务器如果写的操作比较多,可能会成为系统瓶颈。而从服务器过多也会造成存储空间的浪费。所以这种构架只能为读操作提供优化,对数据的写入,只能依赖主服务器。

复制的主要功用:

1)实现数据的分布式存储(Data distribution),但这种分布是指主从服务器都提供同样的数据。

2)实现数据的负载均衡(主要指读,写需要别的机制实现),主要通过LVS集群或者mysql-proxy来实现。

3)备份(backup) 在从服务器上发出复制请求,主服务器将数据传输给从服务器后,进行热备或者温备,或者当需要备份的时候将服务停下来,进行冷备。

4)提供高可用和及其故障转移功能: 确保服务不会断掉。

5)测试mysql的升级:将主服务上数据备份到从服务器,从服务升级如果可以使用,升级为主服务(如果性能较差,只是临时替代)。

三.主要注意的地方:

1)mysql复制过程在网络上传输时是明文的,不过支持SSL加密。

2)mysql复制要求主从架构的服务器的server id 不能相同。

=============================分 割 线============================

下面我们来实现主从构架的mysql服务器及复制过程,需要准备两台虚拟机,一台做主mysql,一台做从mysql,如下图:

wps_clip_image-14611

1)设置一个服务器成为主服务器

#主服务器一定要设置成静态地址

#5.5以下版本要将默认引擎设置为innodb,设置方法:在/etc/my.cf里添加default-engine=innodb ,再重启服务,安装过程不再累赘,笔者采用二进制包的mysql5.5

(1)配置好IP,

 

  
  
  
  
  1. ifconfig eth0 172.16.14.11 
  2.  
  3. vim /etc/sysconfig/network-scripts/ifcfg-eth0 
  4.  
  5. DEVICE=eth0 
  6.  
  7. BOOTPROTO=static 
  8.  
  9. ONBOOT=yes 
  10.  
  11. HWADDR=00:0c:29:f5:6d:47 
  12.  
  13. IPADDR=172.16.14.11 
  14.  
  15. NETMASK=255.255.0.0 
  16.  
  17. GATEWAY=172.16.0.1 

 

(2)修改配置文件,使它成为主服务器

vim /etc/my.cnf

# 添加或修改如下行

# 如果是5.0版本须添加:default-engine=innodb

log-bin=mysql-bin

log-bin-index=mysql-bin.index

binlog_format=mixd

server_id=1

service mysql restart

(3)创建用户,授予权限

mysql

mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'172.16.%.%' IDENTIFIED BY 'redhat';

#REPLICATION CLIENT:用户有权询问附属者/控制者在哪里。 REPLICATION SLAVE:回复附属者所需。

FLUSH PRIVILEGES;

2 )设置一个服务器成为从服务器

 

  
  
  
  
  1. vim /etc/my.cnf 
  2.  
  3. # 从服务器不需要二进制日志,只需要启动中继日志 
  4.  
  5. 注释掉log-bin 和 binlog_format 
  6.  
  7. relay-log=relay-bin                      # 从服务器需要开启中继日志 
  8.  
  9. relay-log-index=relay-bin.index 
  10.  
  11. server-id = 11                            # id=1是主服务器,其余表示从服务器 
  12.  
  13. service mysqd start 
  14.  
  15. mysql 
  16.  
  17. # 查看relay相关的变量设置,几server_id的值 
  18.  
  19. mysql> SHOW VARIABLES LIKE 'relay%'; 
  20.  
  21. mysql> SHOW VARIABLES LIKE 'server_id'
  22.  
  23. # 设置连接账号和密码,(可以设置使用SSL等) 
  24.  
  25. mysql> CHANGE MASTER TO MASTER_HOST='172.16.14.11'
  26.  
  27. mysql> MASTER_USER='repl',           # 注意是逗号 
  28.  
  29. mysql> MASTER_PASSWORD='redhat'; 
  30.  
  31. # 查看下从服务的状态,是否开启 
  32.  
  33. mysql> SHOW SLAVE STATUS\G 
  34.  
  35. # 开启从服务器 
  36.  
  37. mysql> START SLAVE 
  38.  
  39. # 过一会,再使用SHOW命令查看状态。 
  40.  
  41. mysql> SHOW SLAVE STATUS\G 
  42.  
  43. # 如果错误,查看错误日志 
  44.  
  45. mysql> SHOW VARIABLES LIKE '%erro%' 
  46.  
  47. vim /etc/my.cnf 
  48.  
  49. slave_skip_erros=ON 

 

================================================

#如果上面的过程一直mysql报错,那么我们可以使用下列选项忽略它

在my.cnf里添加replicate-ignore-db=db     在从服务器复制时忽略某个数据库

#如果一直是mysql这个数据库报错,replicate-ignore-db=mysql,重启服务

STOP SLAVE;

START SLAVE;

SHOW SLAVE STATUS\G          # 确保无错才能进行下面的复制过程

====================================================

3) 数据库复制过程的实现

(1)#在主服务器上创建一个数据库

 

  
  
  
  
  1. mysql> CREATE DATABASE MYDB; 
  2.  
  3. mysql> USE MYDB; 
  4.  
  5. mysql> CREATE TABLE t1 ( name varchar(20) ); 

 

(2) 从服务器设置,启动复制线程

mysql> START SLAVE;

Query OK, 0 rows affected (0.00 sec)

wps_clip_image-14614

出现MYDB了,复制成功!

=================分  割  线======================

复制过程详解:

假设我们现在有4台mysql服务器 1主:A   3从:B  C   D

从服务器B C D 同时发起复制请求后,主服务器A将数据传输给从服务器B C D,这个过程是异步的,A受到请求后,不管B C D是否同步完成,如果有修改数据的,继续写入数据,这在使用的时候是无法控制的,这样可能造成数据不一致(同步到一半断了而主服务器不管),而且耗时很长。后来goole为mysql引入了一个插件,实现半同步,大大缩减了同步花费的时间,那就是 Semi-sync。

半同步的概念:数据同步时,只等待其中至少一台从服务器(比如B)完成。这样再通过这台从服务器将数据同步给其他服务器(C D)

但是半同步也会带来的问题:网络原因(比如网速很慢)造成同步迟迟不能进行。

解决方法:在等不到某一个从服务器同步后,自动降级为异步。

Semi-sync简介

Semi-sync最早是由Google实现的一个补丁,代码主要由Mark Callaghan、Wei Li(@Google)等人贡献。Google原本是将需求提给Hekki的,但是后来等不及就自己实现了......。(现在Mark Callaghan已跳到Facebook,除了Google,他曾经还在Informix、Oracle工作过)

在5.5之后由MySQL Replication Team按照Plugin的方式将代码移植过来,并将Semi-sync独立成MySQL的一个插件,主要代码移植者是Zhenxing He(参考)。

下面就介绍半同步的复制过程如何实现(基于上面的基础上):

(1)加载插件

如果使用的是5.5版的mysql,那么在/usr/local/mysql/lib/plugin/ 保存了相关的插件,而我们需要安装的是semisync_master.so  semisync_slave.so

 

  
  
  
  
  1. cd /usr/local/mysql/lib/plugin/ 
  2.  
  3. ls -a semisync_* 
  4.  
  5. semisync_master.so  semisync_slave.so 
  6.  
  7. #执行如下命令加载插件 
  8.  
  9. #在主服务器上 
  10.  
  11. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
  12.  
  13. #在从服务器上 
  14.  
  15. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'

 

在初次加载插件后,Mysql会将该插件记录到系统表mysql.plugin中,下次启动系统自动加载。但是我们还需要在主服务器上的my.cnf 里面增加如下记录来打开semi-sync

 

  
  
  
  
  1. rpl_semi_sync_master_enable=1 
  2.  
  3. rpl_semi_sync_master_timeout=1000 
  4.  
  5. 在丛服务器上的my.cnf里添加如下记录 
  6.  
  7. rpl_semi_sync_slave_enable=1 
  8.  
  9. 重启主从服务器上的Mysql服务 

 

==============================================

# 也可通过设置全局变量的方式来设置,如下:

set global rpl_semi_sync_master_enabled=1

# 取消加载插件

mysql> UNINSTALL PLUGIN rpl_semi_sync_master;

==============================================

查看从服务器上的semi_sync是否开启

wps_clip_image-22983

查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功

wps_clip_image-29538

(2)在主服务器上创建一个数据库tests,在从服务器上启用复制,观察变化

# 从服务器上

mysql> stop slave;

mysql> start slave;

# 主服务器上

wps_clip_image-6778

上面比较重要的状态值有:

Rpl_semi_sync_master_tx_avg_wait_time:事务因开启Semi_sync,平均需要额外等待的时间

Rpl_semi_sync_master_net_avg_wait_time:事务进入等待队列后,到网络平均等待时间

依据上面两个状态值可以知道,Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大。

Rpl_semi_sync_master_status 则表示当前Semi-sync是否正常工作。

从Rpl_semi_sync_master_no_times变量,可以知道一段时间内,Semi-sync是否有超时失败过,该计数器则记录了这样的失败次数。

=========================================分 割 线======================================================

使用SSL加密复制过程(很简单):

见官方文档:http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-ssl.html

补充:

设置从服务器为只读,避免用户在从服务器上修改数据:

SHOW VARIABLES LIKE ‘%read%’

SET GLOBAL read_only=on;

--------------------------------------------------

复制过程中过滤的实现:过滤可以在主服务器上也可以在从服务器上实现。

binlog-do-db        白名单   指定打算复制哪个数据库

binlog-ignore-db    黑名单   打算忽略哪个数据库

注意:两个选项不要同时使用,如果同时使用,只有白名单生效

一般不建议在主服务器上过滤,可能会造成二进制文件不完整,造成不能进行时间点恢复

用法:过滤过个db

replicate-do-db=mydb1

replicate-do-db=mydb2

replicate-do-table=table 

# 可以使用符号匹配

replicate-wild-do-table=db_parttern.tbl_pattern

当定义了如下后,考虑,主服务器上的mysql数据库修改的语句是否会复制?

replicate-ignore-db=mysql

依然会复制,只是不保存,占用相关带宽。

你可能感兴趣的:(数据库,mysql,linux,职场,休闲)