mysql的复制架构
mysql的服务器可以一主多从,但是一台从服务器默认只能有一个主服务器。
mysql的主从模型
主从模型具体如下图所所示
在主从模型中,所有的写操作都只能在主服务器上完成,并记录到自己的二进制日志中。然后从服务器的IOthread线程发起复制
请求,主服务器的dumpthread响应IOthread并读取自己二进制文件中的sql语句发送给从服务器,iothread把主服务器发送来的内容
写到自己的relaylog中,然后有sql thread从relaylog中读取数据并运行在自己的服务器上。在这里需要说明的是,在从服务器上
只能进行读操作。在主从模型中通过serverid来进行标识,以避免重复操作
在主从服务架构中需要注意到的问题如下
1、从服务器在复制时,要指定事件位置,也就是从那个点开始复制。
2、如果主服务器已经运行一段时间后,从服务器才开始复制,这时最好对主服务器进行备份并指定备份的时间点,以方便从服务器的复制。
3、主从的server id不能一样
实验步骤
1、创建逻辑卷,存放数据
#fdisk /dev/sda
#partprobe /dev/sda
#pvcreate /dev/sda5
#vgcreate myvg /dev/sda5
#lvcreate -n mylv -L 10G myvg
#mke2fs -j /dev/myvg/mylv
2.创建共享目录并开机自动挂载逻辑卷
#mkdir /mydata //创建共享目录
#vim /etc/fstab //开机自动挂载
/dev/myvg/mydata /mydata ext3 defaults 0 0
3、创建用户
#groupadd -g 306 -r mysql
#useradd -g mysql -r -u 306 mysql
#chown mysql:mysql /mydata //修改共享目录的属主属组为mysql
4、安装并初始化mysql
#tar xf mysql-5.5.20-linux2.6-i686 -C /usr/local
# cd /usr/local#ln -sv mysql-5.5.20-linux2.6-i686 mysql //创建连接
#chown -R mysql:mysql .
#cp support-files/my-large.cnf /etc/my.cnf //配置文件
#vim /etc/my.cnf
在[mysqld]处 添加datadir=/mydata //添加数据存放位置
#scripts/mysql_install_db --user=mysql--datadir=/mydata //初始化Mysql
#chown -R root .
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld //提供mysql脚本
#servie mysqld start
#/usr/local/mysql/bin/mysql //启动并测试mysql是否可用
#service mysqld stop //必须关闭,否则在节点2上无法启动
#scp /etc/my.cnf mynode2:/etc //把mysql的配置文件复制到node2上
#scp /etc/rc.d/init.d/mysqld mynode2:/etc/rc.d/init.d/mysqld //复制服务脚本
以上在主从服务器上做相同操作
5.配置主从服务器
主服务器配置如下
#vim /etc/my.cnf
binlog_format=mixed//启用二进制日志
server-id=1//设置server-id
创建具有复制权限的用户
mysql>grant replication slave,replication client on *.* to repluser@'172.16.26.%' identified by'1234';
mysql>flush privileges;
在启用从服务器之前,需要使用如下命令记录一下主服务器当前的时间点
mysql>show master status
从服务器配置如下
#vim /etc/my.cnf
#log-bin=mysql-bin //禁用二进制日志
relay-log=mysql-relay //启用中继日志
server-id=12//设置server id
#service mysqld restart //重启mysql使配置生效
查看日志的启动情况, 如下图所示
mysql>show global variables like "%log%";
查看配置的server_id,如下所示
mysql>show global variables like "%server_id%";
启动从服务,并指定主服务器参数 不能写在配置文件中,多个参数之间使用逗号隔开。
#service mysqld restart
mysql>change master to
MASTER_HOST='172.16.200.1'//主服务的ip地址
MASTER_USER='repluser'//主服务器的建立的用户
MASTER_PASSWORD='123'//主服务器的用户密码
MASTER_LOG_FILE='mysql-bin.000001'//主服务器的日志文件
MASTER_LOG_POS = 352 //日志文件的位置
MASTER_PORT = 3306 //主服务器所在的端口
设置好参数后,查看自己服务器的/mydata/data下产生的文件,如下图所示
在从服务器上使用show slave status\G;查看服务是否启动复制功能
mysql>start slave //启动slave的复制功能
验证主从服务的效果,
在主服务器上进行如下操作,然后可以在从服务上进行查看。
mysql>create databases testdb;
mysql>create table tb1;
因为只能在从服务器上进行读操作,所以要阻止用户对从服务器进行写操作具体使用如下
mysql>show global variables like 'read_only' //查看只读状态
mysql>set globalread_only=1; //设置为只能只读
假设从服务器崩溃,而主服器已经运行了很长时间,这就需要对主服务器进行备份。这里使用逻辑卷进行备份。
mysql>flush tables with read lock; //施加锁
#lvcreate -L 50M -s -p r -n mysqldata-snap /dev/myvg/mylv 创建快照卷
mysql>show master status //记录二进制日志文件的位置
mysql>unlock tables //释放锁
mount /dev/myvg/mysqldata-snap /mnt 挂载快照卷
cd /mnt
find . | cpio -o -H newc --quiet | gzip >/root/alldatabase.gz //打包压缩
#umount /mnt //卸载
#lvremove mysqldata-snap //删除快照卷
#scp alldatabse.gz node2:/mydata
在从服务器上恢复数据,在进行数据恢复之前,删除/mydata下的从服务器的所有文件,并停止mysql服务
#cd /mydata
#gzip -d alldatabases.gz
#cpio -id
然后就可以启动从服务器,进行上述的测试了。
mysql半同步复制
在一主多从的场景中,主服务器会一同步的方式,只等待一台从服务器复制完成并返回成功信息后才停止等待过程,但是在超时后会自动降级为异步模式。
在主从复制的基础上,只需执行如下操作即可。
# On Master
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>SET GLOBALrpl_semi_sync_master_enabled=1;
mysql>SET GLOBALrpl_semi_sync_master_timeout=1000;
# On Slave
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBALrpl_semi_sync_slave_enabled=1;
mysql>STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
如果需要开机时,自动能够实现半同步则需要在Master和Slave的my.cnf中编辑:
# On Master
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000# 1 second
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled=1
查看从服务器上的semi_sync是否开启:
mysql>SHOW GLOBAL STATUS LIKE 'rpl_semi%';
查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:
mysql>SHOW GLOBAL STATUS LIKE 'rpl_semi%';
本文转自 沐木小布丁 51CTO博客,原文链接:http://blog.51cto.com/sxhxt/957712