准备工作

为什么要实现这项技术

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想。这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力。Ok切入今天微博主题,利用MySQL主从配置,实现读写分离,减轻数据库压力。

目前实现的目标是主从数据库,从数据库能够复制备份主数据库。

需要准备的东西

起码两台服务器,这边只有两台,所以只做最简单的主从结构。

分别安装好 mysql。并且在主服务器上 创建好可以远程访问的 MySQL 用户账号

mysql 配置文件地址。默认地址为 /etc/my.cnf,可以用 find / -name my.cnf 指令全局查找配置文件。

配置工作

配置主服务器 server 1

vim /etc/my.cnf

[mysqld]

server-id=1#主库和从库需要不一致

log-bin=mysql-bin

binlog-do-db=mstest#同步的数据库

binlog-do-db=test#同步的数据库

binlog-do-db=keyboard#同步的数据库

binlog-ignore-db=mysql#不需要同步的数据库

重启 MySQL, service mysqld restart

查看 server-id 及 master 状态(一些参数在配置 从数据库 的时候会用到)

SHOW VARIABLES LIKE 'server_id';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.00 sec)

#数据库锁表,不让写数据;
#这步骤可不做 对于当前环境的 mysql 无需使用 lock 命令,因为没有人操作,但是生产环境中必须这样做
flush tables with read lock; 

show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 |    75191 | typecho,test | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

#主数据库到此配置完毕
unlock tables;

配置从数据库 server 2

vim /ect/my.cnf

[mysqld]
server-id=2

要想实现从 server 1 的 MySQL 同步数据,就得在 server 2 中配置 server 1 的 MySQL 连接信息(可远程登录 server 1 的用户账号信息)。

可以在 配置文件 my.cnf 中添加这些信息:

default-character-set=utf8
master-host=xx.xx.xx.xx
master-user=user
master-password=password
master-port=3306
master-connet-retry=60
replicate-do-db=test
replicate-ignore-db=mysql

修改配置信息之后,重启 MySQL。

还可以在启动 slave 服务之前,修改部分配置:

change master to 
master_host='192.168.0.103',
master_port=3306,
master_user='slave',
master_password='123',
master_log_file='mysql-bin.000005',
master_log_pos=98;

注意配置项名称和值的写法,数字或者字符串,连接符或者下划线。

最后两项是从 server 1 中得来的 File 和 Position,指令用的就是 show master status

启从节点服务状态;停止服务 stop slave; ,出错时先停止,再重新配置。

start slave

查看从服务器状态

show slave status\G

其中输出信息里,有两项需要注意一下

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

若都为 Yes ,说明启动没有问题,如果有一项或者两项都为 No,则说明配置有错误,需要重新配置。

Slave_IO_Running 表示从主服务器 binlog 获取数据,Slave_SQL_Running 表示本地数据库写入管理。

如果有错误,可以查看信息里的错误提示项 Last_IO_Error,Last_SQL_Error。

我两个错误都出现过,按照流程重新做了一遍,重新获取 master status 信息,重新设置 change master,就好了。

启动成功之后,就可以在已经配置了同步的主数据库操作,可以查看到从服务器数据库的一些变化(前提是从服务器要有相关的同步数据库,可通过主服务器备份得来)。