基础环境搭建整理
集群:顾名思义就是好多的组件去做一件事情。
分布式:好多的组件互相耦合关联去做一件事情。
1. docker安装
# 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新并安装Docker-CE
yum makecache fast
yum -y install docker-ce
# 开启Docker服务并设置开机自启
systemctl start docker
systemctl enable docker
# 设置全局docker日志文件大小及个数、镜像加速器
nano /etc/docker/daemon.json
# 复制以下内容保存
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "1"
},
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# 重启docker
systemctl restart docker
# 安装docker基础镜像
docker pull anapsix/alpine-java:latest
2. MySQL
# 拉取MySQL镜像
docker pull mysql:8.0.16
# 挂载本地目录
mkdir /data/mydocker/mysql/mysql80/conf -p
# 创建配置文件(my.conf)并复制以下内容
nano /data/mydocker/mysql/mysql80/conf/my.cnf
[mysqld]
user=mysql
lower_case_table_names=1
max_connections=5000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
# 运行镜像
docker run -it -p 3306:3306 --name mysql80 --restart=always --privileged=true -v /etc/localtime:/etc/localtime:ro -v /data/docker/mysql80/data:/var/lib/mysql -v /data/docker/mysql80/conf/my.cnf:/etc/mysql/my.cnf -v /data/docker/mysql80/mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=root mysql:8.0.26 --lower_case_table_names=1
# 进入MySQL容器
docker exec -it mysql80 /bin/bash
# 进入MySQL服务
mysql -uroot -proot
# 修改root登录权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
# 或者
grant all privileges on *.* to 'root'@'%' identified by 'ptac2020' with grant option;
FLUSH PRIVILEGES;
3. nginx
# 拉取nginx镜像
docker pull nginx:latest
# 创建本地挂载目录
mkdir /data/docker/nginx/html /data/docker/nginx/conf /data/docker/nginx/logs /data/docker/nginx/conf.d -p
# 创建配置文件(nginx.conf),复制以下内容保存
nano /data/docker/nginx/conf/nginx.conf
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
proxy_buffer_size 128k;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 创建配置文件(default.conf),复制以下内容保存
nano /data/docker/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
client_max_body_size 100m;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_store off;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE;
add_header Access-Control-Allow-Credentials true;
if ($request_method = 'OPTIONS') {
return 204;
}
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 运行镜像
docker run -it -p 80:80 --name nginx --restart=always --privileged=true -v /etc/localtime:/etc/localtime:ro -v /data/docker/nginx/html:/usr/share/nginx/html -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/docker/nginx/conf.d:/etc/nginx/conf.d -v /data/docker/nginx/logs:/var/log/nginx -d nginx:latest
4. jdk环境
# 创建jdk安装目录
mkdir -p /usr/local/src/jdk
# 查看安装程序
rpm -qa | grep -i jdk
# 命令下载jdk包
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
# 解压
tar -zxvf jdk-8u131-linux-x64.tar.gz -C /usr/local/src/jdk/
# 配置环境变量
nano /etc/profile
# 添加到最底层
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_131
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 让配置文件生效
source /etc/profile
5. nodeJs
# 下载nodeJs源码包
wget http://nodejs.org/dist/latest/node-v10.11.0-linux-x64.tar.gz
# 解压
tar xf node-v5.10.1-linux-x64.tar.gz -C /usr/local/
# 移动
mv /usr/local/node-v5.10.1-linux-x64/ /usr/local/nodejs
# 软连接
ln -s /usr/local/nodejs/bin/node /usr/local/bin
ln -s /usr/local/nodejs/bin/npm /usr/local/bin
5. ES及ik分词器
# 设置max_map_count不能启动es会启动不起来
sysctl -w vm.max_map_count=262144
#拉取镜像
docker pull elasticsearch:7.7.0
#启动镜像
docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0
# 修改docker中elasticsearch的elasticsearch.yml文件
docker exec -it elasticsearch /bin/bash (进不去使用容器id进入)
vi config/elasticsearch.yml
# 在最下面添加2行
http.cors.enabled: true
http.cors.allow-origin: "*"
# 安装ik分词器 下载地址
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip
# 将分词器安装进容器中
#将压缩包移动到容器中
docker cp /tmp/elasticsearch-analysis-ik-7.7.0.zip elasticsearch:/usr/share/elasticsearch/plugins
#进入容器
docker exec -it elasticsearch /bin/bash
#创建目录
mkdir /usr/share/elasticsearch/plugins/ik
#将文件压缩包移动到ik中
mv /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.7.0.zip /usr/share/elasticsearch/plugins/ik
#进入目录
cd /usr/share/elasticsearch/plugins/ik
#解压
unzip elasticsearch-analysis-ik-7.7.0.zip
#删除压缩包
rm -rf elasticsearch-analysis-ik-7.7.0.zip
# 退出并重启镜像
exit
docker restart 容器id
7. php环境
MediaWiki 1.36 requires PHP 7.3.19 or higher; you are using PHP 7.1.30.
docker pull php:7.4-fpm
# 新建几个文件夹,分别用来映射:网站根目录、nginx配置文件、日志文件
mkdir -p /data/nginx/www /data/nginx/logs /data/nginx/conf
# 在新建的www目录中新建:index.php用来检测php环境是否搭建成功:
<?php
phpinfo();
?>
# 在nginx配置文件目录conf下新建:test-php.conf,后缀是.conf即可:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}
# 实例化php
docker run --name myphp7 -v /data/nginx/www:/www -d php:7.4-fpm
# 实例化nginx
docker run --name php-nginx -p 80:80 -v /data/nginx/www:/usr/share/nginx/html -v /data/nginx/conf:/etc/nginx/conf.d --link myphp7:php -d nginx
8. activemq
docker run --name='activemq' -itd -p 8161:8161 -p 61616:61616 -e ACTIVEMQ_ADMIN_LOGIN=admin -e ACTIVEMQ_ADMIN_PASSWORD=ptac2020 --restart=always -v /home/mydocker/activemq:/data/activemq -v /home/mydocker/activemq/log:/var/log/activemq webcenter/activemq:latest
9. redis哨兵模式
哨兵模式需要在redis主从前提下配置(使用53、54、55服务器为例):
- 主从密码需要一致
- Docker 服务名称(名称不能一样)
10.8.4.53(master)
# 创建挂载目录
mkdir /data/docker/redis/sentinel/conf/ data/docker/redis/data50/ /data/docker/redis/conf/ /data/docker/redis/sentinel/data50/ -p
# 创建redis配置文件
nano /data/docker/redis/conf/redis.conf
logfile "redis.log"
masterauth ptac2020
# 运行镜像
docker run -it --name redis-master --restart=always -v /etc/localtime:/etc/localtime:ro -p 6379:6379 -v /data/docker/redis/data50:/data -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0 /etc/redis/redis.conf --requirepass "ptac2020" --appendonly yes
# 创建哨兵配置文件
nano /data/docker/reids/sentinel/sentinel.conf
port 26379
dir "/data"
logfile "sentinel.log"
sentinel monitor redis-master 10.8.4.53 6379 1
sentinel down-after-milliseconds redis-master 10000
sentinel failover-timeout redis-master 60000
sentinel auth-pass redis-master ptac2020
# 运行sentinel镜像
docker run -it --name sentinel-master -p 26379:26379 -v /etc/localtime:/etc/localtime:ro --restart=always --privileged=true -v /data/docker/redis/sentinel/conf/sentinel.conf:/etc/redis/sentinel.conf -v /data/docker/redis/sentinel/data50:/data -d redis:5.0 redis-sentinel /etc/redis/sentinel.conf
10.8.4.54(slave)
# 创建挂载目录
mkdir /data/docker/redis/sentinel/conf/ data/docker/redis/data50/ /data/docker/redis/conf/ /data/docker/redis/sentinel/data50/ -p
# 创建redis配置文件
nano /data/docker/redis/conf/redis.conf
logfile "redis.log"
masterauth ptac2020
# 运行镜像
docker run -it --name redis-slave-1 --restart=always -v /etc/localtime:/etc/localtime:ro -p 6379:6379 -v /data/docker/redis/data50:/data -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0 /etc/redis/redis.conf --requirepass "ptac2020" --appendonly yes
# 进入redis镜像
docker exec -it redis-slave-1 redis-cli
# 输入密码
auth ptac2020
# 设置从服务
slaveof 10.8.4.53 6379
# 退出镜像
# 创建哨兵配置文件
nano /data/docker/reids/sentinel/sentinel.conf
port 26379
dir "/data"
logfile "sentinel.log"
sentinel monitor redis-slave-1 10.8.4.53 6379 1
sentinel down-after-milliseconds redis-slave-1 10000
sentinel failover-timeout redis-slave-1 60000
sentinel auth-pass redis-slave-1 ptac2020
# 运行sentinel镜像
docker run -it --name sentinel-slave-1 -p 26379:26379 -v /etc/localtime:/etc/localtime:ro --restart=always --privileged=true -v /data/docker/redis/sentinel/conf/sentinel.conf:/etc/redis/sentinel.conf -v /data/docker/redis/sentinel/data50:/data -d redis:5.0 redis-sentinel /etc/redis/sentinel.conf
10.8.4.55(slave)
# 创建挂载目录
mkdir /data/docker/redis/sentinel/conf/ data/docker/redis/data50/ /data/docker/redis/conf/ /data/docker/redis/sentinel/data50/ -p
# 创建redis配置文件
nano /data/docker/redis/conf/redis.conf
logfile "redis.log"
masterauth ptac2020
# 运行镜像
docker run -it --name redis-slave-2 --restart=always -v /etc/localtime:/etc/localtime:ro -p 6379:6379 -v /data/docker/redis/data50:/data -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0 /etc/redis/redis.conf --requirepass "ptac2020" --appendonly yes
# 进入redis镜像
docker exec -it redis-slave-2 redis-cli
# 输入密码
auth ptac2020
# 设置从服务
slaveof 10.8.4.53 6379
# 退出镜像
# 创建哨兵配置文件
nano /data/docker/reids/sentinel/sentinel.conf
port 26379
dir "/data"
logfile "sentinel.log"
sentinel monitor redis-slave-2 10.8.4.53 6379 1
sentinel down-after-milliseconds redis-slave-2 10000
sentinel failover-timeout redis-slave-2 60000
sentinel auth-pass redis-slave-2 ptac2020
# 运行sentinel镜像
docker run -it --name sentinel-slave-2 -p 26379:26379 -v /etc/localtime:/etc/localtime:ro --restart=always --privileged=true -v /data/docker/redis/sentinel/conf/sentinel.conf:/etc/redis/sentinel.conf -v /data/docker/redis/sentinel/data50:/data -d redis:5.0 redis-sentinel /etc/redis/sentinel.conf
10. MySQL双机热备
Mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份的数据库中。实现mysql数据库的热备份。
10.1 配置主服务器(Master)
- my.cnf(master)
[mysqld]
## 设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
- docker镜像(master)
docker run -it -p 3306:3306 --name mysql80-master --restart=always --privileged=true -v /etc/localtime:/etc/localtime:ro -v /data/docker/mysql80-master/data:/var/lib/mysql -v /data/docker/mysql80-master/conf/my.cnf:/etc/mysql/my.cnf -v /data/docker/mysql80-master/mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=ptac2020 mysql:8.0.16 --lower_case_table_names=1
- 进入容器,这里主要是要授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限。
CREATE USER 'slave'@'%' IDENTIFIED BY 'ptac2020';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
10.2 配置从服务器(Slave)
- my.cnf(slave)
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
- docker镜像(slave)
docker run -it -p 3306:3306 --name mysql80-slave --restart=always --privileged=true -v /etc/localtime:/etc/localtime:ro -v /data/docker/mysql80-slave/data:/var/lib/mysql -v /data/docker/mysql80-slave/conf/my.cnf:/etc/mysql/my.cnf -v /data/docker/mysql80-slave/mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=ptac2020 mysql:8.0.16 --lower_case_table_names=1
10.3 完成Master和Slave链接
注意,需要保证 Master 和 Slave 除了不同步的数据库,其他数据库的数据要一致。
在 Master 进入 MySQL, 然后执行命令:
show master status;
记录下 File 和 Position 字段的值,后面会用到。
然后到 Slave 中进入 mysql,执行命令:
change master to master_host='10.8.4.53', master_user='slave', master_password='ptac2020', master_port=3306, master_log_file='edu-mysql-bin.000003', master_log_pos=710, master_connect_retry=30;
并且salve机器也需要绑定对应的slave用户。
CREATE USER 'slave'@'%' IDENTIFIED BY 'ptac2020';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
命令解释:
master_host: Master 的IP地址
master_user: 在 Master 中授权的用于数据同步的用户
master_password: 同步数据的用户的密码
master_port: Master 的数据库的端口号
master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
执行以下命令,开始开启主从同步:
start slave;
在 Slave 的 MySQL 终端执行查看主从同步状态
show slave status \G
SlaveIORunning 和 SlaveSQLRunning 是No,表明 Slave 还没有开始复制过程。相反 SlaveIORunning 和 SlaveSQLRunning 是Yes表明已经开始工作了,因为我已经运行过了,所以我的显示的都是 Yes。
11. RabbitMQ集群
11.1 rabbitmq安装
-
文件上传,上传到/usr/local/software目录下
-
安装文件(按照以下顺序执行)
-
rpm -ivh erlang-23.3.4.8-1.el7.x86_64.rpm yum install socat -y rpm -ivh rabbitmq-server-3.9.7-1.el7.noarch.rpm
-
-
常用命令
-
# 添加开机启动RabbitMQ服务 chkconfig rabbitmq-server on # 启动服务 /sbin/service rabbitmq-server start # 查看服务状态 /sbin/service rabbitmq-server status # 停止服务 /sbin/service rabbitmq-server stop
-
-
web界面插件
-
rabbitmq-plugins enable rabbitmq_management # 然后重新启动服务 /sbin/service rabbitmq-server restart # 初始化账户guest guest 192.168.17.130:15672
-
添加用户并设置权限
-
# 创建账号 rabbitmqctl add_user admin admin # 设置用户角色 rabbitmqctl set_user_tags admin administrator # 设置用户权限,用户admin具有/vhost1这个virtual host中所有资源的配置、写、读权限 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" # 当前用户和角色 rabbitmqctl list_users
-
11.2 集群搭建
11.2.1 搭建步骤
-
修改3台机器名称
-
nano /etc/hostname
-
-
配置各个节点的hosts文件,让各个节点都能互相识别对方
-
nano /etc/hosts 10.8.4.53 hx-lps-test-redis01 10.8.4.54 hx-lps-test-redis02 10.8.4.55 hx-lps-test-redis03
-
-
以确保各个节点的cookie文件使用的是同一个值
-
# 在main节点上执行远程操作命令 scp /var/lib/rabbitmq/.erlang.cookie root@hx-lps-test-redis02:/var/lib/rabbitmq/.erlang.cookie scp /var/lib/rabbitmq/.erlang.cookie root@hx-lps-test-redis03:/var/lib/rabbitmq/.erlang.cookie
-
-
启动RabbitMQ服务,顺带启动Erlang虚拟机和RabbitMQ应用服务(在三台节点上分别执行以下命令)
-
rabbitmq-server -detached
-
-
在节点2执行
-
rabbitmqctl stop_app # rabbitmqctl stop会将Erlang虚拟机关闭,rabbitmqctl stop_app只关闭RabbitMQ服务 rabbitmqctl reset rabbitmqctl join_cluster rabbit@hx-lps-test-redis01 # 只启动应用服务 rabbitmqctl start_app
-
-
在节点3执行
-
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@hx-lps-test-redis02 rabbitmqctl start_app
-
-
集群状态
-
rabbitmqctl cluster_status
-
-
需要重新设置用户
-
# 创建用户 rabbitmqctl add_user admin admin # 设置用户角色 rabbitmqctl set_user_tags admin administrator # 设置用户权限,用户admin具有/vhost1这个virtual host中所有资源的配置、写、读权限 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" # 当前用户和角色 rabbitmqctl list_users
-
-
解除集群节点(slave1和slave2机器分别执行)
-
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app rabbitmqctl cluster_status # main节点上执行 rabbitmqctl forget_cluster_node rabbit@hx-lps-test-redis02
-
11.3 镜像队列
如果RabbitMQ集群中只有一个Broker节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘并执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过publisherconfirm机制能够确保客户端知道哪些消息已经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用。
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker节点之上,如果集群中的一个节点失效了,队列能自动切换到镜像中的另一个节点上以确保服务的可用性。

11.4 高可用负载均衡-haproxy
HAProxy 官方下载地址为:www.haproxy.org/#down ,如果这个网站无法访问,也可以从 src.fedoraproject.org/repo/pkgs/h… 上进行下载。这里我下载的是 2.x 的版本,下载后进行解压:
wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.4.8.tar.gz/sha512/8e1d28191a8c26d46989359a213444f30a09e439d32b5ab6cb01a3ca267788fc7677dd14deaa43a7f6c7741cbf6c8fcf6cdd5cf927d23e48f82b9e7723d8a6f9/haproxy-2.4.8.tar.gz
# 解压
tar -zxvf haproxy-2.4.8.tar.gz haproxy2.4.8
# 进入解压后根目录,执行下面的编译命令:
make TARGET=linux-glibc PREFIX=/usr/local/haproxy2.4.8
make install PREFIX=/usr/local/haproxy2.4.8
make编译可能因环境出错:/bin/sh: cc: 未找到命令
yum install gcc-c++ -y # 如果yum出错,重新配置yum源 cd /etc/yum.repos.d/ # 删除所有文件: rm -f /etc/yum.repos.d/* # 重新下载阿里的 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清理缓存 yum clean all
- 配置环境变量
nano /etc/profile
export HAPROXY_HOME=/usr/local/haproxy2.4.8
export PATH=$PATH:$HAPROXY_HOME/sbin
# 使得配置的环境变量立即生效:
source /etc/profile
# 检查安装是否成功:
haproxy -v
# 负载均衡配置
# 创建目录
mkdir /etc/haproxy
# 编辑文件内容
nano /etc/haproxy/haproxy.cfg
- 文件内容如下:
# 全局配置
global
# 日志输出配置、所有日志都记录在本机,通过 local0 进行输出
log 127.0.0.1 local0 info
# 最大连接数
maxconn 4096
# 改变当前的工作目录
chroot /usr/local/haproxy2.4.8
# 以指定的 UID 运行 haproxy 进程
uid 99
# 以指定的 GID 运行 haproxy 进程
gid 99
# 以守护进行的方式运行
daemon
# 当前进程的 pid 文件存放位置
pidfile /usr/local/haproxy2.4.8/haproxy.pid
# 默认配置
defaults
# 应用全局的日志配置
log global
# 使用4层代理模式,7层代理模式则为"http"
mode tcp
# 日志类别
option tcplog
# 不记录健康检查的日志信息
option dontlognull
# 3次失败则认为服务不可用
retries 3
# 每个进程可用的最大连接数
maxconn 2000
# 连接超时
timeout connect 5s
# 客户端超时
timeout client 120s
# 服务端超时
timeout server 120s
# 绑定配置
listen rabbitmq_cluster
bind :5671
# 配置AMQP模式
mode tcp
# 采用加权轮询的机制进行负载均衡
balance roundrobin
# RabbitMQ 集群节点配置
server hx-lps-test-redis01 10.8.4.53:15672 check inter 5000 rise 2 fall 3 weight 1
server hx-lps-test-redis02 10.8.4.54:15672 check inter 5000 rise 2 fall 3 weight 1
server hx-lps-test-redis03 10.8.4.55:15672 check inter 5000 rise 2 fall 3 weight 1
# amqp绑定配置
listen rabbitmq_cluster2
bind :5673
# 配置TCP模式
mode amqp
# 采用加权轮询的机制进行负载均衡
balance roundrobin
# RabbitMQ 集群节点配置
server hx-lps-test-redis01 10.8.4.53:5672 check inter 5000 rise 2 fall 3 weight 1
server hx-lps-test-redis02 10.8.4.54:5672 check inter 5000 rise 2 fall 3 weight 1
server hx-lps-test-redis03 10.8.4.55:5672 check inter 5000 rise 2 fall 3 weight 1
# 配置监控页面
listen monitor
bind :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
- 启动服务
# 启动
haproxy -f /etc/haproxy/haproxy.cfg
# 查看运行
ps aux|grep haproxy
# 停止 没有killall命令, 安装yum -y install psmisc
killall haproxy
# 开启监控页面访问端口
firewall-cmd --zone=public --add-port=8100/tcp --permanent
systemctl restart firewalld.service
12. ElasticSearch集群
12.1 集群搭建
准备三台服务器:10.8.4.53、10.8.4.54、10.8.4.55
- 修改每台主机的内核参数vm.max_map_count
nano /etc/sysctl.conf
vm.max_map_count = 655350
# 然后执行
sysctl -p
docker pull elasticsearch:7.7.0
- 编辑docker-compose.yaml文件
version: '3'
services:
elasticsearch: # 服务名称
image: elasticsearch:7.7.0 # 使用的镜像
container_name: elasticsearch # 容器名称
restart: always # 失败自动重启策略
environment:
- node.name=es-node-53 # 节点名称,集群模式下每个节点名称唯一
- network.publish_host=10.8.4.53 # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
- network.host=0.0.0.0 # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
- discovery.seed_hosts=10.8.4.53,10.8.4.54,10.8.4.55 # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
- cluster.initial_master_nodes=es-node-53 # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master,否则会报master_not_discovered_exception
- cluster.name=es-cluster # 集群名称,相同名称为一个集群, 三个es节点须一致
- bootstrap.memory_lock=true # 内存交换的选项,官网建议为true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
ulimits: # 栈内存的上限
memlock:
soft: -1 # 不限制
hard: -1 # 不限制
# volumes:
# - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 将容器中es的配置文件映射到本地,设置跨域, 否则head插件无法连接该节点
# - ./data:/usr/share/elasticsearch/data # 存放数据的文件, 注意:这里的esdata为 顶级volumes下的一项。
ports:
- 9200:9200 # http端口,可以直接浏览器访问
- 9300:9300 # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
- 编辑elasticsearch.yml配置文件
network.host: 0.0.0.0
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # 表示支持所有域名
- 初次运行的时候,注释掉compose文件中的volume,需要先运行起来,然后将容器中的data目录cp到宿主机上,否则报错
# 启动elasticsearch镜像文件
docker-compose up -d
# 设置挂载目录
docker cp elasticsearch:/usr/share/elasticsearch/data .
# 关闭elasticsearch镜像
docker-compose down
# 然后将compose文件中的volume选项打开再启动即可完成
docker-compose up -d
- 访问web界面http://10.8.4.53:9200/_cluster/health?pretty
12.2 elasticsearch-head
#拉取镜像
docker pull mobz/elasticsearch-head:5
#创建容器
docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
#启动容器
docker start elasticsearch-head
-
浏览器打开:
http://IP:9100
-
ElasticSearch-head 操作时不修改配置,默认会报 406错误码
# 复制vendor.js到外部
docker cp elasticsearch-head:/usr/src/app/_site/vendor.js /usr/local/
# 修改vendor.js,nano中Ctrl+c可查看当前行号
nano /usr/local/vendor.js
# 6886行,将contentType: "application/x-www-form-urlencoded" 改为
contentType: "application/json;charset=UTF-8"
# 7574行,将var inspectData = s.contentType === "application/x-www-form-urlencoded" && 改为
var inspectData = s.contentType === "application/json;charset=UTF-8" &&
# 修改完成在复制回容器
docker cp /usr/local/vendor.js elasticsearch-head:/usr/src/app/_site
# 重启elasticsearch-head
docker restart elasticsearch-head
12.3 kibana
-
拉取镜像
-
docker pull kibana:7.5.1
-
-
配置文件 kibana.yml
-
mkdir -p /data/docker/kibana/config/ nano /data/docker/kibana/config/kibana.yml # # ** THIS IS AN AUTO-GENERATED FILE ** # # Default Kibana configuration for docker target server.name: kibana server.host: "0" elasticsearch.hosts: [ "http://10.8.4.53:9200","http://10.8.4.54:9200","http://10.8.4.55" ] xpack.monitoring.ui.container.elasticsearch.enabled: true
-
-
启动
-
docker run -d --name=kibana --restart=always -p 5601:5601 -v /data/docker/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.5.1
-
-
查看日志
-
docker logs -f kibana
-
-
访问页面
-
http://10.8.4.53:5601/
-
13. Svn服务器
13.1 garethflowers/svn-server版本
-
Docker下载Svn server
-
docker pull docker.io/garethflowers/svn-server
-
-
根据镜像生成容器
-
docker run -v /data/docker/svn:/var/opt/svn --name svn-server -p 3690:3690 --privileged=true -e SVN_REPONAME=repository -d docker.io/garethflowers/svn-server
-
-
进入容器容器进行配置
-
docker exec -t svn-server svnadmin create /var/opt/svn/axureHtmlRepository
-
-
备份项目仓库
-
docker exec -i svn-server-gf svnadmin dump proj1 > /backup/svn_bk20190506/proj_20190506.dump
-
-
SVN客户端测试连接,svn://192.168.17.130:proj1
-
修改项目仓库的配置svnserve.conf
-
cd /data/docker/svn/data/axureHtmlRepository/conf # 修改 svnserve.conf,以下是必要解注,并且保证配置前面没有空格等特殊字符 nano svnserve.conf anon-access = read auth-access = write password-db = passwd authz-db = authz
-
-
修改passwd
-
nano passwd [users] # harry = harryssecret # sally = sallyssecret wangyue = wangyue123 chenyutao = chenyutao123
-
-
修改authz
-
nano authz [groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe group1 = wangyue,chenyutao [axureHtmlRepository:/] @group1 = rw
-
-
配置完成后,重启镜像容器,安装svn 客户端,url为:svn://192.168.17.130/axureHtmlRepository
14. ftp服务器
14.1 docker搭建ftp服务器
# docker拉取ftp镜像
docker pull fauria/vsftpd
# 启动ftp服务器
docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /data/docker/nginx/html/upgrade:/home/vsftpd/root/upgrade -e FTP_USER=root -e FTP_PASS=ptac.cn -e PASV_ADDRESS=10.8.7.19 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
14.2 上传中文文件名乱码
解决不了编码问题,可通过ftp上传工具
# 更改服务器编码
vi /etc/profile
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
source /etc/profilelocale
- Dockerfile
打包jar
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
发布镜像
-
将Dockerfile和jar包放置同一文件夹;
-
docker build -t jar-test .
-
docker run -d -P 9000 --name dockerfile-test jar-test
15.mongoDB
version: '3'
services:
mongodb:
image: mongo:latest
container_name: mongo-yapi
restart: always
volumes:
- /data/docker/mongodb/db:/data/db
- /data/docker/mongodb/log:/var/log/mongodb
ports:
- 27018:27017
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
docker run -it --rm --link mongo-yapi:mongo --entrypoint npm --workdir /api/vendors registry.cn-hangzhou.aliyuncs.com/anoy/yapi run install-server