并发~负载均衡高可用负载均衡

负载均衡示例+mysql主从同步示例

2020-03-25  本文已影响0人  潇湘夜雨_pwj

环境准备

centos6.9, apache 2.2.15 , redis 3.2.12,php 7.3.13,mysql 5.1.73,thinkphp3.2.3

http是无状态协议,web应用中浏览器向服务器发送请求时,服务器通过识别客户端传递的cookie(header头信息发送)与服务器端存储的session进行识别验证,session默认存储提供服务的本机中,在负载均衡服务架构中,假如对session存储不作处理,客户端第一次请求由192.168.3.21提供服务,cookie与192.168.3.21服务器建立对应,客户端第二次请求时,由192.168.3.20提供服务,此时该服务器不存在session,就出现客户端登录的情况。所以,在web应用中实现负载均衡实现的思路就是解决session共享,本文使用的是apache转发服务。

web请求响应流程

配置基于域名的虚拟主机提供站点服务

apache版本: 2.2.15

在etc/httpd/conf 新建文件夹 extra vhosts


clipboard.png

在站点服务器192.168.3.21,一键安装apache

yum install httpd -y
cd /etc/httpd/conf
vim httpd.conf

在主配置文件httpd.conf中 添加

Include conf/extra/httpd_vhosts.conf

在 extra 创建 httpd_vhosts.conf

vim httpd_vhosts.conf

在httpd_vhosts.conf 添加如下内容

NameVirtualHost *:80
Include /etc/httpd/conf/vhosts/*.conf
httpd_vhosts图例

在 etc/httpd/conf/vhosts 新建以.conf结尾的配置文件

注: 文件名 建议见名知意,实际开发中有多个虚拟域名

vim webtest.conf

在文件 webtest.conf中添加如下代码

<VirtualHost *:80>
    ServerAdmin webtest.com
    DocumentRoot /www/html/webtest
    ServerName webtest.com
</VirtualHost>
webtest.conf图例

在Apache的网站目录下新建 文件夹 webtest 添加文件 index.php 测试

mkdir /www/html/webtest -pv

重启apache

在windows系统 的hosts文件中添加

192.168.3.21  webtest.com    

模仿DNS服务器
在浏览器 访问 webtest.com

hosts图例

站点后台服务器安装 php-redis 扩展 ,192.168.3.24安装redis

在服务器192.168.3.24中 yum安装redis

   yum install -y redis 

启动redis服务:

service redis start

终端:cd /usr/bin

redis图例

2.2 配置 redis.conf 修改 bind 192.168.3.24 当前虚拟主机的ip

cd /etc/redis.conf   
redis配置修改示例

在站点服务器192.168.3.21和192.168.3.20中安装 php-redis 扩展

 yum install php-redis   

注意:安装时 注意 php版本与c++编译环境

2.4 在站点服务器192.168.3.21和192.168.3.20编写测试代码

测试代码图例

浏览器访问 测试

浏览器访问图例

转发服务器apache配置

实际测试中可以通过域名直接转发配置

域名跳转图例 转发服务器转发配置

git搭建 以及 远端 与 站点目录自动同步

yum install git -y
git安装成功示例

git 与站点 www 目录同步 配置过程

cd /home/git
git init --bare test.git

进入站点目录clone空仓库并更改权限

cd /www/html/webtest
git clone /home/git/test.git
chown -R git:git test

配置git钩子同步功能使其代码提交自动同步到站点目录

cd /home/git/test.git/hook
vim post-receive

添加

GIT_WORK_TREE=/www/html/test git checkout -f

更改文件的执行权限

 chmod +x post-receive

注意整个test.git 用户权限

在windows 本地进行客户端 测试

git clone ssh://root@192.168.3.21/home/git/test.git
git add -A
git commit -m ''测试"
git pull

在服务器站点目录下查看 代码 同步

实际部署项目测试

下载thinkphp3.2.3核心包 编辑简单的账号 密码 session 登入退出验证

修改配置文件 添加session 驱动配置,添加缓存session驱动配置

thinkphp3.2.3redis配置图例
 'DATA_CACHE_TYPE' => 'redis',
 'REDIS_HOST'=>'192.168.3.29', 
 'REDIS_PORT'=>6379, 
 'REDIS_DB'=>1,

 'SESSION_TYPE' => 'Redis', //session保存类型
 'SESSION_REDIS_DB' =>0, //session保存到redis 那个类型       
 'SESSION_PREFIX' => 'sess_', //session前缀
 'SESSION_EXPIRE' => 180, //SESSION过期时间

添加session 驱动文件 Redis.class.php作用:相当于更改php.ini配置文件中有关session的配置,存储类型,以及存储位置,等

thinkphp3.2.3添加redis驱动示例

Redis.class.php 示例 :

<?php
namespace Think\Session\Driver;
class Redis {
//  Redis连接对象
  private $redis;
//  Session过期时间
  private $expire;
//操作哪一个数据库
  private $db;
  /**
   * 打开方法
   * @param type $path
   * @param type $name
   * @return type
   */
  public function open($path, $name) {
  $this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') : ini_get('session.gc_maxLifetime');
  $this->db=C('SESSION_REDIS_DB')?C('SESSION_REDIS_DB'):0;
  $this->redis = new \Redis();
  $handle= $this->redis->connect(C('REDIS_HOST'), C('REDIS_PORT'));
  if ($this->db) $this->redis->select($this->db); #已改写可以灵活设置session位置
  return $handle;

  }
  /**
   * 关闭
   * @return type
   */
  public function close() {
  return $this->redis->close();
  }
  /**
   * 读取
   * @param string $id
   * @return type
   */
  public function read($id) {
  $id = C('SESSION_PREFIX') . $id;
  $data = $this->redis->get($id);
  return $data ? $data : '';
  }
  /**
   * 写入
   * @param string $id
   * @param type $data
   * @return type
   */
  public function write($id, $data) {
  $id = C('SESSION_PREFIX') . $id;
  return $this->redis->set($id, $data, $this->expire);
  }
  /**
   * 销毁
   * @param string $id
   */
  public function destroy($id) {
  $id = C('SESSION_PREFIX') . $id;
  $this->redis->delete($id);
  }
  /**
   * 垃圾回收
   * @param type $maxLifeTime
   * @return boolean
   */
  public function gc($maxLifeTime) {
  return true;
  }
}

将上述做好的试验项目上传到 后端站点服务器 192.168.3.20 192.1683.21分别 开启 apache服务 开启转发服务器 的 apache 服务及redis服务器, 在不同的浏览器 分别访问 192.168.3.29, 在redis 服务里可以查看不同的浏览器 对应的 session_id信息,在同一浏览器 重复刷新 不会出现 掉线的情况
配置文件设置的seesion 有效期,过期后刷新浏览器,
会重新提示登入

火狐访问图例

redis查看session存储详情

session存储图例 站点服务响应图例1
站点服务响应图例2

mysql 主从复制

mysql 版本 5.1.73
刷新权限列表,设置 用户登入密码 以及权限

flush privileges;
use mysql;
update user set password=password('123456') where user='root';
GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';
主库示例

查看主服务器的状态 日志文件 以及 记入位置

sercice mysqld restart
mysql -uroot -p123456
show master status; 
主库日志信息图例

从服务器 设置 从服务器的参数 监听的主服务器 ip 以及 日志的位置 ```

start/stop slave;
show slave status\G
从服务器图示

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

启动失败排错

日志位置 log-error=/var/log/mysqld.log

日志示例

主库数据表CRUD 操作时从库数据即可同步


navicate连接示例
上一篇下一篇

猜你喜欢

热点阅读