概述:你的网站访问量非常大,对系统的稳定性非常高,那么可以使用mysql功能的复制功能,复制是指将主要的数据库的DDL和DML操作通过二进制日志传到复制服务器(也叫从服务器)上然后在从服务器上对这些日志重新执行(也叫重做),从而使得从服务器和主服务器的数据保持同步,mysql复制的优点包括以下三个方面
1、如果主服务器出现问题,可以快速切换到从服务器提供服务
2、可以在从服务器上执行查询操作,降低主服务器的访问压力
3、可以在从服务器上执行备份,以避免备份期间影响主服务器的服务
缺点:由于Mysql实现的是异步的复制,所以在主从服务器之间存在一定的差距,所以对实时性要求高的需要从主服务器数据库获得,对一般只有更新不频繁的数据或对实时性要求不高的数据可以通过从服务器查询,解决这个办法的方法可以使用mysql cluster
环境:两台vps主机 系统都为centos5 这里先假设:
主服务器 A, 主机名:vps-rep1.15099.net IP;192.168.3.201
从服务器 B,主机名:vps-rep2.15099.net IP:192.168.3.202
两服务器时间同步
步骤:
1、在两台主机上安装相同版本的数据库,可以在各主机上使用下面命令安装:
yum -y install mysql mysql-server
2、在主服务器上,设置一个复制使用的帐号,并授予REPLICATIAN SLAVE权限。这里创建一个复制帐号rep1,可以从从服务器IP为:192.168.3.202的主机进行连接
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.3.202' IDENTIFIED BY '1234vps';
Query OK, 0 rows affected (0.00 sec)
3、修改主数据库服务器 A 的配置文件/etc/my.cnf,开启BINLOG日志,并设置server-id的值,然后重启mysqld服务
vi /etc/my.cnf
#在[mysqld]字段中里添加下面两行
log-bin=/var/log/mysql-bin.log
server-id=1
4、在主服务器A,设置读锁定有效,这个步骤是为了确保没有数据库操作,以便获得一个一致性的快照
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)经过上面的读锁定命令,这样数据库A就不能够往里面写数据,我们测试看看:
mysql> create database vps;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
5、然后再在主服务器A上运行命令命令,得到当前的二进制日志名和偏移量值,这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000003 | 98 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
这里要记住上面的File和Position,等一下配置从服务器需要这两个数据
6、在从服务器B上,把主服务器A的数据库数据使用scp命令备份到从服务器上,这个步骤有很多种方法,就是把主服务器的资料备份到从服务器
#scp -rp root@192.168.3.201:/var/lib/mysql/* /var/lib/mysql/
#chown -R mysql:mysql /var/lib/mysql/
7、主服务器备份完毕后,恢复主数据库的写操作,剩下的工作之需要在从服务器上执行
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)8修改从服务器的/etc/my.cnf数据库配置文件,增加server-id参数,这里的server-id的值必须是唯一的,不能与主服务器相同
vi /etc/my.cnf
#在[mysqld]字段中里添加下面一行
server-id=2
9、开启从服务器mysql服务
[root@vps-rep2 mysql]# /etc/init.d/mysqld start
Starting MySQL: [ OK ]
[root@vps-rep2 mysql]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> stop slave; < --相当于使用--skip-slave-start参数启动数据库服务
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.3.201',
-> MASTER_PORT=3306,
-> MASTER_USER='rep1',
-> MASTER_PASSWORD='1234vps',
-> MASTER_LOG_FILE='mysqld-bin.000005',
-> MASTER_LOG_POS=98;
Query OK, 0 rows affected (0.01 sec)
mysql>
10、在从服务器上,启动slave线程,同时执行show processlist命令,显示从服务器的进程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show processlist \G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: 20
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 15
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)
看到上面3.row下的connect,代表slave已经连接上master,并且开始接收并执行日志
11、在主服务器上执行一些更新操作,观察是否在从服务器数据库上同步,这里在主服务器上新建一个vps,创建一个rep1_test表,且插入数据
mysql> create database vps;
Query OK, 1 row affected (0.02 sec)
mysql> use vps;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table rep1_test (id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into rep1_test values(1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from rep1_test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)
mysql>
12、在从服务器B上,检查新表是否创建,数据是否同步
mysql> use vps;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------+
| Tables_in_vps |
+---------------+
| rep1_test |
+---------------+
1 row in set (0.00 sec)
mysql> select * from rep1_test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)
从上面的结果看,数据库已经同步了,复制服务配置成功完成。
更多的可以查看官方网站资料:http://dev.mysql.com/doc/refman/5.1/zh/replication.html

没有评论:
发表评论