MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
- 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。
- 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
- 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。
MySQL复制过程
Mysql的复制(replication)是一个异步的复制,从一个Mysql
instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在
Master(IO进程)上。 要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
复制的基本过程如下:
(1)Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
(2)Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave
的IO进程。返回信息中除了日志所包含的信息之外, 还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
(3)Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的
bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
(4)Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行
环境搭建
RHEL 5.4操作系统 mysql5.1.5版本
master 计算机名:node1 IP地址:192.168.0.191
slave 计算机名:node2 IP地址:192.168.0.192
####################################################################################
一、二进制编译安装mysql(主从均安装)
1、 解压包及做链接
# tar xvf mysql-5.1.50-linux-i686-glibc23.tar.gz
-C /usr/local
# cd /usr/local
# ln -sv mysql-5.1.50 mysql
# cd mysql
2、增加用户及该权限
# groupadd mysql
# useradd -g mysql -s /sbin/nologin
-M -r mysql //(-r :加一系统用户)
# mkdir /data //创建数据库存放目录
# chown -R mysql.mysql /data //赋予一定权限
# cd /usr/local/mysql
# chown mysql:mysql . -R
3、 初始化mysql配置
# scripts/mysql_install_db --user=mysql
--datadir=/data
# chown root . -R
# cp support-files/my-large.cnf /etc/my.cnf
# vim /etc/my.cnf datadir = /data #加入这一行
4、启动mysql
# bin/mysqld_safe --user=mysql &
# netstat -nutlp | grep 3306
5、设置使其可以使用mysql命令
#vim /etc/profile
#add PATH=$PATH:/usr/local/mysql/bin
# . /etc/profile //重读配置文件
6、加载库函数
# vim /etc/ld.so.conf.d/mysql.conf /usr/local/mysql/lib
//添加该行
# ldconfig -v
# ln -sv /usr/local/mysql/include /usr/include/mysql
# ls /usr/include/mysql/
7、把mysql加入开机启动
# cp support-files/mysql.server /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
# service mysqld restart
二、配置mysql的配置文件
1、在node1上给从服务器用户rep赋予同步的权限
# mysql
mysql>
mysql> GRANT REPLICATION SLAVE,REPLICATION
CLIENT,RELOAD,SUPER ON *.* TO 'rep'@'192.168.0.2' IDENTIFIED
BY '123456';
mysql> Grant ALL PRIVILEGES ON *.*
TO li@'%' IDENTIFIED BY '123456';
mysql>Flush privileges; // 刷新权限,使设置生效
2、配置node1 的/etc/my.cnf配置文件
创建更新日志的目录并给mysql用户的权限
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql
修改配置文件中如下内容,如果没有添加上去:
log-bin=mysql-bin |
启动二进制日志系统 |
server-id = 1 |
本机数据库ID 标示为主,该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232之间的一个正整数值 |
binlog-ignore-db=mysql |
避免同步mysql用户配置,以免不必要的麻烦 |
查看主服务器的mysql的状态:
mysql> SHOW MASTER STATUS; +------------------+----------+-------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB
| +------------------+----------+-------------------+------------------+
| mysql-bin.000008| 313361 | | mysql | +------------------+----------+-------------------+------------------+
3、配置node2 的/etc/my.cnf配置文件 将以下配置启用:
server-id = 2 |
从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。 |
master-host = 192.168.0.1 |
指定主服务器IP地址 |
master-user = rep |
制定在主服务器上可以进行同步的用户名 |
master-password = 123456 |
密码 |
master-port = 3306 |
同步所用的端口 |
master-connect-retry=60 |
断点重新连接时间 |
replicate-ignore-db=mysql |
屏蔽对mysql库的同步,以免有麻烦 |
查看从服务器的mysql的状态:
# mysql #进入mysql命令行
mysql>SHOW SLAVESTATUS;
*************************** 1. row ***************************
Slave_IO_State:Master_Host: node1.example.com
Master_User: rep Master_Port: 3306 Connect_Retry: 60Master_Log_File:mysql-bin.000008
Read_Master_Log_Pos: 5 Relay_Log_File: mysql-relay-bin.000008
Relay_Log_Pos: 5 Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: NoSlave_SQL_Running: No
……………….
mysql> START SLAVE; // 注意:这个命令的不能有错误产生
再次查看状态
mysql> SHOW SLAVE STATUS;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to
send event Master_Host: node1.example.com Master_User:
rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File:
mysql-bin.000008 Read_Master_Log_Pos: 175 Relay_Log_File:
mysql-relay-bin.000008Relay_Log_Pos: 175 Relay_Master_Log_File:
mysql-bin.000008 Slave_IO_Running: YesSlave_SQL_Running:
Yes
………………………
如果都是yes,那代表已经在同步 此处Slave_IO_Running
,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步。 |