主从复制的前提:

   1、双方的mysql版本最好能保持一致,如果不一致主的要低于从的。

   2、指定从服务器从哪个时间开始复制,如里主从服务器运行过很长一段时间,并且存在不小的数据集,可以先把主服务器做一下备份,然后在从的上面进行恢复,从主服务器上备份时所处的位置开始复制。

   3、主从服务器时间要保持同步

准备两台mysql服务器

   mysql1: 172.16.24.88(主服务器)

   mysql2:  172.16.24.99(从服务器)

保持时间同步:(两边的服务器都要执行)

crontab -e

*/5 * * * */usr/sbin/ntpdate 172.16.0,1 &> /dev/null



一、主从基础配置过程:

1)、修改主服务器的配置文件:

root@www ~]# vim /etc/my.cnf

    log-bin=/mydata/binlogs/master-bin  #启动二进制日志

    server-id = 1                       #指定server-id

2)创建二进制文件的存放目录,并修改其用户限:

    [root@www ~]# mkdir -pv /mydata/binlogs

    [root@www ~]# chown -R mysql.mysql /mydata/binlogs

3)启动mysql服务器:

[root@www ~]# service mysqld start

Starting MySQL..                                           [  OK  ]

4)连上mysql我们授于172.16.24.99对本机开放所有权限,授权的密码为mypass[root@www ~]#grant replication slave,replication client on *.* to 'myuser'@'172.16.24.99' identified by 'mypass';

[root@www ~]# FLUSH PRIVILEGES;

二、从服务器配置过程

1)、修改主服务器的配置文件:

    [root@www ~]# vim /etc/my.cnf     注释掉 下面两项#

    #log-bin=mysql-bin    #注释掉 #

    #binlog_format=mixed  #注释掉 #

    relay-log       = /mydata/relaylogs/resay-bin  #在server-id下添加这一行。

2)创建二进制文件的存放目录,并修改其用户限:

    [root@www ~]# mkdir -pv /mydata/relaylogs

    [root@www ~]# chown mysql.mysql /mydata/relaylogs


3)连上mysql确保中继日志是启动的

[root@www ~]# mysql

MariaDB [(none)]> show global variables like '%relay%';   #查看中继日志是否启动了

+-----------------------+-----------------------------+

| Variable_name         | Value                       |

+-----------------------+-----------------------------+

| max_relay_log_size    | 1073741824                  |

| relay_log             | /mydata/relaylogs/resay-bin |   显示已经启用了中继日志

| relay_log_index       |                             |

| relay_log_info_file   | relay-log.info              |

| relay_log_purge       | ON                          |

| relay_log_recovery    | OFF                         |

| relay_log_space_limit | 0                           |

| sync_relay_log        | 0                           |

| sync_relay_log_info   | 0                           |

+-----------------------+-----------------------------+

9 rows in set (0.03 sec)

4)查看一下主服务器现在二进制文件的状态,以便一会我们启动起复制功能后做比较。

MariaDB [(none)]> show master status;           #查看一下现在主服务器二进制文件现在的记录位置

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      638 |              |                  |

+-------------------+----------+--------------+------------------+

1 row in set (0.03 sec)


MariaDB [(none)]> show processlist;       #查看是否有启用的线程和启用的功能

+----+------+-----------+------+---------+------+-------+------------------+----------+

| Id | User | Host      | db   | Command | Time | State | Info             | Progress |

+----+------+-----------+------+---------+------+-------+------------------+----------+

|  5 | root | localhost | NULL | Query   |    0 | init  | show processlist |    0.000 |

+----+------+-----------+------+---------+------+-------+------------------+----------+

1 row in set (0.00 sec)

5)查看复制功能是否打开

MariaDB [(none)]> show slave status\G;   #查看从服务器的状态信息

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

              Slave_IO_State:

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File:

         Read_Master_Log_Pos: 4

              Relay_Log_File: resay-bin.000001

               Relay_Log_Pos: 4

       Relay_Master_Log_File:

Slave_IO_Running: No    #关键看这两项,复制功能是否启动。

           Slave_SQL_Running: No    #


6)复制功能默认都不会启动,要想启动只能我们自己手动启动,启动命令

MariaDB [(none)]> start slave;  

   MariaDB [(none)]> show slave status\G;    #查看启动状态

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

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-bin.000001

         Read_Master_Log_Pos: 638

              Relay_Log_File: resay-bin.000002

               Relay_Log_Pos: 926

       Relay_Master_Log_File: master-bin.000001

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes        

7)这样一个简得的主从复制就配置好了,如果想要停止则使用下面的命令

   MariaDB [(none)]> stop slave;              #想要停止则用这个命令

    Query OK, 0 rows affected (0.01 sec)  


主从复制之二:

一、如何对主从服务器做限定:

1)如何限定从服务器只读,在从服务器的配置文件中,添加如下一项:

read-only = ON

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

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| innodb_read_only | OFF   |

| read_only        | ON    |

| tx_read_only     | OFF   |

+------------------+-------+

2、我们授权一个用户验证其效果:(在主服务器上执行以下操作)

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| binlogs            |

| information_schema |

| mydb               |

| mysql              |

| performance_schema |

| test               |

+--------------------+

我们把mydb的表授权给从服务器,授权用户为testuser,授权密码为testpass

MariaDB [(none)]> grant all on mydb.* to 'testuser'@'172.16.24.99' identified by 'testpass';

Query OK, 0 rows affected (0.00 sec)

3)到从服务器上验证一下用户信息:


MariaDB [(none)]> use mysql;

Database changed

MariaDB [mysql]> select User,Host from user;

+----------+-------------------------+

| User     | Host                    |

+----------+-------------------------+

| root     | 127.0.0.1               |

| myuser   | 172.16.24.99            |

| testuser | 172.16.24.99            |

| root     | ::1                     |

| root     | localhost               |

| root     | station96.magelinux.com |

+----------+-------------------------+

注意:仅能限制那不具有SUPER权限用户无法执行写操作;想限制所有用户则:

mysql> FLUSH TABLES WITH READ LOCK;

主从复制之三

1)主从复制时的事务安全(每当有事务提交时,立即将与事务相关的日志同步至从服务器)

   在从服务器的配置文件中,添加如下一项:

  [root@www ~]# vim /etc/my.cnf

   sync_binlog=1


[root@www ~]# service mysqld restart  #修改完成之后重启一下mysql;

Shutting down MySQL..                                      [  OK  ]

Starting MySQL..                                           [  OK  ]

[root@www ~]# mysql        #连上mysql


MariaDB [(none)]> show global variables like '%sync_binlog'; #查看修改之后的结果

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog   | 1     |

+---------------+-------+

主从复制之四 (半同步复制)

半同步复制时,主服务器上安装semisync.master.so,从服务器上则安装semisync.slave.so.半同步复制时只要从从服务器中找一个就可以了,所以只需要在从服务器中的一台服务器上装上semisync.slave.so即可。具体操作如下:

1)主服务器上执行:

  MariaDB [(none)]> Install plugin rpl_semi_sync_master soname 'semisync_master.so';

  MariaDB [(none)]> show global variables like '%semi%';   #查看一下安装之后的功能是否启用了没有:

           +------------------------------------+-------+

           | Variable_name                      | Value |

           +------------------------------------+-------+

           | rpl_semi_sync_master_enabled       | OFF   |  #安装完成之后默认是没有启用的

           | rpl_semi_sync_master_timeout       | 10000 |  #等待从服务器多长时间,单位是毫秒

           | rpl_semi_sync_master_trace_level   | 32    |  #跟踪级别

           | rpl_semi_sync_master_wait_no_slave | ON    |  #如果没有从服务器时是否等待它上线

           +------------------------------------+-------+


2)对于我们所要操作的只有以下两项

MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> set global rpl_semi_sync_master_timeout=2000;

Query OK, 0 rows affected (0.00 sec)


3)MariaDB [(none)]> show global variables like '%semi%';  #再查看一下启动状态

+------------------------------------+-------+

| Variable_name                      | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled       | ON    |

| rpl_semi_sync_master_timeout       | 2000  |

| rpl_semi_sync_master_trace_level   | 32    |

| rpl_semi_sync_master_wait_no_slave | ON    |

+------------------------------------+-------+


4)从服务器上的操作:

因为只有管理员才能修改权限,所以先看一下当前是以哪个用户的身份运行的确保是root用户

MariaDB [(none)]> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+


MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';


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

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled     | OFF   |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=1;

Query OK, 0 rows affected (0.00 sec)


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

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled     | ON    |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

5)因为主服务器上设置了是否等待从服务器上线,所以我们从服务器设置完成之后要从起一下IO。

MariaDB [(none)]> stop slave io_thread;

Query OK, 0 rows affected (0.02 sec)


MariaDB [(none)]> start slave io_thread;

Query OK, 0 rows affected (0.00 sec)

这样半同步复制就完成了。

主从复制之五:(复制过滤器

  有时我们期望从服务器只复制主服务器的一部分时,用到了复制过滤器

1)在主服务器上做过滤(则使用以下选项)

master:

binlog_do_db=   #做白名单,表示复制哪些数据库

binlog_ignore_db=   #忽略哪些数据库

(注:两个参数不应该同时使用)

2)从服务器上做过虑(注:要想过滤的更精细一些就在从服务器上做过滤,因为主服务器只能过滤到库级别)

slave:

replicate_do_db=                       #仅复制哪些数据库

replicate_ignore_db=                   #忽略哪些数据库


replicate_do_table= db_name.table_name #仅复制哪些表,要指定数据库名

replicate_ignore_table=                #忽略哪些表


replicate_wild_do_table=               #支持使用通配符复制哪些表

replicate_wild_ignore_table=

如果期望在哪个服务器上做过滤,只要把这些参数写入主配置文件的[mysqld]段中即可。

主从复制之六(多主模型)

1)编辑主服务器的配置文件

server-id       = 1

relay_log   =  /mydata/relaylogs/relay-bin

log-bin=/mydata/binlogs/master-bin

auto_increment_increment = 2

auto_increment_offset = 1

skip_slave_start

2)新建中继日志存放目录并修改权限

[root@www ~]# mkdir /mydata/relaylogs

[root@www ~]# chown -R mysql.mysql /mydata/relaylogs/

3)编辑从服务器的配置文件

log-bin= /mydata/binlogs/master-log

binlog_format=mixed

server-id       = 11

relay-log       = /mydata/relaylogs/resay-bin

auto_increment_increment = 2

auto_increment_offset = 2

skip_slave_start

4)新建二进制日志存放目录并修改权限

[root@www etc]# mkdir /mydata/binlogs

[root@www etc]# chown -R mysql.mysql /mydata/binlogs

注:这里都是接着上面的试验而来的,如里你只是配置这一个功能,那么二制日志和中继日志要定义好)

5)先查看一下当前所处日志文件的位置:

主服务器:

MariaDB [(none)]> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000003 |      327 |              |                  |

+-------------------+----------+--------------+------------------+

6)服务器上建立一个具有复制权限的用户

MariaDB [(none)]> grant replication slave, replication client on *.* to 'myuser'@'172.16.%.%' identified by 'mypass';

MariaDB [(none)]> flush privileges;

7)从服务器上配置:

MariaDB [(none)]> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-log.000002 |      529 |              |                  |

+-------------------+----------+--------------+------------------+

8)服务器上建立一个具有复制权限的用户

MariaDB [(none)]> grant replication slave, replication client on *.* to 'myuser'@'172.16.%.%' identified by 'mypass';

MariaDB [(none)]> flush privileges;

9)把服务器各自指向对方

主:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.24.99',MASTER_USER='myuser',MASTER_PASSWORD='mypass',MASTER_LOG_FILE='master-log.000002',MASTER_LOG_POS=529;

从:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.24.88',MASTER_USER='myuser',MASTER_PASSWORD='mypass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=327;

Query OK, 0 rows affected (0.06 sec)


10)各自启动并查看状态

MariaDB [(none)]> start slave;


MariaDB [(none)]> show slave status\G

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

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.99

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-log.000002

         Read_Master_Log_Pos: 529

              Relay_Log_File: relay-bin.000002

               Relay_Log_Pos: 536

       Relay_Master_Log_File: master-log.000002

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

             Replicate_Do_DB:




MariaDB [(none)]> start slave;

Query OK, 0 rows affected (0.05 sec)


MariaDB [(none)]> show slave status\G

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

              Slave_IO_State: Waiting for master to send event

                 Master_Host: 172.16.24.88

                 Master_User: myuser

                 Master_Port: 3306

               Connect_Retry: 60

             Master_Log_File: master-bin.000003

         Read_Master_Log_Pos: 661

              Relay_Log_File: resay-bin.000002

               Relay_Log_Pos: 870

       Relay_Master_Log_File: master-bin.000003

            Slave_IO_Running: Yes

           Slave_SQL_Running: Yes

后面还有两种复制的方法,待下一章介绍。