1. 主从库简介

在做web应用系统中,如果数据库出现了性能瓶颈,而你又是使用的MySQL数据库,那么就可以考虑采用数据库集群的方式来实现查询负载了。因为一般来讲任何一个系统中数据库的查询操作比更新操作要多的多,因此通过多台查询服务器将数据库的查询分担到不同的查询数据库从而提高数据库的查询效率。

MySQL数据库支持数据库的主从复制功能,使用主数据库进行数据的插入、删除更新操作,而从数据库则专门用来进行数据库查询,这样就可以将更新操作与查询操作分离到不同的数据库上,从而提高查询的效率。


2. 主数据库配置

MySQL任何一台数据库服务器都可以作为主数据库服务器,我们只需要简单的修改配置文件就可以使之成为主数据库服务器。我们打开MySQL的配置文件(对于windows就是MySQL安装目录下的my.ini文件,对于linux通常就是/etc/my.cnf文件),我们在配置文件中加入如下两行:
server-id = 1
log-bin=mysql-bin

注意,MySQL进行主从复制是通过二进制的日志文件来进行,所以我们必须开启MySQL的日志功能,即我们上面的log-bin,同时每一台数据库服务器都需要指定一个唯一的server-id,通常主数据库服务器我们指定为1。

主数据库服务器的配置就是如此了,然后我们还需要给主数据库授予一个可以进行复制的用户,命令如下:

grant replication slave on *.* to 'user_slave'@'%' identified by 'yg123456';

其中,replication slave是MySQL数据库中表示复制的权限名称,user_slave 则是表示从数据库服务器登陆到主数据库服务器时用到的用户名称,123456表示登陆密码。这样,我们就在主数据库服务器上创建了一个可以进行复制的用户账号了。然后我们启动主数据库服务器就可以了。


3. 从数据库配置

从数据库服务器的配置稍微多一点,主要也是修改MySQL的配置文件,加入如下行:
server-id=2
log-bin=mysql-bin                    // 在从服务器上启动日志记录,不是必须,但是官方建议
master-host=主机                     // 主数据库服务器的IP地址
master-user=用户名                // 执行复制的用户名称,就是grant的用户
master-password=密码           // 复制用户的密码,就是grant的用户密码
master-port=端口                    // 主数据库服务器的端口,默认是3306

上述相关的配置参数意义已做了说明,主要就是多了配置主数据库服务器上的复制账号的信息。

 

然后我们启动从数据库服务器,注意启动从数据库服务器后,并没有启动复制线程,我们需要在命令行中执行如下命令来启动复制功能:

slave start

启动后,我们就可以通过如下命令来查看复制的状态了:

show slave status;

然后我们就可以看到系统的输出,第一个就是Slave_IO_State,它的值通常就是Waiting for master to send event,然后我们也还可以看到我们刚才配置的主数据库服务器的IP地址、复制账号等信息。


我们还可以在从数据库服务器上动态的改变对主数据库的配置信息,通过如下命令来进行:
CHANGE MASTER TO MASTER_HOST=’主数据库服务器的IP地址’, MASTER_PORT=3306,MASTER_USER=’主数据库上的复制帐号’, MASTER_PASSWORD=’密码’;


4. 启动与监控
1)监控主数据库服务器的状态
我们可以通过 show  master  status 来查看主数据库服务器的状态,它的输出如下:
+------------------+----------+--------------+------------------+
| File            | Position    | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|
mysql-bin.000003|  370558|              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
其中File是表示日志记录的文件,而Position则是表示当前日志在文件中的位置,这个也是从数据库服务器上执行复制操作必须的标识,后面的两个字段分别表示要记录的数据库名称和不需要记录的数据库名称,我们也可以在配置文件中进行配置。

2监控从数据库服务器的状态
我们可以通过 show  slave  status 来查看从数据库服务器的状态,它的基本输出如下:
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State                   | Master_Host   | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File        | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 172.16.11.221 | repuser     |        3306 |            60 |
mysql-bin.000003|             370558| WEB2-relay-bin.000206 |         12251 | mysql-bin.000003      | Yes              | Yes               |                 |                     |                    |                        |                         |                             |          0 |            |            0 |              370558 |           12251 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+----------------------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)
我们看到红色的部分,分别表示的是Master_Log_File 和 Read_Master_Log_Pos,即主数据库服务器上的日志文件和要读取的主数据库服务器上的日志的位置,通常这个Read_Master_Log_Pos是和主数据库服务器上的Position是一致的,当然这个是指同步以后的,如果从数据库服务器还没有同步完毕,那么这个值通常比主数据库服务器上的要小。

如果从数据库服务器在同步的过程中出现了问题,那么我们可以通过reset slave来重置从数据库服务器的复制线程,从数据库服务器上的通常操作命令有:
Slave start;                  // 启动复制线程
Slave stop;                  // 停止复制线程
Reset slave;                 // 重置复制线程
Show slave status;       // 显示复制线程的状态
Change master to;       // 动态改变到主数据库的配置

 

MySQL 5.5 主从配置差异处理

以前写过一篇关于主从的文章(http://blog.sina.com.cn/s/blog_4c197d420100w7uz.html),其中使用的mysql版本是5.1,今天因为一个测试重新搭建主从环境,使用的mysql版本是5.5,发现其中的有些变化,记录之。

 
其中大部分的内容相似,主要是5.5之后不再支持master打头的参数,如:master-host,master-user,master-password,master-port 等。
错误如下:
[ERROR] /usr/local/mysql/bin/mysqld: unknown variable 'master-host=192.168.2.182'
参照http://blog.sina.com.cn/s/blog_4c197d420100w7uz.html中的情况:
主配置不变,依旧是
server-id=1
log-bin=log
binlog-do-db=database1                      // 需要同步的数据库
binlog-do-db=database2
binlog-ignore-db=mysql                      // 被忽略的数据库
 
从配置改为:
server-id=2
#master-host=192.168.124.51
#master-user= AffairLog
#master-password= password
#master-port=3306
#master-connect-retry=60
replicate-do-db=database1          // 同步的数据库
replicate-do-db=database2
replicate-ignore-db=mysql         // 被忽略的数据库

 

 

 
重启从库时你salve start ,会发现错误,这也提示了我们需要使用change master to,即:
mysql>change master to
>master_host='192.168.124.51',
>master_user='AffairLog',
>master_password='password',
>master_log_file='log.000027',
>master_log_pos=3151;
 
然后 slave start ;
其他和原来的一样