您的位置:首页 > 数据库 > SQL

MySQL的复制(主主及主从架构的实现)

2012-04-11 12:55 639 查看
mysql replication ----- Mysql的复制

复制在网络上是明文传输的,基于安全的考虑,应该使用ssl加密。
首先要先讲讲mysql的日志文件有哪些:
(1)、错误日志:是用来记录在mysql执行过程中发生错误的。
(2)、二进制日志(Binary log:):是用来做即时点回复和复制的,二进制文件是实现复 制的基础。二进制日志文件主要记录的是每一个明确或潜在的能让数据库发生改变的sql语句。
可是用二进制文件做复制,并不能精确保证两个服务器的数据完全一致。这是后话,后面
还有详解。
(3)、查询日志:应该设置为关闭的,因为会降低服务器的性能。
(4)、慢查询日志:服务器默认是关闭的,但在生产环境下,必须是开启的,可以减慢查询速 度,优化服务器的性能。
(5)、中继日志:主要是实现从服务器复制主服务器的数据而用的,在此不再多说,后面讲到主从服务器的实现时,会详细说明怎么使用。
Replication:
从服务器是否需要二进制文件取决于主服务器的架构,但是一般情况下,若从服务器的下面没有基于其自身的另外的从服务器,而主服务器的二进制日志文件存放的位置又绝对安全,则从服务器可以不需要开启二进制日志文件,这样可优化从服务器的性能。
复制又分同步和异步的:
Async 异步 发送方只管发送,并不计较接受方是否收到、什么时候会收到……
sync 同步 数据传输角度讲,发送方收到接收方的确认信号之后才会结束回话。
而Mysql的复制是异步的。
Delay 延迟,既然复制是异步的,那么从服务器的延迟是不可避免的,而作为一个专业的DBA,所要做的就是使延迟在一定范围内,不至影响服务器的正常使用。
需要说明的是,mysql是多用户的,而从服务器的中继日志从主服务器的二进制文件读取操作时(即写操作)是串行的,每次只能写一条,就是这样才会使延迟会越来越严重。

主服务器启动的是Dump线程:主要是将主服务器中的二进制文件内容读给从服务器。
从服务器启动线程有:
I/O thread线程: 接收主服务器dump线程送来的数据(二进制文件内容)写入到中继日志中(relay log)。
SQL thread线程:一旦中继日志有数据,就启动该线程,逐条从中继日志读取数据,并写入到mysql数据库中。

实现主(master)-->从(slave)服务器复制:
必须注意的是,在复制结构中,从服务器的版本必须要与主服务器的版本相同或更高,绝对不能比主服务器的版本低。因为若是从服务器的版本较主服务器的版本低,那么master的某些操作slave识别不了,会造成错误,导致slave服务器不可用。
主从服务器的数据存放位置可以不同,如master服务器的数据存放在一个逻辑卷上,而slave的数据可以存放在磁盘上,或者raid上均可,也可以相同。

下面开始配置:
介绍:master:172.16.7.33
Slave: 172.16.7.25
一、首先将master的数据存放在/mydata/data下,而此目录下是逻辑卷的挂载目录,也就是说将数据存放在了逻辑卷上,逻辑卷的创建过程在此不再赘述,可以参考我下面给出的脚本:
注:此脚本的实现基础是在/dev/sda,由于已经有了3个主分区,所以要建一个扩展分区,再在扩展分区的基础上加上2个类型为8e的LVM分区,整合两个分区,创建物理卷、卷组和逻辑卷。

#!/bin/bash
#author: chenjiuling
#createdate : `date`
lc='/usr/sbin/lvcreate'
lr='/usr/sbin/lvremove'
pc='/usr/sbin/pvcreate'
vc='/usr/sbin/vgcreate'
echo '
n
e

n

+1G
n
#########space is needed ,do not delete it ,you can copy it directly.####
+1G
t
5
8e
t
6
8e
p
w' | fdisk /dev/sda >/dev/null 2>&1
partprobe /dev/sda
sleep 3
mkdir  /mydata
$pc /dev/sda5 /dev/sda6  >/dev/null 2>&1
$vc myvg /dev/sda5 /dev/sda6  >/dev/null 2>&1
$lc -L 1G -n mylv1 myvg  >/dev/null 2>&1
mke2fs -j /dev/myvg/mylv1  >/dev/null 2>&1
mount /dev/myvg/mylv1 /mydata
echo "mount success..."
sleep 3
mkdir /mydata/data


逻辑卷建好后,就可以编译安装mysql了,简单步骤如下:
1、新建用户以安全方式运行进程:

# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data


2、安装并初始化mysql-5.5.20首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.20-linux2.6-i686.tar.gz,  [code]# tar xf 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   //为mysql-5.5.19-linux2.6-i686创建一个软链接
# cd mysql
# chown -R mysql:mysql  .  //将/mysql 目录下的所有文件及目录的属主及属组均改为mysql.
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data    // 指定其数据存放目录和使用的用户,也就是初始化。
# chown -R root  .      //将/mysql 目录下的所有文件及目录的属主改回为root

3、为mysql提供主配置文件:

# cd /usr/local/mysql
# cp support-files/my-large.cnf  /etc/my.cnf
# vim /etc/my.cnf


4、为mysql提供sysv服务脚本:

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

# cd /usr/local/mysql
# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
添加至服务列表:
# chkconfig --add mysqld
# chkconfig mysqld on    //开机自启动服务
而后就可以启动服务测试使用了。
# service mysqld start

5、输出mysql的man手册至man命令的查找路径:
编辑/etc/man.config,添加如下行即可:

MANPATH  /usr/local/mysql/man


6、输出mysql的头文件至系统头文件路径/usr/include:
这可以通过简单的创建链接实现:

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


7、输出mysql的库文件给系统库查找路径:

# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf


8、修改PATH环境变量,让系统可以直接使用mysql的相关命令。

# vim /etc/profile
添加 PATH=$PATH:/usr/local/mysql/bin:/usr/local/nginx/bin
然后使用命令使其生效:
#export PATH=$PATH:/usr/local/mysql/bin:/usr/local/nginx/bin
#source /etc/profile
到此 mysql就编译好了。
Master的数据存放在/mydata/data,slave的数据也存放在/mydata/data下,所以也要在slave上创建目录:
# mkdir /mydata/data -pv
具体mysql的编译安装请参照上面再来一遍,什么也不需改动。
##################################################################


二、修改主服务器的配置文件:使master服务器的server-id 与slave服务器的server-id不一样,以便于区分从哪到哪复制数据,避免出现循环复制。就是给每个服务器一个独立的身份标示。

# vim /etc/my.cnf
Service-id =1 ###其实master的server-id=1 可以不用修改,只改slave的。
Log-bin=/data/mysql-bin
添加Log-bin=/data/mysql-bin,主要是为了将二进制日志文件与数据文件不放在相同的地方,避免数据目录发生故障时,二进制日志文件也在所难免,无法恢复。记得另外创建/data目录。
修改从服务器的配置文件:
# vim /etc/my.cnf
Service-id =11 ####设置为11,是为了给主和从服务器之间留些空隙,便于设置更多的slave服务器。此时就没必要启动二进制日志文件了注释掉log-bin=,但必须要启动的是中继日志。
添加 relay-log=/data/relay-bin
relay-log-index=/data/relay-bin.index
记得另外创建/data目录。
Innodb_file_per_table=1 此命令可以使InnoDB的表单独存为一个文件,master服务器也同样适用。
注意:每次修改了配置文件之后记得要重启服务哦!!!
三、此时才真正进入主从的配置实现阶段:
1、先在主服务器上创建可以实现复制权限的用户
On 172.16.7.33:
mysql ###若是有密码,可用mysql -uroot -p' 提示输入密码
连上mysql之后,进行如下操作:
mysql >grant replication client,replication slave on *.* to 'repl'@'172.16.%.%' identified by '123456';
mysql >flush privileges;
mysql >show grants for 'repl'@'172.16.%.%';
2、在从服务器上操作,使其接受为谁的从。
On 172.16.7.25:
mysql ###若是有密码,可用mysql -uroot -p' 提示输入密码
连上mysql之后,进行如下操作:
change master to master_host='172.16.7.33',master_user='repl',master_password='123456';
smysql >start slave; 启动从服务器
mysql >show slave status\G; 显示从服务器的状态信息
信息Seconds_Behind_Master= 会指出从服务器比主服务器延迟了多少
注意:此时有两个线程非常重要:
Slave_IO_Runing=yes
Slave_SQL_Runing=yes
才算是从服务器启动正常。
mysql >show processlist;查看进程是否正常
四、如果没有问题,就可以在master服务器上进行一些操作,查看slave服务器上是否有相应的数据产生。在此操作不再给出,可自行练习。
由于是初接触mysql的主从配置,中间难免遇见错误,在此也总结了一下我的错误的地方,及其解决方案。如:
错误:说pid 文件找不到致使mysqld服务无法启动。
原因我的存在两种:
(1)数据目录的属主属组可能不是mysql了,因为某些操作,会改动属主属组,所以一定要确保其属主属组一定也必须是mysql;
(2)可能/etc/my.cnf文件里面有错误,语法格式不对或者写错单词也会出现这个错误提示,请一定要比我细心。嘻嘻嘻嘻嘻嘻嘻

主主架构与主从的配置几乎一模一样,就是将上面的主服务器(172.16.7.33)和从服务器(172.16.7.25)的change master 改为对方的host即可。具体步骤
不再详述。
如果遇见错误,请指正!!
我马上就要生日了,祝自己在新的一岁里,活得更精彩!即将毕业,也即将参加工作,挫折是难免的,就像
从服务器的延迟,但不管怎样,都要开开心心的走下去!!

[/code]

本文出自 “无辜de心碎” 博客,请务必保留此出处http://chenjiuling.blog.51cto.com/3057028/831407
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: