MySQL的主从复制

当业务扩展到一定程度时,服务器的负载能力往往不能胜任当前的业务规模,解决的方法无非是横向扩展和纵向扩展:

横向扩展:又称水平扩展(Scale
Out),是通过负载均衡的方式,将压力疏散到后端各个节点服务器;

纵向扩展:又称垂直扩展(Scale
Up),简单提高服务器的硬件性能,此方法很容易再次出现性能瓶颈现象。

数据库服务器在涉及到均衡调度时通常会遇到很多不可忽视的问题:

数据库服务器数据的一致性;

多个事务提交导致的数据完整性的保证;

服务器宕机,怎么保证事务正常提交等等。

数据同步方面,一般得解决方案有一下几种:

同步复制 (Synchronous Replication):发生写数据时,主服务器需要等待从服务器同步完成之后才会返回给客户端信息,等待过程中为阻塞状态,所以效率极低;

半同步复制 (Asynchronous Replication):发生写数据时,主服务器只同步给其中一台从服务器,半同步给其他从服务器;

异步复制 (Semisynchronous Replication):发生写数据时,主服务器在从服务器同步数据的同时,向客户端返回信息,这种方式可能导致主从服务器数据不一致,或者从服务器数据同步状态严重落后于主服务器上的数据。

MySQL主从复制模式:Master/Slave、Master/Master

Master/Slave:一主多从模式,由于从服务器只有只读权限,所以此种模式只能有效分担读请求的压力,但不能分担写请求;此种模式会带来数据同步一致性的问题,可能从服务器同步的数据进度远落后于主服务器更新的进度;如果主机宕机后,则数据就无法写入。

Master/Master:多主模式,多台服务器互为主从;这种模式会带来数据更新不一致,从而发生冲突的问题。

主/从工作流程:

建立主从关系后,如果主服务器发生Data Change之后,Binary Log会更新日志记录;从服务器通过I/O 
Thread读取主服务器上的Binary Log保存至本地的 Relay
Log中,再通过SQL Thread执行本地Relay
Log中的SQL语句,并将执行后的数据保存至磁盘中。

示例一:MySQL异步复制实现

配置文件:

Master:node7配置文件:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

innodb_file_per_table=1

skip_name_resolve=ON

log_bin=master-log                #开启二进制日志

server_id=1                       #设置serverID

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

Slave:node8配置文件:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

relay-log=relay-log               #开启relay日志

innodb_file_per_table=1

read-only=1                       #设置为只读

server_id=2                       #设置serverID,必须不同于其他serverID

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

启动mariaDB:

[[email protected] ~]#
systemctl start mariadb.service

[[email protected] ~]# systemctl start mariadb.service

从服务器需要主服务器授权一个具有REPLICATION
SLAVE, REPLICATION CLIENT权限的用户:

MariaDB [(none)]> GRANT REPLICATION
SLAVE,REPLICATION CLIENT ON *.* TO ‘hisen‘@‘192.168.17.%‘ IDENTIFIED BY
‘hisen‘;

MariaDB
[(none)]> FLUSH PRIVILEGES;

MariaDB [(none)]> SHOW MASTER STATUS;    
#记录此时的binlog文件及位置,从服务器即将从此处进行同步

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

|
File              | Position |
Binlog_Do_DB | Binlog_Ignore_DB |

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

|
master-log.000003 |      492 |              |                  |

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

1
row in set (0.00 sec)

从服务器开始做同步复制的配置:

MariaDB
[(none)]> CHANGE MASTER TO

-> MASTER_HOST=‘192.168.17.70‘,

-> MASTER_USER=‘hisen‘,

-> MASTER_PASSWORD=‘hisen‘,

-> MASTER_LOG_FILE=‘master-log.000003‘,

-> MASTER_LOG_POS=492;

Query
OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> SHOW SLAVE
STATUS\G;         #查看从服务器状态

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

Slave_IO_State:

Master_Host: 192.168.17.70

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:
master-log.000003

Read_Master_Log_Pos: 492

Relay_Log_File: relay-log.000001

Relay_Log_Pos: 4

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: No                    #IO-Thread没有启动

Slave_SQL_Running: No                    #SQL-Thread没有启动

MariaDB [(none)]> START SLAVE;        启动IO-Thread和SQL-Thread

Query
OK, 0 rows affected (0.02 sec)

MariaDB
[(none)]> SHOW SLAVE STATUS\G;

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

Slave_IO_State: Waiting for
master to send event

Master_Host: 192.168.17.70  
#主服务器地址

Master_User: hisen                     #复制时用到的用户名

Master_Port: 3306                       #主服务器端口

Connect_Retry: 60                            #重试连接时长

Master_Log_File:
master-log.000003      #同步主服务器上的binlog文件

Read_Master_Log_Pos: 492                                    
#binlog文件的位置

Relay_Log_File: relay-log.000002       
#本地relay文件

Relay_Log_Pos: 530                                     #relay文件位置

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: Yes               #IO-Thread启动

Slave_SQL_Running: Yes               #SQL-Thread启动

测试主从复制:

Master配置:

MariaDB
[(none)]> CREATE DATABASE hisendb;

Query
OK, 1 row affected (0.00 sec)

MariaDB
[(none)]> USE hisendb;

Database
changed

MariaDB
[hisendb]> CREATE TABLE teachers (TID TINYINT NOT NULL PRIMARY KEY,Name
VARCHAR(50),Age INT,Gender CHAR(10));

Query
OK, 0 rows affected (0.02 sec)

MariaDB
[hisendb]> INSERT INTO teachers VALUES (1,‘Mo Yuan‘,100,‘M‘),(2,‘Bai
Qian‘,150,‘F‘),(3,‘Dong Huadijun‘,100,‘M‘);

Query
OK, 3 rows affected (0.01 sec)

Records:
3  Duplicates: 0  Warnings: 0

MariaDB
[hisendb]> SELECT * FROM teachers;

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

|
TID | Name          | Age  | Gender |

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

|   1 | Mo Yuan       | 
100 | M      |

|   2 | Bai Qian      | 
150 | F      |

|   3 | Dong Huadijun |  100 | M     
|

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

3
rows in set (0.00 sec)

Slave端查看:

MariaDB
[(none)]> SHOW DATABASES;

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

|
Database           |

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

|
information_schema |

|
hisendb            |

|
mysql              |

|
performance_schema |

|
test               |

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

5
rows in set (0.01 sec)

MariaDB
[(none)]> USE hisendb;

Database
changed

MariaDB
[hisendb]> SELECT * FROM teachers;

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

|
TID | Name          | Age  | Gender |

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

|   1 | Mo Yuan       | 
100 | M      |

|   2 | Bai Qian      | 
150 | F      |

|   3 | Dong Huadijun |  100 | M     
|

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

3
rows in set (0.00 sec)

对比可知,已经实现主从同步的效果!

再次查看Master信息:

MariaDB
[(none)]> SHOW MASTER STATUS;

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

|
File              | Position |
Binlog_Do_DB | Binlog_Ignore_DB |

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

|
master-log.000003 |     1008 |              |                  |

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

1
row in set (0.00 sec)

再次查看Slave信息:

MariaDB
[hisendb]> SHOW SLAVE STATUS\G;

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

Slave_IO_State: Waiting for
master to send event

Master_Host: 192.168.17.70

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:
master-log.000003

Read_Master_Log_Pos: 1008                             #已经跟Master的binlog位置相同

Relay_Log_File: relay-log.000002

Relay_Log_Pos: 1046

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

示例二:MySQL半同步复制实现

需要插件支持:semisync_master.so、semisync_slave.so

主节点:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME
‘semisync_master.so‘;

Query
OK, 0 rows affected (0.10 sec)

MariaDB
[(none)]>

MariaDB
[(none)]>

MariaDB
[(none)]> SHOW GLOBAL VARIABLES LIKE ‘rpl_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   
|

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

4
rows in set (0.00 sec)

MariaDB
[(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%‘;

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

|
Variable_name                      |
Value |

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

| rpl_semi_sync_master_enabled       | ON   
|     #半同步主节点开启

| rpl_semi_sync_master_timeout       | 10000 |     #主节点等待超时时间,默认10S

|
rpl_semi_sync_master_trace_level   |
32    |

|
rpl_semi_sync_master_wait_no_slave | ON   
|

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

4
rows in set (0.00 sec)

MariaDB
[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO
‘hisen‘@‘192.168.17.%‘ IDENTIFIED BY ‘hisen‘;

MariaDB
[(none)]> SHOW MASTER STATUS;

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

|
File              | Position |
Binlog_Do_DB | Binlog_Ignore_DB |

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

|
master-log.000003 |      417 |              |                  |

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

1
row in set (0.00 sec)

MariaDB
[(none)]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;

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

|
Variable_name                             
| Value |

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

| Rpl_semi_sync_master_clients               | 1     |     #已经有一个半同步客户端

|
Rpl_semi_sync_master_net_avg_wait_time    
| 0     |

|
Rpl_semi_sync_master_net_wait_time        
| 0     |

|
Rpl_semi_sync_master_net_waits            
| 0     |

|
Rpl_semi_sync_master_no_times             
| 1     |

|
Rpl_semi_sync_master_no_tx                
| 1     |

| Rpl_semi_sync_master_status                | ON    |     #已经确认为半同步复制的主节点

|
Rpl_semi_sync_master_timefunc_failures    
| 0     |

|
Rpl_semi_sync_master_tx_avg_wait_time     
| 0     |

|
Rpl_semi_sync_master_tx_wait_time         
| 0     |

|
Rpl_semi_sync_master_tx_waits             
| 0     |

|
Rpl_semi_sync_master_wait_pos_backtraverse | 0     |

|
Rpl_semi_sync_master_wait_sessions        
| 0     |

|
Rpl_semi_sync_master_yes_tx               
| 0     |

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

14
rows in set (0.01 sec)

从节点:

MariaDB
[(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%‘;

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

|
Variable_name                   | Value |

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

|
rpl_semi_sync_slave_enabled     |
OFF   |

|
rpl_semi_sync_slave_trace_level | 32    |

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

2
rows in set (0.00 sec)

MariaDB
[(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=ON;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%‘;

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

|
Variable_name                   | Value |

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

|
rpl_semi_sync_slave_enabled     | ON    |

|
rpl_semi_sync_slave_trace_level | 32    |

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

2
rows in set (0.00 sec)

MariaDB [(none)]> CHANGE MASTER TO

-> MASTER_HOST=‘192.168.17.70‘,

-> MASTER_USER=‘hisen‘,

-> MASTER_PASSWORD=‘hisen‘,

-> MASTER_LOG_FILE=‘master-log.000003‘,

-> MASTER_LOG_POS=417;

Query OK, 0 rows affected (0.01 sec)

MariaDB
[(none)]> START SLAVE;

Query
OK, 0 rows affected (0.01 sec)

MariaDB
[(none)]> SHOW SLAVE STATUS\G;

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

Slave_IO_State: Waiting for
master to send event

Master_Host: 192.168.17.70

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:
master-log.000003

Read_Master_Log_Pos: 417

Relay_Log_File: relay-log.000002

Relay_Log_Pos: 530

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

MariaDB
[hisendb]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;

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

|
Variable_name              | Value |

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

| Rpl_semi_sync_slave_status | ON    |     #已经确认为半同步复制中从节点

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

1
row in set (0.00 sec)

验证主从模式半同步复制:

Master节点:

MariaDB
[(none)]> CREATE DATABASE hisendb;

Query
OK, 1 row affected (0.00 sec)

MariaDB
[(none)]> USE hisendb;

Database
changed

MariaDB
[hisendb]> CREATE TABLE teachers(TID INT NOT NULL PRIMARY KEY,Name
VARCHAR(50) NOT NULL,Age INT ,Gender CHAR(1));

Query
OK, 0 rows affected (0.01 sec)

MariaDB
[hisendb]> INSERT INTO teachers VALUES (1,‘Ma Yun‘,55,‘M‘),(2,‘Ma
Huateng‘,43,‘M‘),(3,‘Li Yanhong‘,49,‘M‘);

Query
OK, 3 rows affected (0.01 sec)

Records:
3  Duplicates: 0  Warnings: 0

MariaDB
[hisendb]> SELECT * FROM teahcers;

ERROR
1146 (42S02): Table ‘hisendb.teahcers‘ doesn‘t exist

MariaDB
[hisendb]> SELECT * FROM teachers;

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

|
TID | Name       | Age  | Gender |

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

|   1 | Ma Yun     |  
55 | M      |

|   2 | Ma Huateng |   43 | M     
|

|   3 | Li Yanhong |   49 | M     
|

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

3
rows in set (0.00 sec)

MariaDB
[hisendb]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;

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

|
Variable_name                             
| Value |

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

|
Rpl_semi_sync_master_clients              
| 1     |

|
Rpl_semi_sync_master_net_avg_wait_time    
| 1500  |

|
Rpl_semi_sync_master_net_wait_time        
| 4502  |

|
Rpl_semi_sync_master_net_waits            
| 3     |

|
Rpl_semi_sync_master_no_times             
| 1     |

|
Rpl_semi_sync_master_no_tx                
| 1     |

| Rpl_semi_sync_master_status                | ON    |

|
Rpl_semi_sync_master_timefunc_failures    
| 0     |

|
Rpl_semi_sync_master_tx_avg_wait_time     
| 1592  |

|
Rpl_semi_sync_master_tx_wait_time         
| 4777  |

|
Rpl_semi_sync_master_tx_waits             
| 3     |

|
Rpl_semi_sync_master_wait_pos_backtraverse | 0     |

|
Rpl_semi_sync_master_wait_sessions        
| 0     |

|
Rpl_semi_sync_master_yes_tx               
| 3     |

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

14
rows in set (0.00 sec)

Slave节点:

MariaDB
[(none)]> USE hisendb

Database
changed

MariaDB
[hisendb]> SELECT * FROM teachers;

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

|
TID | Name       | Age  | Gender |

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

|   1 | Ma Yun     |  
55 | M      |

|   2 | Ma Huateng |   43 | M     
|

|   3 | Li Yanhong |   49 | M     
|

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

3
rows in set (0.00 sec)

到此主从模式的半同步复制已经成功,但是如果主节点与从节点的IO-Thread停止通信,则主节点会等待一个超时时间,然后自动降级为异步复制模式:

关闭从节点Slave功能:

MariaDB
[hisendb]> STOP SLAVE;

Query
OK, 0 rows affected (0.01 sec)

MariaDB
[hisendb]> SHOW SLAVE STATUS\G;

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

Slave_IO_State:

Master_Host: 192.168.17.70

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:
master-log.000003

Read_Master_Log_Pos: 932

Relay_Log_File: relay-log.000002

Relay_Log_Pos: 1045

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: No    
#IO-Tread关闭

Slave_SQL_Running: No    
#SQL-Thread关闭

主节点再插入数据,会等待10s的半同步超时时间:

MariaDB
[hisendb]> INSERT INTO teachers VALUES (4,‘Lei Jun‘,44,‘M‘);

Query
OK, 1 row affected (10.00 sec)

查看主节点半同步信息:

MariaDB
[hisendb]> SHOW GLOBAL STATUS LIKE ‘%semi%‘;

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

|
Variable_name                             
| Value |

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

|
Rpl_semi_sync_master_clients              
| 1     |

|
Rpl_semi_sync_master_net_avg_wait_time    
| 1194  |

|
Rpl_semi_sync_master_net_wait_time        
| 4777  |

|
Rpl_semi_sync_master_net_waits            
| 4     |

|
Rpl_semi_sync_master_no_times             
| 2     |

|
Rpl_semi_sync_master_no_tx                
| 2     |

| Rpl_semi_sync_master_status                | OFF   |     #关闭半同步主节点功能

|
Rpl_semi_sync_master_timefunc_failures    
| 0     |

|
Rpl_semi_sync_master_tx_avg_wait_time     
| 1592  |

|
Rpl_semi_sync_master_tx_wait_time         
| 4777  |

|
Rpl_semi_sync_master_tx_waits             
| 3     |

|
Rpl_semi_sync_master_wait_pos_backtraverse | 0     |

|
Rpl_semi_sync_master_wait_sessions        
| 0     |

|
Rpl_semi_sync_master_yes_tx               
| 3     |

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

14
rows in set (0.01 sec)

示例三:MySQL双主模式实现:

MySQL的双主模式,其实就是服务器互为主从关系的模式,都拥有写数据的权限,也就是说双方都分别拥有binlog和relaylog。但是双主模式会带来不少问题,也容易造成数据不一致的情况。

由于双主/多主服务器都能对同一表进行插入新数据,如果有id属性,可能会造成双主服务器插入数据冲突,这种问题可以通过自增长id来解决,但是看起来并没像想象中那么美好:

从上图可以看出,按照自增长id的方式,ID号出现“间隙”。主主模式在使用时,问题多多,所以生产环境中MySQL一般都使用主从模式,主主模式可以作为了解MySQL同步数据其中的一种方式而已。

实验拓扑:

配置主要节点:

MySQL服务启动前,配置文件设定:

(1)sever_id必须不同;

(2)双方都需要启用binlog和relaylog;

(3)存在自增长id的表,为了使得id不冲突,需要定义自动增长方式:

一个节点使用奇数id

auto_increment_offset=1

auto_increment_increment=2

另一个节点使用偶数id

auto_increment_offset=2

auto_increment_increment=2

MySQL服务启动后:

(1)双方都需要有复制权限的用户;

(2)双方都需要指向对方为自己的主节点。

实验过程:

node7文件配置:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

thread_handling=pool-of-threads

innodb_file_per_table=1

skip_name_resolve=ON

log_bin=master-log      
#开启binlog

relay-log=relay-log    
#开启relay log

auto_increment_offset=1   
#自增长id初始值

auto_increment_increment=2  
#自增长id步进

server_id=1          #serverID

node8文件配置:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

symbolic-links=0

relay-log=relay-log  
#开启relay log

innodb_file_per_table=1

server_id=2      #serverID

log_bin=master-log  
#开启binlog

auto_increment_offset=2  
#自增长id初始值

auto_increment_increment=2   
#自增长id步进

①启动MySQL服务:

[[email protected]
~]# systemctl start mariadb.service

[[email protected]
~]# systemctl start mariadb.service

②各自创建一个拥有复制权限的用户:

node7 :

MariaDB
[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO
‘hisen‘@‘192.168.17.%‘ IDENTIFIED BY ‘hisen‘;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> FLUSH PRIVILEGES;

Query
OK, 0 rows affected (0.11 sec)

node8:

MariaDB
[(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO
‘hisen‘@‘192.168.17.%‘ IDENTIFIED BY ‘hisen‘;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> FLUSH PRIVILEGES;

Query
OK, 0 rows affected (0.00 sec)

③查看双方当前使用的binlog及位置:

node7:

MariaDB
[(none)]> SHOW MASTER STATUS;

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

|
File              | Position |
Binlog_Do_DB | Binlog_Ignore_DB |

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

|
master-log.000003 |      502 |              |                  |

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

1
row in set (0.00 sec)

node8:

MariaDB
[(none)]> SHOW MASTER STATUS;

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

|
File              | Position |
Binlog_Do_DB | Binlog_Ignore_DB |

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

|
master-log.000003 |      502 |              |                  |

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

1
row in set (0.00 sec)

④各自指向对方的服务器为自己的主节点:

node7 :

MariaDB
[(none)]> CHANGE MASTER TO

->   MASTER_HOST=‘192.168.17.80‘,

-> 
MASTER_USER=‘hisen‘,

-> 
MASTER_PASSWORD=‘hisen‘,

-> 
MASTER_LOG_FILE=‘master-log.000003‘,

-> 
MASTER_LOG_POS=502;

Query
OK, 0 rows affected (0.04 sec)

node8:

MariaDB
[(none)]> CHANGE MASTER TO

-> 
MASTER_HOST=‘192.168.17.70‘,

-> 
MASTER_USER=‘hisen‘,

-> 
MASTER_PASSWORD=‘hisen‘,

->   MASTER_LOG_FILE=‘master-log.000003‘,

-> 
MASTER_LOG_POS=502;

Query
OK, 0 rows affected (0.02 sec)

⑤开启SLAVE,并查看SLAVE状态:

node7:

MariaDB [(none)]> START SLAVE;

Query
OK, 0 rows affected (0.01 sec)

MariaDB
[(none)]> SHOW SLAVE STATUS\G;

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

Slave_IO_State: Waiting for master
to send event

Master_Host:
192.168.17.80   #主节点为对方IP

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-log.000003

Read_Master_Log_Pos: 502

Relay_Log_File: relay-log.000002

Relay_Log_Pos: 530

Relay_Master_Log_File: master-log.000003

Slave_IO_Running: Yes       
#已经开启IO-Thread

Slave_SQL_Running: Yes     
#已经开启SQL-Thread

node8:

MariaDB
[(none)]> START SLAVE;

Query
OK, 0 rows affected (0.00 sec)

MariaDB
[(none)]> SHOW SLAVE STATUS\G;

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

Slave_IO_State: Waiting for
master to send event

Master_Host: 192.168.17.70  
#主节点为对方IP

Master_User: hisen

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:
master-log.000003

Read_Master_Log_Pos: 502

Relay_Log_File: relay-log.000002

Relay_Log_Pos: 530

Relay_Master_Log_File:
master-log.000003

Slave_IO_Running: Yes  
#已经开启IO-Thread

Slave_SQL_Running: Yes  
#已经开启SQL-Thread

⑥测试主主数据复制:

创建数据库hisendb,并创建friends表:

MariaDB [(none)]> CREATE DATABASE hisendb;

Query OK, 1 row affected (0.01 sec)

MariaDB [hisendb]> CREATE TABLE friends(ID INT UNSIGNED PRIMARY
KEY AUTO_INCREMENT,Name VARCHAR(50) NOT NULL,Age TINYINT,Gender ENUM(‘F‘,‘M‘));

Query OK, 0 rows affected (0.09 sec)

首先在node7主节点插入 (‘Xu He‘,25,‘M‘),(‘Xu
Mingying‘,27,‘F‘):

MariaDB
[hisendb]> INSERT INTO friends(Name,Age,Gender) VALUES (‘Xu He‘,25,‘M‘),(‘Xu
Mingying‘,27,‘F‘);

Query
OK, 2 rows affected (0.17 sec)

Records:
2  Duplicates: 0  Warnings: 0

MariaDB
[hisendb]> SELECT * FROM friends;

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

|
ID | Name        | Age  | Gender |

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

|  1 | Xu He       |  
25 | M      |

|  3 | Xu Mingying |   27 | F     
|

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

2
rows in set (0.00 sec)

再次在node8主节点插入(‘Tian
Tao‘,26,‘M‘),(‘Liang Juntao‘,27,‘M‘):

MariaDB
[hisendb]> INSERT INTO friends(Name,Age,Gender) VALUES (‘Tian
Tao‘,26,‘M‘),(‘Liang Juntao‘,27,‘M‘);

Query
OK, 2 rows affected (0.00 sec)

Records:
2  Duplicates: 0  Warnings: 0

MariaDB
[hisendb]> SELECT * FROM friends;

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

|
ID | Name         | Age  | Gender |

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

|  1 | Xu He        |  
25 | M      |

|  3 | Xu Mingying  |   27
| F      |

|  4 | Tian Tao     |  
26 | M      |

|  6 | Liang Juntao |   27 | M     
|

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

4
rows in set (0.00 sec)

由上可知,双方能完成数据同步,但是自增长ID的确出现“间隙”。

时间: 2024-10-19 03:09:21

MySQL的主从复制的相关文章

mysql实现主从复制

今天说一下MySQL的主从复制如何做到! 准备工作: 1.两个虚拟机:我这里用的是CentOS5.5,IP地址分别是192.168.1.101 和192.168.1.105: 101做主服务器,105做从服务器(都已经安装相同版本的Mysql): 2.本机环境:Apache+PHP+MySQL 好了,现在开始吧,来看看这听起来高大上的主从复制是怎么回事. 原理:mysql要做到主从复制,其实依靠的是二进制日志,即:假设主服务器叫A,从服务器叫B:主从复制就是   B跟着A学,A做什么,B就做什么

怎样解决MySQL数据库主从复制延迟的问题?

1.网络超时 2.慢查询 3.流量 问题一:主库的从库太多,导致复制延迟从库数据以3-5个为宜,要复制的从节点数量过多,会导致复制延迟问题二:从库硬件比主库差,导致复制延迟查看Master和Slave的系统配置,可能会因为机器配置不当,包括磁盘I/O.CPU.内存等各方面因素造成复制的延迟.一般发生在高并发大数据量写入场景中问题三:慢SQL语句过多假如一条SQL语句执行时间是20秒,那么从执行完毕到从库上能查到数据至少需要20秒,这样就延迟20秒了.一般要把SQL语句的优化作为常规工作不断地进行

用python监控mysql的主从复制

利用python来检查MySQL的主从复制, 有一个注意点是,cur.execute("show slave status;") 不能用cur.execute("show slave status\G;") result = cur.fetchall() 返回的是个二元数组 result[0] 返回时整个show slave status 状态信息. result[0][n] 返回具体的某一项. python代码如下: #!/usr/bin/env python #

MySQL的主从复制是如何实现的

前言 MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果. MySQL主从复制架构图 一主一从 master-slave-replication-01 一主多从 master-slave-replication-02 级联 master-slave-repli

Mysql中主从复制的原理、配置过程以及实际案例

Mysql中主从复制的原理.配置过程以及实际案例1.什么是主从复制?原理:主从分离,什么意思呢?我们不妨画个图看看.如图1所示: 2.准备工作:预备两台服务器,我这里使用虚拟机安装了两个Centos6.7_64位操作系统,并分别在两台服务器上安装mysql.我的IP地址分别为:192.168.1.15/192.168.1.16,这里我定义15为主服务器,16为从服务器.首先,我们编辑主服务器中mysql配置文件.(因我的mysql使用非root用户安装,因此配置文件放在/home/formal/

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番配置直接可以实现,而读写分离则需要一些软件的支持,基本上读写分离的实现有两种: Amoeba(变形虫):是由前阿里员工实现的一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.但是由于没人维护了,而且据说作者也不再回答开发者的问题,所以不予考虑. Mysql-Proxy:是一

MySQL DB 主从复制之SSL

需求架构 准备工作 主从服务器时间同步 # 主从服务器同时配置crontab任务,与NTP服务器同步时间即可 */5 * * * * ntpdate 172.16.0.1 &>/dev/null 部署配置 主库配置 vi /etc/my.cnf server-id = 1 # 在复制架构中,需保持全局唯一 log-bin = mysql-bin # 默认在数据目录下 sync_binlog = 1 # 设置mariadb每次在提交事务前会将二进制日志同步到磁盘,保证服务器崩溃时不会丢失事件

基于SSL的mysql(MariaDB)主从复制

一.前言 备份数据库是生产环境中的首要任务,重中之重,有时候不得不通过网络进行数据库的复制,这样就需要保证数据在网络传输过程中的安全性,因此使用基于SSL的复制会大加强数据的安全性 二.准备工作 1.主从服务器时间同步 [[email protected] ~]# crontab -e */30 * * * * /usr/sbin/ntpdate 172.16.0.1 &>/dev/null 2.mysql说明 (1)主服务器 hostname:master    IP:172.16.7.2

mysql的主从复制(二)mysql-proxy实现读写分离

安装前准备(三台虚拟机): 主机1: 172.16.24.77   安装msyql服务器端  mysql-proxy 主机2: 172.16.24.88    安装mysql服务器端(mysql主) 主机3: 172.16.24.99   安装mysql服务器端(mysql从) (注,我这里的三台主机都是安装好了mysql的,如里你没有安装请参照前面的博客有安装过程) 一.安装mysql-proxy 所需安装包(mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit

mysql半主从复制

node3: 172.16.92.3/16 mariadb主服务器node4: 172.16.92.4/16 mariadb从服务器以上节点均为CentOS 7.1 配置环境1. 配置好光盘yum源2. 关闭selinux和iptables node3: mariadb主服务器 [[email protected] ~]# yum -y install mariadb-server[[email protected] ~]# vim /etc/my.cnf[mysqld]datadir=/var