mysql主从复制与分库分表

一、主从复制的概念

1、什么是主从复制?
主从复制,是用来建立若干个和主库完全一样的数据库环境,称为从库;
2、主从复制的好处?
1)做数据的热备:主库发生故障后,可切换到从库提供服务。
2)数据量越来越大,导致单机TPS、内存、I/O访问频率越来越高,单机性能越来越差,此时增加多个从库,可以降低单机磁盘I/O访问的频率,提高单机的I/O性能。
3)读写分离,使数据库能支撑更大的并发。

读写分离对于报表系统中尤其重要,由于部分报表sql语句非常的慢,会导致锁表,影响读请求的速度。
3、主从复制的原理(三个线程)
1)主库的更新事件(update、insert、delete)被写到binlog
2)从库创建一个I/O线程连接到主库
3)主库创建一个binlog dump 线程,把binlog的内容发送到从库
4)从库读取主库传过来的binlog内容并写入到relay log
5)从库创建一个SQL线程,从relay log里面读取内容,更新到从库

由于mysql实现的主从复制是异步复制,所以主从库之间数据有一定差异,在从库上的查询操作需要考虑到这些数据的差异,一般只有更新不频繁的数据或者对实时性要求不高的数据,可以通过从库查询,实时性要求高的数据仍然需要从主库获得。

二、配置主库

假如有两台服务器,172.23.29.111和172.23.21.112,前者为主服务器,后者为从服务器

1、172.23.29.111上创建从服务器的用户changhf(该用户在从服务器上已存在),需要先用root登录,先后执行sql:

mysql>CREATE USER 'changhf'@'172.23.29.112' IDENTIFIED BY '123456';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'changhf'@'172.23.29.112' IDENTIFIED BY '123456';

不要用其他正在使用着的用户,建立主从关系后,会改变该用户的权限,我在这里掉到坑里了。用的已经存在的用户cms,导致该用户怎么也登录不上了。

2、vi my.cnf 在[mysqld]下面添加

binlog-do-db=zy_mycat1
binlog-do-db=zy_mycat2
binlog-do-db=zy_mycat3
binlog_ignore_db=mysql

3、先在主服务器上锁定所有的表,以免在复制过程中数据发生变化。

mysql>FLUSH TABLES WITH READ LOCK;

4、退出mysql

mysql>quit
mysqldump -uroot -p123456 --databases zy_mycat1 zy_mycat2 zy_mycat3  --lock-tables=false  -- > /root/mycat_backup.sql

5、从当前服务器传递文件到另一台服务器

scp /root/all.sql [email protected]:/root

6、再次连接数据库进入mysql命令行查看master状态

mysql>SHOW MASTER STATUS;

需要记住这个状态,配置从服务器时有用:mysql主从复制与分库分表_第1张图片

7、解锁数据表

mysql>UNLOCK TABLES;

 

三、配置从库

1、导入主服务器的数据库

mysql -uchanghf -pcms < /root/all.sql

2、vi my.cnf

在[mysqld]下面添加

replicate-do-db=zy_mycat1
replicate-do-db=zy_mycat2
replicate-do-db=zy_mycat3

3、从服务器只能是指定的用户名密码机器来登录: 

mysql -uchanghf -p123456 -h172.23.29.112

4、需要使用root用户登录执行以下命令,并开启slave

mysql>change master to master_host='172.23.29.111',master_user='root',master_password='123456',master_log_file='mysql-bin.000020',master_log_pos=930;
mysql>start slave;

5、检查从服务器复制功能

mysql>show slave status\G

6、最后一步,在主服务器创建表并插入数据,然后观察从服务器是否同步。

mysql>create table food (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
mysql>insert into food (id,user_id,traveldate,fee,days)  values(1,@@hostname,20160101,100,10),(5000001,@@hostname,20160102,100,10),(10000001,@@hostname,20160103,100,10);

四、mysqldump用法

mysqldump常用于mysql数据备份,适用于数据量较小的情况下,否则太慢。

1、最简单的备份:

mysqldump -uroot -p123456 cms > /root/cms.sql

2、备份全部数据库

mysqldump -uroot -p123456 --all-databases  --lock-tables=false  -- > /root/all.sql

五、为什么要分库分表为什么要分库分表?如何实现分库分表?

分库分表原因一般是:1、单库并发过高;2、单库数据量过大

1、数据量只增不减,历史数据又必须要留存,非常容易成为性能的瓶颈,而要解决这样的数据库瓶颈问题,“读写分离”和缓存往往都不合适,目前比较普遍的方案就是使用NoSQL/NewSQL或者采用分库分表。
2、使用分库分表时,主要有垂直拆分和水平拆分两种拆分模式,都属于物理空间的拆分。
分库分表方案:只分库、只分表、分库又分表。

1)垂直拆分:由于表数量多导致的单个库大。将表拆分到多个库中。
2)水平拆分:由于表记录多导致的单个库大。将表记录拆分到多个表中。
水平拆分时,需要确定分片键和分片策略,然后使用中间件(ShardingSphere、Mycat 等)操作,还需要考虑分布式主键、分布式事务等。

你可能感兴趣的:(mysql)