搜档网
当前位置:搜档网 › mysql主从数据库的优势

mysql主从数据库的优势

mysql主从数据库的优势
mysql主从数据库的优势

MySQL主从服务器配置的优势\ 在MySQL数据库中,支持单项、异步复制。在复制过程中,一个服务器充当

主服务器,而另外一台服务器充当从服务器。如下图所示。此时主服务器会将更新信息写入到一个特定的二进制文件中。并会维护文件的一个索引用来跟踪日志循环。这个日志可以记录并发送到从服务器的更新中去。当一台从服务器连接到主服务器时,从服务器会通知主服器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从那个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新。

这就是MySQL服务器数据库复制原理的基本说明。作为数据库管理员,对于这个原理只要有几个基本的了解即可。

▲其需要关注的是,我们可以从这个复制功能中得到哪些实惠?

好处一:实现服务器负载均衡

通过服务器复制功能,可以在主服务器和从服务器之间实现负载均衡。即可以通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好的客户相应时间。通常情况下,数据库管理员会有两种思路。

一是在主服务器上只实现数据的更新操作。包括数据记录的更新、删除、新建等等作业。而不关心数据的查询作业。数据库管理员将数据的查询请求全部转发到从服务器中。这在某些应用中会比较有用。如某些应用,像基金净值预测的网站。其数据的更新都是有管理员更新的,即更新的用户比较少。而查询的用户数量会非常的多。此时就可以设置一台主服务器,专门用来数据的更新。同时设置多台从服务器,用来负责用户信息的查询。将数据更新与查询分别放在不同的服务器上进行,即可以提高数据的安全性,同时也缩短应用程序的响应时间、提高系统的性能。

二是在主服务器上与从服务器切分查询的作业。在这种思路下,主服务器不单单要完成数据的更新、删除、插入等作业,同时也需要负担一部分查询作业。而从服务器的话,只负责数据的查询。当主服务器比较忙时,部分查询请求会自动发送到从服务器重,以降低主服务器的工作负荷。当然,像修改数据、插入数

据、删除数据等语句仍然会发送到主服务器中,以便主服务器和从服务器数据的同步。

要在数据库之间实现负载的均衡,其关键点就是数据同步的时间。如果主服务器与从服务器之间数据的更新时间比较长,此时从主服务器中查询得到的数据就会同从从服务器中得到的数据有差异。而如果同步的时间比较短,如实现同步复制,对网络带宽、服务器设备等就有比较高的要求。

可见这个同步的时间选择直接关系到其应用的效果。那么这个同步的时间应该选择多少呢?这没有一个固定的答案。主要是看用户的需要。如用户对数据的及时性要求并不是很高,或者数据更新的频率不是很高,那么这个同步的时间可以稍微长一点。但是如果这个数据的及时性要求很高,如股票的价格等等,此时就需要能够实现同步更新。所以具体要看企业实际的应用才能够决定采用什么样的同步时间。

在采取这个应用时,需要注意MySQL数据库的复制是单向的。即只能够将数据从主服务器复制到从服务器,而不能够将数据从从服务器发生到主服务器。这也就是说,数据库管理员不能够在从服务器上更新数据,否则的话,就可能会与主服务器上的数据产生冲突。默认情况下,系统会自动利用主服务器上的数据来更新从服务器上的数据。即在从服务器上所做的任何更改,到时候都会失效。如果是用户的请求,一般不用担心。系统会自动判断用户的请求是查询请求还是数据更新请求。并自动根据请求的类型转发到不同的服务器上。主要是数据库管理员,不要手痒痒,手动去更新从服务器上的数据。否则的话,就会导致从服务器与主服务器之间数据的冲突。

好处二:通过复制实现数据的异地备份

如上图所示,可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业带来比较大的损失。

而如果使用复制来实现对数据的备份,就可以在从服务器上对数据进行备份。此时不仅不会干扰主服务气的正常运行,而且在备份过程中主服务器可以继续处理相关的更新作业。同时在数据复制的同时,也实现了对数据的异地备份。除非主服务器和从服务器的两块硬盘同时损坏了,否则的话数据库管理员就可以在最短时间内恢复数据,减少企业的由此带来的损失。

在通过这种方式进行异地备份时,主要需要注意如下二个细节:

一是数据更新的时间。如果要采取这种方式进行备份,那么对于数据同步的时间,要小于等于数据备份的周期。只有如此,才能够确保最近更新的数据被正

确的备份。此时即使主服务器出现了故障,用户丢失的也只是最近一个备份周期的数据。

二是从服务器上硬盘的空间。根据一般用户的心态,从服务器的配置往往比主服务器要低。但是现在从服务器要承担起数据备份的任务,为此对于硬盘的空间要求就要比主服务器要高。其不但要能够存储主服务器上的数据,而且还要对其进行备份。为此一般要求,从服务器上的存储空间是主服务器上的两倍。否则的话,就容易出现磁盘空间不足而导致备份作业失败。

好处三:提高数据库系统的可用性

数据库复制功能实现了主服务器与从服务器之间数据的同步,增加了数据库系统的可用性。当主服务器出现问题时,数据库管理员可以马上让从服务器作为主服务器,用来数据的更新与查询服务。然后回过头来再仔细的检查主服务器的问题。此时一般数据库管理员也会采用两种手段。

一是主服务器故障之后,虽然从服务器取代了主服务器的位置,但是对于主服务器可以采取的操作仍然做了一些限制。如仍然只能够进行数据的查询,而不能够进行数据的更新、删除等操作。这主要是从数据的安全性考虑。如现在一些银行系统的升级,在升级的过程中,只能够查询余额而不能够取钱。这是同样的道理。

二是从服务器真正变成了主服务器。当从服务器切换为主服务器之后,其地位完全与原先的主服务器相同。此时可以实现对数据的查询、更新、删除等操作。为此就需要做好数据的安全性工作。即数据的安全策略,要与原先的主服务器完全相同。否则的话,就可能会留下一定的安全隐患。

Mysql主从方案介绍

mysql主从方案主要作用:

读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql 语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

发扬不同表引擎的优点。目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为 master,处理高并发写入,使用master作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点。

热备,slave和master的数据“准实时”同步。

准备工作。先分别安装两台MYSQL

配置MASTER。找到https://www.sodocs.net/doc/5c8890097.html,f文件,修改:

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

max_binlog_size = 100M

binlog_do_db = DB_AdidasFootball

binlog_do_db = DB_CodeBuilder

binlog_ignore_db = test

其中,作为主机,server-id必须为1.

binlog_do_db为需要复制的db。 binlog_ignore_db为忽略复制的db。需要增

加DB的话,就增加相应的一行。

重启master数据库,运行检查:

mysql> show master status; #检查是否以master形式启动了。

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

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

| File | Position | Binlog_Do_DB |

Binlog_Ignore_DB |

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

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

| mysql-bin.000002 | 1087 | DB_AdidasFootball,DB_CodeBuilder | test |

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

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

1 row in set (0.00 sec)

mysql> show variables like "%log%";

#需要看到这样的一行,说明binlog已经开启了: log_bin | ON

在master上为slave建立用户

mysql> grant replication slave, reload, super on *.* to 'slave'@'10.*'

identified by '123456';

这样,主机配置完毕。

配置slave

server-id = 2 #随便什么数字,多台slave注意不能为重复就

可以了。

#log_bin = /var/log/mysql/mysql-bin.log #slave的binlog

就没有必要再开启了。注释掉。

master-host = 192.168.0.3 #master的IP

master-user = slave #上面操作中,建立的用户名

master-password = 123456 #上面操作中,建立的密码

重启slave,检查salve状态

slave:mysql> show slave status;

#很多很多列

接下来,将主机数据 copy 过来

这个流程比较复杂:)各个步骤注意所在的机器

slave:mysql> stop slave; #停掉slave的复制先。

master:mysql> flush tables with read lock; #锁掉master服务器的所有表,

禁止写入。

master:mysql> show master status; #还是上面的语句,查看并记录下 File

mysql-bin.000002, Position 1087

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

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

| File | Position | Binlog_Do_DB |

Binlog_Ignore_DB |

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

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

| mysql-bin.000002 | 1087 | DB_AdidasFootball,DB_CodeBuilder | test |

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

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

1 row in set (0.00 sec)

chluo@master:~$ mysqldump AdidasFootball > AdidasFootball.sql #在命令

行中导出DB的数据,这里是bash操作:)

master:mysql> unlock tables; #导出完成之后,解锁。 master可以继续跑起

来了。

chluo@slave:~$ mysql AdidasFootball < AdidasFootball.sql #在slave的

命令行中导入DB的数据,这里又是bash操作:)

slave:mysql> change master to

-> master_log_file='mysql-bin.000002', #将这里修改为刚记录下来的数据

-> master_log_pos=1087; #还有这里

slave:mysql> start slave;

完成。

注意事项

从机必须有其需要的数据库,才能够进行同步,否则会忽略。

=============================老王指正===========================

有几个错误:

1:其中,作为主机,server-id必须为1.

似乎没有这个规定。。

2:binlog_ignore_db为忽略复制的db。

主服务器最好不要使用binlog_ignore_db,否则binlog就不完整了,不能回到过去某个时间点,可以通过从服务器忽略不想复制的库。

3:grant replication slave, reload, super on

安全考虑,不要给super

4:master-host = 192.168.0.3

不用通过配置文件设置主服务器信息,而应该使用change master to这样的sql

///////////////////////

MySQL 主从复制是其最重要的功能之一。主从复制是一台服务器充当主服务器,另一台或多台服务器充当从服务器,主机自动复制到从机。对于多级复制,数据服务器即可充当主机,也可充当从机。MySQL 复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。要做MySQL 主从关系的设置,需要有两台MySQL 主机。所以在开始配置之前需要准备两个MySQL 服务器,可以是在虚拟机里安装,也可以在真实机器上安装。

最好是在主/从服务器上安装相同的MySQL 版本。或者是slave 上的MySQL 版本要高于Master 上的版本。另外,推荐是选择较新的正式的MySQL 版本。

MySQL 手册中对配置主从复制架构的提示和建议:

1. We recommend using the most recent MySQL version available because replication capabilities are continually being improved.

2. We also recommend using the same version for both the master and the slave.

3. We recommend upgrading masters and slaves running alpha or beta versions to new (production) versions.

4. Replication from a

5.0.3 master to a 5.0.2 slave will fail; from a 5.0.4 master to a 5.0.3 slave

will also fail.

5. In general, slaves running MySQL 5.0.x may be used with older masters(even those running MySQL 3.23, 4.0, or 4.1), but not the reverse.

6. Y ou cannot replicate from a master that uses a newer binary log format to a slave that uses an older format (for example, from MySQL 5.0 to MySQL 4.1.)

7. The binary log format as implemented in MySQL 5.0 is considerably different from that used in previous versions. Major changes were made in MySQL 5.0.3(for improvements to handling of character sets and LOAD DA TA INFILE) and 5.0.4 (for improvements to handling of time zones).

一、操作环境说明

主机(master):

Windows Server 2003,IP:10.0.0.101

MySQL版本:mysql-essential-5.1.47-win32.msi

MySQL 安装路径:D:\MySQLServer5.1

从机(slave):

Windows Server 2003,IP:10.0.0.102

MySQL版本:mysql-essential-5.1.47-win32.msi

MySQL 安装路径:D:\MySQLServer5.1

其他相关软件:

MySQL 管理客户端:

Navicat 8 for MySQL(Windows)

本文的实验环境是在Vmware workstation 7.0 虚拟机下搭建的。

二、配置MySQL 主机(master):

首先打开MySQL 服务器的配置文件my.ini(Linux 下是文件https://www.sodocs.net/doc/5c8890097.html,f),一般都在MySQL 安装目录下,本实验中在D:\MySQLServer5.1 下。记得先备份以下原来的配置文件。然后在my.ini 文件末尾加入下面的代码:

#Master Config

server-id = 1

log-bin = mysql-bin

binlog-do-db = test

binlog-ignore-db = mysql

注意上面这几项配置,如果在配置文件中已经存在就不用添加了(MySQL5.0较早的版本中有,本实验的5.1.47版本没有)。注意都是小写字母。

上面的这些配置的含义:

- server-id 顾名思义就是服务器标识id号了

- log-bin 指定日志类型

- binlog-do-db 是你需要复制的数据库名称,如果有多个就用逗号“,”分开

- binlog-ignore-db 是不需要复制的数据库名称,如果有多个就用逗号“,”分开

然后添加一个用户,用于从服务器访问:

很多教程使用MySQL 命令行(CLI)命令来操作,我们这里使用MySQL 图形界面的管理客户端Navicat 来操作,结果是一样的。

连接到10.0.0.101 上的MySQL 服务器,进入用户管理界面,建立一个用户slave,密码也是slave。主机填写“10.%”,意味着只允许该账户从IP地址开头为“10”的主机上连接。当然填写“%”也可以。

账户权限:需要为slave 账户开放“全局许可权”:Reload、Super、Replication Slave、Replication Client。因为配置中是对test 数据库进行复制,所以还要开放该对数据库test 的一切权限。

用MySQL 命令行操作的话,请参考以下形式的语句:

grant usage on *.* to 'slave'@'10.%' identified by 'slave';

该命令就是添加一个用户了。“@”前面的“slave”是用户名,后面的是有效的域,“10.%”也就是说以“10”开头的任意IP都能使用这个帐号访问这台MySQL 服务器,也可以设置成固定的I P比如“10.0.0.102”。by 后面的“slave”是密码。

MySQL 主服务器配置完毕。把MySQL 服务重新启动一下,在命令行窗口中执行:net stop mysql //关闭MySQL服务

net start mysql //开启MySQL服务

当然也可以在Windows 服务管理控制台操作MySQL 服务。

三、配置MySQL 从机(slave):

打开从服务器的配置文件my.ini,同样在末尾加入下面的代码:

# Slave Config

server-id = 2

master-host = 10.0.0.101

master-port = 3306

master-user = slave

master-password = slave

replicate-do-db = test

下面来解释下:

Server-id 从服务器标识id号

Master-host 主服务器的IP 地址

Master-port 主服务器的端口

Master-user 用于和主服务器同步数据的用户名,我们在配置主服务器时已经添加了,即slave

Master-password 就是Master-user 的密码

Replicate-do-db 要备份的数据库名称

注意,如果my.ini 文件中原来就有一个server-id=1 的配置,需要删除掉(MySQL5.0较早的版本中有,本实验的5.1.47版本没有)。配置语句也都是小写字母。

重启从服务器上的MySQL 服务。

四、测试

登录到从服务器命令行界面,执行以下命令,查看从服务器的配置是否正确:

Show slave status;

执行后会显示很多东西, 然后找到下面这两项:

Slave_IO_Running: Y es

Slave_SQL_Running: Yes

如果两项都是Y es 那么就配置成功了。如果不全是Y es,则有可能是主服务器上slave 账户的权限配置问题,需要反复检查。

接着执行命令:

load data from master;

这个命令就是从主服务器载入数据。本命令用于对主服务器进行快照,并拷贝到从属服务器上。它可以更新MASTER_LOG_FILE和MASTER_LOG_POS的值,这样,从属服务

器就可以从正确的位置开始进行复制。使用--replicate-*-do-*和--replicate-*-ignore-*选项指定的表和数据库排除规则均被兑现。--

如果命令执行后显示信息“Query OK, 0 rows affected (0.13 sec)”,则说明正确执行了数据复制。

本“load data from master”语句只对MyISAM 类型的表起作用。如果试图载入一个非MyISAM表,会导致以下错误:

ERROR 1189 (08S01): Net error reading from master

并且当拍摄快照时,会获得对主服务器的全局读取锁定。在载入操作期间,该锁定会阻止对主服务器的更新。

然后,在主服务器建表和增删记录,应该在从服务器中看到对应的变化。说明配置成功了。

五、MySQL 主从复制错误的处理

MySQL 主从复制架构配置成功后,首先应该在主服务器上锁住表,然后备份数据,同步到从服务器上。

flush tables with read lock;

-- copy data files ...

unlock tables;

或者是通过mysqldump 工具来备份和同步数据:

mysqldump --user=root --password=xxxx --master-data=1 --all-databases > dbsnapshot.sql 然后主从复制开始正确工作。

如果主服务器已经存在一定数量的数据,或从服务器由于某些原因中断了同步的进程,这个时候可以按照以下的步骤来重新同步:

1、从主服务器导出欲同步的数据库;

2、在从服务器运行stop slave 停止同步;

3、导入第1步的数据库到从服务器;

4、在从服务器上运行start slave 开始同步。

CHANGE MASTER TO

MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=106;

5.切换slave为master,在slave上:

mysql> STOP SLA VE;

mysql> RESET MASTER;

6 重置二进制log文件

FLUSH MASTER;

当前网站的调整

MySQL数据双向同步解决方案

1.mysql数据同步实现原理 即读写操作在两台服务器上进行,每台服务器即主也是从。当其中的任何一台服务器收到操作请求时,其进行相应的数据变化,并把变化的数据复制到另一台服务器中。 2.配置服务器master 初始服务器 通过mysql工具连接服务器master后,新建两个数据库audit,idm。导入初始化数据库文件,完成数据库的初始化 给用户授权 从开始菜单中打开mysql5的命令行,输入正确的密码,进入mysql控制台命令行模式后,输入如下命令: #授权来自192.168.0.189的backup用户拥有对所有库的复制数据的权限,该用户的密码设为123456 GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.0.189' IDENTIFIED BY '123456'; #刷新权限设置 FLUSH PRIVILEGES ; 修改配置文件 修改主目录中的my.inf文件,在mysqld下面加入如下内容 server-id = 1 log-bin=mysql-bin binlog-do-db = audit binlog-do-db = idm binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = test master-host = 192.168.0.189 master-user = backup master-password = 123456 master-port = 3306

replicate-do-db = audit replicate-do-db = idm master-connect-retry = 60 3.配置服务器slave 初始服务器 通过mysql工具连接服务器ha002后,新建两个数据库audit,idm。导入初始化数据库文件,完成数据库的初始化 给用户授权 从开始菜单中打开mysql5的命令行,输入正确的密码,进入mysql控制台命令行模式后,输入如下命令: #授权来自192.168.0.188的backup用户拥有对所有库的复制数据的权限,该用户的密码设为123456 GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.0.188' IDENTIFIED BY '123456'; #刷新权限设置 FLUSH PRIVILEGES ; 修改配置文件 修改主目录中的my.inf文件,在mysqld下面加入如下内容 server-id = 2 master-host = 192.168.0.188 master-user = backup master-password = 123456 master-port = 3306 relicate-do-db = audit replicate-do-db = idm master-connect-retry = 60 log-bin=mysql-bin binlog-do-db = audit binlog-do-db = idm binlog-ignore-db = information_schema

MySQL主从复制、搭建、状态检查、中断排查及备库重做 实战手册

美河学习在线https://www.sodocs.net/doc/5c8890097.html, MySQL主从复制 MySQL主从复制、搭建、状态检查、中断排查及备库重做 本文档主要对MySQL主从复制进行简单的介绍,包括原理简介、搭建步骤、状态检查、同步中断及排查、备库重建。

目录 一、MySQL主从复制概述 (2) 1、主从复制简介 (2) 2、主从复制原理、机制 (2) 3、主从复制原理图 (3) 二、MySQL主从复制搭建 (4) 1、Master端配置部署 (4) 2、Slave端配置部署 (4) 3、建立主从同步 (4) 三、主从复制状态检查及异常处理 (6) 1、主从复制状态检查 (6) 2、IO_thread异常 (7) 3、sql_thread异常 (8) 4、主从复制延迟 (9)

一、MySQL主从复制概述 1、主从复制简介 MySQL主从复制就是将一个MySQL实例(Master)中的数据实时复制到另一个MySQL实例(slave)中,而且这个复制是一个异步复制的过程。 实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(sql_thread和IO_thread),另外一个进程在 Master(IO进程)上。 2、主从复制原理、机制 要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。 复制的基本过程如下: 1)、Slave上面的IO_thread连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; 2)、Master接收到来自Slave的IO_thread的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO_thread。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log file的以及bin-log pos; 3)、Slave的IO_thread接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”; 4)、Slave的Sql_thread检测到relay-log中新增加了内容后,会马上解析relay-log 的内容成为在Master端真实执行时候的那些可执行的内容,并在本数据库中执行。

计算机二级《mysql数据库程序设计》知识点总结

MySQL知识点总结 .数据操作:检索、排序、过滤、分组、汇总、计算、联接、子查询与组合查询 .表操作:表的创建、修改、删除和重命名、表数据的插入、更新和删除 .索引(含主、外键)、视图 .难度编程:存储过程与存储函数、触发器与事件、PHP .数据库管理:事务处理、用户与权限、备份与还原、数据库维护 1.检索数据:select…from… Select [distinct] prod_id,prod_name from products [limit 4,5]; 2.检索排序:order by… Select * from products order by prod_id [asc|desc],prod_name [asc|desc]; 3.过滤数据:where 字句 = <> != > >= < <= between (1)普通where 字句 Select prod_id,prod_name from products where prod_name=’liyang’; Select prod_id,prod_name from products where prod_id between 10 and 50; Select prod_id,prod_name from products where prod_name is [not] null; (2)组合where字句:使用AND和OR连接多个条件表达式,且AND次序优于OR; (3)IN 与NOT操作符 Select prod_id,prod_name from products where prod_id [not] in(1,2,3) |prod_name in(’zhangsan’,’lisi’,’wangwu’); (4)LIKE操作符与通配符:“%”与“_” Select prod_id,prod_name from products where prod_name like ’%liu%’; Select prod_id,prod_name from products where prod_name like ’_u%’; 找出u位于名字的第二个位置的prod_id和prod_name。 (5)正则表达式 4. 计算字段 (1)拼接字段:concat(…,…) Select concat(姓氏,名字) as from orders; Select concat(vend_name,’(’,vend_country,’)’) from vendors; (2)算术运算 Select prod_name,prod_price,prod_num,prod_price*prod_num as prod_money from products; 4.使用数据处理函数:文本处理函数、日期和时间处理函数、数值处理函数。 5.汇总数据:聚集函数SUM() AVG() COUNT() MAX() MIN() Select avg(distinct prod_price) from products; Select avg(prod_price) 均价,max(prod_price) 最高价from products; 6.分组数据:group by…创建分组、过滤分组、分组排序 Select count(prod_id),prod_id from products where prod_id>1000 group by prod_id having count(prod_id)>2 order by prod_id;求出prod_id大于1000且产品数量大于2的产品数量,并按prod_id排序,注意分组语句中对象要前后一致,如下划线部分。 7.使用子查询:进行过滤select…where…in(select…where…in(select…))、作为计算字段使用 子查询。

MYSQL四种备份方法总结

MYSQL四种备份方法总结 Mysql数据库备份主要有4种方法: 1、mysqldump 2、直接拷贝(cp、tar,gzip,cpio) 3、mysqlhotcopy 4、同步复制 mysqldump生成能够移植到其它机器的文本文件,缺省地,文件内容包含创建正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句。也就是说,mysqldump产生的输出可在以后用作mysql的输入来重建数据库。mysqldump比直接拷贝要慢些。 使用直接拷贝,如果正在备份的表正被读写就容易导致表损坏,而且不建议对isam表使用直接拷贝的方法来备份,因为ISAM表只能在相似的硬件结构的机器上拷贝。 1、mysqldump备份: 使用方法:mysqldump [OPTIONS] database [tables] 输出文件的开头看起来象这样: # MySQL Dump 6.0 # # Host: localhost Database: samp_db #--------------------------------------- # Server version 3.23.2-alpha-log # # Table structure for table 'absence' # CREATE TABLE absence( student_id int(10) unsigned DEFAULT '0' NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (student_id,date) ); # # Dumping data for table 'absence' # INSERT INTO absence VALUES (3,'1999-09-03'); INSERT INTO absence VALUES (5,'1999-09-03'); INSERT INTO absence VALUES (10,'1999-09-08'); ...... 文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。例: %mysqldump samp_db >/opt/mysqldatabak/samp_db.2006-5-15 %mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz #产生压缩备份 %mysqldump samp_db student score event absence >grapbook.sql #备份数据库的某些表 %mysqladmin -h https://www.sodocs.net/doc/5c8890097.html, create samp_db %mysqldump samp_db | mysql -h https://www.sodocs.net/doc/5c8890097.html, samp_db #直接恢复到另一个服务器上使用--add-drop-table选项告诉服务器将DROP TABLE IF EXISTS语句写入备份文件,这样当我们以后用来恢复数据库时,如果表已经存在,你

mysql主从

一、概述 MySQL从3.23.15版本以后提供数据库复制(replication)功能,利用该功能可以实现两个数据库同步、主从模式、互相备份模式的功能。本文档主要阐述了如何在linux系统中利用mysql的replication进行双机热备的配置。 二、环境 操作系统:Linux 2.6.23.1-42.fc8 # SMP(不安装XEN) Mysql版本:5.0.45-4.fc8 设备环境:PC(或者虚拟机)两台 三、配置 数据库同步复制功能的设置都在MySQL的配置文件中体现,MySQL的配置文件(一般是https://www.sodocs.net/doc/5c8890097.html,f):在本环境下为/etc/https://www.sodocs.net/doc/5c8890097.html,f 。 3.1 设置环境: IP 的设置: A主机 IP:10.10.0.119 Mask:255.255.0.0 B主机 IP:10.10.8.112 Mask:255.255.0.0 在IP设置完成以后,需要确定两主机的防火墙确实已经关闭。可以使用命令service iptables status 查看防火墙状态。如果防火墙状态为仍在运行。使用service iptables stop 来停用防火墙。如果想启动关闭防火墙,可以使用setup 命令来禁用或定制。 最终以两台主机可以相互ping通为佳。 3.2 配置A主(master) B从(slave)模式 3.2.1 配置A 为master 1、增加一个用户同步使用的帐号: GRANT FILE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’; GRANT REPLICATION SLAVE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’; 赋予10.10.8.112也就是Slave 机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以。 2、增加一个数据库作为同步数据库: create database test; 3、创建一个表结构: create table mytest (username varchar(20),password varchar(20)); 4、修改配置文件: 修改A的/etc/https://www.sodocs.net/doc/5c8890097.html,f 文件,在https://www.sodocs.net/doc/5c8890097.html,f 配置项中加入下面配置:server-id = 1 #Server 标识 log-bin

数据库基本知识(自己整理,初学者可以看一下,基于某MySql)

数据库

1常见数据库 1.1MySql : 甲骨文 1.2Oracle: 甲骨文 1.3SQL Server: 微软 1.4Sybase: 赛尔斯 1.5DB2: IBM 2MySql基础知识 2.1关系结构数据模型数据库 2.2SQL(Structured Query Language)结构化查询语言2.2.1DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等 操作数据库 CREATE DATABASE [IF NOT EXISTS]mydb1 USE mydb1 DROP DATABASE [IF NOT EXISTS] mydb1

ALTER DATABASE mydb1 CHARACTER SET utf8 操作表 插入表 CREATE TABLE stu( sid CHAR(6), sname VARCHAR(20), age INT, gender VARCHAR(10) ); 更改表 ALTER TABLE t_user ADD (student varcher(20)) ALTER TABLE t_user MODIFY gender CHAR(20) ALTER TABLE t_user CHANGE gender VARCHER(20) ALTER TABLE t_user REMANE genderTO genders ALTER TABLE t_user DROP gender 删除表 DROP TABLE t_user 2.2.2DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据) 插入数据 INSERT INTO t_user VALUES() INSERT INTO 表名 VALUES(值1,值2,…)

mysql数据库同步跳过临时错误

mysql数据库同步跳过临时错误 slave stop; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; slave start; 几个跟热备有关的mysql命令:(需要在mysql命令行界面或query ) stop slave #停止同步 start slave #开始同步,从日志终止的位置开始更新。 show slave status #查看同步状态 SET SQL_LOG_BIN=0|1 #主机端运行,需要super权限,用来开停日志,随意开停,会造成主机从机数据不一致,造成错误 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n # 客户端运行,用来跳过几个事件,只有当同步进程出现错误而停止的时候才可以执行。 RESET MASTER #主机端运行,清除所有的日志,这条命令就是原来的FLUSH MASTER RESET SLAVE #从机运行,清除日志同步位置标志,并重新生成https://www.sodocs.net/doc/5c8890097.html, 虽然重新生成了https://www.sodocs.net/doc/5c8890097.html,,但是并不起用,最好,将从机的mysql进程重启一下,LOAD TABLE tblname FROM MASTER #从机运行,从主机端重读指定的表的数据,每次只能读取一个,受timeout时间限制,需要调整timeout时间。执行这个命令需要同步账号有 reload 和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值 LOAD DATA FROM MASTER #从机执行,从主机端重新读入所有的数据。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值 CHANGE MASTER TO master_def_list #在线改变一些主机设置,多个用逗号间隔,比如CHANGE MASTER TO MASTER_HOST='https://www.sodocs.net/doc/5c8890097.html,', MASTER_USER='replication', MASTER_PASSWORD='bigs3cret' MASTER_POS_WAIT() #从机运行 SHOW MASTER STATUS #主机运行,看日志导出信息 SHOW SLAVE HOSTS #主机运行,看连入的从机的情况。 SHOW SLAVE STATUS (slave) SHOW MASTER LOGS (master) SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [ LIMIT [offset,] rows ] PURGE [MASTER] LOGS TO 'logname' ; PURGE [MASTER] LOGS BEFORE 'date'

MySQL主从、主主复制及高可用性要点

一:MySQL复制: MySQL复制简介: 将master服务器中主数据库的ddl和dml操作通过二进制日志传到slaves服务器上,然后在master服务器上将这些日志文件重新执行,从而使得slave服务器和master服务器上的数据信息保持同步。 Mysql复制的原理: 将数据分布到多个系统上去,是通过将Mysql的某一台master主机的数据复制到其它(slave)主机上,并重新执行一遍来实现的; 复制过程中一个服务器充当master服务器,而一台或多台其它服务器充当slave服务器。master服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。 这些日志可以记录发送到slave服务器的更新。当一个slaves服务器连接master服务器时,它通知master服务器从服务器在日志中读取的最后一次成功更新的位置。slave服务器接收从那时起发生的任何更新,然后封锁并等待master服务器通知新的更新。 mysql复制的优点: 在slave服务器上执行查询操作,降低master服务器的访问压力 当master服务器上出现了问题可以切换到slave服务器上,不会造成访问中断等问题 在slave服务器上进行备份,以避免备份期间影响master服务器的服务使用及日常访问

Mysql自身的复制功能:是构建大型、高性能应用程序的基础。 mysql支持的复制类型: 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持 混合类型的复制::默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。 MySQL复制技术的特点: 数据分布(Data distribution ) 备份(Backups) 负载平衡(load balancing) 高可用性和容错性High availability and failover 复制的工作过程: master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); slave将master的binary log events拷贝到它的中继日志(relay log); slave重做中继日志中的事件,将改变反映它自己的数据。

Mysql数据库安装及生产环境下主从库同步配置

Mysql数据库安装及生产环境下主从库同步配置

目录 1安装M YSQL数据库...................................................................................................................................... 2生产环境下M Y SQL数据库主从同步配置................................................................................................. 2.1 主数据库配置 (5) 2.2 从数据库配置 (5) 3监控服务器............................................................................................................................................... 3.1 监控主数据库服务器 (6) 3.2 监控从数据库服务器 (6)

1安装Mysql数据库 安装环境: 系统:CentOS-6.6-x86_64 数据库:MySQL-server-5.5.42-1.el6.x86_64;MySQL-client-5.5.42-1.el6.x86_64 1.SSH方式登录到MySQL服务器 2.创建存放安装文件的目录 [root@localhost /]# mkdir -p /sw/mysql55 3.上传安装文件到上一步创建的目录 4.检查是否已安装过MySQL [root@localhost /]# rpm -qa | grep -i mysql MySQL-client-5.5.42-1.el6.x86_64 MySQL-server-5.5.42-1.el6.x86_64 5.如果已安装则移除,否则请跳过此步 [root@localhost /]# yum -y remove MySQL-server-5.5.42-1.el6.x86_64 [root@localhost /]# yum -y remove MySQL-client-5.5.42-1.el6.x86_64 删除老版本mysql的开发头文件和库 rm -fr /usr/lib/mysql rm -fr /usr/include/mysql rm -fr /var/lib/mysql rm -f /etc/https://www.sodocs.net/doc/5c8890097.html,f 6.安装MySQL [root@localhost /]# cd /sw/mysql55/ [root@localhost mysql55]# rpm -ivh MySQL-server-5.5.42-1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:MySQL-client ########################################### [100%] [root@localhost mysql55]# rpm -ivh MySQL-client-5.5.42-1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:MySQL-server ########################################### [100%] 7.配置MySQL [root@localhost mysql55]# cp /usr/share/mysql/https://www.sodocs.net/doc/5c8890097.html,f /etc/https://www.sodocs.net/doc/5c8890097.html,f [root@localhost mysql55]# vi /etc/https://www.sodocs.net/doc/5c8890097.html,f [client] #password = your_password port = 8819 socket = /var/lib/mysql/mysql.sock default-character-set=utf8 [mysqld] port = 8819 socket = /var/lib/mysql/mysql.sock lower_case_table_names=1

MySQL数据库教案

任务引入[5分钟] 课程介绍[20分钟] 认识数据库 提问:按自己的理解,说说数据库是什么? 展示各类网站 商城网站页面是大家在熟悉不过的了,商城网站上的商品琳琅满目, 让人流连忘返。但是在大家欣赏自己喜爱的商品之余,是否想过商城网站 上的文字信息、图片信息等存放在哪里呢?当大家在商城网站上进行注册 用户时,自己的信息又存在哪里呢?当客户在商城网站上留言的时候,留 言信息又放在哪里了呢?这就是本门课程——《WEB数据库应用》要解决 的问题。 主要让学生明确以下几个问题: 1.明确课程定位与作用 专业基础课,与《程序设计基础》一起,为《网站建设》奠定基础。 同时兼顾计算机二级考试相关内容。通过任务引领型和项目活动形式,掌 握简单的数据库设计、数据管理和维护方法,能进行web服务器的设置, 具备使用web数据库与高级程序设计语言或动态网页结合完成简单程序 开发的基本职业能力。 2.明确课程内容 内容的确定遵循两个原则:一是满足后续课程的基本需求,二是为学 生进一步的学习提供必要的准备。通过对学生就业岗位和用人单位对本专 业毕业生设置的招聘岗位等分析,课程内容应基本包括数据库系统概述、 关系理论、关系数据库查询语言SQL、数据库设计与关系规范化理论、MySQL 数据中管理系统与高级程序设计语言或动态网页技术结合的简单应用。 3.强调学习方法 (1)与以往《计算机基础》、《办公软件应用》在学习方法上不同, 知识与操作的连续性更强,在学习上要坚持一贯,持之以恒。 提问 展示 展示课程 标准、课程 体系图 与教材配 合

新知识[45分钟] (2)课程难度加大,要求大家认真听、认真做,尤其要认真思考。逐渐养成举一反三的习惯、锻炼独立进行逻辑思维的能力。 (3)要学会自学。 (4)要善于和老师沟通。 (5)要学会团队协作。 4.明确考核方式 (1)日常评价 由三个部分组成:出勒(20%)、学习积极主动性(40%)、任务完成情况(40%) (2)终结评价 平时:20% 期中:20% 期末:40% 一、数据库基本概念 请学生回忆从小学——初中——高中——大学,每个期末处理成绩的过程,大部分都有帮助老师统计分数的经历。提问: 1.你用过哪些方式协助老师统计分数? 2.在这个过程中你发现了什么变化?为什么产生这样的变化? 经过充分的讨论发言之后,让学生总结为什么产生数据库技术,并简单说明其发展阶段: 第一代:网状、层次数据库系统 第二代:关系型数据库系统 第三代:以面向对象模型为主要特征的数据库系统 二、数据库基本概念 1.数据 数据是存储在数据库中的基本对象,包括数字、文字、图形、图像和声音等。 2.数据库 数据库简单地说就是存放数据的仓库。这些数据是按照一定的格式存放在计算的存储设备上。

mysql数据库主主同步方案

Mysql 数据库主主(master-master)同步方案 一、MySQL同步概述 1.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。 请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。 单向复制有利于健壮性、速度和系统管理: 健壮性:主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

速度快:通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。 系统管理:使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。 2.MySQL数据复制的原理 MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。 每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。 认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。 将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在

MySQL重点知识归纳整理

数据库管理系统:按照一定的数据模型科学的组织和存储数据,提供数据的高效获取与维护。 定义语言DDL操纵语言DML数据库的运行与管理,数据库的建立和维护功能,提供方便,有效存取数据库信息的接口和工具。数据库管理员DBA 数据库系统:数据库,数据库管理系统,应用开发工具,应用系统,数据库管理员和用户构成。 模式(逻辑模式或概念模式):全体数据的逻辑结构和特征的描述。 外模式(子模式或用户模式)是模式的子集。 内模式(存储模式DDL)对数据库物理结构和存储方式的描述。 数据库的概念结构(逻辑结构和特征的描述)独立于内外模式。 内外模式依赖概念模式,独立于存储设备。 数据库设计的6阶段,需求分析,概念结构设计,逻辑结构设计,物理结构设计,数据库实施,数据库运行与维护。 概念(信息结构)通过数据模型(逻辑)Create database db_test; use db_test; Create table content(content_id int primary key,subject varchar(200),words varchar(1000),username varchar(50),face varchar(50),email varchar(50),createtime datetime); Insert into content(content_id,subject,words,username,face,email,createtime) values(null,’mysql问题请教’,’mysql中对数据表的操作有哪些?’,’mysql初学者’,’face.jpg’,’tom@https://www.sodocs.net/doc/5c8890097.html,’,now()); Update content set words=‘如何使用insert语句?’where uername=’mysql 初学者’; 修改数据库 Alter database db_test Default character set gb2312字符集 Default collate gb2312;校对规则 查看 Show databases; 更新表 Alter table db_test add column userdz char(10) not null default ‘wuhan’ after face; 修改列名和数据类型 Alter table db_test change column sex新face 旧char(1) null default ‘m’;

mysql主从复制原理

主从复制的原理: 分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下: 1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; 2)、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置; 3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”; 4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。 Mysql为了解决这个风险并提高复制的性能,将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Y ahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。当然,即使是换成了现在这样两个线程处理以后,同样也还是存在slave 数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事物中,这些问题都是会存在的。如果要完全避免这些问题,就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案,需要将所有数据都load到内存中,这样就对内存的要求就非常大了,对于一般的应用来说可实施性不是太大。 复制常用架构 Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要master和slave的压力不是太大(尤其是slave端压力)的话,异步复制的延时一般都很少很少。尤其是自slave端的复制方式改成两个进程处理之后,更是减小了slave端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用,只需要通过廉价的pc server来扩展slave的数量,将读压力分散到多台slave的机器上面,即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。 Mysql主从复制配置过程: 环境:master: 192.168.0.3 Slave: 192.168.0.4 Mysql版本为5.0.67(编译安装) database: eric 1.Master服务器启动mysql, a)#mysql –uroot –proot b)创建一个有复制权限的用户,只限slave远程连接访问. i. mysql>grant replication slave on *.* to replication@192.168.0.4

MySQL基本知识整理--数据库和表的操作

MySQL数据库知识整理 /* MySQL服务操作 */ /* 打开数据库服务 */ net start mysql /* 连接与断开服务 */ mysql -h 地址-P 端口-u 用户名-p 密码 /* 跳过权限验证登录MySQL */ mysqld --skip-grant-tables /* 修改root密码 */ update https://www.sodocs.net/doc/5c8890097.html,er set password=password('xxx'); /* 显示正在运行的线程 */ SHOW PROCESSLIST /* 数据库操作 */ /* 查看当前数据库 */ select database(); /* 显示当前时间、用户名、数据库版本 */ select now(), user(), version(); /* 创建库 */ create database[ if not exists] 数据库名数据库选项数据库选项:CHARACTER SET charset_name COLLATE collation_name /* 查看已有库 */ show databases[ like 'pattern'] /* 查看当前库信息*/ show create database 数据库名 /* 修改库的选项信息 */ alter database 库名选项信息 /* 删除库 */ drop database[ if exists] 数据库名同时删除该数据库相关的目录及其目录内容 /* 数据表操作 */ /* 删除表*/ DROP TABLE[ IF EXISTS] 表名 /* 清空表数据 */ TRUNCATE [TABLE] 表名 /* 复制表结构 */ CREATE TABLE 表名 LIKE 要复制的表名

MYSQL主从数据库介绍__主库__从库

如上图所示,整个数据层有Group1,Group2,Group3三个集群组成,这三个集群就是数据水平切分的结果,当然这三个集群也就组成了一个包含完整数据的DB。每一个Group包括1个Master(当然Master也可以是多个)和N个Slave,这些Master和Slave的数据是一致的。比如Group1中的一个slave发生了宕机现象,那么还有两个slave是可以用的,这样的模型总是不会造成某部分数据不能访问的问题,除非整个Group里的机器全部宕掉,但是考虑到这样的事情发生的概率非常小(除非是断电了,否则不易发生吧)。 在没有引入集群以前,我们的一次查询的过程大致如下:请求数据层,并传递必要的分库区分字段(通常情况下是user_id)?数据层根据区分字段Route到具体的DB?在这个确定的DB内进行数据操作。这是没有引入集群的情况,当时引入集群会是什么样子的呢?看图一即可得知,我们的路由器上规则和策略其实只能路由到具体的Group,也就是只能路由到一个虚拟的Group,这个Group并不是某个特定的物理服务器。接下来需要做的工作就是找到具体的物理的DB服务器,以进行具体的数据操作。基于这个环节的需求,我们引入了负载均衡器的概念(LB)。负载均衡器的职责就是定位到一台具体的DB服务器。具体的规则如下:负载均衡器会分析当前sql的读写特性,如果是写操作或者是要求实时性很强的操作的话,直接将查询负载分到Master,如果是读操作则通过负载均衡策略分配一个Slave。我们的负载均衡器的主要研究放向也就是负载分发策略,通常情况下负载均衡包括随机负载均衡和加权负载均衡。随机负载均衡很好理解,就是从N个Slave中随机选取一个Slave。这样的随机负载均衡是不考虑机器性能的,它默认为每台机器的性能是一样的。假如真实的情况是这样的,这样做也是无可厚非的。假如实际情况并非如此呢?每个Slave的机器物理性能和配置不一样的情况,再使用随机的不考虑性能的负载均衡,是非常不科学的,这样一来会给机器性能差的机器带来不必要的高负载,甚至带来宕机的危险,同时高性能的数据库服务器也不能充分发挥其物理性能。基于此考虑从,我们引入了加权负载均衡,也就是在我们的系统内部通过一定的接口,可以给每台DB服务器分配一个权值,然后再运行时LB根据权值在集群中的比重,分配一定比例的负载给该DB服务器。当然这样的概念的引入,无疑增大了系统的复杂性和可维护性。有得必有失,我们也没有办法逃过的。 有了分库,有了集群,有了负载均衡器,是不是就万事大吉了呢?事情远没有我们想象的那么简单。虽然有了这些东西,基本上能保证我们的数据层可以承受很大的压力,但是这样的设计并不能完全规避数据库宕机的危害。假如Group1中的slave2 宕机了,那么系统的LB并不能得知,这样的话其实是很危险的,因为LB不知道,它还会以为slave2为可用状态,所以还是会给slave2分配负载。这样一来,问题就出来了,客户端很自然的就会发生数据操作失败的错误或者异常。这样是非常不友好的!怎样解决这样的问

相关主题