MySQL/Redis/Nginx 运维速查:安装、配置、高可用

25 阅读13分钟

目录

  1. MySQL安装(RPM/YUM/源码)
  2. MySQL基础操作(SQL/约束/数据类型)
  3. MySQL高级特性(索引/视图/存储引擎/锁/事务)
  4. MySQL备份恢复与主从复制
  5. MySQL高可用(MHA/读写分离)
  6. Redis(安装/指令/集群/持久化)
  7. Nginx(安装/虚拟主机/模块/优化)
  8. LNMP/Tomcat/动静分离
  9. 高可用组件(Keepalived/LVS/HAProxy)

1. MySQL安装(RPM/YUM/源码)

1.1 RPM包安装MySQL 5.7.37

# 卸载冲突的mariadb
rpm -e mariadb-libs --nodeps

# 按依赖顺序安装RPM包
rpm -ivh mysql-community-common-5.7.37-1.el7.x86_64.rpm    # 通用文件
rpm -ivh mysql-community-libs-5.7.37-1.el7.x86_64.rpm     # 客户端依赖库
rpm -ivh mysql-community-client-5.7.37-1.el7.x86_64.rpm   # 客户端工具
rpm -ivh mysql-community-server-5.7.37-1.el7.x86_64.rpm   # 服务端程序

# 启动服务并查看初始密码
systemctl start mysqld
cat /var/log/mysqld.log | grep password
mysql -uroot -p  # 输入初始密码登录

1.2 YUM安装MySQL

# 安装MySQL YUM源
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 安装服务端
yum -y install mysql-community-server

# 启动并获取初始密码(同RPM步骤)
systemctl start mysqld
cat /var/log/mysqld.log | grep password

1.3 源码安装MySQL 5.7.37

1.3.1 依赖安装

yum install -y cmake make gcc gcc-c++ openssl openssl-devel ncurses ncurses-devel bison bison-devel

1.3.2 编译安装

# 解压源码包
tar -zxf mysql-boost-5.7.37.tar.gz -C /usr/src/
cd /usr/src/mysql-5.7.37/

# 编译配置(单行执行)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/usr/local/mysql/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=ON \
-DWITH_MYISAM_STORAGE_ENGINE=ON \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_BOOST=boost/boost_1_59_0

# 编译安装(多核加速:make -j 4)
make && make install

1.3.3 初始化配置

# 创建用户和目录
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /usr/local/mysql/{data,etc,tmp,logs}
chown -R mysql:mysql /usr/local/mysql

# 初始化数据库
/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf --initialize --user=mysql

# 配置环境变量
echo 'export MYSQL_HOME=/usr/local/mysql' >> /etc/profile
echo 'export PATH=$MYSQL_HOME/bin:$PATH' >> /etc/profile
source /etc/profile

# 注册系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
systemctl daemon-reload
systemctl start mysql

2. MySQL基础操作(SQL/约束/数据类型)

2.1 DDL语句(创建/修改/删除)

-- 创建表
CREATE TABLE student (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT DEFAULT 0,
  gender CHAR(1) CHECK (gender IN ('M','F'))
);

-- 修改字段
ALTER TABLE student ADD score INT;
ALTER TABLE student MODIFY score DECIMAL(5,2);
ALTER TABLE student DROP COLUMN age;

-- 删除表
DROP TABLE IF EXISTS student;

2.2 DML语句(增/删/改)

-- 插入数据
INSERT INTO student (name, gender, score) VALUES 
('佩奇', 'F', 80),
('乔治', 'M', 60);

-- 修改数据
UPDATE student SET score = 85 WHERE name = '乔治';

-- 删除数据
DELETE FROM student WHERE score < 60;

2.3 约束条件

约束类型语法示例说明
主键id INT PRIMARY KEY非空+唯一,表中唯一标识
非空name VARCHAR(50) NOT NULL字段值不能为空
唯一phone VARCHAR(11) UNIQUE字段值唯一(可空)
默认值age INT DEFAULT 18未赋值时使用默认值
自增id INT AUTO_INCREMENT自动递增(仅INT类型)
外键CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class(id)关联另一张表的主键

2.4 数据类型

2.4.1 数值类型

类型占用字节范围(有符号)用途
TINYINT1-128~127状态标记(0/1)
INT4-2^31~2^31-1常规整数(ID/年龄)
FLOAT(M,D)4单精度浮点小数(精度要求低)
DECIMAL(M,D)可变高精度小数金额/百分比

2.4.2 字符串类型

类型最大长度特点
CHAR(M)255固定长度,查询快
VARCHAR(M)65535可变长度,省空间
TEXT65535长文本(文章/备注)

2.4.3 日期类型

类型格式用途
DATEYYYY-MM-DD日期(生日/订单日期)
DATETIMEYYYY-MM-DD HH:MM:SS日期+时间(创建时间)
TIMESTAMPYYYY-MM-DD HH:MM:SS时间戳(自动更新)

3. MySQL高级特性(索引/视图/存储引擎/锁/事务)

3.1 索引

3.1.1 创建索引

-- 单列索引
CREATE INDEX idx_name ON student(name);

-- 组合索引
CREATE INDEX idx_name_age ON student(name, age);

-- 唯一索引
CREATE UNIQUE INDEX idx_phone ON student(phone);

-- 全文索引(仅MyISAM)
CREATE FULLTEXT INDEX idx_content ON article(content);

3.1.2 索引管理

-- 查看索引
SHOW INDEX FROM student\G;

-- 删除索引
DROP INDEX idx_name ON student;

-- 修改索引(先删后建)
ALTER TABLE student DROP INDEX idx_age;
ALTER TABLE student ADD INDEX idx_age(age);

3.1.3 索引设计原则

  1. 高频查询字段优先建索引
  2. 避免过度索引(增删改性能下降)
  3. 联合索引遵循“最左匹配原则”
  4. 小表/低基数字段(如性别)不建索引

3.2 视图

-- 创建视图
CREATE VIEW v_student_class AS
SELECT s.name, c.name AS class_name 
FROM student s 
JOIN class c ON s.class_id = c.id;

-- 使用视图
SELECT * FROM v_student_class WHERE class_name = '月亮班';

-- 修改视图
ALTER VIEW v_student_class AS
SELECT s.name, c.name AS class_name, s.score 
FROM student s 
JOIN class c ON s.class_id = c.id;

-- 删除视图
DROP VIEW IF EXISTS v_student_class;

3.3 存储引擎

3.3.1 常用引擎对比

特性InnoDBMyISAM
事务支持
行级锁❌(表锁)
外键
全文索引❌(5.6+支持)
缓存数据+索引仅索引
崩溃恢复

3.3.2 修改存储引擎

-- 创建表时指定
CREATE TABLE test (id INT) ENGINE=MyISAM;

-- 已存在表修改
ALTER TABLE test ENGINE=InnoDB;

-- 查看引擎
SHOW TABLE STATUS LIKE 'test'\G;

3.4 锁与事务

3.4.1 事务ACID特性

  • 原子性(A):要么全执行,要么全回滚
  • 一致性(C):事务前后数据完整性不变
  • 隔离性(I):事务之间相互隔离
  • 持久性(D):事务提交后数据永久保存

3.4.2 事务操作

-- 开启事务
START TRANSACTION;

-- 执行操作
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;

-- 提交/回滚
COMMIT;  -- 提交
-- ROLLBACK;  -- 回滚

-- 保存点
SAVEPOINT sp1;
ROLLBACK TO sp1;

3.4.3 事务隔离级别

-- 查看当前隔离级别
SELECT @@tx_isolation;

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
隔离级别脏读不可重复读幻读
读未提交
读提交
可重复读
串行化

4. MySQL备份恢复与主从复制

4.1 备份类型

类型特点工具
全量备份备份所有数据,恢复快mysqldump/物理拷贝
增量备份备份新增数据,备份快binlog
差异备份备份全量后新增数据mysqldump + binlog

4.2 备份命令

# 全量备份
mysqldump -uroot -p --all-databases > all_dbs.sql

# 单库备份
mysqldump -uroot -p school > school.sql

# 单表备份
mysqldump -uroot -p school student > student.sql

# 仅备份表结构
mysqldump -uroot -p -d school student > student_struct.sql

4.3 恢复命令

# 全量恢复
mysql -uroot -p < all_dbs.sql

# 单库恢复
mysql -uroot -p school < school.sql

# 基于binlog恢复
mysqlbinlog --start-position=107 --stop-position=453 /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p

4.4 主从复制(一主一从)

4.4.1 主库配置

# /etc/my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = school  # 仅同步school库
-- 授权从库用户
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

-- 查看主库状态
SHOW MASTER STATUS\G;  -- 记录File和Position

4.4.2 从库配置

# /etc/my.cnf
[mysqld]
server-id = 2
relay-log = relay-log-bin
relay-log-purge = 0
-- 配置主从同步
CHANGE MASTER TO 
MASTER_HOST='192.168.1.10',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

-- 启动同步并查看状态
START SLAVE;
SHOW SLAVE STATUS\G;  -- 确保Slave_IO_Running和Slave_SQL_Running均为Yes

5. MySQL高可用(MHA/读写分离)

5.1 MHA(主从自动切换)

5.1.1 安装MHA

# 所有节点安装依赖
yum -y install perl-DBD-mysql perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager

# 管理节点安装MHA Manager
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

# 数据节点安装MHA Node
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

5.1.2 配置MHA

# /etc/mha/mha.cnf
[server default]
user = root
password = 123456
ssh_user = root
repl_user = slave
repl_password = 123456
ping_interval = 1
manager_workdir = /var/log/mha
manager_log = /var/log/mha/manager.log

[server1]
hostname = 192.168.1.10
port = 3306

[server2]
hostname = 192.168.1.20
port = 3306
candidate_master = 1

[server3]
hostname = 192.168.1.30
port = 3306
no_master = 1

5.1.3 启动MHA

# 检查SSH免密登录
masterha_check_ssh --conf=/etc/mha/mha.cnf

# 检查主从复制
masterha_check_repl --conf=/etc/mha/mha.cnf

# 启动MHA管理器
masterha_manager --conf=/etc/mha/mha.cnf

5.2 读写分离(MyCAT)

5.2.1 安装MyCAT

# 安装JDK
tar -zxf jdk-8u131-linux-x64.tar.gz -C /usr/local/
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_131' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile

# 安装MyCAT
tar -zxf MyCAT-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/
echo 'export MYCAT_HOME=/usr/local/mycat' >> /etc/profile
echo 'export PATH=$MYCAT_HOME/bin:$PATH' >> /etc/profile
source /etc/profile

5.2.2 配置MyCAT

<!-- /usr/local/mycat/conf/schema.xml -->
<schema name="school" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="dthost" database="school"></dataNode>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
  <heartbeat>select user()</heartbeat>
  <writeHost host="master" url="192.168.1.10:3306" user="mycat" password="123456"></writeHost>
  <writeHost host="slave" url="192.168.1.20:3306" user="mycat" password="123456"></writeHost>
</dataHost>
<!-- /usr/local/mycat/conf/server.xml -->
<user name="root">
  <property name="password">123456</property>
  <property name="schemas">school</property>
</user>
<user name="readuser">
  <property name="password">123456</property>
  <property name="schemas">school</property>
  <property name="readOnly">true</property>
</user>

5.2.3 启动MyCAT

mycat start
# 测试连接
mysql -uroot -p123456 -h 127.0.0.1 -P 8066

6. Redis(安装/指令/集群/持久化)

6.1 安装Redis

# 依赖安装
yum install -y gcc tcl

# 编译安装
tar -zxf redis-6.2.6.tar.gz -C /usr/src/
cd /usr/src/redis-6.2.6/
make && make install

# 启动Redis
redis-server &  # 前台启动
redis-server /etc/redis.conf &  # 配置文件启动
redis-cli  # 客户端连接

6.2 常用指令

指令功能示例
SET设置键值对SET name "佩奇"
GET获取值GET name
MSET批量设置MSET age 6 gender F
MGET批量获取MGET name age
DEL删除键DEL age
KEYS匹配键KEYS *
EXPIRE设置过期时间EXPIRE name 60
TTL查看过期时间TTL name
FLUSHDB清空当前库FLUSHDB
FLUSHALL清空所有库FLUSHALL

6.3 集群部署

6.3.1 主从复制

# 从库执行
redis-cli SLAVEOF 192.168.1.10 6379

# 取消主从
redis-cli SLAVEOF NO ONE

6.3.2 哨兵模式(Sentinel)

# sentinel.conf
port 26379
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
# 启动哨兵
redis-sentinel sentinel.conf &

6.3.3 集群模式(Cluster)

# 创建集群(3主3从)
redis-cli --cluster create 192.168.1.10:6379 192.168.1.20:6379 192.168.1.30:6379 192.168.1.40:6379 192.168.1.50:6379 192.168.1.60:6379 --cluster-replicas 1

# 连接集群
redis-cli -c -h 192.168.1.10 -p 6379

6.4 持久化

6.4.1 RDB(快照)

# redis.conf
save 900 1  # 900秒内1次修改触发快照
save 300 10 # 300秒内10次修改触发快照
save 60 10000 # 60秒内10000次修改触发快照
dbfilename dump.rdb  # 快照文件名
dir /var/lib/redis  # 存储目录

6.4.2 AOF(追加日志)

# redis.conf
appendonly yes  # 开启AOF
appendfilename "appendonly.aof"  # AOF文件名
appendfsync everysec  # 每秒同步一次

7. Nginx(安装/虚拟主机/模块/优化)

7.1 安装Nginx

# 依赖安装
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 编译安装
tar -zxf nginx-1.20.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.20.2/
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

# 启动Nginx
/usr/local/nginx/sbin/nginx
# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
# 停止Nginx
/usr/local/nginx/sbin/nginx -s stop

7.2 虚拟主机

7.2.1 基于域名

# /usr/local/nginx/conf/nginx.conf
server {
    listen 80;
    server_name www.kgc.com;
    root /usr/local/nginx/html/kgc;
    index index.html index.htm;
}

server {
    listen 80;
    server_name www.taobao.com;
    root /usr/local/nginx/html/taobao;
    index index.html index.htm;
}

7.2.2 基于端口

server {
    listen 80;
    server_name www.kgc.com;
    root /usr/local/nginx/html/kgc80;
    index index.html index.htm;
}

server {
    listen 8080;
    server_name www.kgc.com;
    root /usr/local/nginx/html/kgc8080;
    index index.html index.htm;
}

7.2.3 基于IP

server {
    listen 192.168.1.10:80;
    server_name www.kgc.com;
    root /usr/local/nginx/html/ip10;
    index index.html index.htm;
}

server {
    listen 192.168.1.20:80;
    server_name www.kgc.com;
    root /usr/local/nginx/html/ip20;
    index index.html index.htm;
}

7.3 核心模块

7.3.1 状态监控(stub_status)

location /status {
    stub_status on;
    allow 192.168.1.0/24;
    deny all;
}

7.3.2 HTTPS(ssl_module)

# 生成证书
openssl genrsa -out /usr/local/nginx/conf/server.key 2048
openssl req -new -key /usr/local/nginx/conf/server.key -out /usr/local/nginx/conf/server.csr
openssl x509 -req -days 365 -in /usr/local/nginx/conf/server.csr -signkey /usr/local/nginx/conf/server.key -out /usr/local/nginx/conf/server.crt
server {
    listen 443 ssl;
    server_name www.kgc.com;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    root /usr/local/nginx/html/kgc;
    index index.html index.htm;
}

7.3.3 负载均衡(upstream)

upstream tomcat_servers {
    server 192.168.1.10:8080 weight=1;
    server 192.168.1.20:8080 weight=1;
}

server {
    listen 80;
    server_name www.kgc.com;
    location / {
        proxy_pass http://tomcat_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

7.4 性能优化

# 全局优化
worker_processes auto;  # 等于CPU核心数
worker_cpu_affinity auto;  # CPU亲和
worker_rlimit_nofile 65535;  # 文件句柄限制

# 事件模块
events {
    use epoll;  # 事件模型
    worker_connections 65535;  # 单进程最大连接数
}

# HTTP模块
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;  # 高效文件传输
    tcp_nopush      on;  # 减少网络报文段
    keepalive_timeout  65;  # 长连接超时

    # Gzip压缩
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 32k;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 内核参数优化(/etc/sysctl.conf)
    # net.core.somaxconn = 65535
    # net.ipv4.tcp_tw_reuse = 1
    # net.ipv4.tcp_tw_recycle = 1
}

8. LNMP/Tomcat/动静分离

8.1 LNMP部署

8.1.1 安装PHP

# 依赖安装
yum install -y gd libxml2-devel libjpeg-devel libpng-devel

# 编译安装
tar -zxf php-7.4.33.tar.gz -C /usr/src/
cd /usr/src/php-7.4.33/
./configure --prefix=/usr/local/php --with-mysqli --with-pdo-mysql --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-fpm --enable-mbstring --enable-zip --enable-exif --disable-ipv6
make && make install

# 配置PHP-FPM
cp php.ini-production /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/
systemctl start php-fpm
systemctl enable php-fpm

8.1.2 整合Nginx与PHP

# /usr/local/nginx/conf/nginx.conf
server {
    listen 80;
    server_name www.kgc.com;
    root /usr/local/nginx/html;
    index index.html index.php;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

8.2 Tomcat部署

# 安装JDK
tar -zxf jdk-8u131-linux-x64.tar.gz -C /usr/local/
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_131' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile

# 安装Tomcat
tar -zxf apache-tomcat-8.5.82.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-8.5.82 /usr/local/tomcat

# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
# 停止Tomcat
/usr/local/tomcat/bin/shutdown.sh

8.3 动静分离

# Nginx配置
upstream php_servers {
    server 192.168.1.20:80;
}

upstream tomcat_servers {
    server 192.168.1.30:8080;
}

server {
    listen 80;
    server_name www.kgc.com;
    root /usr/local/nginx/html;
    index index.html index.php index.jsp;

    # 静态文件(Nginx直接处理)
    location ~ \.(html|css|js|png|jpg|gif)$ {
        expires 30d;
    }

    # PHP动态请求(转发到PHP-FPM)
    location ~ \.php$ {
        proxy_pass http://php_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # JSP动态请求(转发到Tomcat)
    location ~ \.jsp$ {
        proxy_pass http://tomcat_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

9. 高可用组件(Keepalived/LVS/HAProxy)

9.1 Keepalived

9.1.1 主从模式

# 主节点 /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_MASTER
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
}
# 从节点 /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
}
# 启动Keepalived
systemctl start keepalived
systemctl enable keepalived

9.1.2 双主模式

# 节点1
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.101
    }
}
# 节点2
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.101
    }
}

9.2 LVS

9.2.1 DR模式

# 调度器配置
modprobe ip_vs
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 配置VIP
ip addr add 192.168.1.100/24 dev ens33:0

# 配置LVS规则
ipvsadm -C
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -g
ipvsadm -save > /etc/sysconfig/ipvsadm
# 真实服务器配置
ip addr add 192.168.1.100/32 dev lo:0
route add -host 192.168.1.100 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

9.2.2 NAT模式

# 调度器配置
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.20:80 -m
ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.30:80 -m

9.3 HAProxy

9.3.1 安装HAProxy

yum install -y gcc pcre-devel zlib-devel
tar -zxf haproxy-2.4.20.tar.gz -C /usr/src/
cd /usr/src/haproxy-2.4.20/
make TARGET=linux-glibc PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

9.3.2 配置HAProxy

# /usr/local/haproxy/conf/haproxy.cfg
global
    log 127.0.0.1 local0
    maxconn 4096
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    retries 3
    maxconn 2000
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance roundrobin
    server web1 192.168.1.20:80 check inter 2000 fall 3
    server web2 192.168.1.30:80 check inter 2000 fall 3
# 启动HAProxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

总结

  1. MySQL:支持多方式安装(RPM/YUM/源码),核心关注索引、事务、主从复制和高可用(MHA/读写分离);
  2. Nginx:高性能Web服务器,支持虚拟主机、负载均衡、动静分离,需结合PHP/Tomcat实现动态请求处理;
  3. 高可用:Keepalived实现VIP漂移,LVS/HAProxy实现负载均衡,三者结合可构建高可用集群架构;
  4. Redis:内存数据库,支持主从/哨兵/集群模式,持久化(RDB/AOF)保证数据不丢失;
  5. LNMP/Tomcat:LNMP处理PHP动态请求,Tomcat处理JSP动态请求,Nginx负责静态资源和请求转发。