主从复制的前提:
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
后面还有两种复制的方法,待下一章介绍。