阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL主从复制 实践

176次阅读
没有评论

共计 5813 个字符,预计需要花费 15 分钟才能阅读完成。

异步主从复制

 
主从部署步骤:
  • 备份还原
    • 使用 MySQLdump 或者 xtrabackup
    • 把主库现有基础数据还原到从库
  • 授权
    • grant replication slave on *.*
    • 给从库一个复制 binlog 的账号
  • 配置复制,并启动
    • 从库上配置复制信息,并指向 master
  • 查看主从复制信息
    • show slave status \G
1)备份还原
主:101
从:100
a) 主库备份
aiapple@Ubuntu:~$ mysqldump -uroot -p --socket=/tmp/mysqldata/node1/mysql.sock --master-data --all-databases  > all_master.sql
--master-date: 记录备份时 binlog 位置
aiapple@ubuntu:~$ cat all_master.sql | less
 
--
-- Position to start replication or point-in-time recovery from
--
 
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=6125;
 
--
-- Current Database: `db1`
--
b) 从库还原
主库远程连接到从库,使用 source 还原
从库添加主库白名单:
mysql> grant all on *.* to root@192.168.1.101 WITH GRANT OPTION;  
设置密码:
mysql> set password for root@’localhost’=password(‘000000’);
Query OK, 0 rows affected (0.00 sec)
主库添加从库白名单:
mysql> grant all on *.* to root@192.168.1.100 identified by '000000' with grant option;
主库登陆从库并还原数据:
aiapple@ubuntu:~$ mysql -uroot -p -h 192.168.1.100
 
mysql> source all_master.sql
2)赋权 replication slave
mysql> grant replication slave on *.* to repl@192.168.1.100 identified by 'repl';
Query OK, 0 rows affected (0.00 sec)
3) 从库配置复制
MySQL 主从复制 实践
# 查看帮助信息?change master to
 
mysql> change master to MASTER_USER='repl';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
 
mysql> change master to MASTER_PASSWORD='repl';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
 
mysql> change master to MASTER_HOST='192.168.1.101';
Query OK, 0 rows affected (0.03 sec)
 
mysql> change master to MASTER_LOG_FILE='mysql-bin.000001';
MySQL 主从复制 实践
4)启动:
MySQL 主从复制 实践
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
 
mysql> show slave status\G;
 
slave_io_running:yes
slave_sql_running:yes
#表示配置成功
 
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time | State                                                                       | Info             |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
|  2 | root        | localhost | NULL | Query   |    0 | init                                                                        | show processlist |
| 16 | system user |           | NULL | Connect |   60 | Waiting for master to send event                                            | NULL             |
| 17 | system user |           | NULL | Connect |   60 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL             |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
注意:
  • 主从 server_id 应该不同;
  • 主从开启 binlog 日志
  • MASTER_LOG_FILE 指定主库 bin_log 第一个文件;
半同步复制

配置 mysql 半同步复制 semi-sync
查看有哪些插件
show plugin

1. 主从异步复制搭建

1) 主库全备,备库恢复
mysqldump -uroot -p123456 --socket=/data/mysql/node1/mysqld.sock --single-transaction -A --master-data=1 > all_db.sql
mysql -utest -ptest -h(从库 IP) -P3306
mysql>source all_db.sql;
2) 主库授权用户
grant replication slave on *.* to repl@'(从库 IP)' identified by 'repl';
3) 从库配置复制
less all_db.sql|grep "change master to"
change master to master_host='(主库 IP)',master_user='repl',master_password='repl',master_log_file='XXX',master_log_pos=XXX;
start stave;
show slave status\G
4) 复制检验
主库:use db1;
insert into t1 values(10);
从库:use db1;
select * from t1;(获得数据)
主库:drop database db2;
从库:show databases;(显示 db2 被删除)
5) 查看线程
主库:show processlist;(dump 线程)
从库:show processlist;(IO 线程、SQL 线程)
6) 查看日志
从库:cd /data/mysql/node1
cat master.info
cat relay-log.info
2. 主从半同步复制安装
1) 主库安装插件
show plugins;
install PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
2)��库安装插件
show plugins;
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
3) 参数设置
主库:show variables like '%semi%';
SET GLOBAL rpl_semi_sync_master_enabled=1;
从库:SET GLOBAL rpl_semi_sync_slave_enabled=1;
4) 重启主从复制
从库:stop slave;
start slave;
5) 状态检查
show global status like '%semi%';
6) 复制检查
主库:use db1;
insert into t1 values(100);
从库:use db1;
select * from t1;(获得数据)
7) 测试延迟
从库:stop slave;
主库:use db1;
insert into t1 values(1);(被卡 10s)
set global rpl_semi_sync_master_timeout=1000;(设置主等从时间 1 秒)从库:start slave;
stop slave;
主库:use db1;
insert into t1 values(88);(被卡 1s)
注意:rpl_semi_sync_master_timeout 主库等待时间不能设置大,不然会引起主库雪崩效应;最好在 1 秒内;
MySQL 主从复制 实践
并行复制

1.MySQL 并行复制
 
# 从库:show variables like '%slave_par%';
set global slave_parallel_workers=10; 设置 sql 线程数为 10
#重启 slave
stop slave;
start slave;
#查看线程
show processlist;(十个 worker 线程)
 
注:实际上有 11 个线程,10worker 线程,1 个调度线程;
部分数据复制

 
部分数据复制:
在配置文件中设置
主库添加参数指定到库:
binlog_do_db=db1
binlog_ignore_db=db1
binlog_ignore_db=db2
或从库添加参数
可以到表;
replicate_do_db=db1
replicate_ignore_db=db1
replicate_do_table=db1.t1
replicate_wild_do_table=db%.%          #配置设置
replicate_wild_ignore_table=db1.%     #1 打头的表
注:建议使用在从库添加参数,这样更加灵活可以指定到表级别;
部分复制
 
1) 主库:create database db2;
2) 从库部分复制配置
配置文件中增加配置
#vim /data/mysql/my1.cnf(replicate_do_db=db2)
 
重启 mysql
#mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown
#/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf &
 
show slave status;
显示:replicate_do_db=db2
 
3) 测试
主库:use db1;
delete from t1;
从库:use db1;
select * from t1;(任然保留数据)
主库:use db2;
create table user(a int,b int);
从库:use db2;
show tables;(查看到 user 表)
联级复制

 
联级复制(A->B->C)
1) 从库:#vim /data/mysql/my1.cnf(log_slave_updates)
#mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown
#/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf &
2) 创建新实例
在主库服务器上创建一个从库 2 实例
#mysqladmin -uroot --socket=XXX --port=3306 -p123456 shutdown
#kill -9 (mysqld_safe 进程号)
#cp -r node1 node2
#vim my.cnf(修改相关参数, 端口 3307)
#chown -R mysql.mysql node2
#/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf &
#/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/mysql/my2.cnf &
#mysqldump -utest -ptest -hXXX -P3306 -A --master-data=1 > d731.sql(dump 从库 1 的全备)
#mysql -uroot --socket=/data/mysql/node2/mysqld.sock -p123456 < d731.sql
3) 配置从 1 和从 2 的主从
从 1 授权:grant replication slave on *.* to repl@'(从 2IP)' identified by 'repl';
从 2 配置复制:less d731.sql|grep "change master to"
change master to master_host='(从 1IP)',master_user='repl',master_password='repl',master_log_file='XXX',master_log_pos=XXX;
start stave;
show slave status\G
show processlist;
4) 联级复制测试
主库:create database db3;
从 1:show databases;(获得新建库)
从 2:show databases;(获得新建库)
监控与处理

# 查看状态 
show slave status;
成功与否:
slave_sql_running:
slave_io_running:
延时多久
seconds_Behind_Master
从库出现问题时
last_sql_errno
last_sql_error
last_io_errno
last_io_error
复制出错处理
常见:1062(主键冲突),1032(记录不存在)
解决:
  • 手动处理
  • 跳过复制错误:set global sql_slave_skip_counter=1
复制出错,大部分因为,主从数据不一致导致的;
最好的办法还是进行数据主从复制的校验;percona 公司有主从复制校验工具;

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134477.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5813字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中