乐趣区

负载均衡分布式集群的理解以及多台服务器代码如何同步

集群

我们的项目如果跑在一台机器上,如果这台机器出现故障的话,或者用户请求量比较高,一台机器支撑不住的话。我们的网站可能就访问不了。那怎么解决呢?就需要使用多台机器,部署一样的程序,让几个机器同时的运行我们的网站。那怎么怎么分发请求的我们的所有机器上。所以负载均衡的概念就出现了。

负载均衡

负载均衡是指基于反向代理能将现在所有的请求根据指定的策略算法,分发到不同的服务器上。常用实现负载均衡的可以用 nginx,lvs。但是现在也有个问题,如果负载均衡服务器出现问题了怎么办?所有冗余的概念就出现了。

冗余

冗余其实就是两个或者多台服务器 一个主服务器,一个从服务器。假设一个主服务器的负载均衡服务器出现了问题,从服务器能够替代主服务器来继续负载均衡。实现的方式就是使用 keepalive 来抢占虚拟主机。

分布式

分布式其实就是将一个大项目的拆分出来,单独运行。

举个上面的例子。假设我们的访问量特别大。我们就可以做成分布式,跟 cdn 一样的机制。在北京,杭州,深圳三个地方都搭建一个一模一样的集群。离北京近的用户就访问北京的集群,离深圳近的就访问深圳这边的集群。这样就将我们网战给拆分 3 个区域了,各自独立。

再举个例子比如我们 redis 分布式。redis 分布式是将 redis 中的数据分布到不同的服务器上面,每台服务器存储不同的内容,而 mysql 集群是每台服务器都放着一样的数据。这也就理解了分布式和集群的概念。

MySQL 主从

mysql master 服务器会把 sql 操作日志写入到 bin.log 日志里 slave 服务器会去读 master 的 bin.log 日志,然后执行 sql 语句。

主从有以下几个问题。

1.master 服务器能写又能读,slave 却只能写。

slave 读取的数据还没有写入,这样该怎么解决呢?

  1. 假如缓存,从缓存中读取。
  2. 强制从 master 读取。
  3. 使用 pxc 集群,任何一个节点都是可读可写的,读写强一致性。

如何解决数据不一致

config/database.phpmysql 配置块中将 sticky 设置为 true

sticky 是一个 可选值,它可用于立即读取在当前请求周期内已写入数据库的记录。若 sticky 选项被启用,并且当前请求周期内执行过「写」操作,那么任何「读」操作都将使用「写」连接。这样可确保同一个请求周期内写入的数据可以被立即读取到,从而避免主从延迟导致数据不一致的问题。不过是否启用它,取决于应用程序的需求。

同步代码到多台服务器

Laravel 为我们提供了扩展包 laravel/envoy,它为定义远程服务器的日常任务,提供了一套简洁、轻量的语法。Blade 风格语法即可实现部署任务的配置、Artisan 命令的执行等。

composer global require laravel/envoy

Envoy 任务都应在项目根目录下的 Envoy.blade.php 中定义。写入一下内容

@servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2'])

@task('deploy', ['on' => ['web-1', 'web-2']])
    cd site
    git pull origin {{$branch}}
    composer update
    php artisan migrate
@endtask

以上代码意思就是在命令行 envoy run deploy 时候,我们会 ssh 到会 web-1,web-2 执行

cd site
    git pull origin {{$branch}}
    php artisan migrate

也可以自己手写一个 Linux cron 来实现代码同步

很多 PHPer 在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql 优化、shell 脚本、Docker、微服务、Nginx 等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要请戳这里

退出移动版