14 MyCat和Nginx.txt
UP 返回
1. MyCat
1.1 概念
Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,基于 Java 开发,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。
比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。
Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。
简单的说,MyCAT就是:一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在
分布式数据库中间件
1.2 安装Mycat JDK:要求jdk必须是1.7及以上版本 MySQL:推荐mysql是5.5以上版本
将MySQL的服务端和客户端安装包(RPM)上传到服务器
查询之前是否安装过MySQL
rpm -qa|grep -i mysql
卸载旧版本MySQL
rpm -e --nodeps 软件名称
安装服务端和客户端
rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm
rpm -ivh MySQL-client-5.5.49-1.linux2.6.i386.rpm
启动MySQL服务 本次使用Redis服务器,里面已经配好了java和mysql,所以直接从这一步开始就可以了
service mysql start
登录MySQL
mysql -u root
设置远程登录权限 此时可以在本地连接远程MySQL进行测试
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
安装Mycat 官网:http://www.mycat.org.cn/ 下载地址:https://github.com/MyCATApache/Mycat-download 这里使用本地已经有的文件:E:\2019年4月黑马程序员教程\05-黑马JavaEE49期全套\17品优购电商系统开发\配套软件\MyCat\Mycat-server-1.4-release-20151019230038-linux.tar.gz
put D:/EnvironmentDevs/Mycat-server-1.4-release-20151019230038-linux.tar.gz 上传压缩包并解压
tar zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat /usr/local/ 移动到用户目录下,统一规范一下
进入mycat目录的bin目录,启动mycat
./mycat start
./mycat stop 停止,mycat 支持的命令:console | start | stop | restart | status | dump console表示前台启动,可以看到一些出错信息。Mycat的默认端口号为:8066
1.3 MyCat分片-海量数据存储解决方案
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
(1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分
(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
!!@@2022080710.png_653_493_1@@!! MyCat分片策略。为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。分片的规则有多种,比如按照id,按照时间等等,选择合适的规则可以极大避免后续数据处理的难读
编辑配置文件 /usr/local/mycat/conf/schema.xml
!!@@202208081.png_1291_652_1@@!!
schema 标签用于定义MyCat实例中的逻辑库
table 标签定义了MyCat中的逻辑表 rule用于指定分片规则,auto-sharding-long的分片规则是按ID值的范围进行分片 1-5000000 为第1片 5000001-10000000 为第2片....
dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
在服务器上创建3个数据库,分别是db1 db2 db3
编辑配置文件设置字符集和连接的用户名。启动或重启Mycat生效 /usr/local/mycat/conf/server.xml
!!@@2022080714.png_1309_770_1@@!! 注意schemas的值要和schema.xml中配置的schema保持一致。Mycat的启动日志可以查看:tail -f /usr/local/mycat/logs/wrapper.log
使用Navicat,创建MySQL连接,地址/端口/用户名/密码=192.168.25.132/8066/root/123456,即可连接成功! ▶可以连接但是显示找不到库,没找到解决办法,后使用SQLyog连接可以查到库并操作
1.4 Mycat的使用和分片规则
使用sqlyog建表,可以发现MyCat会自动将表转换为大写,MySQL的3个库都自动创建了该表
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
执行插入语句,可以mysql里看到这几条都被插到了第一个节点库db1中。使用Mycat插入查询必须都指定列名,不允许直接使用*
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
SELECT id,title FROM TB_TEST # 查询数据
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001'); # 插入成功,进入节点2 db2
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001'); # 插入成功,进入节点3 db3
INSERT INTO TB_TEST(ID,TITLE) VALUES(15000001,'goods10000001'); # 插入失败,节点3只能容纳10000001-15000000的数据,超过就报错了,如果想插只能扩大节点数
Mycat的分片规则在rule.xml配置文件中,在这里可以看到schema.xml中指定的规则auto-sharding-long
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
columns用于指定需要分片的列,algorithm指定对应的算法名,这里是rang-long,在下面可以找到这个算法的具体信息
<function name="rang-long"
class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
可以看到对应的其实是一个类,mapFile指定了自动分片的范围,可以在配置文件夹中看到这个文件autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
这里指定了每一个节点的id范围,所以可以在这里更改范围大小。以上可以看出任何一张表都可以对应自己的tableRule,同时tableRule中指定对应规则function,function又可以指定自己对应的文件
但是有时候主键并不是累加的,比如订单id生成的是随机大数字,用上面的方法不能很好的分片。这里可以使用提供的一致性哈希murmur规则,他可以平均的将数据分布在几个分区中
!!@@202208091.png_977_254_1@@!! 将节点数量count改为3
复制一个murmur规则,指定列为order-id
<tableRule name="sharding-by-murmur-order">
<rule>
<columns>order_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
在schema.xml中指定表tb_order的分片规则为sharding-by-murmur-order。保存以后重启Mycat(./mycat restart),每次重启qlyog也需要重启连接,不然就报错
<table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
使用 E:\2019年4月黑马程序员教程\05-黑马JavaEE49期全套\17品优购电商系统开发\资源\建库语句\pinyougoudb-v1.3.sql 中的建表语句在Mycat建表tb_order
再使用后面的插入语句插一些数据,可以看到最终数据均衡的插入了各个节点。一定要注意Mycat中表名需要大写
MySQL的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置。从节点会及时从主节点同步数据,增删改操作直接走主节点,查询操作一般均衡的分摊到各个从节点,这种分摊需要自己去处理逻辑
但是Mycat可以自动切换读写分离,具体配置不细说,参文档:E:\2019年4月黑马程序员教程\05-黑马JavaEE49期全套\17品优购电商系统开发\配套软件\MyCat
2. Nginx
Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器(一般用前两个),应用场景:
http 服务器。Nginx 是一个 http 服务可以独立提供 http 服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况
2.1 安装 本次使用pinyougou服务器复制出来的nginx-test做测试
安装gcc环境和第三方开发包 此步省略,因为测试的服务器已安装
yum install gcc-c++
yum install -y pcre pcre-devel PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库;pcre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库。
yum install -y zlib zlib-devel zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要在 linux 上安装 zlib 库。
yum install -y openssl openssl-devel OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux安装 openssl 库。
上传解压安装包 官方网站下载 nginx:http://nginx.org/
put D:/EnvironmentDevs/nginx-1.8.0.tar.gz
tar zxvf nginx-1.8.0.tar.gz
创建Makefile文件。进入Nginx目录执行以下命令,会生成Makefile文件。Makefile是一种配置文件,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,后编译,或者重新编译,甚至于进行更复杂的功能操作,因此makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
!!@@202208092.png_474_173_1@@!! —执行后—> !!@@202208093.png_453_207_1@@!!
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
对于以上命令的一些参数解析可以了解一下:
configure参数 \代表换行,分隔不同命令。这里就是要把Nginx安装在/usr/local/nginx目录下
./configure \
--prefix=/usr \ 指向安装目录
--sbin-path=/usr/sbin/nginx \ 指向(执行)程序文件(nginx)
--conf-path=/etc/nginx/nginx.conf \ 指向配置文件
--error-log-path=/var/log/nginx/error.log \ 指向log
--http-log-path=/var/log/nginx/access.log \ 指向http-log
--pid-path=/var/run/nginx/nginx.pid \ 指向pid
--lock-path=/var/lock/nginx.lock \ (安装文件锁定,防止安装文件被别人利用,或自己误操作。)
--user=nginx \
--group=nginx \
--with-http_ssl_module \ 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
--with-http_flv_module \ 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)
--with-http_stub_status_module \ 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
--with-http_gzip_static_module \ 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
--http-client-body-temp-path=/var/tmp/nginx/client/ \ 设定http客户端请求临时文件路径
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \ 设定http代理临时文件路径
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ 设定http fastcgi临时文件路径
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ 设定http uwsgi临时文件路径
--http-scgi-temp-path=/var/tmp/nginx/scgi \ 设定http scgi临时文件路径
--with-pcre 启用pcre库
编译和安装 安装后可以在 /usr/local中看到nginx文件夹
make make就是按照Makefile来编译
make install
!!@@202208094.png_415_175_1@@!!
启动与访问
mkdir /var/temp/nginx/client -p 启动nginx之前,之前配置Makefile中将临时文件目录指定为/var/temp/nginx/client,需要在/var下创建此目录
cd /usr/local/ngiux/sbin sbin目录是执行文件;conf是配置;html是欢迎页面
./nginx 启动,不报错就是启动成功。直接在浏览器访问虚拟机地址即可看到nginx欢迎页面 http://192.168.25.134/ (默认80端口)
ps aux|grep nginx
!!@@202208095.png_688_366_1@@!!
其他相关命令:
关闭 nginx: ./nginx -s stop 或者 ./nginx -s quit
重启 nginx: 先关闭后启动。 或者 刷新配置文件:./nginx -s reload
2.2 使用测试
将商品详情页相关文件复制进item文件夹,并上传服务器;将item下所有文件复制到nginx的html下,访问 http://192.168.25.134/item.html 即可看到详情页
put -r d:/EnvironmentDevs/item/
mv item/* /usr/local/nginx/html/
配置文件: !!@@202208101.png_1261_634_1@@!!
配置虚拟主机:就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器
1) 端口绑定
put -r d:/EnvironmentDevs/myhtml myhtml中含有两个文件夹,cart和search,分别存了品优购购物车和查询页的静态页面
cp -r myhtml/* /usr/local/nginx/ 把cart和search移动到nginx目录下
在配置文件中添加server配置,使得81 82端口分别访问cart和search页面。重启即可看到效果 http://192.168.25.134:81/ http://192.168.25.134:82/
server {
listen 80;
server_name cart.pinyougou.com;
location / {
root cart;
index cart.html;
}
}
!!@@202208131.png_330_376_1@@!!
2) 域名绑定
修改本地host映射,把域名映射到nginx服务器上(可以用Switchhosts修改hosts,记住管理员启动)
!!@@202208135.png_630_467_1@@!!
修改nginx的server配置,端口改成80,但是可以用不同的域名。重启后在浏览器可以直接用域名访问到对应页面 http://search.pinyougou.com/ http://cart.pinyougou.com/
!!@@202208134.png_404_366_1@@!!
反向代理
解压出一个Tomcat,将品优购的index页面及相关文件夹复制到Tomcat的ROOT目录中,这样后面就可以直接使用ip+目录访问到页面。上传到服务器
put -r D:\EnvironmentDevs\upload\tomcat-nginxtest
mkdir /usr/local/tomcat-cluster 创建集群Tomcat文件夹,因为后面会部署多个
cp -r tomcat-nginxtest/ /usr/local/tomcat-cluster/tomcat1 复制
chmod -R 777 tomcat-cluster/ 赋权限
./startup.sh 进入bin文件夹启动。访问 http://192.168.25.134:8080/ 即可看到首页
修改nginx的配置文件并重启,确保host中有www.pinyougou.com的映射,即可在浏览器用www.pinyougou.com访问主页
upstream pinyougou-portal{
server 192.168.25.134:8080;
}
server {
listen 80;
server_name www.pinyougou.com;
location / {
proxy_pass http://pinyougou-portal;
index search.html;
}
}
!!@@202208136.png_445_234_1@@!!
负载均衡
再复制两个上面的Tomcat
cp -r tomcat-nginxtest/ /usr/local/tomcat-cluster/tomcat2
cp -r tomcat-nginxtest/ /usr/local/tomcat-cluster/tomcat3
使用editplus修改每个Tomcat的三个端口,同时修改index.html的标题使他们有区别
!!@@202208138.png_1236_732_1@@!! !!@@202208139.png_1323_483_1@@!!
赋权限,启动各个Tomcat,可以通过各个端口访问到主页 http://192.168.25.134:8280/
chmod -R 777 tomcat-cluster/
修改nginx的upstream配置,添加另外两个地址重启即可。继续访问www.pinyougou.com,可以看到均衡访问
server 192.168.25.134:8180;
server 192.168.25.134:8280;
!!@@2022081310.png_508_283_1@@!!
每个地址默认权重是1,如果其中一台服务器性能比较好,想让其承担更多的压力,可以设置权重
upstream tomcat-portal {
server 192.168.25.141:8080;
server 192.168.25.141:8180 weight=2; 这个地址访问的几率就是2/(1+2+2)=50%
server 192.168.25.141:8280;
}
高可用(了解即可)
nginx 作为负载均衡器,所有请求都到了 nginx,如果nginx 服务器宕机后端 web 服务将无法提供服务,影响严重。
为了避免负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务 IP 并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务 IP 地址,这样的主服务器就开始再次提供负载均衡服务。
keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived 的作用是检测 web 服务器的状态,如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将 web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的 web 服务器。
keepalived 是以 VRRP 协议为实现基础的,VRRP 全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip(VIP = Virtual IPAddress,虚拟 IP 地址,该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 VRRP 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。
keepalived 主要有三个模块,分别是 core、check 和 VRRP。core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。VRRP 模块是来实现 VRRP 协议的。
学习参考文档: E:\2019年4月黑马程序员教程\05-黑马JavaEE49期全套\17品优购电商系统开发\配套软件\Nginx\keepalived高可用\keepalived
DOWN 返回