探索MySQL高可用架构之MHA(4)
-----构建mysql高可用系列(共9篇)
上一篇文章介绍了本次架构中的Mysql源码安装。本篇文章主要介绍本次架构中的ABBB复制。
首先我们先介绍什么是MySql AB复制????
AB复制又称主从复制,实现的是数据同步。如果要做MySQL AB复制,数据库版本尽量保持一致。如果版本不一致,从服务器版本高于主服务器,但是版本不一致不能做双向复制。
MySQL AB复制有什么好处呢?
a.解决宕机带来的数据不一致,因为MySQL AB复制可以实时备份数据。
b.减轻数据库服务器压力,这点很容易想到,多台服务器的性能一般比单台要好。
AB复制主要通过2个线程实现:
a.I/O线程:从主库上把bin-log下载到从库后,放到从库的Relay-log中。(从库中的)
b.SQL线程:把Relay-log中的动作,在从库上做一次。(从库中的)
AB复制的3个主要步骤
a.主服务器把数据更改记录到二进制日志中,这个操作叫做二进制日志事件。
b.从服务器把主服务器的二进制日志事件拷贝到自己的中继日志(relay log)中。
c.从服务器执行中继日志中的事件,把更改应用到自己的数据上。
修改主库和从库的参数文件(/etc/my.cnf)
主库:10.142.132.52 #[mysqld]标签下追加server_id =1
#表示是本机的序号为1,一般来讲就是master的意思
wait_timeout=360000
#服务器在关闭它之前在一个连接上等待行动的秒数。
log-bin=binlog
#开启Binlog日志
log-bin-index=binlog.index
#开启Binlog日志的索引文件
log_slave_updates=1
#表示slave将复制事件写进自己的二进制日志
sync
-binlog = 1
#当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令
来将binlog_cache中的数据强制写入磁盘
auto_increment_offset = 2
#表示自增长字段从那个数开始,他的取值范围是1 .. 65535
auto_increment_increment = 2
#表示自增长字段每次递增的量,其默认值是1,取值范围
是1 .. 65535
从库1:10.142.132.51(备主) #[mysqld]标签下追加
relay_log_purge=0
#是否自动清空不再需要中继日志时,0不启动
server_id =2
wait_timeout=360000
#服务器在关闭它之前在一个连接上等待行动的秒数。
log-bin=binlog
#开启Binlog日志
log-bin-index=binlog.index
#开启Binlog日志的索引文件
log_slave_updates=1
#表示slave将复制事件写进自己的二进制日志
sync
-binlog = 1
#当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指
令来将binlog_cache中的数据强制写入磁盘
auto_increment_offset = 1
#表示自增长字段从那个数开始,他的取值范围是1 .. 65535
auto_increment_increment = 2
#表示自增长字段每次递增的量,其默认值是1,取值范围
是1 .. 65535
从库2:10.142.132.48 #[mysqld]标签下追加
read_only=1
#只读操作控制
relay_log_purge=0
#是否自动清空不再需要中继日志时,0不启动
server_id = 3
relay_log =
/app/mysql/mysql-relay-bin
#定义relay_log的位置和名称
relay_log_index=
/app/mysql/mysql-relay-bin
.index
#定义relay_log的索引文件
位置和名称
wait_timeout=360000
#服务器在关闭它之前在一个连接上等待行动的秒数。
从库3:10.142.132.47 #[mysqld]标签下追加
read_only=1
#只读操作控制
relay_log_purge=0
#是否自动清空不再需要中继日志时,0不启动
server_id = 4
relay_log =
/app/mysql/mysql-relay-bin
#定义relay_log的位置和名称
relay_log_index=
/app/mysql/mysql-relay-bin
.index
#定义relay_log的索引文件
位置和名称
wait_timeout=360000
#服务器在关闭它之前在一个连接上等待行动的秒数。
主库 #创建用AB复制所需的用户
mysql> GRANT replication slave ON *.* TO
'lipengfei'
@
'%'
identified
by
'lipengfei'
;
mysql> flush privileges;
所有从库 #如果从库以前有数据,要干掉原有数据,保持从库是干净的
service mysql stop
#停止Mysql服务
cd
/app/mysql/data
#进入数据目录
rm
-fr 数据库目录
#删除数据库目录
service mysql restart
#启动Mysql服务
主库 #主库的数据导出,并导入所有从库,保持数据一致
mysqldump -u root -pmysql m >
/tmp/full
.sql
#主库导出数据
scp
/tmp/full
.sql root@从库IP:
/tmp/
#主库导出的数据通过scp传送到所有从库
所有从库 #导入主库传过来的数据
mysql -u root -pmysql m <
/tmp/full
.sql
#导入主库传递过来的数据
主库 #为主库加上只读锁,查看当前Binlog日志情况
mysql> flush tables with
read
lock;
#给主库加上读锁
mysql> show master status;
#查看Bin-log状态
+---------------+----------+--------------+------------------+------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+------------+
| binlog.000001 | 402 | | | |
+---------------+----------+--------------+------------------+------------+
mysql>unlock tables;
#给主库解锁
所有从库 #向主库做同步操作,开启AB复制
mysql> change master to master_host=
'主库IP'
, master_port=主库端口,
master_user=
'同步用户'
,
master_password=
'同步用户的密码'
,
master_log_file=
'主库Binlog'
,master_log_pos=主库Binlog位置;
#向主库做同步操作
mysql> start slave;
#启动AB复制
所有从库 #查看AB复制的状态
mysql> show slave status \G
Slave_IO_Running: Yes
#I/O线程状态OK
Slave_SQL_Running: Yes
#SQL线程状态OK
Seconds_Behind_Master: 0
#同步效率非常好,没有延迟
主库 #模拟产生数据
mysql> create database slave;
#创建数据库
mysql> use slave;
#选择数据库
mysql> create table a(a int);
#创建表
mysql> insert into a values(1);
#插入数据
mysql> insert into a values(2);
#插入数据
所有从库 #查看数据同步状态
mysql> show databases;
#查看当前有哪些数据库(主库新建的slave库同步过来了)
mysql> use slave;
#选择数据库
mysql>
select
* from a;
#查看a表数据
如果从库的同步进程停止了,主库的操作还会往从库中同步吗?会丢数据吗?
所有从库 #模拟服务出现问题
service mysql stop #停止mysql服务,模拟从库出现问题
主库 #从库出现问题,此期间主库正常操作
use slave;
#选择数据库
insert into a values(3);
#插入数据
insert into a values(4);
#插入数据
所有从库 #问题解决,查看有没有丢数据
service mysql start
#启动Mysql服务
mysql >use slave;
#选择数据库
mysql >
select
* from a;
#数据自动同步过来了,主库的数据没有丢失