先介绍mysql主从复制或者主从同步的作用,然后介绍实验过程,最后介绍mysql主从复制原理。
mysql主从同步作用:
一、1、数据分布;2、负载平衡;3、备份;4、高可用性(high availability)和容错。
二、实验环境:一台rhel5.6作为mysql主服务器,ip为192.168.65.151;另一台rhel5.6作为mysql从服务器,ip为192.168.65.129
三、实验过程:
在主从机器上分别安装上mysql
#yum install mysql mysql-server mysql-devel -y
接下来主从mysql做的内容相似,尽管如此,还是区分来写。
在主mysql上面操作:
#service mysqld start
#ps aux |grep mysqld
/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock
得到上面内容将其拷贝下来待用。
#service mysqld stop
#mkdir /var/log/mysql
#touch /var/log/mysql/mysql-bin.log
#chmod 777 /var/log/mysql/ -R
#vim /etc/my.cnf
server-id=1
log_bin=/var/log/mysql/mysql-bin.log //在my.cnf中的[mysqld]区域中加上这两行,保存退出
#/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock --port=3306 --server-id=1 --log-bin=/var/log/mysql/mysql-bin.log & //将刚才复制的命令在linux系统下粘贴,并且增加后面三段信息,这样经过配置好的mysql服务器重新运行了。
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.77-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123'; //在主mysql上面创建同步账号,用户名为slave,密码为123.
mysql> flush privileges; //生效创建的账号。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 378 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>
在从mysql上面操作:
#service mysqld start
#ps aux |grep mysqld
/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock
得到上面内容将其拷贝下来待用。
#service mysqld stop
#mkdir /var/log/mysql
#touch /var/log/mysql/mysql-bin.log
#chmod 777 /var/log/mysql/ -R
#vim /etc/my.cnf
server-id=2
log_bin=/var/log/mysql/mysql-bin.log //在my.cnf中的[mysqld]区域中加上这两行,保存退出
#/usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock --port=3306 --server-id=2 --log-bin=/var/log/mysql/mysql-bin.log & //将刚才复制的命令在linux系统下粘贴,并且增加后面三段信息,这样经过配置好的mysql服务器重新运行了。
到这里开始在从mysql上使用change master从主mysql上同步:
mysql> change master to master_host='192.168.65.151', master_user='slave', master_port=3306, master_password='123', master_log_file='mysql-bin.000001', master_log_pos=378; //这里的master_host一定要是主mysql的ip,master_user和master_password是在主mysql上创建的同步账号和密码,master_log_file和master_log_pos是在主mysql上执行show master status时出现的file和position对应的东西。
mysql> start slave; //开启同步
现在做个测试,如下图:
实验表明在主数据库服务器上新建数据库可以立即在从数据库上显示,这证明实验成功,即双机主从mysql复制做成功。
mysql主从复制原理:
复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器上,然后在从服务器上对这些日志重新执行(也叫重做),从而使得从服务器和主服务器的数据保持同步。MYSQL支持一台主服务器同时向多台从服务器进行复制,从服务器同时也可以作为其他服务器的主服务器,实现链状的复制。mysql复制的优点主要包括以下3个方面:a、如果主服务器出现问题,可以快速切换到从服务器提供服务;可以在从服务器上执行查询操作,降低主服务器的访问压力;可以在从服务器上执行备份,以避免备份期间影响主服务器的服务。注意:由于mysql实现的是异步的复制,所以主从服务器之间存在一定的差距,在从服务器上进行的查询操作需要考虑到这些数据的差异,一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询,实时性要求高的数据仍然需要从主数据库获得。
mysql的复制至少需要两个mysql服务,这些mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。复制配置的步骤比较简单,下面进行详细介绍:(1)确保主从服务器上安装了相同版本的数据库。因为复制的功能在持续的改进中,所以在可能的情况下推荐安装最新的稳定版本。(2)在主服务器上,设置一个复制使用的账户,并授予replication salve权限。这里创建一个复制用户slave,可以从ip为任意的主机进行连接,也可以做成只从ip为192.168.65.151的主机进行连接:mysql> grant replication slave on *.* to 'slave'@'192.168.65.151'identified by '123';(3)修改主数据库服务器的配置文件my.cnf,开启binlog,并设置server-id的值,修改完后记得重启数据库服务以生效;(4)在主服务器上,设置读锁定有效,这个操作是为了确保没有数据库操作,以便获得一个一致性的快照,在这里由于我实验了好几遍,每次验证都要锁定和解锁,挺麻烦的就没有做锁。可以接着第(3)步后面这样设置锁:mysql> flush tables with read lock; 解锁:mysql> unlock tables;(5)然后得到主服务器上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复。mysql> show master status;(6)现在主数据库服务器已经停止了更新操作,需要生成主数据库的备份,备份的方式有多种,可以直接在操作系统下cp全部的数据文件到从数据库服务器上,也可以通过mysqldump导出数据或者使用ibbackup工具进行数据库的备份,还可以直接在从数据库上启动从mysql服务开始主从同步。如果主数据库的服务可以停止,那么直接cp数据文件应该是最快的生成快照的方法:[mysql@db]$ tar -cvf data.tar data,然后将主数据库的一致性备份恢复到从数据库上,这里用.tar打包的文件包只需要解开到相应的目录即可;用mysqldump备份:1)[mysql@db]$ mysqldump -uroot -p --all-database > all.sql //备份所有数据库。2)[mysql@db]$ mysqldump -uroot -p test > test.sql //备份一个数据库(test)。 3)[mysql@db]mysqldump -uroot -p test emp > emp.sql //备份一个数据库的某张表(数据库test下的表emp) 4)[mysql@db]mysqldump -uroot -p test emp dept > emp_dept.sql //备份一个数据库的多张表(数据库test下的表emp、dept)。(7)修改从数据库的配置文件my.cnf,增加server-id (8)对从数据库服务器做相应设置,指定复制使用的用户,主数据库服务器的ip、端口以及开始执行复制的日志文件和位置等。
下面再通过图文并茂的形式解释mysql主从复制原理:
大致描述过程如下:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,然后通过sql线程来在从上执行中继日志中的内容,从而使从库和主库保持一致。主从同步详细过程如下:
1、主服务器验证连接。
2、主服务器为从服务器开启一个线程。
3、从服务器将主服务器日志的偏移位告诉主服务器。
4、主服务器检查该值是否小于当前二进制日志偏移位。
5、如果小于,泽通知从服务器来取数据。
6、从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。
7、当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。
8、从服务器sql线程执行二进制日志,随后进入睡眠状态。
本文出自 “个人感受” 博客,谢绝转载!