实验:Mysql实现企业级数据库互为主从架构实战

首先看一下主从从架构的图:
实验:Mysql实现企业级数据库互为主从架构实战
一、单一master和多slave
在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个
Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因
为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延
时一般都很少很少。尤其是自从Slave端的复制方式改成两个线程处理之后,更是减
小了Slave端的延时问题。而带来的效益是,对于数据实时性要求不是特别高的应用
,只需要通过廉价的pcserver来扩展Slave的数量,将读压力分散到多台Slave的机
器上面,即可通过分散单台数据库服务器的读压力来解决数据库端的读性能瓶颈,毕
竟在大多数数据库应用系统中的读压力还是要比写压力大很多。这在很大程度上解决
了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案
解决数据库瓶颈。
实验:Mysql实现企业级数据库互为主从架构实战
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
(2) 用一个slave作为备用master,只进行复制;#主服务器挂了之后,可在从服务器执行
1> 在备机上执行STOP SLAVE 和RESET MASTER
2> 查看show slave status \G;
3> 然后修改应用的连接地址。
(3) 用一个远程的slave,用于灾难恢复;
二、互为主从Master-Master(Master-Master in Active-Active Mode)
实验:Mysql实现企业级数据库互为主从架构实战
Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这
样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

互为主从复制过程
什么是自增长ID?
对于某些唯一性的字段,可以通过设置自增长ID来实现,自增长ID的数据,代表这个表中存在一条唯一的记录;而自增长id是肯定不会重复的;
创建表,设置ID为自增长
create table userInfo (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
两边插入数据看数据增长
insert into userInfo(name) value(‘xiao’),(‘da’),(‘lao’);
互为主从复制过程
主主复制:
互为主从:两个节点各自都要开启binlog和relay log;
1、数据不一致;
2、自动增长id;
定义一个节点使用奇数id
auto_increment_increment=2 #表示自增长字段每次递增的量
auto_increment_offset=1 #表示自增长字段从那个数开始
另一个节点使用偶数id
auto_increment_increment=2
auto_increment_offset=2
配置:
1、server_id必须要使用不同值;
2、均启用binlog和relay log;
3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;
服务启动后执行如下两步:
4、都授权有复制权限的用户账号;
互为主从的配置:
在实验:Mysql实现企业级数据库主从复制架构实战基础上进行配置,
可查看连接:
http://blog.csdn.net/ketchup_/article/details/78999733
master:vim /etc/my.cnf
实验:Mysql实现企业级数据库互为主从架构实战
• 重启服务:systemctl restart mariadb
• 进入mariadb:mysql -uroot -p123456
• 查看状态:show master status;
实验:Mysql实现企业级数据库互为主从架构实战
• 在slave上创建账户:
实验:Mysql实现企业级数据库互为主从架构实战
• 启动服务器复制线程
实验:Mysql实现企业级数据库互为主从架构实战
• 启动:start slave;
• 查看状态:show master status;
实验:Mysql实现企业级数据库互为主从架构实战
Slave 操作:
slave:vim /etc/my.cnf
实验:Mysql实现企业级数据库互为主从架构实战
• 重启服务:systemctl restart mariadb
• 查看状态:show master status;
实验:Mysql实现企业级数据库互为主从架构实战

• 启动从服务器复制线程
让slave连接master,并开始重做master二进制日志中的事件。
位置:mysql -uroot -p123456 然后直接输入命令即可;
CHANGE MASTER TO MASTER_HOST=’172.17.252.233’,
MASTER_USER=’slave’,
MASTER_PASSWORD=’magedu’,
MASTER_LOG_FILE=’mysql-bin.000001’,
MASTER_LOG_POS=278; #查看:MariaDB [mysql]> show binlog events;
实验:Mysql实现企业级数据库互为主从架构实战
执行start slave;# 启动复制线程。
• 查看slave状态:show slave status\G;
实验:Mysql实现企业级数据库互为主从架构实战

测试:
在master里创建自增长ID:
实验:Mysql实现企业级数据库互为主从架构实战
查看表结构:
实验:Mysql实现企业级数据库互为主从架构实战
实验:Mysql实现企业级数据库互为主从架构实战
扩展:
异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端
,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经
提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整
。 全
同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库
执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。需要有超时时间。
半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而
是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制
提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时
间。所以,半同步复制最好在低延时的网络中使用。
半同步复制:
master:
安装插件:
MariaDB [BB]> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
实验:Mysql实现企业级数据库互为主从架构实战
查看状态:SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%’;
实验:Mysql实现企业级数据库互为主从架构实战
开启半同步状态: SET GLOBAL rpl_semi_sync_master_enabled=ON; 或SET GLOBAL rpl_semi_sync_master_enabled=1;
实验:Mysql实现企业级数据库互为主从架构实战
重新启动slave:stop slave ; start slave;
slave:
• 安装插件:MariaDB [BB]> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
实验:Mysql实现企业级数据库互为主从架构实战
• 查看状态:SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%’;
实验:Mysql实现企业级数据库互为主从架构实战
• 开启半同步状态:
set global rpl_semi_sync_slave_enabled=on;
实验:Mysql实现企业级数据库互为主从架构实战
• 查看状态:SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%’;
实验:Mysql实现企业级数据库互为主从架构实战
• 重新启动slave:stop slave ; start slave;

在俩边查看:tail -200 /var/log/mariadb/mariadb.log
实验:Mysql实现企业级数据库互为主从架构实战