资讯专栏INFORMATION COLUMN

主流开源软件部署方案

IT那活儿 / 2359人阅读
主流开源软件部署方案


一. 选型

1.  反向代理服务器

Nginx 是一个高性能的HTTP和反向代理web服务器,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx是同类型软件中应用范围最广的开源类的反向代理服务器。

2.  web应用服务器

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。目前生产中如果不是应用于容器和微服务,在同类型web应用服务器中Tomcat是一个不错的选择。

3.  内存数据库

Redis是一个高性能的key-value数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。

区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。Redis还支撑集群。redis-cluster采用无中心结构,每个节点都维护着集群的信息,并且节点之间互相通信;节点的 fail 是通过集群中超过半数的节点检测失效时才生效无需人为干扰;客户端与redis节点直连不需要中间proxy层,client根据node返回的错误信息重定向请求;redis-cluster实现了故障转移、负载均衡、高可用性、高并发等功能

4.  关系型数据库

MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL [1]  自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。

Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合


二. 系统基本要求

1.  系统要求

RHEL 6.5 / CENTOS 6.5 及以上

2.  软件要求

开源软件生产安装要求一般要求最新稳定版本,以下安装版本是目前要求版本,具体如下所示:

Nginx1.20.1、jdk1.8.0_144、Tomcat-8.5.71、keepalive-2.1.0、redis5.0.13、mysql5.7.35

依赖:针对不同的软件需要不同的依赖包,具体如下所示:

  • Nginx:openssl openssl-devel zlib zlib-devel pcre pcre-devel gcc make automake autoconf libtool gcc-c++

  • Tomcat:主要依赖于jdk环境

  • Redis:tcl gcc make

  • Mysql:无

  • Linux下root账号安装:

    yum install libaio openssl openssl-devel tcl ssl * gcc* lua zlib zlib-devel pcre pcre-devel-y

3.  系统架构要求

每个环节必须要求存在高可用,nginx+keepalived实现高可用,mysql+keepalived实现高可用,redis哨兵或集群架构实现高可用。

4.  硬件要求

  • 网络1000Mbps及以上

  • 内存和cpu针对不同的软件建议不同的大小,如下

  • Nginx:4G2C

  • Tomcat:8G4C+

  • Redis:内存建议8G及以上,CPU4个以上

  • Mysql:内存建议8G及以上,CPU4个以上

5.  关闭selinux


修改selinux配置文件:SELINUX=disabled


6.  关闭防火墙

  • 关闭防火墙

    systemctl stop firewalld.service 或service iptables stop

  • 禁用防火墙

    systemctl disable firewalld.service 或 chkconfig iptables off


三、keepalived安装部署


1.  Keepalived编译

  • 安装依赖包:

    yum install gcc* openssl* ssl* -y

  • 解压keepalived安装包并进去加压目录:

    ./configure --prefix=/data/keepalived/

  • 创建软连接:

    ln-s/data/keepalived/etc/keepalived/

    keepalived.conf /etc/keepalived/keepalived.conf

2.  检查脚本编写


cat /data/keepalived/sbin/check.sh

#!/bin/bash

ps=`ss -anl|grep LISTEN|grep -w 8080|wc -l`

if [$ps -ne 1]; then

pkill keepalived

fi


注:check.sh的权限必须是700才能调用执行:

chmod 700 /data/keepalived/sbin/check.sh

3.  keepalived配置


cat /data/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_local {

script "/data/keepalived/sbin/check.sh"

interval 3

weight -2

}


vrrp_instance VI_1 {

    state BACKUP #slave: state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100 #slave: priority 90

nopreempt #不抢占

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.66

    }

track_script {

chk_local

}

}


4.  启动


/data/keepalived/sbin/keepalived -f 
/data/keepalived/etc/keepalived/keepalived.conf -S 0


注:nginx和mysql的keepalived高可用安装配置一样,只是把监听nginx的端口换成监听mysql的端口即可。


四、nginx安装部署

1.  安装准备:

  • 确认 /data 目录其他用户有写权限

  • 检查依赖包:pcre pcre-devel zlib zlib-devel openssl openssl-devel

  • 确认安装包:nginx-1.12.0.tar.gz

  • 准备两台主机,两台主机安装方式一模一样

  • 解压 tar -zxvf nginx-1.12.0.tar.gz -C /data

2.  编译安装:

  • 配置执行以下命令

cd /data/nginx-1.12.0

./configure --prefix=/data/nginx

--with-http_realip_module

--with-http_sub_module

--with-http_flv_module

--with-http_dav_module

--with-http_gzip_static_module

--with-http_stub_status_module

--with-http_addition_module

--with-http_ssl_module


  • 编译

    make

  • 安装

    make install

3.  修改nginx配置文件

  • 修改配置文件

vi /data/nginx/conf/nginx.conf


a.添加如下代码


location /nginx_status {

stub_status on; #开启stub_status监控模块

access_log off; #访问日志不记录到log中

allow 127.0.0.1; #只允许本机访问

deny all; # 不允许其他ip地址访问

}

b.到 server 所在代码段:


include /data/nginx/conf/conf.d/*.conf


c.在http模块中填下如下代码:


server_tokens off; #屏蔽nginx的版本号


  • 修改nginx端口

    由于非root用户只能使用大于1024的的端口,

    修改 port :80 为 port :7280

4.  启动nginx

  • 执行命令:

/data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf


  • 查看启动进程 ps -ef| grep nginx

5.  测试启动情况

  • 访问 http://localhost:7280

  • 访问 http://localhost:7280/nginx_status

6.  反向代理配置

  • 在http模块中填下如下代码:

upstream webserver {

server tomcat1_ip:port;

server tomcat2_ip:port;

server tomcat3_ip:port;

server tomcat4_ip:port;

}


注:该配置为nginx进来的请求轮询依次分发到后端各web服务,upstream后端的webserver名字在server模块中localtion代码段里面添加如下内容:

proxy_pass http://webserver。


五、tomcat安装部署


1.  jdk、tomcat解压


tar -zxvf jdk-8u144-linux-x64.tar.gz

mv /data/jdk1.8.0_144 /data/jdk

tar -zxvf apache-tomcat-8.5.71.tar.gz

mv /data/apache-tomcat-8.5.71 /data/tomcat


2.  java环境变量添加


vim .bash_profile

JAVA_HOME=/data/jdk

JAVA_BIN=/data/jdk/bin

PATH=$PATH:$JAVA_BIN

CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JAVA_BIN PATH CLASSPATH

source .bash_profile

java -version


3.  tomcat配置修改


vi /data/tomcat/conf/server.xml

<Connector port="8080"

protocol="org.apache.coyote.http11.Http11NioProtocol"

maxThreads="400" minSpareThreads="200" maxSpareThreads="500"

connectionTimeout="200000" maxHttpHeaderSize="102400" maxPostSize="-1"

redirectPort="8443" URIEncoding="UTF-8" />


<Host name="localhost" appBase="/data/tomcat/webapps"

unpackWARs="true" autoDeploy="true" />


<Valve className="org.apache.catalina.valves.AccessLogValve"

directory="logs"  prefix="localhost_access_log." suffix=".txt"

pattern="%h|%{X-FORWARDED-FOR}i|%l|%u|%t|%r|%s|%T|%b|%{Referer}i|%{User-Agent}i" />


4.  JVM配置


vi catalina.sh

JAVA_OPTS="-server -Xmx4g -Xms4g -Xmn256m -
XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Duser.timezone=GMT+8 -verbose:gc -Xloggc:$CATALINA_BASE/logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails"



六、redis集群安装部署


1.  安装准备

  • 确认 /data 目录其他用户有写权限,确认依赖包gcc/tcl/make

  • 安装包:redis-5.0.13.tar.gz

  • 主备三台主机,三台主机单节点安装启动方式一模一样

  • 解压:tar -xvf redis-5.0.13.tar.gz -C /data

2.  编译安装


cd /data/redis-5.0.13

make MALLOC=libc

cd src ; make test

cd ../

make install PREFIX=/data/redis

cd ../redis

mkdir data log conf tmp monitor


3.  修改redis配置文件

每台主机需要配置两个配置文件分别为7001端口和7002端口,配置要求如下所示:

cat /data/redis/conf/7001.conf

bind 0.0.0.0

protected-mode yes

port 7001

tcp-backlog 511

timeout 0

tcp-keepalive 60

daemonize yes

supervised no

pidfile /data/redis/tmp/redis7001.pid

loglevel verbose

logfile "/data/redis/log/redis.log"

databases 16

save 900 1

save 300 10

save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /data/redis/data

slave-serve-stale-data yes

slave-read-only yes

repl-diskless-sync no

repl-diskless-sync-delay 5

repl-disable-tcp-nodelay no

slave-priority 100

requirepass d^L8sU_s9

masterauth d^L8sU_s9

maxclients 20000

maxmemory 4G

maxmemory-policy volatile-lru

maxmemory-samples 3

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

aof-rewrite-incremental-fsync yes

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

aof-load-truncated yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

cluster-replica-validity-factor 0

cluster-require-full-coverage no

hz 100


cat /data/redis/conf/7001.conf配置中只需要把7001改成7002。


4.  启动redis

三台主机redis都安装完成后,把3台主机6个redis都启动,启动命令如下:

/data/redis/bin/redis-server /data/redis/conf/7001.conf

/data/redis/bin/redis-server /data/redis/conf/7002.conf


5.  集群安装

任意一台redis主机上执行如下命令:

/data/redis/bin/redis-cli --cluster create ip1:7001 ip1:7002
ip2:7001 ip2:7002 ip3:7001 ip3:7002 --cluster-replicas 1 -a d^L8sU_s9


6.  测试redis集群

  • 检查集群信息:

    /data/redis/bin/redis-cli -c -h ip1 -p 7001 -a d^L8sU_s9 cluster info

  • 检查集群节点状态:

    /data/redis/bin/redis-cli -c -h ip1 -p 7001 -a d^L8sU_s9 cluster ndoes

  • 检查单节点信息:

    /data/redis/bin/redis-cli -c -h ip1 -p 7001 -a d^L8sU_s9  info


七、mysql双主安装部署


1.  安装准备

  • 确认 /data 目录其他用户有写权限

  • 安装包:mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz

  • 准备两台主机

  • 解压:tar -xvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz -C /data

2.  初始化安装

  • 进入安装目录并重命名解压目录并进入目录:

    cd /data  &&  mv mysql-5.7.35-linux-glibc2.12-x86_64 mysql && cd /data/mysql

  • 创建数据及日志等目录:

    mkdir data log

  • 根据配置文件初始化mysql:

./bin/mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize-insecure --user=mysql --innodb_undo_tablespaces=3
  • Mysql配置文件如下:

cat /data/mysql/conf/my.cnf

[client]

port=3306

socket=/tmp/mysql.sock

default-character-set=utf8


[mysql]

no-auto-rehash

default-character-set=utf8


[mysqld]

socket=/tmp/mysql.sock

basedir=/data/mysql

datadir=/data/mysql/data

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

port=3306

character-set-server=utf8

explicit_defaults_for_timestamp=true

lower_case_table_names=1

back_log=200

max_connections=3000

max_connect_errors=100000

table_open_cache=512

external-locking=FALSE

max_allowed_packet=1024M

sort_buffer_size=8M

join_buffer_size=8M

thread_cache_size=51

query_cache_size=32M

#query_cache_limit=4M

transaction_isolation=REPEATABLE-READ

tmp_table_size=96M

max_heap_table_size=96M

skip-name-resolve


###***slowqueryparameters

slow_query_log_file=/data/mysql/log/slow.log

long_query_time=1

slow_query_log = 1


###***binlogparameters

log-bin=/data/mysql/log/mysql-bin

binlog_cache_size=16M

max_binlog_cache_size=128M

max_binlog_size=512M

binlog_format=ROW

expire_logs_days=7


###***MyISAMparameters

key_buffer_size=16M

read_buffer_size=8M

read_rnd_buffer_size=16M

bulk_insert_buffer_size=8M


#***Innodbstorageengineparameters

innodb_buffer_pool_size=4G

innodb_data_file_path=ibdata1:1G:autoextend

innodb_read_io_threads=8

innodb_write_io_threads=8

innodb_thread_concurrency=16

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=16M

innodb_log_file_size=512M

innodb_log_files_in_group=4

innodb_max_dirty_pages_pct=75

innodb_buffer_pool_dump_pct=75

innodb_lock_wait_timeout=50

innodb_file_per_table=on

innodb_undo_tablespaces=3

###***master-slave replication parameters

    server-id=1 #主节点为1,slave节点配置为2,这是主从mysql配置中唯一不一样的地方。

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=4

slave-parallel-type=LOGICAL_CLOCK

slave-preserve-commit-order=1

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1


[mysqldump]

quick

max_allowed_packet=1024M


[myisamchk]

key_buffer=16M

sort_buffer_size=16M

read_buffer=8M

write_buffer=8M


[mysqld_safe]

open-files-limit=8192

log-error=/data/mysql/log/error.log

pid-file=/data/mysql/log/mysqld.pid


  •  启动主从mysql:       

/data/mysql/bin/mysqld_safe --defaults-
file=/data/mysql/conf/my.cnf  &


  • 主从初始化及启动方式一样。

3.  配置mysql主从

  • 主库操作:登陆mysql:

/data/mysql/bin/mysql -uroot

mysql>
update mysql.user set authentication_string=password(*) where user=root;

mysql>
flush privileges;

mysql>
grant replication slave on *.* to repl@% identified by ****;

  • 从库操作:登陆mysql:

/data/mysql/bin/mysql -uroot

mysql>
change master to master_host=主库ip,master_user=repl,master_port=3306,master_password=Rep
2018#,master_auto_position=1;
mysql>start slave;



4.  配置mysql双主

  • 从库操作:

mysql>grant replication slave on *.* to repl@% identified 
by ****;
  • 主库操作:

mysql>change master to master_host=从库ip,master_user=repl,master_port=3306,master_password=Rep
2018#,master_auto_position=1;
mysql>
start slave;


5.  测试双主同步

  • db1操作:

    a. 登陆数据库

    Create database if not exists dbname;

    b. 查看db2是否已通过过来dbname。

  • db2操作:

    a. 登陆数据库

    use dbname

    create table tablename (id int(11),name varchar(25) );

    b. 查看db1是否已同步过来tablename。


八、总结

至此一个实现高可用反向代理集群即安装完成,简单的架构如上图所示;

  • nginx主要实现高可用反向代理负载均衡功能;

  • web服务多机主要提高程序的的并发处理能力及避免单点故障;

  • redis做缓存数据库可以缓存不怎么修改的配置信息或序列计数等信息提高程序的处理效率;

  • mysql主从主要就是存储数据并保障主从读写分离机failover自动切换避免单点故障。




END



更多精彩干货分享

点击下方名片关注

IT那活儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129755.html

相关文章

  • 明与暗角力!开源云平台中的拼图“玩具”

    摘要:开源云平台中的拼图玩具对于云平台,如今基本就意味着开源。明与暗角力开源云平台中的拼图玩具为什么会产生这种混淆正如之前谈到由两大部分组成和的计算引擎。 开源云平台中的拼图玩具 对于云平台,如今基本就意味着开源。提及开源技术,着实在云计算和大数据下火起来。面对扑面而来的云服务,无论是何种服务对于企业和用户来说都是熟悉的陌生人,熟悉是因为知道云计算的人都能说出IaaS、PaaS和SaaS这几个词,...

    1treeS 评论0 收藏0
  • LinuxCon+ContainerCon+CloudOpen首次来华,国际开源盛会不容错过!

    摘要:月日,国家会议中心,由主办的合称将强势登陆北京这是首次来华,在这场三合一的开源技术盛会中,来自国内外的开发人员架构师系统管理员专家商业领袖等数千名专业人士将汇聚一堂。后被收购,梁胜出任云平台首席技术官,也成为首位华人。 6月19-20日,国家会议中心,由The Linux Foundation主办的LinuxCon + ContainerCon + CloudOpen (合称LC3) ...

    Corwien 评论0 收藏0
  • 斌哥的 Docker 进阶指南—监控方案的实现

    摘要:本文转自刘斌博文如何选择监控方案,文中刘斌从技术的角度深入解释了监控的数据采集原理,介绍了现有开源的监控方案,以及能够对进行监控功能的主流服务工具。下一章,刘斌将为大家介绍监控的开原方案,主流服务,及其特点。 过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减。另一...

    X_AirDu 评论0 收藏0
  • 云计算开源下半场:运营商成主力 独享两大优势

    摘要:而随着云计算成为转型的重要技术支撑,云计算开源也进入了下半场。房秉毅表示,在这个转型过程中,云计算显然为运营商的转型和新业务发展提供了极大的机会。但在房秉毅看来,从传统向转型的时候,尤其在云计算方面,运营商拥有两大独特优势。近年来,在云计算领域,开源技术呈现爆发式的增长,像OpenStack、KVM等已经成为云计算领域非常主流的开源应用。借用云计算领域的主流看法,这个过程就是云计算开源战场的...

    niceforbear 评论0 收藏0
  • 一个程序员的正版清单

    摘要:有部分前端人员使用的是盗版的。非编程相关其它一些我使用的,但与编程关系不大的正版工具。尊重别人,更是尊重自己做为一个程序员,使用正版,我认为这不是自做清高的事情,这是对自己职业的一种基本尊重。 ...

    wudengzan 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<