session会话、tomcat会话保持、mysql存储引擎等
2019-03-15 本文已影响0人
佐岸的咖啡
1、简述session会话保持的几种方式并举例实现
1).session sticky
- source ip (基于源地址绑定)
nginx: ip_hash
haproxy: source
lvs: sh
- cookie (基于cookie绑定)
vim /etc/nginx/nginx.conf
http {
..........
upstream tcsrvs {
#一致性哈希算法绑定后端主机,保持会话
hash $request_uri consistent;
#使用cookie绑定后端主机,保持会话
hash $cookie_name consistent;
server 192.168.10.100:8080;
server 192.168.10.101:8080;
}
vim /etc/nginx/conf.d/ilinux.conf
server {
listen 80;
server_name www.ilinux.io;
location / {
proxy_pass http://tcsrvs;
}
}
..........
}
- uri
2).session cluster
- httpd + tomcat cluster
- http连接模式
<proxy balancer://tcsrvs>
BalancerMember http://192.168.10.100:8080 route=TomcatA loadfactor=1 #会话组成员
BalancerMember http://192.168.10.101:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>
<VirtualHost *:80>
ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/ #反向代理,调用tcsrvs会话组
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>
- ajp连接器
<proxy balancer://tcsrvs>
BalancerMember ajp://192.168.1.15:8009
BalancerMember ajp://192.168.1.16:8009
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName lb.ilinux.io
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
- 启用管理接口
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
3).session server
- 1.启用集群多播,将下列配置放置于<engine>或<host>中
~ #] vim /etc/tomcat/server.xml
......
<Host name= localhost" appBase="webapps"
unpackWARS="true" autoDeploy="true"
#添加以下语句
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" #使用多播同步管理器
expireSessionsOnShutdown="false" #不允许关机丢失会话
notifyListenersOnReplication="true"/> #通知其他服务器
<Channel className="org.apache.catalina.tribes.group.GroupChannel">#定义信道
<Membership className="org.apache.catalina.tribes.membership.McastService"#组件一
address="228.0.0.4" #多播地址
port="45564" #端口
frequency="500" #每隔0.5秒发送状态探测
dropTime="3000"/> #离线时长
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"#接收器
address="auto" #自动探测地址
port="4000" #接受端口
autoBind="100" #每隔多长时间绑定
selectorTimeout="5000" #选择器的超时时间
maxThreads="6"/> #最大并发连接数
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">#发送器
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>#轮询的并发送器
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>#过滤器
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> #过滤器
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"#部署器自动部署
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
- 2.配置webapps
编辑WEB-INF/web.xml, 添加<distributable/>元素
~ #] cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/
~ #] vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
..................
<distributable/> #t添加元素
.................
注意: CentOS 7上的tomcat自带的文档中的配置示例有语法错误,绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址做为使用的地址
[root@tomcat-77 ~]# vim /etc/hosts #查看主机名和ip 是否正确
2、实现tomcat会话保持与会话保持器msm配置示例
image.png1).架构配置
名称 | 服务器ip | 类型 (CentOS 7) |
---|---|---|
Server | 192.168.8.104 | httpd |
tomcatA | 192.168.8.105 | |
tomcatB | 192.168.8.103 | |
memcachedA | 192.168.8.106 | |
memcachedB | 192.168.8.107 |
2).安装JDK和TOMCAT
- 在tomcatA和B上分别安装jdk和tomcat
[root@tomcat-A ~]# yum install ntpdate -y
[root@tomcat-A ~]# ntpdate ntp1.aliyun.com #同步时间
[root@tomcat-A ~]# yum -y install java-1.8.0-openjdk
[root@tomcat-A ~]# java -version #版本查询
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) #混合模式
注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
设定java环境变量
[root@tomcat-A ~]# echo $JAVA_HOME #查询是否有路径
[root@tomcat-A ~]# vim /etc/profile.d/java.sh #编写脚本
export JAVA_HOME=/usr
[root@tomcat-A ~]# . /etc/profile.d/java.sh
[root@tomcat-A ~]# echo $JAVA_HOME
/usr
#安装tomcat
[root@tomcat-15 ~]# yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
2).下载对应的jar包,存储到对应的位置
url: https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
rpm -ql tomcat-lib #
/usr/share/java/tomcat/ # yum安装默认在此目录
/usr/local/tomcat/lib # 在官网rpm安装的默认在此目录了
3).配置tomcat的主文件
host字段
[root@tomcat-15 ~]# vim /etc/tomcat/server.xml
......
<Host name= "localhost" appBase="webapps"
unpackWARS="true" autoDeploy="true"
#添加以下语句
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.8.105:11211,n2:192.168.8.103:11211" #缓存服务器地址端口
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
4).提供测试的页面
[root@tomcat-A ~]# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
[root@tomcat-A ~]# vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="green">TomcatA.ilinux.io</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("ilinux.io","ilinux.io"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
[root@tomcat-A ~]#systemctl start tomcat.servicen #启动tomcat
tomcatB服务器:
[root@tomcat-B ~]# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
[root@tomcat-B ~]# vim /usr/local/tomcat/webapps/test/index.jsp
添加如下内容:
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="red">TomcatB.ilinux.io</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("ilinux.io","ilinux.io"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
[root@tomcat-B ~]#systemctl start tomcat.servicen #启动tomcat
5).下载并启动memcached
[root@memcached-A ~]# yum install ntpdate -y
[root@memcached-A ~]# ntpdate time1.aliyun.com #同步时间
[root@memcached-A ~]# yum install -y memcached
[root@memcached-A ~]# systemctl start memcached.service
[root@memcached-A ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:11211 *:*
LISTEN 0 128 :::11211 :::*
.....
6).配置httpd反代设置
[root@httpd ~]# yum install -y httpd
[root@httpd ~]# vim /etc/httpd/conf.d/ilinux.conf
#proxy_http_module反向代理配置:
<VirtualHost *:80>
ServerName www.ilinux.io
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy balancer://tomcat>
BalancerMember http://192.168.8.105:8080 loadfactor=1
BalancerMember http://192.168.8.103:8080 loadfactor=1
ProxySet lbmethod=byrequests
</Proxy>
ProxyVia Off
ProxyRequests Off
ProxyPass / balancer://tomcat/
ProxyPassReverse / balancer://tomcat/
<Proxy *>
Order Allow,Deny
Allow From all
</Proxy>
<Location />
Order Allow,Deny
Allow From all
</Location>
</VirtualHost>
>
[root@httpd ~]# httpd -t
[root@httpd ~]# systemctl start httpd.service
7).测试页面
image.png image.png3、简述mysql存储引擎及读写锁实现并发访问控制
存储引擎
MySQL --> MariaDB --> Percona-server
InnoDB --> XtraDB
- 表类型: 也称为"表类型",表级别概念,不建议在同一个库中的表上使用不同的ENGINE;
- CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME
- SHOW TABLE STATUS
- 常见的存储引擎:
- MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED
- InnoDB: InnoBase
- Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
- 数据存储于"表空间(table space)"中:
- (1)所有数据库中的所有类型为InnoDB表的数据和索引储存于同一个表空间中;
- 表空间文件: datadir定义的目录中
- 文件: ibdata1, ibdata2...
- 表空间文件: datadir定义的目录中
- (2)innodb_file_per_table=ON, 意味着每表使用单独的表空间文件;
- 数据文件(数据和索引,存储于数据库目录)存储于自己专用的表空间文件中,并存储于数据库目录下: tbl_name.ibd
- 表结构的定义: 在数据库目录, tbl_name.frm
- (1)所有数据库中的所有类型为InnoDB表的数据和索引储存于同一个表空间中;
- 事务型存储引擎,适合对事物要求较高的场景中; 但较适用于处理大量短期事务;
- 基于MVCC(Mutil Version Concurrency Control)支持高并发; 支持四个隔离级别, 默认级别为REPEATABLE-READ; 间隔锁以防止幻读;
- 使用聚集索引(主键索引)
- 支持"自适应Hash索引"
- 锁粒度: 行级锁; 间隙锁
- 总结:
- 数据存储: 表空间
- 并发: MVCC, 间隙锁, 行级锁
- 索引: 聚集索引、辅助索引
- 性能: 预读操作、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操作缓存区
- 备份: 支持热备
MyISAM: (非事务型)
- 支持全文索引、压缩、空间函数(GIS)
- 不支持事务
- 锁粒度: 表级锁
- 崩溃无法保证表安全恢复
- 适用场景: 只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短)
- 文件: 每个表有三个文件,存储于数据库目录中
- tbl_name.frm: 表格式定义
- tbl_name.MYD: 数据文件
- tbl_name.MYI: 索引文件
- 特性:
- 加锁和并发: 表级锁
- 修复: 手动或自动修复、但可能会丢失数据
- 索引: 非聚集索引
- 延迟索引更新
- 表压缩
- 行格式:
- {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
- 其他的存储引擎:
- CSV: 将CSV文件(以逗号分隔字段的文本文件)作为MySQL表文件;
- MRG_MYISAM: 将多个MyISAM表合并成的虚拟表
- BLACKHOLE: 类似于/dev/null, 不真正存储数据
- MEMORY: 内存存储引擎,支持hash索引,表级锁,常用语临时表
- FEDERATED: 用于访问其他远程MySQL服务器上表的存储引擎接口
- MariaDB额外支持很多种存储引擎:
- OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE.....
- 搜索引擎:
- lucene,sphinx
- luncene: Solr, ElasticSearch
- lucene,sphinx
并发控制:
- 锁: Lock
- 锁类型:
- 读锁: 共享锁, 可被多个读操作共享
- 写锁: 排它锁,独占锁
- 锁粒度:
- 表锁: 在表级别施加锁,并发性较低
- 行锁: 在行级别施加锁,并发性较高; 维持锁状态的成本较大
- 锁策略: 在锁粒度及数据安全性之间寻求一种平衡机制
- 存储引擎: 级别以及何时施加或释放锁由存储引擎自行决定
- MySQL Server: 表级别,可自行决定,也允许显示请求
- 锁类别:
- 显式锁: 用户手动请求的锁
- 隐式锁: 存储引擎自行根据需要施加的锁
- 显式锁的使用:
- (1)LOCK TABLES
- LOCK TABLES tbl_name read|write,tbl_name read|write,...
- UNLOCK TABLES
- (2)FLUSH TABLES
- FLUSH TABLES tbl_name,...[WITH READ LOCK];
- UNLOCK TABLES
- (3)SELECT cluase
- [FOR UPDATE|LOCK IN SHARE MODE]
- (1)LOCK TABLES