第十八周作业

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服务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容