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

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

1、主数据库配置

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 'repuser'@'%' IDENTIFIED BY '123456';

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

2、从数据库配置

从数据库服务器的配置稍微多一点,主要也是修改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=’密码’;

3、启动与监控

监控主数据库服务器的状态,我们可以通过showmaster status来查看主数据库服务器的状态,它的输出如下:

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000003 | 370558 | | |

+------------------+----------+--------------+------------------+

1 row IN SET (0.00 sec)

其中File是表示日志记录的文件,而Position则是表示当前日志在文件中的位置,这个也是从数据库服务器上执行复制操作必须的标识,后面的两个字段分别表示要记录的数据库名称和不需要记录的数据库名称,我们也可以在配置文件中进行配置。

监控从数据库服务器的状态,我们可以通过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)

上面显示的结果中的mysql-bin.000003和370558分别表示的是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的主从数据库的配置,这也也为我们的应用在集群中的使用打下了一个基础。

主从数据库

ThinkPHP的模型支持主从式数据库的连接,配置DB_DEPLOY_TYPE为1可以采用分布式数据库支持。如果采用分布式数据库,定义数据库配置信息的方式如下:

//在项目配置文件里面定义

return array(

'DB_TYPE'=>'mysql',//分布式数据库的类型必须相同

'DB_HOST'=>'192.168.0.1,192.168.0.2',

'DB_NAME'=>'thinkphp',//如果相同可以不用定义多个

'DB_USER'=>'user1,user2',

'DB_PWD'=>'pwd1,pwd2',

'DB_PORT'=>'3306',

'DB_PREFIX'=>'think_',

……其它项目配置参数

);

连接的数据库个数取决于DB_HOST定义的数量,所以即使是两个相同的IP也需要重复定义,但是其他的参数如果存在相同的可以不用重复定义,例如:

'DB_PORT'=>'3306,3306'和'DB_PORT'=>'3306'等效

'DB_USER'=>'user1',

'DB_PWD'=>'pwd1',

'DB_USER'=>'user1,user1',

'DB_PWD'=>'pwd1,pwd1',

等效。

还可以设置分布式数据库的读写是否分离,默认的情况下读写不分离,也就是每台服务器都可以进行读写操作,对于主从式数据库而言,需要设置读写分离,通过下面的设置就可以:

'DB_RW_SEPARATE'=>true,

在读写分离的情况下,第一个数据库配置是主服务器的配置信息,负责写入数据,其它的都是从数据库的配置信息,负责读取数据,数量不限制。每次连接从服务器并且进行读取操作的时候,系统会随机进行在从服务器中选择。

注意事项:主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制。

分享到:

2011-07-25 22:57

浏览 1035

分类:数据库

评论

mysql主从 查询负载_MySQL集群:主从数据库配置 实现查询负载相关推荐

  1. 迅搜xunsearch全文搜索引擎在负载均衡集群中的配置方法

    迅搜xunsearch全文搜索引擎在负载均衡集群中的配置方法 近来在一个电商项目中需要对商品检索实现中文分词和全文搜索功能,,于是使用了国内做得比较好并且是开源的迅搜全文搜索引擎,对PHP支持良好并且 ...

  2. redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析

    文章目录 1. 在linux下安装redis 2. redis主从架构 2.1 redis主从架构搭建步骤 2.2 redis主从架构数据同步原理 2.3 如果在主从传输过程中,从节点挂了怎么办? 2 ...

  3. mysql设置定时入伍_mysql 集群自动化配置

    #!/bin/sh #文 件 名: autogen_mysql.sh #功 能: 自动生成Mysql集群配置文件,生成环境自动部署,自动运行脚本等 #创建时间: 2012-02-05 #自动化生成的文 ...

  4. JMS之——ActiveMQ 高可用与负载均衡集群安装、配置(ZooKeeper + LevelDB + Static discovery)...

    一.说明 从 ActiveMQ 5.9 开始, ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于ZooKeeper + LevelDB 的 Master-Sla ...

  5. LVS 负载均衡集群详细介绍

    目录 0 前言 1 什么是 LVS? 3 为什么要用 LVS? 4 LVS 的组成及作用 5 负载均衡的由来及所带来的好处 6 LVS 负载均衡集群的类型 7 DNS / 软硬件负载均衡的类型 8 L ...

  6. 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群

    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...

  7. 负载均衡集群 [ 1 ] ---集群的认识,四层负载,七层负载 ,LVS 实现四层负载均衡

    文章目录 负载均衡集群 1.集群是什么? 2.负载均衡集群技术 3.负载均衡集群技术的实现 4.负载均衡分类 5.四层负载均衡(基于IP+端口的负载均衡) 6.七层的负载均衡(基于虚拟的URL或主机I ...

  8. 搭建K8S-web-MySQL-keepalived 负载均衡集群项目

    搭建K8S-web-MySQL-keepalived 负载均衡集群项目 部署目录 搭建K8S-web-MySQL-keepalived 负载均衡集群项目 总体架构图 安装MySQL 下载MySQL镜像 ...

  9. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

最新文章

  1. 闭包的介绍、构成条件、作用及示例代码
  2. python等差分解一个数
  3. 第一个程序实现登录功能,密码输错三次封账号。
  4. Android分享-微信、Facebook、Google
  5. [NOIp2017提高组]奶酪(BFS)
  6. asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法...
  7. (十五) 构建springmvc+mybatis+dubbo分布式平台-window安装dubbo管控台
  8. HihoCoder-1174拓扑排序
  9. LeetCode(8) - String to Integer (atoi)
  10. 程序江湖:第五章 机会是一种困扰
  11. Spark的简介和在大数据领域的地位
  12. android画板笔锋实现
  13. python库手册_Python 中文开发手册
  14. 暴力法——猴子分桃-源代码 c语言实现
  15. 微信多开无法连接服务器,ios丨微信多开联网失败解决方法
  16. Python制作关键字云+情感分析图
  17. HTML5实现音频和视频嵌入,如何利用HTML5实现音频和视频嵌入的方法
  18. 统计模型——贝叶斯统计模型,负二项分布
  19. Web前端Lec12 - HTTP协议
  20. 去中心化社交网络协议除了Nostr还有哪些?

热门文章

  1. LeetCode简单题之重塑矩阵
  2. TensorFlow指定CPU和GPU方法
  3. 用Auto-TensorCore代码生成优化matmul
  4. 2021年大数据Flink(二十八):Flink 容错机制 自动重启策略和恢复
  5. Android ListView (多个adapter 说明)
  6. git 下载的文件与git上面的文件不相同的处理方法
  7. Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
  8. Gym 101845(2018 ACM-ICPC, Universidad Nacional de Colombia Programming Contest)
  9. 使用Java监控工具出现 Can't attach to the process
  10. Leetcode812.Largest Triangle Area最大三角形面积