主从服务器配置的原理
 
Mysql的Replication是一个异步的复制过程,从一个Master服务器上复制到另一个slave服务器上。在主与从之间的实现整个过程主要有三个线程来完成,其中两个线程(SQL线程和IO线程)在从服务器上,另一个IO线程在主服务器上。
 
要实现Mysql的Replication,首先必须打开主服务器的Binarylog功能,否则无法实现,因为整个复制过程实现。因为整个复制过程实际上就是从服务器从主服务器上获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。打开MysqlR Binary Log可以通过在启动Mysql Server的过程中的Mysqld参数组增加“log-bin"参数项。
 
MySQL复制的基本过程如下:
 
1、从服务器上面的IO线程连接主服务器上,并请求从指定日志文件的指定位置之后的日志内容
 
2、Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程是根据请求信息读取指定日志指定位置之后的日志信息,返回给从服务器的IO线程。返回信息中除了日志所包含的信息外,还包括本次返回的信息在主服务器上Binary Log文件的名称以及在BinaryLog中的位置
 
3、从服务器的IO线程接收到信息后,将接收到的日志内容依次写入到从服务器的RelayLog文件的最末端,并将读取到的主服务器端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速从主服务器哪个位置开始往后的日志内容读取
 
4、从服务器的SQL线程检测到RelayLog中新增加了内容后,会马上解析该Log文件中的内容成为在主服务器真实执行时候的那些可执行的Query语句,并在自身执行这些Query。这样,实际就是在主服务器和从服务器执行同样的Query,所以两端的数据是完全一样的。
 
二、MySQL主从配置的优点
 
1、解决web应用系统,数据库出现的性能瓶颈,采用数据库集群的方式来实现查询负载;一个系统中数据库的查询操作比更新操作要多得多,通过多台查询服务器将数据库的查询分担到不同的查询服务器上从而提高查询效率。
 
2、MySQL数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除与更新操作,而从数据库则专门用来进行数据查询操作,这样可以将更新操作和查询操作分担到不同的数据库上,从而提高了查询效率。
 
说明:主服务器是172.16.6.1,在主服务器运行一段时间的时候才开始建从服务器,因此主服务器要做一次备份,从服务器要导入。
 
主服务器的配置:172.16.6.1
 
一、安装mysql
说明:由于mysql编译安装时间比较长,所以此处的安装包是二进制编译的包,解压后可以直接使用。
下载mysql-5.5.15-linux2.6-i686.tar.gz                         
#解压mysql软件包到/usr/local下
tar -vxf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local         #-C 指定解压的位置
#为解压后的文件创建软链接
cd /usr/local
ln -sv mysql-5.5.15-linux2.6-i686 mysql                       
#添加mysql组和mysql用户
groupadd mysql                                                
useradd -g mysql -s /sbin/nologin -M mysql                     #-M不指定家目录-g指定组
#查看创建的MYSQL用户
id mysql
#改变mysql目录的属主属组为mysql用户和mysql组
cd mysql
chown -R mysql:mysql .                                         #-R 递归更改
#查看操作是否成功
ll 查看
说明:为了以后的mysql数据的备份和恢复等我们尽量把mysql的数据放在一个单独的分区或磁盘上
#创建分区
fdisk /dev/sda
    n 创建分区
    t 改变类型为8e
partprobe /dev/sda       #内核重读分区信息
#创建逻辑卷
 pvcreate /dev/sda5      #创建物理卷
 vgcreate myvg /dev/sda5     #创建卷组并命名为myvg
 lvcreate -L 3G -n mydata myvg     #创建逻辑卷并命名为mydata大小为3G
 
#查看创建的逻辑卷
lvs
#格式化逻辑卷文件
mke2fs -j -L MYDATA -b 2048 /dev/myvg/mydata                   #-j 指定为ext3文件系统 -b 指定块大小
#挂载逻辑卷
mkdir /mydata                     #创建挂载点文件
vim /etc/fstab
LABEL=MYDATA /mydata ext3 default 0 0                         #开机自动挂载
mount -a                                                       #手动挂载
#创建数据存放目录并更改属主属组
mkdir /mydata/data                                            #创建目录用来存放数据
chown -R mysql:mysql /mydata/data                             #改变属主属组以mysql用户运行
ll /mydata/data                                               #查看操作结果
 
初始化数据库等操作
scripts/mysql_install_db --user=mysql --datadir=/mydata/data   #数据初始化
chown -R root .                                                #把属主改为root
cd support-files                                               #mysql的配置文件
cp my-large.cnf /etc/my.cnf                                    #添加主配置文件
#修改配置文件添加一行数据的存放位置
vim /etc/my.cnf
datadir = /mydata/data                                         #添加数据的目录
#配置使用mysqld命令来启动mysql服务
cp mysql.server /etc/init.d/mysqld                            #控制mysql服务启动的脚本
service mysqld start                                          #验证启动
 
#设置为开机自动启动
chkconfig --add mysqld                                        #添加开机自动启动
chkconfig --list mysqld                                       #查看操作结果
#查看mysql的3306端口是否处于监听状态
netstat -tnlp                                                 #监听在3306端口
#配置客户端命令搜索路径
vim /etc/profile
PATH=$PATH:/usr/local/mysql/bin
. /etc/profile                                                #重读文件
echo $PATH                                                    #查看一下
#使用命令连接mysql server
mysql                                                         #连接mysql
 
#创建头文件的链接文件
cd ..                                                         #切换到父目录
ls
ln -sv /usr/local/mysql/include /usr/include/mysql            #为头文件创建软连接
ls /usr/include/mysql/
#创建mysql库文件的库搜索文件
vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib                                          #添加配置库文件路径
ldconfig -v                                                   #重新装载
#增加mysqld命令的man文档路径
ls man/
vim /etc/man.config
MANPATH /usr/local/mysql/man                                 #添加man文档的路径
man mysqld                                                    #测试一下
 
2、修改主配置文件
  vim /etc/my.cnf
  log-bin=mysql-bin                                           #打开二进制日志
  server-id = 1
 
3、创建用户帐号,注意权限
 mysql> grant replication client,replication slave on *.* to 'back'@'172.16.%.%' identified by 'redhat';
 mysql> flush privileges;
 
4、做备份
 mysql> flush tables with read lock;                           #对表文件加锁
 mysql> show master status;                                    #查看log,Pos文件对应的位置
 
+------------------+----------+--------------+------------------+
 | File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 +------------------+----------+--------------+------------------+
 | mysql-bin.000002 |      190 |              |                  |
 +------------------+----------+--------------+------------------+
 mysqldump --all-databases --single-transaction --master-data=2 > /all.sql     #备份数据库文件
 mysql> unlock tables;                     #解开表锁
 
从服务器的配置:
1、安装mysql,并启动
 
2、修改配置文件
  vim /etc/my.cnf
   #log-bin=mysql-bin                                            #关闭二进制日志
   relay_log=relay-log                                           #启动中继日志
   server-id = 2
   read_only = ON                                                #ON表示从服务器只能以读的方式工作
 
3、
scp 172.16.6.1:/all.sql ./      #使用scp命令从主服务器上把备份的日志文件拷贝到当前目录
mysql < all.sql               #使用备份的日志文件在从服务器上执行一次
mysql <show databases;                                           #验证是否和主服务保持一直
 
4、
mysql -uroot -predhat
less all.sql                                                    #查看得到log的文件及pos文件或在服务启动之前show master status\G;
mysql> change master to master_user='back',master_host='172.16.6.1',master_password='redhat',master_log_file='mysql-bin.000002 ',master_log_pos=190;

5、启动从服务器并查看从服务器的状态
 mysql> start slave;
 mysql> show slave status\G;
 
6、查看从服务器的错误日志文件
 cd /mydata/data/
 tail 主机名.err                                                  #查看错误日志
 
6、在主服务器创建一个数据库,在从服务器上查看是否同步过来。