mysql 主从复制模式主要为master负责接收用户的请求,DDL,DML,DCL等操作,slave主要负责同步master的二进制日志,以便备份数据。在一此数据库访问量比较大的场景,master-slave模式还可以结合mysql-proxy做读写分离,mysql-proxy负责将用户的写请求转发到master,将用户的读请求转发到slave,以分担数据库的压力。甚至更健壮的系统,一个master对应多个slave,做成高可用HA集群,当master宕机的时候,多个slave会协商出一个slave重新成为master,以达到服务的持续性。
在mysql master-slave架构中,slave会启动两个主要的线程,一个是io thread,另一个是sql thread。大家都知道,mysql的replication主要是通过slave同步master中的二进制日志,然后将二进制日志先储存在slave中的中继日志中,然后再在本地通过读取中继日志执行sql操作。io thread主要完成的工作就是第一步,而sql thread主要工作是从中继日志中读取日志,然后进行本地操作。而对于master而言,也会启动一条dump线程,该线程主要的作用是响应slave的io thread请求,将二进制日志发送到slave。主要流程图如下:
下面来一步一步搭建mysql的master-slave架构。
1、环境准备
os:centos 6.4
mysql服务器:5.5.28(2台)
ip分配:master:192.168.1.101
slave:192.168.1.108
mysql通过二进制安装包:mysql-5.5.28-linux2.6-x86_64.tar.gz
2、mysql安装
解压到/usr/local目录
tar xf mysql-5.5.28-linux2.6-x86_64.tar.gz -C /usr/local
添加软链
ln -sv /usr/local/mysql-5.5.28-linux2.6-x86_64 /usr/local/mysql
添加mysql用户,用户组
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
添加mysql数据目录
mkdir -pv /data/mysql
chown -R mysql:mysql /data/mysql
初始化mysql数据库
cd /usr/local/mysql
chown -R root.mysql ./*
scripts/mysql_install_db --user=mysql --datadir=/data/mysql
复制mysql配置文件,启动脚本
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add msyqld
3、master配置
vim /etc/my.cnf
在[mysqld]中添加:
datadir=/data/mysql
innodb_file_per_table=1 # 对innodb来说每表一个表空间文件
log-bin=master-bin #开启二进制日志功能
log-bin-index=master-bin.index #二进制日志文件的索引文件
#server_id可暂时不用改,只要不和slave中的server_id一样即可
保存退出。
4、初始化master
用mysql进入交互命令行界面
授权relication slave复制权限
mysql> grant relication slave on *.* to 'repluser'@'192.168.1.%' identified by 'replpass';
mysql> flush privileges; #读取授权表
5、安装slave
按上述相同方式安装好slave。
6、slave配置
vim /etc/my.cnf
在[mysqld]中添加:
datadir=/data/mysql
innodb_file_per_table=1 # 对innodb来说每表一个表空间文件
relay-bin=relay-bin #开启中继日志功能
relay-bin-index=relay-bin.index #中继日志文件的索引文件
read_only=1 #设置slave为只读模式
server_id=10#注意,slave中的server_id不能和master的server_id相同。
保存退出。
7、初始化slave
用mysql进入交互命令行界面
mysql> change master to
master_host='192.168.1.101',
master_user='repluser',
master_password='replpass',
master_log_file='master-bin.000002',
master_log_pos=107
#其中master_log_file和master_log_pos是在master中通过show master status命令查看到的。
#所以务必要先在master中查看对应的值后,再执行此命令。
#master_log_file:slave要同步的二进制文件
#master_log_pos:同步的起始位置
8、启动slave
mysql> start slave
#此命令会同步启动io_thread和sql_thread,也可以独启动它们。
#mysql> start slave io_thread
#mysql> start slave sql_thread
至此,mysql的master-slave模式基本搭建完成了。
在slave中可查看slave的状态信息
mysql> show slave status \G;
看到以上信息,恭喜你,master-slave已经搭建成功了。
9、测试
在master中创建一个数据库
mysql> create database leedb;
在slave中查看数据库
mysql> show databases;
可以看到刚才在master中的leedb自动同步到slave中了。以后在master中所有可能引起数据库变更
的动作都会自动同步到slave中了。当然,mysql可以对数据库或对数据表进行过滤同步,可以有选
择性地同步某个数据库或者某个数据库的某张表,这个留待后续再讨论。