查看: 782|回复: 0

[Mysql数据库] mysql主从复制

发表于 2018-1-23 08:00:01

要实现主从复制,首先得打开主服务器binlog功能,工作原理其实就是从库向主库获取binlog日志,记录sql操作。
mysql的主从复制是一个异步的复制过程,将数据从一个主数据库复制到另一个从数据库,在主和从之间实现复制的过程是由3个线程参与完成的,主库IO线程从库IO和SQL线程。i/o线程去请求主库 的binlog,得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

#读写分离软件
maxscale,MyCat,atlas

mysql主从复制原理介绍
1)master服务器上开启二进制日志,每个事务更新数据完成之前,master都会把数据变化记录到二进制日志文件中(串行写入)
2)slave上配置change master to,将master的binary日志拷贝到它自己的中继日志(I/O线程)
3)SQL线程从中继日志中读取事件,并重放其中的事件更新slave的数据,使得和master的数据一样

A:在主服务器上配置如下
1、在master上创建一个备份账户,每个slave使用标准的mysql用户名和密码连接master,进行复制操作的用户会授予replication slave权限。
命令:
mariaDB [jiaoyu]> grant replication slave,reload on . to 'backup'@'192.168.119.%' identified by '1234'
2、master上开启log-bin
配置my.cnf(启用log-bin,配置server-id)
3、备份master服务器上的数据(/server/backup)
[root@db backup]# mysqldump -uroot -pLsf@8816 -A -x > /server/backup/mysql_date +%F.sql
4、通过SCP把主服务器上的数据拷贝到从服务器上,在从服务器上执行一遍,以便在主从同步之前,数据是一致的
5、记录master服务器上master_log_file和master_log_pos
MariaDB [jiaoyu]> show master status;

B、在从服务器上配置如下(slave)
1、配置change master(master.info)
mariaDB [jiaoyu]>change master to master_host='192.168.119.128',master_port=3306,master_user='backup',master_password='1234',master_file_log='mysql-bin.000009',master_file_pos=643;
2、配置my.cnf开启
log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
(server-id必须唯一,relay_log中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处))
3、把从主服务器拷贝过来的备份数据,还原数据库
4、开启start slave
MariaDB [(none)]> show slave status\G
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.119.129
Master_User: req
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 643
Relay_Log_File: test-relay-bin.000012
Relay_Log_Pos: 537
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes #这个为yes
Slave_SQL_Running: Yes #这个为yes
...
Seconds_Behind_Master: 0
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接

小结:
1、主从复制是异步的逻辑的sql语句级的复制
2、复制时,主库有一个I/O线程,从库有俩个线程I/O和sql

=======================主从复制实例===============================
主从复制实例

#关闭单实例
/etc/init.d/mysqld stop
#查看进程
lsof -i:3306
#开启多实例
/data/3306/mysql start
/data/3307/mysql start
#查看进程
ss -lntup|grep 330

主从复制实践:
1、准备
主库log_bin
主从server-id不同
2、主库准备
mysql -uroot -poldboy123 -S /data/3306/mysql.sock
grant replication slave on . to 'rep'@'172.16.1.%' identified by 'oldboy123';
flush privileges;

3、把数据从主库搞到从库。
复制前 让从和主一致。
mysql -S /data/3306/mysql.sock
mysql> flush table with read lock; 不能关窗口
mysql> show master status;
+-------------------+----------+
| File | Position |
+-------------------+----------+
| oldboy-bin.000002 | 405 |
单开窗口
mysqldump -A -B --master-data=2 -S /data/3306/mysql.sock|gzip >/opt/3306.sql.gz
原窗口
mysql> unlock table;
从库恢复:
gzip -d /opt/3306.sql.gz
mysql -uroot -poldboy123 -S /data/3307/mysql.sock

5、指定主机、用户、位置点同步
mysql> CHANGE MASTER TO
MASTER_HOST='172.16.1.51',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=656166;

6、开启同步开关,检查是否同步。
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

#测试
create database ddd;
drop database ddd;

数据库主从复制原理

要实现主从复制,首先得打开主服务器binlog功能,工作原理其实就是从库向主库获取binlog日志,记录sql操作。
mysql的主从复制是一个异步的复制过程,将数据从一个主数据库复制到另一个从数据库,在主和从之间实现复制的过程是由3个线程参与完成的,主库IO线程从库IO和SQL线程。

工作中错误。
stop slave; #<==临时停止同步开关。
set global sql_slave_skip_counter =1 ; #<==将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;

32期mysql主从复制
1、部署主从复制时不正常问题汇总
1、server-id相同导致
2、userver-uuid相同导致(带着数据库克隆虚拟机)
[root@oldboyedu ~]# cat /data/3306/data/auto.cnf
[auto]
server-uuid=5f61a6ed-0950-11e7-94ed-000c29210a05
3、change master错误。

(2)快速主从复制
mysqldump -A -B --master-data=1 -S /data/3306/mysql.sock >/opt/3306.sql
从库:
CHANGE MASTER TO
MASTER_HOST='172.16.1.51',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123';

(3)5.6 GTID复制特性:

(4)监控主从复制:
两个yes一个0 必要条件
关键:模拟用户访问,主写时间戳,从读。
(5)主从复制故障排除
stop slave; #<==临时停止同步开关。
set global sql_slave_skip_counter =1 ; #<==将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;
配置文件:
[root@MySQL ~]# grep slave-skip /data/3306/my.cnf
slave-skip-errors = 1032,1062,1007
(6)从库记录binlog
log-slave-updates #<==必须要有这个参数
log-bin = /data/3307/oldboy-bin
expire_logs_days = 7
从库记binlog: 1、从库备份。2、从库再做主库(级联)。
A--->B-->C-->D
(7)MySQL主从复制延迟问题原因及解决方案
讲了6点。
(8)级联复制与主主复制
A--->B-->C-->D
(9)从库只读read-only
M--->S
从库配置read-only:具有SUPER权限的用户不受read-only参数影响,例如:管理员root。
授权Web连接用户,尽量不要有all。create。
(10)生产读写分离情况如何授权网站用户
oldboy授权Web连接用户select。
主库:oldboy 123456 3306 172.16.1.51 W
从库:oldboy 123456 3306 172.16.1.52 W
a.主库 增删改查,从库:查(revoke增删改)
b.主库 增删改查,从库:read-only
c.忽略mysql同步(不记录binlog),主库从库分别授权oldboy.主库 增删改查,从库:查
replicate-ignore-db = mysql
binlog-ignore-db = mysql

=========================================================
导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
1、网络不通
2、密码不对
3、pos不对

==============================================
主主复制常见方法
解决数据写入冲突方法

实现的具体参数:
解决主键自增长变量冲突:
Master1:
auto_increment_increment = 2 #自增ID的间隔,如 1 3 5间隔为2。
auto_increment_offset = 1 #ID的初始位置
(将形成 1,3,5,7...序列)

Master2:
auto_increment_increment = 2 #自增ID的间隔,如 2 4 6间隔为2。
auto_increment_offset = 2 #ID的初始位置
(将形成 2,4,6,8 ...序列)
缺点:ID号不连续
优点:前端网站程序不需要任何修改。
应用:尽量不要双写,而是单写,作用可作为主宕机后备用选择


第二种主主复制
使用序号服务器
优点:ID号连续
缺点:前端网站程序需要修改。

测试单个主库
create database oldboy CHARACTER SET utf8 COLLATE utf8_general_ci;
use oldboy;
CREATE TABLE student (
id bigint(12) NOT NULL auto_increment COMMENT '主键',
name varchar(12) NOT NULL COMMENT '姓名',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

主库:
auto_increment_increment = 2
auto_increment_offset = 1
log-slave-updates

从库:
auto_increment_increment = 2
auto_increment_offset = 2
log-slave-updates

===========================================================
半同步 +++++++++++++++++++++++++++++++++++++++++++++++++++++

1、分别在主从节点上安装相关的插件

master> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
slave> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

2、启用半同步复制

在master上的配置文件中,添加
rpl_semi_sync_master_enabled=ON

在至少一个slave节点的配置文件中添加
rpl_semi_sync_slave_enabled=ON

而后重新启动mysql服务即可生效。

或者,也可以mysql服务上动态启动其相关功能:

master> SET GLOBAL rpl_semi_sync_master_enabled = ON;
slave> SET GLOBAL rpl_semi_sync_slave_enabled = ON;
slave> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

3、确认半同步功能已经启用

master> CREATE DATABASE magedudb;
master> SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';

slave> SHOW DATABASES;



上一篇:12C SqlPlus提示
下一篇:常用SQL语句
回复

使用道具 举报