1、主从库定义
Master(主库)负责写操作的负载,也就是说一切写的操作都在Master上进行,而读的操作则分摊到Slave(从库)上进行。这样一来的可以大大提高读取的效率。
在一般的互联网应用中,经过一些数据调查得出结论,读/写的比例大概在 10:1左右,也就是说大量的数据操作是集中在读的操作,这也就是为什么我们会有多个Slave的原因。但是为什么要分离读和写呢?熟悉DB的研发人员都知道,写操作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情。我们这样的分离是把写操作集中在一个节点上,而读操作其其他的N个节点上进行,从另一个方面有效的提高了读的效率,保证了系统的高可用性。
2、主从库原理
在复制过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器。如下图所示。
图1:主从库原理图
此时主服务器会将更新信息写入到一个特定的二进制文件中。并会维护文件的一个索引用来跟踪日志循环。这个日志可以记录并发送到从服务器的更新中去。当一台从服务器连接到主服务器时,从服务器会通知主服器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从那个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。
3、主从库配置
主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的查询操作(如:密码修改后重新登录);从库负责查询较旧数据,做一些对实效性要求较小的分析,报表生成的工作。这样做将数据库的压力分担到两台服务器上从而保证整个系统响应的及时性。
3.1、运行环境
192.168.1.18(master)
192.168.1.100(slave)
3.2、master数据库配置
1.修改my.ini配置(linux应该是my.cnf(在哪…)),在[mysqld]下添加如下配置:
server-id=1 #1表示为master数据库
log-bin=mysql-bin #开启二进制日志功能
binlog-do-db=要同步的数据库 #可写多个,不添加的时候表示同步这个数据库
log_bin_trust_function_creators=1 #保证存储过程同步到从库
2.在master上为slave创建一个用于从master自动同步的账号,为了安全,应该限制账号的登录IP为slave的IP。
msyql>grant replication slave on*.* to "loxx"@"192.168.1.100" identified by"123456";
Loxx,123456表示主库给从库连接开设的账号名和密
3.刷新权限表,重启数据库
msyql>flush privileges
4.查看master配置状态(记住File和Position值,需要在slave中用到)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 107 | jinyidb | mysql |
+------------------+----------+--------------+------------------+
3.3、slave数据库配置
1.修改my.ini配置,,在[mysqld]下添加如下配置:
server-id=2 #如果有多台从数据库,只需要数字依次递增就可以了
log-bin=mysql-bin
replicate-do-db=testdb #指定需要同步的数据库名,如果有多个数据库则多写几次
replicate-ignore-db=mysql #指定不需要同步的数据库,如果有多个也多写几次
2.重启数据库
3.在slave中配置master账号信息
mysql>stop slave
mysql>change master tomaster_host="192.168.1.18",master_user="loxx",master_password="123456",master_log_file="mysql-bin.000006",master_log_pos=107;
mysql>start slave
mysql>show slave status
检查配置信息,如果发现
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两条记录了,说明你配置成功了,可以在主数据库做点改动测试一下效果
4、注意事项
* server_id保证主从库的不同;
* 日志有时候会报错,可以再从库中刷新日志:resetslave;
* 在从库连接主库时候,要保证从库与主库的表结构相同
* 在从库连接主库时候,
over