Mysql的主从复制

内容目录


 

一、理论讲解

Mysql复制基于二进制日志,二进制日志(The binary log):记录了所有对数据库数据的修改语句;

主从复制原理

主从服务器同时做好,刚开始主从服务器没有数据,当主服务器上创建数据库,执行数据操作之后会在本地的数据库上执行一次,同时也会在二进制日志文件中记录一份,当本地二进制文件有改变之后会通过网络传送在从服务器上,从服务器接受这个日志文件之后会保存在从服务器的日志文件中,这个日志就是中继日志,保存下来之后本地mysql server 会启动一个mysql进程,由这个进程负责从中继日志中读一个语句在mysql从服务器上运行一遍,最终实现mysql主从服务器数据一致。

具体过程如下图:

 


 


 


 

二、编译安装mysql

1、下载mysql源码包

# mysql-5.5.20-linux2.6-i686.tar.gz 编译mysql之前我们需要去mysql官网查找最新版本的mysql源码包,可以根据自己的实际需要选择对应的源码包!

2、创建mysql挂载目录

#由于以后我们这里会产生很大的数据量,在这里我们最好应该把mysql单独放在一个目录中去,下面我们可以在磁盘中创建一个分区,用于单独存放mysql数据,可以在系统开机时就挂载这个mysql目录,为服务提供保证

fdisk /dev/sda -->n e 4-->p n +10G-->t 8e w-->partprobe -->pvcreate /dev/sda5 -->vgcreste myvg /dev/sda5 --> lvcrete -L 2G -n mydata myvg-->lvs -->mke2fs -b 1024 /dev/myvg/mydata --> vim fstab ...... mkdir /mydata-->mount -a -->mkdir /mydata/data (创建data用于存储mysql数据)

3、添加mysql系统用户和组

# groupadd -r mysql #添加mysql

# useradd -g mysql -r -s /sbin/nologin -M mysql #添加mysql用户

# id mysql 查看mysqlid信息

 

 

4、解压mysql源码包

# tar xvf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local 解压在/usr/local

# cd /usr/local/

#ln -sv mysql-5.5.20-linux2.6-i686 mysql创建软连接

# chown -R mysql:mysql /mydata/data #改变存储mysql数据的目录属主属组为mysql

# cd /mysql --> chown -R mysql:mysql . #mysql属组属主改为mysql

#rpm -q mysql-server #初始化mysql之前确认系统上没有安装mysql-server rpm包,否则会冲突

 

# scripts/mysql_install_db --user=mysql --datadir=/mydata/data #用脚本初始化mysql

#chown -R root . # mysql 中的属主重新改为root,为了使mysql执行时添加安全保证。

 

5、为mysql提供主配置文件

# cd /usr/local/mysql

# cp support-files/my-large.cnf /etc/my.cnf

# mysql提供主配置文件:

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:

thread_concurrency = 2

 

另外还需要添加如下行指定mysql数据文件的存放位置:

datadir = /mydata/data

 

 

6、为mysql提供sysv服务脚本

# cd /usr/local/mysql

# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

# mysql提供sysv服务脚本:

添加至服务列表:

# chkconfig --add mysqld

# chkconfig --level 2345 mysqld on

 

而后就可以启动服务测试使用了。

# ls /mydata/data 里面有mysql的日志文件

7、优化mysql服务

#为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

# ln -sv /usr/local/mysql/include /usr/include/mysql

#mysql创建头文件链接

# vim /etc/ld.so.conf.d/mysql.conf

/usr/local/mysql/lib

# ldconfig -v 重新加载一下 -v显示过程

 

 

8、为mysql提供帮助文件

编辑/etc/man.config,添加如下行即可:

MANPATH /usr/local/mysql/man

 

9、修改mysql环境变量

修改PATH环境变量,让系统可以直接使用mysql的相关命令。具体实现过程这里不再给出。

# vim /etc/profile 添加下面一句:

export PATH=$PATH:/usr/local/apache/bin:/usr/local/mysql/bin

# source /etc/profile 重读配置文件

#service mysqld start

 

三、主从mysql 服务器配置


 

、注

每个mysql服务器都有自己的server ID,而且不能相同;

在主服务器上为主从服务器复制建立复制权限账号,使从服务器具有可复制主服务器的权限;

可以基于ssl 身份验证,主从服务器之间可以相互验证其对方的身份;

从服务器的mysql软件版本不能比主服务器的mysql软件版本低,但是可以比主服务器的mysql版本高!

Mastermysq版本为:

 

Slavemysql版本为:


 

如果我们建立主从服务器的时候两台服务器都是干净的机器,那么此时两台服务器建立主从是很简单也很方便的 ,但是如果主服务器已经建立并且已经工作两个月了,在主服务器上已经产生几个G的数据了,那么我们应该怎么样在两台服务器上配置主从复制呢? 好,接下来我们来分析一下,如果主服务器已经建立一段时间,并且也产生很多数据了,如果此时我们还基于主从复制的架构来实现两台数据量差别巨大的服务器同步的话,还需要把主服务器的上的二进制日志文件导入在从服务器上,分析一下,主服务器上产生几个G的数据,那么主服务器的二进制日志文件会有多大呢,是不是已经超过数据库本身的几个G的数据量呢,如果从服务器再接受这个二进制日志文件,并且在本地生成中继日志,再在本地一条一条命令的执行一遍会不会已经几个月过去了呢,这样主从数据同步的目的和效果就没有实现,这里我们有一个方案就是可以基于物理的方式把主服务器上的数据复制一份然后直接导入在从服务器上,然后此时两台主从服务器上的数据基本大同,我们此时可以基于主从复制的架构来实现主从复制会不会简单操作一点呢!


 

二、配置主从服务器

此时,我们这里有两台服务器分别是172.16.33.10 (Master) 172.16.33.11(Slave)

这里我们的mysql的目录是/mydata/data;


 

1.配置主服务器Master(172.16.33.10)

(1).查看/etc/my.cnf配置文件中是否启动二进制日志和server ID

server-id = 1 #主服务器的server-id,默认的就是1,这里我们不需要修改

log-bin=mysql-bin #默认情况下都已经开启,此时不需要做修改

 

(2).在主服务器上建立复制权限用户:

 

# mysql -uroot -p

 

mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO user@'172.16.33.%' IDENTIFIED BY '123456';

Query OK, 0 rows affected (0.11 sec)

#这里我们授权user用户在172.16.33.*主机上执行复制主服务器上所有数据库的所有表权限;

 

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

 

为了验证添加授权用户成功,这里我们可以验证一下:

mysql> SHOW GRANTS FOR user@'172.16.33.%';

 

2.配置从服务器Slave(172.16.33.11):

 

查看mysql上的中继日志,启用从服务器上的relay_log前两项:

 

(1).编辑/etc/my.cnf配置文件,更改server-id使它和主服务器的server-id不一样,关闭二进制日志并打开中继日志:

# vim /etc/my.cnf

找到server-id,并改为

server-id = 8

 

注释掉 log-bin=mysql-bin (这里是为了关闭二进制日志)

#log-bin=mysql-bin”下面增加两项,以打开中继日志

relay-log = relay-bin

relay-log-index = relay-bin.index

 

(2).在从服务器上指定主服务器:

# service mysqld restart 重新启动一下mysql从服务器

 

# mysql -uroot -p

 

mysql> CHANGE MASTER TO

-> MASTER_HOST='172.16.33.10',

-> MASTER_USER='user',

-> MASTER_PASSWORD='123456';

Query OK, 0 rows affected (0.08 sec)

mysql> START SLAVE; 启动从服务器进程

Query OK, 0 rows affected (0.01 sec)

mysql> SHOW SLAVE STATUS\G 查看从服务器上的工作属性

 

 

如果看到方框内的两项都为yes’的话,说明你的从服务器已经正常启动了。

 

 

三、对主从服务器进行测试

从服务器Slave172.16.33.11上执行如下操作:

# mysql -uroot -p

mysql> show databases;

 

主服务器Master172.16.33.10执行如下操作:

# mysql -uroot -p

mysql> show databases;

 

此时可以看到主从服务器的数据库都是四个。

 

现在我们在主服务器Mater172.16.33.10上创建一个数据库student和表stu,看从服务器Slave172.16.33.11是否会自动同步主服务器:

在主服务器172.16.33.10上执行如下操作:

# mysql -uroot -p

mysql> create database student;

mysql> use student;

mysql> create table stu (

-> Name varchar(20) not null,

-> Age char(3) );

 

mysql> show databases;

 

 

 

在从服务器172.16.33.11上查看是否有student数据库以及stu表:

# mysql -uroot -p

 

mysql> SHOW DATABASES; 

mysql> use student;

Database changed

mysql> show tables;

mysq> desc stu;

此时发现从服务器172.16.33.11上有student数据库和stu表,说明mysql服务器主从复制的架构就实现了。

 

mysql> show processlist; 查看从服务器的工作进程

查看从服务器与主服务器的异步时间,即比主服务器慢了多长时间:

mysql> show slave status\G

红色的方框为从服务器比主服务器慢的时间,作为一个管理员我们要经常查看从服务器的工作状态,以实时做好准备工作!