主从同步原理:
Master:记录数据更改操作
1、启用binlog日志
2、设置binlog日志格式
3、设置server_id
slave:运行两个线程
1、Slave_IO:复制master主机binlog日志里的SQL到本机的relay_log文件
2、Slave_SQL:执行本机relay_log文件里的SQL语句,重现Master的数据操作
构建环境:
1、确保从库与主库数据相同
2、主服务器要启用binlog日志、有授权用户并查看当前使用的日志
3、从服务器要设置server_id,指定主库信息
相关文件:
文件名 | 说明 |
---|---|
master.info | 主库信息 |
relay-log.info | 中继日志信息 |
主机名-rely-bin.xxxxx | 中继日志 |
主机名-rely-bin.index | 索引文件 |
主库配置选项:
选项 | 用途 |
---|---|
binlog_do_db=name | 设置Master对哪些库记日志 |
binlog_ignore_db=name | 设置Master对哪些库不记日志 |
从库配置选项:
选项 | 用途 |
---|---|
log_slave_updates | 记录从库更新,允许链式复制 |
relay_log=dbsvr2-relay-bin | 制定中继日志文件名 |
replicate_do_db=mysql | 仅复制制定库,其他库被忽略,可设置多条 |
replicate_ignore_db=test | 不复制哪些库,其他库将被忽略,jgnore-db与do-db只需用一种 |
主从同步结构:
单向复制:主–>从
链式复制:主–>从–>从
互为主从:主<–>主
一主多从:从<–主-->从
复制模式:
1、异步复制:主库执行完一次事务后,立即将结果返给客户端,并不关心从库是否接受处理
2、全同步复制:当从库执行完一次事务,且所有从库都执行了该事务后才返回给客户端
3、半同步复制:介于异步复制和全同步复制之间,等待至少一个从库接收到并写到relay-log中才返回给客户端
主从同步配置:
1、配置主服务器
开启binlog日志,指定服务ID与日志格式
[mysqld]
log-bin=日志名 #开启binlog日志
bind-address=0.0.0.0
server_id=id值
binlog-format="mixed" #指定日志格式
#重启服务
systemctl restart mysqld
2、授权用户,允许从库网段访问(默认对所有库有同步权限)
mysql> grant replication slave on *.* to 'mingzi'@'%' identified by '1234';
#允许mingzi用户从所有网段连接,对所有库有同步权限密码1234
3、查看主库信息
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 439
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
配置从库
确保从库数据与主库数据一致下进行以下操作
1、指定server_id,不允许重复
vim /etc/my.cnf
[mysql]
server_id=id
#重启服务
systemctl restart mysqld
2、指定从库信息
mysql> change master to
-> master_user='mingzi'
-> ,master_password='1234',
-> master_host='192.168.4.2' #主机地址,
-> master_log_file='mysql-bin.000003', #主机日志文件名
-> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave; #启动进程
3、检查状态
mysql> show slave status\G
……
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
1、主库
配置主服务器
开启binlog日志,指定服务ID与日志格式
[mysqld]
log-bin=日志名 #开启binlog日志
bind-address=0.0.0.0
server_id=id值
binlog-format="mixed" #指定日志格式
授权用户,允许从库网段访问(默认对所有库有同步权限)
mysql> grant replication slave on *.* to '授权用户'@'第一台从库位置' identified by '密码';
2、第一台从库
修改配置文件/etc/my.cnf
vim /etc/my.cnf
[mysqld]
server_id=id号
log_bin=日志名
binlog_format='mixed'
log_slave_updates
重启后进入数据库配置主从关系
授权用户,允许从库网段访问(默认对所有库有同步权限)
mysql> grant replication slave on *.* to '授权用户i'@'第二台从库位置' identified by '密码';
#允许mingzi用户从所有网段连接,对所有库有同步权限密码1234
指定从库信息
mysql> change master to
-> master_user='授权用户'
-> ,master_password='密码',
-> master_host='192.168.4.2' #主机地址,
-> master_log_file='mysql-bin.000003', #主机日志文件名
-> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave; #启动进程
3、配置第二台从库
修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=id号
指定从库信息
mysql> change master to
-> master_user='授权用户'
-> ,master_password='密码',
-> master_host='192.168.4.2' #主机地址,
-> master_log_file='mysql-bin.000003', #主机日志文件名
-> master_log_pos=439; #主机偏移位置
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave; #启动进程
1、查看是否允许动态加载模块
mysql> mysql> show variables lik_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES | #默认允许
+----------------------+-------+
1 row in set (0.00 sec)
2、加载插件
主库:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec)
从库:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec
插件安装完,但半同步复制还是关闭状态。
3、启用半同步复制
主库:
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'rpl_semi_sync_%_enabled'; #查看状态
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
+------------------------------+-------+
1 row in set (0.00 sec)
从库`
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'rpl_semi_sync_%_enabled'; #查看状态
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
+-----------------------------+-------+
1 row in set (0.01 sec)
此时,临时半同步复制配置完成,数据库关闭后失效
4、永久配置半同步状态
需要将修改主配置文件/etc/my.cnf
主库:
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
从库:
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
5、在高可用架构下,master和slave需同时启动
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
mysql> show variables like 'rpl_semi_sync_%_enabled';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
2 rows in set (0.00 sec)