MySQL主从Replication同步&&半同步&&主主复制架构

时间:2022-05-31 06:40:48

一、实验环境:
CentOS6.4_x86_64+5.6.12 MySQL Community Server (GPL)
主服务器:Master:10.33.100.66
从服务器:Slave:10.33.100.77
在主从服务器上都部署了安装通用二进制格式的MySQL,详细过程这里不再赘述,可参查此前相关博文
二、主从复制架构的实现
MySQL的主从Replication同步的优点:

  • 在从服务器上可以执行查询操作,降低主服务器的压力;
  • 在从服务器上进行备份,避免备份期间影响主服务器服务;
  • 当主服务器出现问题时,可以很方便地切换到从服务器,让从顶替主服务器作为暂时的主服务器。

注意:从服务器的版本要和主服务器的版本相同或高与主服务器的版本
第一种情况:当主服务器和从服务器都是新的,主服务器中并没有数据。
主服务器上的配置:
1、修改主库my.cnf,设置server-id,log-bin,log-bin-index;
MySQL主从Replication同步&&半同步&&主主复制架构
2、启动mysqld服务,登录主库,确保二进制日志为开启状态
MySQL主从Replication同步&&半同步&&主主复制架构
3、建立仅限Slave主机使用的专门用于进行复制数据的用户:
MySQL主从Replication同步&&半同步&&主主复制架构
MySQL主从Replication同步&&半同步&&主主复制架构
4、在Slave上测试是否可以成功登录Master
MySQL主从Replication同步&&半同步&&主主复制架构
5、刷新日志并查看主库信息
MySQL主从Replication同步&&半同步&&主主复制架构
从服务器的配置:
1、开启中继日志,设置server-id,在[mysqld]的配置中添加如下行:
MySQL主从Replication同步&&半同步&&主主复制架构
2、重启Slave后指定Master,这里指定的用户要和在Master上授权的用户相同:
MySQL主从Replication同步&&半同步&&主主复制架构
3、启动Slave进程并查看运行状态
MySQL主从Replication同步&&半同步&&主主复制架构
注意必须要有上图方框中的两个Yes状态,依次表示网络正常和表结构正常
至此主从服务器就搭建好了,而通常生产情况下,要在正在使用的mysql服务器上做从服务器,可通过如下设置完成。
第二种情况:为正在使用的mysql服务器做从服务器
主服务器上的配置:
1、查看二进制日志的状态,开启二进制日志
2、更改mysql服务器的server-id
3、建立仅限Slave主机使用的专门用于进行复制数据的用户(以上三个步骤,同第一种情况的操作)
4、备份mysql数据库中的数据:由于mysql服务器处于工作状态,并且数据量通常是非常大的,故选择热备份,不耽误服务器提供服务,而备份之后可以直接在从服务器上导入;在Master和Slave上安装好备份工具Xtrabackup(具体的介绍使用,请看此前相关博文)
首先建立一个目录,用于存放备份的数据:

[root@Master ~]# mkdir /backup

完全备份:在/backup目录下会生成一个时间戳的目录,里面就是备份的数据文件;

[root@Master ~]# innobackupex --user=root --password=' ' --socket=/tmp/mysql.sock /backup

准备完全备份文件,使完全备份文件能直接能被用作还原文件
MySQL主从Replication同步&&半同步&&主主复制架构
把备份打包压缩传输到Slave上:
MySQL主从Replication同步&&半同步&&主主复制架构
从服务器上的配置:
1、将主服务器备份好的数据还原,查看做好完全备份时的二进制日志的终止点,作为恢复即时点的起始点:
MySQL主从Replication同步&&半同步&&主主复制架构
2、完全备份的恢复,要关闭服务,确保从服务器上的数据库目录是空的,然后还原数据文件
MySQL主从Replication同步&&半同步&&主主复制架构
3、更改数据文件的属组属主:
MySQL主从Replication同步&&半同步&&主主复制架构
4、启动服务,开启中继日志,修改server id,(以上3步操作同第一种情况,如果在此前修改的是配置文件则不需要重复配置),指定主服务器:
由于在主服务器上做好备份到把从服务器启动这段时间,主服务器上一直有数据产生,故要做时间点恢复,指定二进制文件和位置,而后启动从服务器进程并查看运行状态;
MySQL主从Replication同步&&半同步&&主主复制架构
三、主从半同步的实现(只有mysql-5.5版本之后才支持)
默认情况下主从复制是异步进行的,导致从服务器有可能是落后于主服务器的,这在一定程度上是不安全的,如果主服务器瞬间挂掉,从服务器将来不及复制数据。为了解决这个问题,可以打上google的一个补丁,使主从服务器实现半同步。
开启半同步这个功能之后,主服务器只等待多个从服务器中的指定的一台从服务器复制成功,然后才进行其他写操作,使这个从服务器和主服务器上的数据完全同步,而并不管其他的从服务器。这在一定程度上就保证了数据的安全性。当然主服务器是不能一直等待从服务器复制成功的,因为万一从服务器挂掉,那么主服务器将一直处于等待状态而不提供写服务,这就需要定义一个超时时间,防止等待从服务器时间太长,单位是ms。如果超过定义的时间,从服务器还没有响应,则把指定的从服务器自动降级到异步模式,在选定一个从服务器做同步。
在主服务器上配置:
MySQL主从Replication同步&&半同步&&主主复制架构
编辑配置,文件开启半同步功能,设定超时时间 ;添加完成后保存重启服务
在[mysqld]中添加:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=100
在从服务器上配置:
MySQL主从Replication同步&&半同步&&主主复制架构
编辑配置文件,开启半同步功能,在[mysqld]中添加:
rpl_semi_sync_slave_enabled=1
重启服务:查看服务是否开启:mysql> show plugins;
MySQL主从Replication同步&&半同步&&主主复制架构
查看主服务器上的semi_sync是否开启,clients 值为1证明主从半同步复制连接成功:
MySQL主从Replication同步&&半同步&&主主复制架构
查看从服务器上的semi_sync是否开启:
MySQL主从Replication同步&&半同步&&主主复制架构
四、主从服务器推荐的设置(如果做主主复制架构,请按需设置,但read_only绝不能设置)
主服务器上的配置:编辑/etc/my.cnf在[mysqld]中添加:
sync_binlog=1 ##任何一个事物提交之后就立即写入到磁盘中的二进制文件
innodb_flush_logs_at_trx_commit=1 ##任何一个事物提交之后就立即写入到磁盘中的日志文件
从服务器的配置:编辑 /etc/my.cnf在[mysqld]中添加:
skip_slave_start=1 ##设定从服务器开启时不开启从服务器进程,这样产生时间差可以对从服务器进行配置;可用命令mysql>start slave;开启从服务器进程
read_only=1 ##设定从服务器只能进行读操作,不能进行写操作,保证数据同步(此时root用户仍能进行写操作)
五、主主复制架构的实现
主主复制架构,可以实现像主从服务器进行写操作,也就是说一个是另一个的主服务器,也是另一个的从服务器。
由于以上步骤以及设定10.33.100.77为10.33.100.66的从服务器,故只需设置10.33.100.66为10.33.100.77的从服务器即可。
10.33.100.66服务器的配置:
编辑/etc/my.cnf 在[mysqld]中添加:

auto-increment-increment=2
auto-increment-offset=1

重启服务,此时两台服务器均为新建立,且无其它写入操作,只需记录当前二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可
MySQL主从Replication同步&&半同步&&主主复制架构
10.33.100.77服务器的配置:
授权给复制数据的用户:
MySQL主从Replication同步&&半同步&&主主复制架构
编辑/etc/my.cnf 在[mysqld]中添加:

log-bin=binarylog
log-bin-index=binarylog.index
auto-increment-increment=2
auto-increment-offset=2

重启服务:
MySQL主从Replication同步&&半同步&&主主复制架构
主从服务器接下来指定对另一台服务器为自己的主服务器即可:
10.33.100.66服务器指向10.33.100.77,开启从服务进程;
MySQL主从Replication同步&&半同步&&主主复制架构
10.33.100.77服务器指向10.33.100.66;开启从服务进程:
MySQL主从Replication同步&&半同步&&主主复制架构
至此,主主复制架构完成
六、其他复制选项
–read_only
该选项让从服务器只允许来自从服务器线程或具有SUPER权限的用户的更新,可以确保从服务器不接受来自客户的更新。
–replicate_do_db=db_name
告诉从服务器只做数据库为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次,而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。 请注意不复制跨数据库的语句
–replicate_do_table=db_name.tbl_name
告诉从服务器线程只做对指定表的复制。要指定多个表,应多次使用该选项,每个表使用一次。同–replicate-do-db对比,允许跨数据库更新。
–replicate_ignore_db=db_name
告诉从服务器不要复制数据库为db_name的语句,要想忽略多个数据库,应多次使用该选项,每个数据库使用一次。
–replicate-ignore-table=db_name.tbl_name
告诉从服务器线程不要复制更新指定表的任何语句(即使该语句可能更新其它的表)。要想忽略多个表,应多次使用该选项,每个表使用一次。
–replicate_wild_do_table=db_name.tbl_name
告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。模式可以包含‘%’和‘_’通配符,与LIKE模式匹配操作符具有相同的含义。要指定多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。
–replicate_wild_ignore_table=db_name.tbl_name
告诉从服务器线程不要复制表匹配给出的通配符模式的语句。要想忽略多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。
–replicate_rewrite_db=from_name->to_name
告诉从服务器如果数据库为主服务器上的from_name,则翻译为to_name。只影响含有表的语句
–report_host=slave_name
从服务器注册过程中报告给主服务器的主机名或IP地址。该值出现在主服务器上SHOW SLAVE HOSTS的输出中。如果不想让从服务器自己在主服务器上注册,则不设置该值。
–report_port=slave_port
连接从服务器的TCP/IP端口号,从服务器注册过程中报告给主服务器。
–skip_slave_start
告诉从服务器当服务器启动时不启动从服务器线程。使用START SLAVE语句在以后启动线程。
–slave_skip_errors=[err_code1,err_code2,… | all]
通常情况,当出现错误时复制停止,这样需要手动解决数据中的不一致性问题。该选项告诉从服务器SQL线程当语句返回任何选项值中所列的错误时继续复制
七、其他注意事项
1.不能从使用新二进制日志格式的主服务器向使用旧二进制日志格式的从服务器复制。
2.升级从服务器时,应先关闭从服务器,升级到相应版本,然后重启从服务器并重新开始复制。
3.可以查看SHOW SLAVE STATUS语句的Seconds_Behind_Master列的结果知道从服务器复制的最后一个查询的日期。
4.从服务器不需要始终连接到主服务器,从服务器可以宕机或断开连接几个小时甚至几天,重新连接后获得更新信息,生产环境中对于较为核心的在线应用数据,采取尽量让备机的数据延后主机时间的做法。
5.必须在主服务器和从服务器上总是使用相同的全局字符集和校对规则(–default-character-set、–default- collation)。否则,会在从服务器上遇到复制键值错误,因为在主服务器的字符集中被认为是唯一的键值在从服务器的字符集中可能不是唯一的。
6.怎样通过复制来提高系统的性能?
将一个服务器设置为主服务器并且将所有写指向该服务器。然后根据预算配置尽可能多的从服务器以及栈空间,并且在主服务器和从服务器之间分发读取操作。也可以用–skip-innodb、–skip-bdb、–low-priority-updates以及–delay-key- write=ALL选项启动从服务器,以便在从服务器端提高速度。在这种情况下,为了提高速度,从服务器使用非事务MyISAM表来代替InnoDB和BDB表。
7.怎样强制主服务器阻塞更新直到从服务器同步?

  • 在主服务器上,执行这些语句: mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW
    MASTER STATUS;
    记录SHOW语句的输出的日志名和偏移量。这些是复制坐标。
  • 在从服务器上,发出下面的语句,其中Master_POS_WAIT()函数的参量是前面步骤中的得到的复制坐标值:mysql> SELECTMASTER_POS_WAIT(‘log_name’, log_offset);SELECT语句阻塞直到从服务器达到指定的日志文件和偏移量。此时,从服务器与主服务器同步,语句返回。
  • 在主服务器上,发出下面的语句允许主服务器重新开始处理更新:
    mysql> UNLOCK TABLES;