实验前提:两台服务器

Master server:172.16.23.1

slave server:172.16.23.2

 

一、mysql主从服务器实现

简单介绍:

 MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。

1、主服务器编辑配置文件/etc/my.cnf

[mysqld]添加如下内容

Logbin=mysql_bin

Server-id=1

2、从服务器编辑配置文件/etc/my.cnf

[mysqld]添加如下内容

#Logbin=mysql_bin 注释二进制日志,不需要

Server-id=11   //主从服务器server-id不能相同,否则在主主架构上可能出现循环

Skip-slave-start=1 //让从服务器启动时不自动启动两个线程,sql线程,I/0线程

Relay-log=relay-bin   //从服务器启动中继日志,并起名

Relay-log-index=relay-bin.index //从服务器中继日志的索引

 

show global variables like '%relay% 查看中继日志是否开启

 

3、主服务器上建从数据库账号

grant replication slave,replication client on *.* to repl@'172.16.23.2' identified by ' repl';

flush privilege;

 

4、从服务器:指定主服务器是谁

Mysql>change master to master_host='172.16.23.1',master_user='rep1',master_password='repl';

 --start slave;

 -show slave status\G; //查看关态

如果是下面两行:Slave_IO_Running: Yes

 则成功        Slave_SQL_Running: Yes

 

 

二、当主服务器有大量数据时,主服务需完全备份数据,从服务器导入主的备份,这样速度快些

1、先关闭从服务器 slave stop

2、主服务器备份,方便从服务器导入

mysqldump --all-database --lock-all-tables --master-data=2 >/root/slave.sql

 --master-data=2开启主备份时二进制所在位置,方便从恢复

3、复制到从服务器,打开备份的文件打二进制日志位置

scp /root/slave.sql 172.16.23.2/tmp/

mysqlbinlog /tmp/slave.sql | head -50

找到备份二进制日志位置 如:master_log_file='mysql_bin.000005',master_log_pos=4544

 

4、从服务器指定主服务器是谁,及从服务器要主服务器上的用户名,密码,二进制日志所在的位置

change master to  master_host='172.16.23.1',master_user='rep1',master_password='repl',

master_log_file='mysql_bin.000005',master_log_pos=4544

start slave

show slave status\G;

5、关闭从服务器日志,导入主服务器的备份

mysql>source /tmp/slave.sql

set sql_log_bin=0

set sql_log_bin=1

6、从服务器验证与主服务器对照

从服务:mysql>show databases;

如果从服务上有主服务器上所有的数据库,说明已经导入成功

 

 

 

三、Mysql主主复制

简单介绍:MySQL主主复制与主从复制不同。在主主复制时,两台服务器的任何一台上面的数据库发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。

在两台服务器上各自建立一个具有复制权限的用户;

Master server创建一个充许slave server来访问master server的用户,即用户名密码都是slave

mysql> grant replication slave,replication client  on  *.*  to slave@’172.16.23.2′  identified by  ‘slave′;

slave  server创建一个充许master server来访问slave server的用户,即用户名密码都是master

mysql> grant replication slave,replication client on  *.*  to  master @’172.16.23.1′  identified by  master′;

2、修改配置文件:

# master 服务器上

[mysqld]

server-id = 10       //两主主服务器id不能相同

log-bin = mysql-bin  //启动二进制日志,方便另主服务器复制

auto-increment-increment = 2   //自动增长步长

auto-increment-offset = 1       //自动增长起始位置

 

# slave服务器上

[mysqld]

server-id = 20               //两主主服务器id不能相同

log-bin = mysql-bin           //启动二进制日志,方便另主服务器复制

auto-increment-increment = 2  //自动增长步长

auto-increment-offset = 2     //两服务器的值分别为12,这样可以避免客户端同时向两台服务器插入数据时,出现主键冲突。

 

3、如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可

 

Master server

mysql> SHOW MASTER STATUS\G

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

            File: mysql-bin.000001

        Position: 107

    Binlog_Do_DB:

Binlog_Ignore_DB:

1 row in set (0.00 sec)

 

 

Slave server

mysql> SHOW MASTER STATUS\G

mysql> SHOW MASTER STATUS\G

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

            File: mysql-bin.000001

        Position: 107

    Binlog_Do_DB:

Binlog_Ignore_DB:

1 row in set (0.00 sec)

4、各服务器接下来指定对另一台服务器为自己的主服务器

Master server

# mysql

> CHANGE MASTER TO

> MASTER_HOST=’172.16.23.2′,

> MASTER_USER=’slave′,

> MASTER_PASSWORD=’slave′,

> MASTER_LOG_FILE=’mysql-bin.000001′,

> MASTER_LOG_POS=107;

Slave server上:

# mysql

> CHANGE MASTER TO

> MASTER_HOST=’172.16.23.1′,

> MASTER_USER=’master′,

> MASTER_PASSWORD=’master′,

> MASTER_LOG_FILE=’mysql-bin.000001′,

> MASTER_LOG_POS=107;

5、启动复制功能

两台服务器同时执行

Mysql>start slave      //这样就成为了主主复制

6、验证

Master server上创建数据库,及表

# mysql> create database wl;

# mysql> USE wl;

> CREATE TABLE qq(

> name  varchar(20));

> \q

slave server是否有wl数据库及数据,再在这台服务器上执行相似操作,看另一台服务器上是否有,如果都能同步数据,说明成功。

 

 

四、mysql半同步实现

mysql5.5版本新特性,为了保证主从数据的一致性,mysql发布了半同步复制功能,之前版本为异步复制,半同步的意思表示MASTER 只需要接收到其中一台SLAVE的返回信息,就会commit;否则需等待直至切换成异步再提交。在异步复制的模式下会存在下面的缺点,如果主机出故障时,已经commit的事务不会被传送到任何的slave上。mysql5.5 google 提供补丁半同步   一个主多个从,主从在一个服务器上可同步,半同步主设超时时间,1000毫秒,如果半同步如果无法在指定时间完成将自动降至异步模式

前面已经介绍过主从服务器的实现,这理将接着实现半同步.

 

1、在两台服务器上安装模块

# On Master 

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  //安装主模块

show plugins; 显示模块是否装成功

 

# On slave

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_slave.so';  //安装从模块

show plugins; 显示模块是否装成功

在两台服务器修改配置文件/etc/my.cnf

# On Master 

[mysqld] 

rpl_semi_sync_master_enabled=1                开启半同步功能

rpl_semi_sync_master_timeout=1000 # 1 second    设置超时时间

 

# On Slave 

[mysqld] 

rpl_semi_sync_slave_enabled=1                开启半同步功能

slave服务设置

mysql> stop slave

mysql>start slave

验证是否设置成功

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

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

 

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

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

 

 

五、一些补充

1、如何让从服务的mysql服务在启支时不要自动启动从服务器线程

服务器数据文件 ,

master.info, 记录chang master to 传递参数据

relay-log.info 记录当前服务器上中继日志

mysqld --verbose --help

从服务器

[mysqld]

skip-slave-start=1 启动时不让它主动启动master

 

2、数据库复制过滤

复制部分数据库

 

主服务器

[mysqld] 两个不能同时用

binlog-do-db=wl     白名单

binlog-ignore-db=wl 黑名单

 

在主服务器过滤:任何不涉及到数据库相关的写操作都不会被记录到二进制日志当中;缺点是如果有一天主服务器数据库损坏,想做时间

点还原,那将不可能。建议不要使用。

 

从服务器:缺点是占用带宽,因为过滤是通过过滤中继中志进行的,从服务器中继日志是通过读主服务器的二进制日志文件进行的,因此将把所有主服务器中的二进制文件读取过来,sql线程只执行那些定义的信息,因此仍然占用带宽。

 

只需要服务器上指定选项就可以了

主:[mysqld]两个不能同时用,白名单生效,一般不在主服务器过滤

 binlog-do-db=magedu白名单

 binlog-ignore-db=mysql黑名单

主服务器过滤:任何不涉及到数据库相关的写操作都不会被 记录到二进制日志当中

从:过滤

replicate_do_db

repplicate_ignore_db  忽然数据库

replicate_do_table

repplicate_ignore_table

 

replicate_wild_do_table=wl.tb% 正则表达式,tb表开头的表都将复制

repplicate_wild_ignore_table

 

浪费带宽,从主服务器服务所有到从服务器,只是服复制

 

在从服只复制magedu一个数据库

[mysqld] 复制多个库需多写几行

replicate_do_db=wl

replicate_do_db=wl

 

3、更安全复制,

主服务器崩溃,事务已经提交没写入二进制日志

主服务器:

[mysqld]

sync-binlog=1  事务完成会立即写入到二进制日志中

innodb_flush-logs_at-trx_commit=1 每一事务提效立即刷新到日志中

写数据到磁盘

 

从服务器

skip-slave-start=1   在从服务器不让它自动重启

read_only=1         不让普通用户在从服务器上写入数据,因为从服务器不允放写入数据