美文网首页工作生活
第十八周作业

第十八周作业

作者: 卫清华 | 来源:发表于2019-07-03 15:16 被阅读0次

    1、运用haproxy实现nginx服务负载均衡

    测试环境:

    Nginx1: 172.16.100.151 port:80

    Nginx2:172.16.100.155 port:80

    Haproxy:172.16.100.156

    安装环境

    1.Nginx安装过程略

    2.配置nginx方便测试效果

    修改nginx安装目录下/html/index.html文件的内容,方便测试效果

    172.16.100.155--index.html

    172.16.100.151--index.html

    检查nginx配置文件,并启动/重启

    3.安装haproxy

    这里采用的是yum安装haproxy1.5

    haproxy-1.5

    4.配置haproxy

    Yum安装haproxy在默认目录/etc/haproxy下,配置文件为haproxy.cfg

    修改配置文件端口

    修改bind ip:端口

    修改backend app地址

    修改backend app地址

    此处仅做测试,所以backend static没有做过多修改,直接改为本机地址。

    5.测试负载

    访问172.16.100.156,可以看到结果

    强制刷新后

    反复刷新可以发现实现了轮询效果

    6.测试高可用

    保持其他设置不变,关掉172.16.100.151的nginx,刷新172.16.100.156发现页面停留在172.16.100.155

    2、搭建haproxy实现mysql负载均衡

    1.Mysql安装过程略过

    2.配置mysql

    配置172.16.100.151的mysql

    编辑/etc/my.cnf文件,在mysqld模块加入以下内容:

    server-id=1                             #server的唯一标识

    auto_increment_offset=1                  #自增id起始值

    auto_increment_increment=2                #每次自增数字

    log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项

    max_binlog_size=1024M                          #binlog单文件最大值

    replicate-ignore-db = mysql                    #忽略不同步主从的数据库

    replicate-ignore-db = information_schema

    replicate-ignore-db = performance_schema

    replicate-ignore-db = test

    保存修改,重启mysql服务,检查端口,服务等是否正常

    进入mysql,为mysql添加主从同步用账户

    mysql> grant replication slave on *.* to 'repl'@'172.16.100.155' identified by '123456';

    mysql> show master status;  在172.16.100.151上查看master状态

    在151机的mysql内再执行:

    mysql> change master to master_host='172.16.100.155',\

    master_port=3306,master_user='repl',master_password='123456',\

    master_log_file='mysql-bin.000001',master_log_pos=120; 

    Mysql-bin二进制文件对应155的二进制文件,master_log_pos对应155的position

    mysql> start slave;  开启主从服务

    mysql> show slave status\G; 查看状态

    主从同步成功。

    配置172.16.100.155的mysql

    两者过程大致相同

    编辑/etc/my.cnf文件,在mysqld模块加入以下内容:

    server-id=2                           #server的唯一标识,不可重复

    auto_increment_offset=1                  #自增id起始值

    auto_increment_increment=2                #每次自增数字,一共有几台mysql则为几,此处一共两台mysql,故而设为2

    log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项

    max_binlog_size=1024M                          #binlog单文件最大值

    replicate-ignore-db = mysql                    #忽略不同步主从的数据库

    replicate-ignore-db = information_schema

    replicate-ignore-db = performance_schema

    replicate-ignore-db = test

    保存修改,重启mysql服务,检查端口,服务等是否正常

    进入mysql,为mysql添加主从同步用账户

    mysql> grant replication slave on *.* to 'repl'@'172.16.100.151' identified by '123456';

    mysql> show master status;  在172.16.100.155上查看master状态

    在155机的mysql内再执行:

    mysql> change master to master_host='172.16.100.151',\

    master_port=3306,master_user='repl',master_password='123456',\

    master_log_file='mysql-bin.000001',master_log_pos=308415; 

    Mysql-bin二进制文件对应151的二进制文件,master_log_pos对应151的position

    mysql> start slave;  开启主从服务

    mysql> show slave status\G; 查看状态

    备注:

    如果出现slave_IO_running:NO的情况,在确保网络,数据库权限都正常的情况下,一般是由于所要连接的主库position值发生变化,导致在建立主从时没有对应上正确的position,一般原因是主库数据库存在读写过程。

    3.配置haproxy实现mysql负载均衡

    在haproxy机172.16.100.156上

    修改haproxy配置文件内容:global

            daemon

            nbproc 1

            pidfile /var/run/haproxy.pid

    defaults

            mode tcp               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK

            retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置

            option redispatch       #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器

            option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

            maxconn 4096            #默认的最大连接数

            timeout connect 5000ms  #连接超时

            timeout client 30000ms  #客户端超时

            timeout server 30000ms  #服务器超时

            #timeout check 2000      #=心跳检测超时

            log 127.0.0.1 local0 err #[err warning info debug]

    ########test1配置#################

    listen test1

            bind 0.0.0.0:3306

            mode tcp

            #maxconn 4086

            #log 127.0.0.1 local0 debug

            server s1 172.16.100.151:3306

            server s2 172.16.100.155:3306

    ########frontend配置##############

    重新启动haproxy,连接mysql测试即可

    3、搭建tomcat服务器,并通过nginx反向代理访问

    https://www.jianshu.com/p/a3713dc1fd38

    4、搭建Tomcat,并基于memcached实现会话共享

    Memcached是一款免费、开源、分布式的内存对象缓存系统, 用于减少数据库的负载, 加快web应用程序的访问. Memcached简单并且强大, 其简单的设计加快了部署, 易于开发, 缓存解决了面临的大量数据时很多的问题.

    [root@mem-node1 ~]# yum -y install libevent libevent-devel

    [root@mem-node1 ~]# cd /usr/local/src/

    [root@mem-node1 src]# ll memcached-1.4.34.tar.gz                   

    -rw-r--r-- 1 root root 391131 Jun 27 07:41 memcached-1.4.34.tar.gz

    [root@mem-node1 src]# tar -zvxf memcached-1.4.34.tar.gz

    [root@mem-node1 src]# cd memcached-1.4.34               

    [root@mem-node1 memcached-1.4.34]# ./configure --prefix=/usr/local/memcached

    [root@mem-node1 memcached-1.4.34]# make && make install

    启动memcached,端口11211可以根据自己需要修改不同端口

    [root@mem-node1 ~]# /usr/local/memcached/bin/memcached -d -m 512 -u root -p 11211 -c 1024 -P /var/lib/memcached.11211pid

    查看memcached进程是否起来

    [root@mem-node1 ~]# ps -ef|grep memcached

    root      1340     1  0 14:34 ?        00:00:00 /usr/local/memcached/bin/memcached -d -m 512 -u root -p 11211 -c 1024 -P /var/lib/memcached.11211pid

    root      1400 16303  0 14:35 pts/0    00:00:00 grep memcached

    [root@mem-node1 ~]# lsof -i:11211

    COMMAND    PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME

    memcached 1340 root   26u  IPv4 18958545      0t0  TCP *:memcache (LISTEN)

    memcached 1340 root   27u  IPv6 18958546      0t0  TCP *:memcache (LISTEN)

    memcached 1340 root   28u  IPv4 18958549      0t0  UDP *:memcache

    memcached 1340 root   29u  IPv4 18958549      0t0  UDP *:memcache

    memcached 1340 root   30u  IPv4 18958549      0t0  UDP *:memcache

    memcached 1340 root   31u  IPv4 18958549      0t0  UDP *:memcache

    memcached 1340 root   32u  IPv6 18958550      0t0  UDP *:memcache

    memcached 1340 root   33u  IPv6 18958550      0t0  UDP *:memcache

    memcached 1340 root   34u  IPv6 18958550      0t0  UDP *:memcache

    memcached 1340 root   35u  IPv6 18958550      0t0  UDP *:memcache

    测试一下memcached连接,如下说明成功(输入quit退出)

    [root@mem-node1 ~]# telnet 192.168.10.203 11211

    Trying 192.168.10.203...

    Connected to 192.168.10.203.

    Escape character is '^]'.

    [root@Tomcat-node1 ~]# cd /usr/local/src/MSM_Software

    [root@Tomcat-node1 MSM_Software]# ll

    total 1212

    -rw-rw-r--. 1 root root  53259 Aug 27 09:53 asm-5.2.jar

    -rw-rw-r--. 1 root root 323740 Aug 27 09:51 kryo-4.0.0.jar

    -rw-rw-r--. 1 root root  85217 Aug 27 09:51 kryo-serializers-0.38.jar

    -rw-rw-r--. 1 root root 152401 Aug 27 09:49 memcached-session-manager-1.9.7.jar

    -rw-rw-r--. 1 root root  10788 Aug 27 09:49 memcached-session-manager-tc8-1.9.7.jar

    -rw-rw-r--. 1 root root   5711 Aug 27 09:52 minlog-1.3.0.jar

    -rw-rw-r--. 1 root root  37160 Aug 27 09:51 msm-kryo-serializer-1.9.7.jar

    -rw-rw-r--. 1 root root  51287 Aug 27 09:53 objenesis-2.4.jar

    -rw-rw-r--. 1 root root  20883 Aug 27 09:52 reflectasm-1.11.3.jar

    -rw-rw-r--. 1 root root 472838 Aug 27 09:50 spymemcached-2.12.2.jar

    特别注意:

    memcached-session-manager-tc8-1.9.7.jar中的tc8为tomcat的版本号。

    一定要注意:不同版本号的tomcat,对应的msm包也不同。此处为tomcat8的jar包。

    需要把上面这些MSM依赖的jar包下载后全部上传到两台机器的tomcat安装路径的lib/ 目录下

    [root@Tomcat-node1 MSM_Software]# \cp -rf /usr/local/src/MSM_Software/* /usr/local/tomcat8/lib/

    接下来进行序列化tomcat配置,序列化tomcat配置的方法有很多种:

    java默认序列化tomcat配置、javolution序列化tomcat配置、xstream序列化tomcat配置、flexjson序列化tomcat配置和kryo序列化tomcat配置。

    官网介绍说 使用kryo序列化tomcat的效率最高,所以这里只介绍kryo序列化。

    在No-Stick模式和Stick模式下context.xml文件配置也有所不同(一般用的是No-Stick模式)

    只需要修改conf/context.xml文件:

    [root@Tomcat-node1 ~]# cd /usr/local/tomcat8/conf/

    [root@Tomcat-node1 conf]# cp context.xml context.xml.bak

    a)No-Stick模式

    记住:多个tomcat实例时 需要选择Non-Sticky模式,即sticky="false"

    [root@Tomcat-node1 conf]# vim context.xml                       #在<Context>和</Context>之间添加下面内容.就在底部</Context>之前添加就行

    .......

        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

             memcachedNodes="n1:192.168.10.203:11211,n2:192.168.10.205:11211"

             lockingMode="auto"

             sticky="false"

             sessionBackupAsync="false"

             sessionBackupTimeout= "1000" 

             copyCollectionsForSerialization="true"

             requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

             transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

        />

    第一台tomcat节点的congtext.xml配置好之后,再将该文件拷贝到另一台tomcat节点的相同路径下

    b) Stick模式。

    故障转移配置节点(failoverNodes),不能使用在Non-Sticky模式,多个使用空格或逗号分开,配置某个节点为备份节点。

    当其他节点都不可用时才会存储到备份节点,适用于sticky模式(即一台tomcat,多台memcached)。

    [root@Tomcat-node1 conf]# vim context.xml             

    ......

        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                 memcachedNodes="n1:192.168.10.203:11211,n2:192.168.10.205:11211"            #多个memcached之间用空格或逗号隔开都可以的

                 sticky="true"

                 failoverNodes="n2"                                         

                 requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|swf|flv)$"

                 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

                 copyCollectionsForSerialization="true"

        />

    第一台tomcat节点的congtext.xml配置好之后,再将该文件拷贝到另一台tomcat节点的相同路径下,并将failoverNodes后面的参数改为n1

    配置好之后,一定要记得重启两台机器的tomcat服务!

    [root@Tomcat-node1 ~]# /usr/local/tomcat8/bin/shutdown.sh      #或者直接使用kill杀死

    [root@Tomcat-node1 ~]# lsof -i:8080

    [root@Tomcat-node1 ~]# /usr/local/tomcat8/bin/startup.sh

    ======================================================================================

    Manager 各参数说明:

    memcachedNodes     必选项,memcached的节点信息,多个memcached节点,中间需要使用空格

    failoverNodes="n2"  表示当前session保持到n1的memcached节点上

    failoverNodes      可选项,不能使用在non-sticky sessions模式。故障转移配置节点,多个使用空格或逗号分开,配置某个节点为备份节点,

    当其他节点都不可用时才会存储到备份节点,官方建议配置为和tomcat同服务器的节点。

    理由如下:

    假如有两台服务器m1,m2,其中m1部署tomcat和memcached节点n1,m2部署memcached节点n2。

    如果配置tomcat的failoverNodes值为n2或者不配置,则当服务器m1挂掉后n1和tomcat中保存的session会丢失,而n2中未保存或者只保存了部分session,

    这就造成 部分用户状态丢失。

    如果配置tomcat的failoverNodes值为n1,则当m1挂掉后因为n2中保存了所有的session,所以重启tomcat的时候用户状态不会丢失。

    为什么n2中保存了所有的session? 因为failoverNodes配置的值是n1,只有当n2节点不可用时才会把session存储到n1,所以这个时候n1中是没有保存任何session的。

    lockingMode  可选值,默认none,只对non-sticky有效。

    requestUriIgnorePattern  可选值,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。

    sessionBackupAsync    可选值,默认true,是否异步的方式存储到memcached。

    sessionBackupTimeout  可选项,默认100毫秒,异步存储session的超时时间。

    如果memcached session manager的会话共享配置后,重启tomcat服务没有报错,但是访问页面的时候报错,页面访问失败,如下在logs/catalina.out日志里发现的错误:SEVERE [http-nio-8080-exec-1] org.apache.coyote.http11.AbstractHttp11Processor.process Error processing request java.lang.NoSuchFieldError: attributes

    5、haproxy开启日志功能

    修改haproxy配置文件

    vi /etc/haproxy/haproxy.cfg 可以看到如下行,把这个开启

    log 127.0.0.1 local2

    没有指定端口,默认为udp 514

    修改rsyslog配置文件

    vi /etc/rsyslog.conf

    #启用在udp 514端口接收日志消息

    $ModLoad imudp

    $UDPServerRun 514

    #在rules(文本最末)节中添加如下信息

    local2.* /var/log/haproxy.log

    #表示将发往facility local2的消息写入haproxy.log文件中,"local2.* "前面的local2表示facility,预定义的。*表示所有等级的

    重启rsyslog服务

    #重启 rsyslog

    systemctl restart rsyslog

    #重启haproxy

    systemctl restart haproxy

    查看/var/log/haproxy.log文件应该能看到日志信息

    查看日志

    tail -f /var/log/haproxy.log

    syslog 通过 Facility 的概念来定义日志消息的来源,以便对日志进行分类,Facility 的种类有:

    类别  解释

    kern    内核消息

    user    用户信息

    mail    邮件系统消息

    daemon  系统服务消息

    auth    认证系统

    authpriv    权限系统

    syslog  日志系统自身消息

    cron    计划安排

    news    新闻信息

    local0~7    由自定义程序使用

    而另外一部分 priority 也称之为 serverity level,除了日志的来源以外,对统一源产生日志消息还需要进行优先级的划分,而优先级的类别有一下几种:

    类别  解释

    emergency   系统已经无法使用了

    alert   必须立即处理的问题

    critical    很严重了

    error   错误

    warning 警告信息

    notice  系统正常,但是比较重要

    informational   正常

    debug   debug的调试信息

    panic   很严重但是已淘汰不常用

    none    没有优先级,不记录任何日志消息

    6、开启haproxy监控页面

    在/etc/haproxy/haproxy.cfg中进行配置:

    listen admin_stats

            mode    http

            stats   enable

            bind    *:8080  // 监听端口

            stats   refresh 30s

            stats   uri /admin // 统计页面访问的url

            stats   realm haproxy

            stats   auth root:root // 认证用户与密码

            stats   hide-version

    保存配置,重启haproxy服务

    相关文章

      网友评论

        本文标题:第十八周作业

        本文链接:https://www.haomeiwen.com/subject/acaqhctx.html