异步主从复制

 
主从部署步骤:
  • 备份还原
    • 使用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=; --
-- 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 '' 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, rows affected (0.00 sec)
 
3) 从库配置复制
#查看帮助信息
? change master to mysql> change master to MASTER_USER='repl';
Query OK, rows affected, warnings (0.03 sec) mysql> change master to MASTER_PASSWORD='repl';
Query OK, rows affected, warnings (0.02 sec) mysql> change master to MASTER_HOST='192.168.1.101';
Query OK, rows affected (0.03 sec) mysql> change master to MASTER_LOG_FILE='mysql-bin.000001';
 
4)启动:
mysql> start slave;
Query OK, 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 |
+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+
| | root | localhost | NULL | Query | | init | show processlist |
| | system user | | NULL | Connect | | Waiting for master to send event | NULL |
| | system user | | NULL | Connect | | 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.主从异步复制搭建

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

并行复制

 
1.MySQL并行复制
#从库:
show variables like '%slave_par%';
set global slave_parallel_workers=; 设置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打头的表
 
注:建议使用在从库添加参数,这样更加灵活可以指定到表级别;
 
部分复制
)主库:
create database db2;
)从库部分复制配置
配置文件中增加配置
#vim /data/mysql/my1.cnf(replicate_do_db=db2) 重启mysql
#mysqladmin -uroot --socket=XXX --port= -p123456 shutdown
#/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf & show slave status;
显示:replicate_do_db=db2 )测试
主库:
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)
)从库:
#vim /data/mysql/my1.cnf(log_slave_updates)
#mysqladmin -uroot --socket=XXX --port= -p123456 shutdown
#/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/my1.cnf &
)创建新实例
在主库服务器上创建一个从库2实例
#mysqladmin -uroot --socket=XXX --port= -p123456 shutdown
#kill - (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= > d731.sql(dump从库1的全备)
#mysql -uroot --socket=/data/mysql/node2/mysqld.sock -p123456 < d731.sql
)配置从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;
)联级复制测试
主库:
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公司有主从复制校验工具;
 
 
 
 
 
 
 
 
 

mysql 主从复制 实践的更多相关文章

  1. MySQL主从复制(Master-Slave)实践

    MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...

  2. 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

    一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...

  3. mysql主从复制原理及实践

    Mysql主从复制原理及实践 mysql主从框架       MySQL主从架构是MySQL集群中最基本也是最常用的一种架构部署,能够满足很多业务需求,常见的有一主一从或者一主多从.可以防止单一主机的 ...

  4. 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

    一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...

  5. MySQL主从复制与读写分离实践

    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践  目录: 介绍 MySQL的安装与配置 MySQL主从复制 MySQL读写分离 编译安装lua 安装配置MySQ ...

  6. MySQL主从复制介绍:使用场景、原理和实践

    MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借 ...

  7. Linux下Mysql主从复制(Master-Slave)与读写分离(Amoeba)实践

    一.为什么要做Mysql的主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...

  8. [转]MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

    转自:http://heylinux.com/archives/1004.html Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单 ...

  9. MySQL主从复制与读写分离

    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中, ...

随机推荐

  1. Python::OS 模块 -- 进程参数

    os模块的简介请参看 Python::OS 模块 -- 简介 os模块的文件和目录操作 Python::OS 模块 -- 文件和目录操作 os模块的进程管理 Python::OS 模块 -- 进程管理 ...

  2. Linux下手动获取当前调用栈

    被问到如何手动获取当前的调用栈,之前碰到过一时没记起来,现在回头整理一下. 其原理是:使用backtrace()从栈中获取当前调用各层函数调用的返回地址,backtrace_symbols()将对应地 ...

  3. Linux命令行与图形界面切换方法

    1.实时切换 1.1 命令行->图形 startx 1.2 图形->命令行 Ctrl+Alt+F1--F6 2.启动默认 2.1 启动进入命令行 修改/etc/inittab文件 &quo ...

  4. .jre下的lib和jdk下的lib的区别

    jre是JDK的一个子集.提供一个运行环境.JDK的lib目录是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件.例如,编译器等.JRE的lib目录是为JVM,运行时候用的.包括所有的标准 ...

  5. Android——手机内部文件存储(作业)

    作业:把用户的注册信息存储到文件里,登录成功后读出并显示出来 activity_practice2的layout文件: <?xml version="1.0" encodin ...

  6. There is already an open DataReader associated with this Command which must be closed first." exception in Entity Framework

    Fixing the "There is already an open DataReader associated with this Command which must be clos ...

  7. localStorage兼容ie6/7 用addBehavior 实现

    制作过程我就不说了,程序下面会占出来 define(function(){ if('localStorage' in window) return; function Storage(){ this. ...

  8. Node调试之道-----JSHint

    Node调试之道-----JSHint Node的优势我就不再乱吹捧了,它让javascript统一web的前后台成为了可能.但是对于新手来说,server端的JS代码可能不像client端的代码那么 ...

  9. 02 Linux 下安装JDK并测试开发“Hello World!”

    测试环境 主机系统:Win7 64位 虚拟机:VMware® Workstation 11.1.0 虚拟机系统:CentOS 6.5 64位   Kernel 2.6.32-431.e16.x86_6 ...

  10. The content of the adapter has changed but ListView did not receive a notification

    java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive ...