热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式系统+数据库主从复制详解

分布式系统+数据库主从复制详解,Go语言社区,Golang程序员人脉社

分布式系统总结

  • 分布式系统
  • 为什么用分布式系统
  • 分布式系统局限
  • 设计分布式
  • 数据库主从复制
  • 数据库主从复制操作
  • 常见问题解决

1 分布式系统

1.1 “分布式系统”定义

《分布式系统原理和范型》一书中是这样定义分布式系统的:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统”。
从进程角度看,两个程序分别运行在两个台主机的进程上,它们相互协作最终完成同一个服务(或者功能),那么理论上这两个程序所组成的系统,也可以称作是“分布式系统”。

1.2 集群

当然,这个两个程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我们又可以称之为“集群”。所谓集群,就是将相同的程序,通过不断横向扩展,以提高服务能力的方式。

2 为什么用分布式系统

2.1 提高系统容错

集中式系统就是把所有的程序、功能都集中到一台主机上,从而往外提供服务的方式。
把Web服务器、数据库等都会安装到一台电脑上。好处是,易于理解、方便维护,想要的东西我都放到了一个地方,东西好找啊。当然弊端也是显而易见的,如果这台机子崩了,或者硬盘坏了,那相当与整个系统就奔溃了,而且如果备份也是在这个硬盘上,那相当于招了灭顶之灾。
所以巴菲特有个关于投资的名言,就是“不要把鸡蛋放在一个篮子里”。对于系统而言也是如此。厂商的机子不可能永远保证永远不坏,我们也无法保证黑客不会来对我们的系统搞基,最为关键的是,我们自己无法保证自己的程序不会出bug。所以问题无法避免,错误也不可避免。我们只能鸡蛋分散到不同的篮子里,来减轻一锅端的风险。这就是为什么需要分布式系统的原因。

2.1 提高系统可扩展性

使用分布式系统的另外一个理由是可扩展性。毕竟任何主机(哪怕是小型机、超级计算机)都会有性能的极限。而分布式系统可以通过不断扩张主机的数量以实现横向水平性能的扩展。大家也都了解到 Google 的服务器主机,大多是淘汰的二线机子拼凑的吧。

3 分布式系统关注点

异构性:分布式系统由于基于不同的网络、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通信协议来屏蔽异构系统之间的差异。一般交由中间件来处理这些差异。

缺乏全球时钟:在程序需要协作时,它们通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识,但是,实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式这一事实带来的直接结果。

一致性:数据被分散或者复制到不同的机器上,如何保证各台主机之间的数据的一致性将成为一个难点。

故障的独立性:任何计算机都有可能故障,且各种故障不尽相同。他们之间出现故障的时机也是相互独立的。一般分布式系统要设计成被允许出现部分故障而不影响整个系统的正常使用。

并发:分布式系统的目的,是为了更好的共享资源。那么系统中的每个资源都必须被设计成在并发环境中是安全的。

透明性:分布式系统中任何组件的故障、或者主机的升级、迁移对于用户来说都是透明的,不可见的。

开放性:分布式系统由不同的程序员来编写不同的组件,组件最终要集成成为一个系统,那么组件所发布的接口必须遵守一定的规范且能够被互相理解。

安全性:加密用于给共享资源提供适当的保护,在网络上所有传递的敏感信息,都需要进行加密。拒绝服务攻击仍然是一个有待解决的问题。

可扩展性:系统要设计成随着业务量的增加,相应的系统也必须要能扩展来提供对应的服务。

4 设计分布式

设计分布式系统的本质就是“如何合理将一个系统拆分成多个子系统部署到不同机器上”。
所以首要考虑的问题是如何合理的将系统进行拆分。由于拆分后的各个子系统不可能孤立的存在,必然是通过网络进行连接交互,所以它们之间如何通信变得尤为重要。当然在通信过程要识别“敌我”,防止信息在传递过程中被拦截和窜改,这就涉及到安全问题了。分布式系统要适应不断增长的业务需求,那么就需要考虑其扩展性。分布式系统还必须要保证可靠性和数据的一致性。
概况起来,在设计分布式系统时,应考虑以下几个问题:
系统如何拆分为子系统?
如何规划子系统间的通信?
通信过程中的安全如何考虑?
如何让子系统可以扩展?
子系统的可靠性如何保证?
数据的一致性是如何实现的?

5主从复制主要步骤

  1. 一台服务器开多个Mysql服务
  2. 主数据库配置
  3. 从数据库配置
  4. 主从数据库同步

5.1具体操作

5.2.1一台服务器开多个Mysql服务

(1)安装数据库
此处数据库版本为5.7,按照数据库安装步骤装好数据库,并配置环境。将该数据库作为主库,下图为数据库安装路径。

下图为数据库Data的存放路径

注意:标红的部分,两个配置文件有所不同,后文会详解。
(2)建立新的MYSQL服务安装路径
注意:对数据库进行操作时,一定要先关闭数据库服务!!!
关闭数据库服务,选择任意路径,在该路径下建立用于存放从库的文件夹,将主库安装路径下(有bin文件的路径)的所有文件复制到从库文件夹下;

(3)拷贝Data文件
将主库的Data文件夹直接拷贝到从库文件夹下,与上一步拷贝到的路径相同。

注意:拷贝时,也拷贝了主库的auto.cnf文件,该文件存储数据库的uuid,直接拷贝会引发主从库uuid错误,因此最好在此处修改从库中auto.cnf中uuid的数值,修改方式参考下文问题解决方法。
(4)修改配置文件
在MYSQL2下修改my-default.ini文件,重命名为my.ini,修改后内容如下;

port为该MYSQL服务的端口,默认的端口为3306,此处一定要设置与已有端口不同,且唯一。Server-id为该MYSQL服务的唯一标识,默认设置为1,此处一定要设置与默认值不同,且唯一;
basedir为从库的安装路径,即创建的文件夹路径;datadir为从库Data文件的路径;
log-bin为数据库开启log日志,该日志用来记录数据操作,主从复制主要依赖log日志;
replicate-do-db为需要复制的数据库名。
(5)安装服务
以管理员身份运行cmd,执行命令:
mysqld -install mysql2 -defaults-file=F:MYSQL2my.ini

mysql2为启动的服务名,必须唯一。
补充(不属于操作步骤):删除服务指令为:mysql –remove mysql2
(6)修改注册表
在开始菜单输入regidit命令打开注册表,找到HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> mysql2选中后将ImagePath参数值改成自己的安装路径即可。(一定要仔细校对,少一个横杠都可能会失败!)

(7)启动服务并登录
在命令行继续输入:net start mysql2

注意,登录时要输入端口号,因为开启了多个MYSQL服务,需要端口号识别。

5.2.2主数据库配置

(一定要在关闭服务的前提下操作)主数据库配置文件如下:(注意,此处为Data文件下的my.ini文件,并非是安装路径下的my-default.ini)

5.2.3从数据库配置

为了操作方便,从数据库配置在前面开启多个MYSQL服务时已经全部配置完成。

5.2.4主从数据库同步

(1)为从库添加一个用户,在主库指定replication权限
用root用户登录从库,创建一个用于同步的用户,并为该用户授权。授予all权限,才能执行change master指令。
create user ‘yyk2’@’%’ identified by ‘yyk’;
grant all privileges on . to ‘yyk2’@’%’ identified by ‘yyk’;

登录主库,创建用户yyk2,并为从库的yyk2用户授予复制权限
grant replication slave on . to ‘yyk2’@’%’ identified by ‘yyk’;

(2)查看主库状态
show master status

记录File以及Position的值。
(3)在从库设置它的主库
退出从库,用已授权用户yyk2重新登录,并设置它的主库,此处要填写对应的File以及Position。
change master to master_host=‘127.0.0.1’,master_port=3306,master_user=‘yyk2’,master_password=‘yyk’,master_log_file=‘mysql-bin.000002’,master_log_pos=997;
(4)在从库开启数据库复制功能并查看是否成功
start slave;
show slave statusG;

如果有两个YES则表明成功。

6 问题总结(重要)

最容易出现的问题:

报错内容为:The slave I/O thread stops because master and slave have equal MySQL server UUIDs;these UUIDs must be different for replocation to work.
分别查看主从数据库的uuid,可以看到值相同
查看方式两种:
1、分别登录主库和从库,直接在命令行输入
show variables like ‘%server%’;
2、分别在主库和从库的Data文件夹下查看auto.cnf的内容。
这里需要修改server UUID
关闭slave:
stop slave
利用select uuid()自动生成一个uuid:
select uuid();

关闭MYSQL2服务在MYSQL2的安装路径下的Data文件夹下找到文件auto.cnf

修改其中的uuid的值,修改为上文随机生成的值0a3a8da-41d1-11e7-b4ae-60a44c65a128。
重启开启MYSQL2服务
进入从库:
start slave
show slave statusG;
再查看状态,成功。

部分转载自:http://blog.csdn.net/denghejing/article/details/60763800


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
铁人萱小小
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有