- 浏览: 403741 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (99)
- Spring (14)
- Hibernate (2)
- Struts (0)
- Java (21)
- J2ee (1)
- JFreeChart (1)
- Tomcat (3)
- Eclipse (3)
- 项目日记 (2)
- Javascript (4)
- fckeditor (2)
- mysql (13)
- Powerdesigner (2)
- sql server 2005 (1)
- Css (1)
- jQuery (2)
- 架构 (4)
- 性能 (7)
- struts2 (1)
- LigerUI (1)
- ibatis (2)
- 数据库 (1)
- 职业发展 (3)
- maven (1)
- mybatis (1)
- 算法 (1)
- 项目经理 (2)
- hadoop-1.0 (2)
- hadoop1.0 (1)
- hadoop-2.0 (1)
- 网络安全 (5)
- 正则表达式 (1)
- 管理 (2)
- Redis (1)
- linux (4)
- infobright (1)
- CentOS (4)
- windows (1)
- 其他 (1)
- easyui (1)
- elasticsearch (0)
- 公司管理 (0)
最新评论
-
wangyudong:
由Spring Boot实现的微服务需要有比较好的工具去测试R ...
使用Spring Boot快速构建应用 -
masuweng:
<artifactId>maven-compile ...
使用Spring Boot快速构建应用 -
masuweng:
说明下<start-class>com.test. ...
使用Spring Boot快速构建应用 -
masuweng:
学习了,感谢了
使用Spring Boot快速构建应用 -
幽蓝星空:
执行mvn clean install spring-boot ...
使用myeclipse打包Spring Boot工程
在企业应用中,mysql经常采用主从构架,或者主主架构,这样可以实现mysql服务器的负载均衡,提升mysql服务器的性能。而关键是,可以实现mysql的数据同步复制功能,来为企业数据备份提供一种方便的机制。
一.首先了解下mysql的复制功能:
1)支持一主多从的机制,数据通过同步从主服务器复制都从服务器里
2)支持多级结构,主从 从从 主主(互为主从)
3)支持过滤的功能(可以只复制主服务的部分数据而非全部)
二.关于主从构架的mysql,为了数据的一致性,修改数据只能在主服务器上执行,我们来了解一下它的复制类型
1)基于语句的复制:把在主服务上执行的语句,在从服务器上在执行一次。
这种方式有缺陷,如果是像updata t1 SET SALRIS=SALARIS+1000,那么对每个需要更改的数据执行1000次,而不是基于行,大量浪费了系统资源。
2)基于行的复制Row:改变以后的内容复制过去,而不是重新执行一遍。
update t1 SET SALARIS=SALARIS+1000
3)混合类型复制:语句+行
优先使用语句复制,如果语句复制的内容和数据精确,启用行复制
但是想象一下,这种构架的复制单主服务器如果写的操作比较多,可能会成为系统瓶颈。而从服务器过多也会造成存储空间的浪费。所以这种构架只能为读操作提供优化,对数据的写入,只能依赖主服务器。
复制的主要功用:
1)实现数据的分布式存储(Data distribution),但这种分布是指主从服务器都提供同样的数据。
2)实现数据的负载均衡(主要指读,写需要别的机制实现),主要通过LVS集群或者mysql-proxy来实现。
3)备份(backup) 在从服务器上发出复制请求,主服务器将数据传输给从服务器后,进行热备或者温备,或者当需要备份的时候将服务停下来,进行冷备。
4)提供高可用和及其故障转移功能: 确保服务不会断掉。
5)测试mysql的升级:将主服务上数据备份到从服务器,从服务升级如果可以使用,升级为主服务(如果性能较差,只是临时替代)。
三.主要注意的地方:
1)mysql复制过程在网络上传输时是明文的,不过支持SSL加密。
2)mysql复制要求主从架构的服务器的server id 不能相同。
=============================分 割 线============================
下面我们来实现主从构架的mysql服务器及复制过程,需要准备两台虚拟机,一台做主mysql,一台做从mysql,如下图:
1)设置一个服务器成为主服务器
#主服务器一定要设置成静态地址
#5.5以下版本要将默认引擎设置为innodb,设置方法:在/etc/my.cf里添加default-engine=innodb ,再重启服务,安装过程不再累赘,笔者采用二进制包的mysql5.5
(1)配置好IP,
view plain
ifconfig eth0 172.16.14.11 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static ONBOOT=yes HWADDR=00:0c:29:f5:6d:47 IPADDR=172.16.14.11 NETMASK=255.255.0.0 GATEWAY=172.16.0.1
(2)修改配置文件,使它成为主服务器
view plain
vim /etc/my.cnf # 添加或修改如下行 # 如果是5.0版本须添加:default-engine=innodb log-bin=mysql-bin log-bin-index=mysql-bin.index binlog_format=mixd server_id=1 service mysql restart
(3)创建用户,授予权限
view plain
mysql mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'172.16.%.%' IDENTIFIED BY 'redhat'; #REPLICATION CLIENT:用户有权询问附属者/控制者在哪里。 REPLICATION SLAVE:回复附属者所需。 mysql>FLUSH PRIVILEGES;
2 )设置一个服务器成为从服务器
view plain
vim /etc/my.cnf # 从服务器不需要二进制日志,只需要启动中继日志 注释掉log-bin 和 binlog_format relay-log=relay-bin # 从服务器需要开启中继日志 relay-log-index=relay-bin.index server-id = 11 # id=1是主服务器,其余表示从服务器 service mysqd start mysql # 查看relay相关的变量设置,几server_id的值 mysql> SHOW VARIABLES LIKE 'relay%'; mysql> SHOW VARIABLES LIKE 'server_id'; # 设置连接账号和密码,(可以设置使用SSL等) mysql> CHANGE MASTER TO MASTER_HOST='172.16.14.11', mysql> MASTER_USER='repl', # 注意是逗号 mysql> MASTER_PASSWORD='redhat'; # 查看下从服务的状态,是否开启 mysql> SHOW SLAVE STATUS\G # 开启从服务器 mysql> START SLAVE # 过一会,再使用SHOW命令查看状态。 mysql> SHOW SLAVE STATUS\G # 如果错误,查看错误日志 mysql> SHOW VARIABLES LIKE '%erro%' vim /etc/my.cnf slave_skip_erros=ON
================================================
#如果上面的过程一直mysql报错,那么我们可以使用下列选项忽略它
在my.cnf里添加replicate-ignore-db=db 在从服务器复制时忽略某个数据库
#如果一直是mysql这个数据库报错,replicate-ignore-db=mysql,重启服务
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G # 确保无错才能进行下面的复制过程
====================================================
3) 数据库复制过程的实现
(1)#在主服务器上创建一个数据库
view plain
mysql> CREATE DATABASE MYDB; mysql> USE MYDB; mysql> CREATE TABLE t1 ( name varchar(20) );
(2) 从服务器设置,启动复制线程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
出现MYDB了,复制成功!
=================分 割 线======================
复制过程详解:
假设我们现在有4台mysql服务器 1主:A 3从:B C D
从服务器B C D 同时发起复制请求后,主服务器A将数据传输给从服务器B C D,这个过程是异步的,A受到请求后,不管B C D是否同步完成,如果有修改数据的,继续写入数据,这在使用的时候是无法控制的,这样可能造成数据不一致(同步到一半断了而主服务器不管),而且耗时很长。后来 goole为mysql引入了一个插件,实现半同步,大大缩减了同步花费的时间,那就是 Semi-sync。
半同步的概念:数据同步时,只等待其中至少一台从服务器(比如B)完成。这样再通过这台从服务器将数据同步给其他服务器(C D)
但是半同步也会带来的问题:网络原因(比如网速很慢)造成同步迟迟不能进行。
解决方法:在等不到某一个从服务器同步后,自动降级为异步。
Semi-sync简介:
Semi-sync最早是由Google实现的一个补丁,代码主要由Mark Callaghan、Wei Li(@Google)等人贡献。 Google原本是将需求提给Hekki的,但是后来等不及就自己实现了......。(现在Mark Callaghan已跳到Facebook,除了 Google,他曾经还在Informix、Oracle工作过)
在5.5之后由MySQL Replication Team按照Plugin的方式将代码移植过来,并将Semi-sync独立成MySQL的一个插件,主要代码移植者是Zhenxing He(参考)。
下面就介绍半同步的复制过程如何实现(基于上面的基础上):
(1)加载插件
如果使用的是5.5版的mysql,那么在/usr/local/mysql/lib/plugin/ 保存了相关的插件,而我们需要安装的是semisync_master.so semisync_slave.so
view plain
cd /usr/local/mysql/lib/plugin/ ls -a semisync_* semisync_master.so semisync_slave.so #执行如下命令加载插件 #在主服务器上 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #在从服务器上 mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 在初次加载插件后,Mysql会将该插件记录到系统表mysql.plugin中,下次启动系统自动加载。但是我们还需要在主服务器上的my.cnf 里面增加如下记录来打开semi-sync rpl_semi_sync_master_enable=1 rpl_semi_sync_master_timeout=1000 在丛服务器上的my.cnf里添加如下记录 rpl_semi_sync_slave_enable=1 重启主从服务器上的Mysql服务
==============================================
# 也可通过设置全局变量的方式来设置,如下:
set global rpl_semi_sync_master_enabled=1
# 取消加载插件
mysql> UNINSTALL PLUGIN rpl_semi_sync_master;
==============================================
查看从服务器上的semi_sync是否开启
查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功
(2)在主服务器上创建一个数据库tests,在从服务器上启用复制,观察变化
# 从服务器上
view plain
mysql> stop slave; mysql> start slave;
# 主服务器上
上面比较重要的状态值有:
Rpl_semi_sync_master_tx_avg_wait_time:事务因开启Semi_sync,平均需要额外等待的时间
Rpl_semi_sync_master_net_avg_wait_time:事务进入等待队列后,到网络平均等待时间
依据上面两个状态值可以知道,Semi-sync的网络消耗有多大,给某个事务带来的额外的消耗有多大。
Rpl_semi_sync_master_status 则表示当前Semi-sync是否正常工作。
从Rpl_semi_sync_master_no_times变量,可以知道一段时间内,Semi-sync是否有超时失败过,该计数器则记录了这样的失败次数。
===========分 割 线=================================
使用SSL加密复制过程(很简单):
见官方文档:http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-ssl.html
补充:
设置从服务器为只读,避免用户在从服务器上修改数据:
SHOW VARIABLES LIKE ‘%read%’
SET GLOBAL read_only=on;
--------------------------------------------------
复制过程中过滤的实现:过滤可以在主服务器上也可以在从服务器上实现。
binlog-do-db 白名单 指定打算复制哪个数据库
binlog-ignore-db 黑名单 打算忽略哪个数据库
注意:两个选项不要同时使用,如果同时使用,只有白名单生效
一般不建议在主服务器上过滤,可能会造成二进制文件不完整,造成不能进行时间点恢复
用法:过滤过个db
replicate-do-db=mydb1
replicate-do-db=mydb2
replicate-do-table=table
# 可以使用符号匹配
replicate-wild-do-table=db_parttern.tbl_pattern
当定义了如下后,考虑,主服务器上的mysql数据库修改的语句是否会复制?
replicate-ignore-db=mysql
发表评论
-
MySQL MyISAM 表并发
2015-05-26 10:28 827mysql的myisam解决并发读写解决方法MyISAM在读 ... -
centos 7安装mysql5.5和infobright后,infobright开机启动问题
2014-08-25 09:48 2879因为mysqld-ib的服务脚本需要调用sudo这个命令, ... -
centos 7安装mysql5.5
2014-08-13 23:41 24895首先centos7 已经不支持mysql,因为收费了你懂得 ... -
Java不写文件,LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现
2014-07-28 20:41 2749大家都知道当插入大批量数据MySQL的时候,MySQL使用l ... -
java的8种排序
2013-03-18 09:58 11368种排序之间的关系: ... -
mysql性能优化-慢查询分析、优化索引和配置
2013-03-17 23:46 5938目录 一、优化概述 二、查询与索引优化分析 1性能瓶颈 ... -
MySQL全文检索中Like索引的实现
2013-03-17 23:32 3156在数据库使用中,DBA都会告诉大家SQL的LIKE条件为%X ... -
mysql 5.6 分区 置换
2013-03-08 11:28 1462mysql 5.6 增加了对分区的置换功能。 http:/ ... -
MySQL 集群方案相关问题
2012-08-23 11:58 33401、 "NDB" 是什 ... -
给有重复记录的表添加唯一索引
2012-06-14 12:50 2098相当有用的一招,原文复制如下: 不希望数据表中有重复记 ... -
多服务器MYSQL数据同步
2012-04-10 22:56 2244两台服务器A:192.168.1.1B:192.168.1.2 ... -
谈谈网站性能技术 -- 由12306.cn
2012-03-05 21:49 112112306.cn网站挂了,被全国人民骂了。我这两天也在思考这个 ... -
MYSQL-FRONT登录 ERROR 1130的解决办法
2011-08-15 17:40 1331在红旗里装了mysql5.0.18 版本运行服务器。 可 ... -
mysql 跟踪设置
2009-10-10 16:56 2858windows: 打开my.ini 同样打 ...
相关推荐
MySQL主从复制是一种数据库高可用性和数据冗余的重要机制,它允许数据从一个服务器(主节点)同步到一个或多个其他服务器(从节点)。在本实践中,我们将深入探讨这一模式的各个方面,包括其工作原理、配置步骤、...
在MySQL的主从复制中,其传输过程是明文传输,并不能保证数据的安全性,在编译安装Mysql时,基本上都会加上一个 --with-openssl这样的选项,即表示支openssl加密传输协议,因此就可以为mysql配置基于ssl加密传输
MySQL主从复制是一种数据库高可用性和数据冗余的解决方案,它允许数据从一个服务器(主节点)实时同步到另一个或多个服务器(从节点)。这种架构能够实现读写分离,提高系统的读取性能,并且在主节点出现故障时,...
- 数据延迟:主从之间可能存在时间差,可能需要使用异步+半同步复制策略。 - 复制冲突:主从数据库同时进行写操作可能导致冲突,需设计处理策略。 8. **适用场景** - 数据备份与恢复:从服务器可以作为数据备份...
在实际生产环境中,还应考虑其他因素,如使用SSL加密复制流量以增强安全性,或者设置多个从服务器以实现更高级别的容错。同时,根据业务需求,可能还需要调整MySQL的参数设置,如`max_connections`、`table_cache`等...
2. **半同步复制**:主库在提交事务前,需等待至少一个从库确认收到二进制日志,保证至少有1个副本的数据一致性。 3. **全同步复制**:所有从库都确认后主库才提交,数据一致性最高,但可能影响写性能。 ### 四、...
为了增强这种安全性,我们可以利用Linux系统的openssl工具来实现MySQL主从复制的加密通信。以下是如何在Linux环境下通过openssl配置MySQL主从复制的详细步骤: 首先,我们需要准备证书。证书是SSL/TLS加密的基础,...
MySQL配置SSL主从复制是为了确保数据在主从节点之间的传输是安全的,通过加密通信防止数据在传输过程中被窃取或篡改。SSL(Secure Sockets Layer)是一种广泛使用的网络安全协议,可以为网络通信提供加密处理,确保...
当mysql跨越互联网进行复制时别人可以窃取到mysql的复制信息,这些信息是明文的,因此存在不安全性,这里通过ssl对复制的信息进行加密。当在客户没有固定ip而要访问服务器时,mysql要允许任意地址的访问,服务端和...
MySQL 5.5 引入了 Google 补丁实现的半同步复制(semisync)。如果在指定时间内从服务器未确认,系统会自动降级为异步模式。 4. **禁止从服务器在启动时自动启动从服务线程**: 为了防止从服务器在启动时自动开始...
总的来说,MySQL主从复制是实现高可用性和负载均衡的重要手段,但在配置过程中需谨慎操作,确保数据的一致性和完整性。同时,随着MySQL版本的更新,配置方法可能会有所变化,建议参考最新文档进行配置。
5. **安全性和审计**:支持SSL加密传输,确保数据在传输过程中的安全性,并可进行操作审计,方便追踪和管理复制活动。 6. **性能优化**:通过并行处理和智能缓存,提高数据复制的效率和速度。 7. **易于管理和监控...
在MySQL 5.5中,主从复制进一步优化,引入了半同步复制(Semi-Synchronous Replication)以增强数据的安全性。 二、`transfer.2.2`工具特性 1. **多线程处理**:`transfer.2.2`的一大亮点在于其多线程机制。传统的...
在某些情况下,如半同步复制,可以确保主服务器确认事务在复制到从服务器后才完成,以提高数据一致性的保证。 8. **复制的扩展性**:通过添加更多的从服务器,可以水平扩展数据库容量和读取性能。读写分离策略允许...
在Linux系统中安装MySQL8并...在实际操作中,你可能需要根据具体的网络环境和安全需求调整一些细节,例如限制复制用户的访问权限、使用SSL加密复制等。记得在进行任何重大变更之前,做好数据备份,以防止意外情况发生。
在高可用性场景中,MySQL可以通过主从复制实现数据备份,当主服务器故障时,可以从备用服务器接管服务,保证业务连续性。 LVS(Linux Virtual Server)是基于Linux操作系统的四层负载均衡技术,它可以在多台服务器...
主从复制、半同步复制和多源复制是常见的复制策略。 六、高可用性 通过集群、故障切换、读写分离等手段提高系统的可用性,确保在硬件或软件故障时仍能提供服务。 七、安全性 学习如何设置用户权限,使用SSL加密...
书中会讨论主备切换、群集和半同步复制等技术,以增强系统的容错能力。 通过阅读《高性能的MySQL》第三版,读者可以掌握MySQL的高级特性和最佳实践,提升数据库的稳定性和效率,为业务发展提供强大支撑。