linux服务器管理——高可用电商项目系统部署方案
高可用电商项目系统部署方案报告
前言
liunx服务器管理 B站地址:https://www.bilibili.com/video/BV1KY4y1z73K?p=4&spm_id_from=pageDriver 视频中肯定是有一些问题的,敬请指正,谢谢
[摘 要]
为某电商项目搭建高可用的部署方案,其中使用到lvs的dr模式负载均衡为主体,运用mysql集群和GlusterFS集群结合keepalived保证商品图片和视频的文件服务和防止意外发生,满足日浏览量200万和成交10万单的业务量
[关键词]
lvs负载均衡,mysql双主双从,高可用企业电商部署方案,GlusterFS分布式文件系统集群,keepalived
环境
环境 | 版本 |
---|
centos | 7.9 | nginx | 1.2.6 | GlusterFS | 6.0+ | Mysql | 5.7 |
(表一为环境版本对应表)
拓扑图
完整拓扑图
(图一为详细系统拓扑图)
机器 | ip地址 | VIP | GW |
---|
router | 210.202.135.1,10.0.0.200 | | 192.168.112.1 | lvs1 | 10.0.0.10 | 10.0.0.100 | 10.0.0.200 | lvs2 | 10.0.0.11 | 10.0.0.100 | 10.0.0.200 | rs1 | 10.0.0.15 | | 10.0.0.200 | rs2 | 10.0.0.16 | | 10.0.0.200 | rs3 | 10.0.0.17 | | 10.0.0.200 | rs4 | 10.0.0.18 | | 10.0.0.200 |
(表二为详细系统拓扑对应表)
准备工作
必要安装和操作
我们需要在centos7上安装ipvsadm和keepalived,并且关闭防火墙
yum -y install ipvsadm keepalived
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
克隆
(图二为centos7克隆位置图)
(图三为centos7克隆操作图)
(图四为centos7克隆结果图)
搭建LVS的DR模式
简单拓扑
一开始搭建简单的拓扑结构,后续增加realserver3和realserver4
(图五为初始搭建的简单拓扑图)
配置IP
router
查看网卡的uuid以及mac地址
cd /etc/sysconfig/network-scripts
nmcli con show
//网卡的uuid以及mac地址
24fdc2d7-3fc5-480f-b380-074fed3b5e17
00:0c:29:57:ee:c7
1cd7f152-79ee-3565-bab4-7a4a68e234f8
//重启网络服务
service network restart
(图六为网卡的uuid以及mac地址对应图)
配置静态IP
vim ifcfg-ens33
vim ifcfg-ens37
//ens33配置详情
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.200
NETMASK=255.0.0.0
GATEWAY=192.168.112.1
DNS1=114.114.114.114
//ens37配置详情
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=1cd7f152-79ee-3565-bab4-7a4a68e234f8
DEVICE=ens37
ONBOOT=yes
IPADDR=210.202.135.1
GATEWAY=192.168.112.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
测试连通
(图八为测试router的连通图)
router启动路由转发
cd /proc/sys/net/ipv4
echo 1 >> ip_forward
(图九为router启动路由转发结果图)
查看路由表
route -n
(图十为路由表显示图)
lvs1
ens33:c31f05a0-503b-3522-8fe0-20d0ed06cac1
ens37:24fdc2d7-3fc5-480f-b380-074fed3b5e17
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.10
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
lvs2
ens33:64d22abf-b543-3d0f-b208-98199a41c76c
ens33:24fdc2d7-3fc5-480f-b380-074fed3b5e17
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
RS1的IP配置
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.15
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
RS2的IP配置
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.16
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
配置keepalived
lvs1
修改keepalived.conf文件
cd /etc/keepalived/
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_instance VI_1 {
state MASTER #备用机为BACKUP
interface ens37 #绑定VIP的网卡为ens33,根据自己服务器设置
virtual_router_id 51
priority 100 #权重,主机应该更大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 # vip01
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens37
virtual_router_id 55
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.101 # vip02
}
}
virtual_server 10.0.0.100 80 {
delay_loop 6 #每过6秒查询node的状态
lb_algo rr #lvs负载均衡算法,rr为轮询
lb_kind DR #DR模式
protocol TCP #用tcp协议检查node状态
#下面是配置被负载均衡的真实服务器nginx
real_server 10.0.0.15 80 {
weight 2 #权重
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
virtual_server 10.0.0.101 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.16 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
启动keepalived并设置自启动
systemctl start keepalived.service
systemctl enable keepalived.service
(图十一为设置启动keepalived并设置自启动结果图)
lvs2
//修改keepalived.conf文件
cd /etc/keepalived/
vim keepalived.conf
//conf配置详情
! Configuration File for keepalived
global_defs {
router_id LVS_2
}
vrrp_instance VI_1 {
state BACKUP
interface ens37
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 # vip01
}
}
vrrp_instance VI_2 {
state MASTER
interface ens37
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.101 # vip02
}
}
virtual_server 10.0.0.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.15 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
virtual_server 10.0.0.101 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.16 80 {
weight 2
TCP_CHECK {
connect_port 80
connect_timeout 1
nb_get_retry 2
delay_before_retry 1
}
}
}
//启动keepalived并设置自启动
systemctl start keepalived.service
systemctl enable keepalived.service
统一配置RS
安装gcc
yum -y install gcc
安装nginx
//更新yum源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
//安装
yum -y install nginx
设置nginx启动与自启动
systemctl start nginx.service
systemctl enable nginx.service
关于nginx的基础知识
nginx部署目录
/usr/share/nginx/html
nginx配置目录
/etc/nginx(default.conf,conf.d)
安装net-tools
yum install net-tools
RS1编辑dr模式脚本
vim /usr/local/sbin/lvs_dr_rs.sh
//脚本详情
#/bin/bash
vip01=10.0.0.15
vip02=10.0.0.16
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip01 broadcast $vip01 netmask 255.255.255.255 up
route add -host $vip01 lo:0
ifconfig lo:1 $vip02 broadcast $vip02 netmask 255.255.255.255 up
route add -host $vip02 lo:1
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#限制arp响应请求
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
#限制arp发送请求
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
运行并设置脚本自启动
//运行
sh lvs_dr_rs.sh
//自启动
cd /etc/rc.d/
vim rc.local
//在rc.local中添加
sh /usr/local/sbin/lvs_dr_rs.sh
//设置rc.local能被操作
chmod a=rwx rc.local
(图十二为在rc.local配置图)
(图十三为rc.local权限图)
RS2编辑dr模式脚本
vim /usr/local/sbin/lvs_dr_rs.sh
#/bin/bash
vip01=10.0.0.15
vip02=10.0.0.16
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip01 broadcast $vip01 netmask 255.255.255.255 up
route add -host $vip01 lo:0
ifconfig lo:1 $vip02 broadcast $vip02 netmask 255.255.255.255 up
route add -host $vip02 lo:1
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#限制arp响应请求
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
#限制arp发送请求
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
//运行
sh lvs_dr_rs.sh
//自启动
cd /etc/rc.d/
vim rc.local
sh /usr/local/sbin/lvs_dr_rs.sh
chmod a=rwx rc.local
查看结果
ip addr
rs
(图十四为realserver的ip详情图)
lvs
(图十五为lvs的ip详情图)
若见到如图所示,则证明配置成功生效
MYSQL的双主互从
准备工作
卸载mariadb
//查询mariadb的软件包
rpm -qa | grep -i mariadb
//彻底卸载mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
//查找mysql的包
rpm -qa | grep mysql
安装mysql
//安装wget
yum -y install wget
//获取mysql的镜像地址进行更新
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
yum -y install mysql-community-server
//可能出现的错误1,请查看本文的错误模块
开启mysql并设置自启动
//开启mysql的服务
systemctl start mysqld.service
systemctl status mysqld.service
成功截图
(图十五为mysql服务运行图)
mysql配置
查看临时密码
grep "password" /var/log/mysqld.log
//我的临时密码: sFFdT>fp1>0I
登录mysql
mysql -u root -p
(图十六为mysql登录成功图)
修改mysql的密码
重设密码为最低级标准
//修改密码策略为0,=号后的数字越高安全等级越高最高是4
set global validate_password_policy=0;
//重设密码的默认长度
set global validate_password_length=1;
重设密码
set password for 'root'@'localhost'=password('123456');
### 配置双主互从
1.重启net服务
将ens33连接
(图十七为网络连接设置位置图)
service network restart
2.确保mysql端口启用
netstat -nltp
(图十八为确认mysql端口启用图)
3.配置my.cnf
vim /etc/my.cnf
rs1的配置
//增加的配置RS1
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id=100
log-bin=mysql-bin
log-slave-updates
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=7
auto_increment_increment=1
auto_increment_offset=1
//无需同步的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#binlog-do-db=test
rs2的配置
//增加的配置RS2
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id=101
log-bin=mysql-bin
log-slave-updates
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=7
auto_increment_increment=1
auto_increment_offset=2
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#binlog-do-db=test
4.若你的机器是克隆的则要修改mysql的server-uuid
若非克隆机则无需修改,若克隆不修改则出现错误3
查询server-uuid
进入你当前机器的mysql
show global variables like '%uuid';
利用mysql生成uuid
select uuid();
查看并修改你当前的uuid
cd /var/lib/mysql/
//查看auto.cnf
cat auto.cnf
vim auto.cnf
(图十九为auto.cnf中mysql的uuid设置图)
重启mysql服务
systemctl restart mysqld.service
5.添加一个测试用户
//先修改密码策略,请参看上方密码策略修改
//添加新用户
GRANT REPLICATION SLAVE, FILE, REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
//刷新策略
FLUSH PRIVILEGES;
//查看是否成功
use mysql;
select user from user;
(图二十为策略成功用户添加成功图)
6.查看主节点状态
show master status;
(图二十一为rs1的主节点状态图)
(图二十二为rs2的主节点状态图)
7.配置主从
rs1需要配置rs2的ip地址以及rs2的节点状态,rs2则相反
//rs1
change master to master_host='10.0.0.16',master_port=3306,
master_user='repluser',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=1030;
//rs2
change master to master_host='10.0.0.15',master_port=3306,
master_user='repluser',master_password='123456',
master_log_file='mysql-bin.000004',master_log_pos=154;
8.启动并查看slave
//启动slave
start slave;
//设置同步(注意设置同步必须在启动之前或关闭后,再启动)
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
//查看slave状态
show slave status \G;
若出现,说明未启动
Slave_IO_Running: No
Slave_SQL_Running: No
(图二十三为slave未启动图)
启动成功
若启动成功后出现Slave_IO_Running,Slave_SQL_Running两者不同步则参看错误3
Slave_IO_Running: No
Slave_SQL_Running: Yes
正常启动示例
Slave_IO_State: Connecting to master
Master_Host: 10.0.0.15
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 619
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(图二十四为slave正在启动图)
(图二十五为slave启动成功图)
9.测试
在RS1上
去为数据创建一个数据库并添加一个数据表
show databases;
create database test;
create table `test`.`user`(`id` INT NOT NULL AUTO_INCREMENT ,`username` VARCHAR(20),PRIMARY KEY (`id`));
show tables;
在RS2上
若查询对应创建的数据库发现创建成功并有表说明数据同步成功
(图二十六为rs2数据同步成功结果图)
MYSQL配置双主双从
更新拓扑图
增加realserver3和realserver4并配置IP如上
(图二十七为更新后拓扑图)
配置新增的两台realserver
rs3
配置ens33网卡静态ip
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.17
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
rs4
配置ens33网卡静态ip
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=24fdc2d7-3fc5-480f-b380-074fed3b5e17
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.18
NETMASK=255.0.0.0
GATEWAY=10.0.0.200
DNS1=114.114.114.114
配置uuid和my.cnf
参看上方双主互从的第四步
配置slave
设置与主数据库同步,在这里我们从拓扑图中可以看出rs3是rs1的从,rs4是rs2的从
先到主中停止slave
在rs3中设置rs1,rs4中设置rs2如下
//rs1
change master to master_host='10.0.0.16',master_port=3306,
master_user='repluser',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=1030;
//rs2
change master to master_host='10.0.0.15',master_port=3306,
master_user='repluser',master_password='123456',
master_log_file='mysql-bin.000004',master_log_pos=154;
最后重启服务再执行启动slave,最后你应该看到四台机器的slave都状态都是成功同步的
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试
原始数据库
原始数据库中,rs1~rs4都具有如下图数据
(图二十八为原始数据库数据图)
删除记录
我们在rs1中对共有数据进行删除
delete from user where id = 5;
最后我们发现四台机器上都没有了数据表,表示双主双从数据同步成功!
(图二十九为测试双主双从示例成功图)
使用GlusterFS搭建分布式文件系统
官方地址:
https://www.gluster.org/
安装
分别在两台rs1和rs2上安装
yum install centos-release-gluster
yum install glusterfs-server
启动服务
分别在两台rs1和rs2上启动
systemctl start glusterd
systemctl enable glusterd
systemctl status glusterd
(图三十为GlusterFS服务启动成功图)
建立信任池
在这里只需要在rs1中进行操作即可
gluster peer probe 10.0.0.16
//查看信任池状态
gluster peer status
(图三十一为搭建信任池成功图)
创建复制卷
设置复制卷目录
rs1上是exp3,rs2上是exp4
mkdir -p /data/exp3
mkdir -p /data/exp4
使用命令创建复制卷
命名为repl-volume
gluster volume create repl-volume replica 2 transport tcp 10.0.0.15:/data/exp3 10.0.0.16:/data/exp4 force
//查看卷信息
gluster volume info repl-volume
//开启卷
gluster volume start repl-volume
(图三十二为创建复制卷成功图)
(图三十三为复制卷信息图)
(图三十四为复制卷开启成功图)
错误及解决
错误1
mysql服务安装失败,公钥过期或未安装
(图三十五为错误一截图)
解决
重新去获取2022年的key
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
//重新安装mysql服务
yum -y install mysql-community-server
错误2
mysql缺失libncurses.so.5无法登录
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
解决
安装libncurses.so.5及其依赖
yum -y install libncurses.so.5
yum -y install libncurses*
错误3
由于mysql的connection id相同导致数据无法同步
(图三十六为错误一截图)
解决
先把当前的mysql的slave停止,然后设置同步,然后确定mysql的uuid以及my.cnf中的server-id与其他机器不同后,重启机器
//关闭slave
stop slave;
//设置同步(注意设置同步必须在启动之前或关闭后,再启动)
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
//重启
reboot
错误4
克隆导致的数据库本来就不同步,后续数据同步后导致数据缺失
解决
从节点还原数据库,锁定主节点
flush table with read lock;
从结点创建数据库
创建缺失的即可
解锁
unlock tables;
参考文献
《CENTOS 7系统管理与运维实战》,王亚飞、王刚 编著,清华大学出版社
keepalived+lvs+dr 主从模式和双主模式配置,神奇的路人A, https://blog.csdn.net/qq_44936079/article/details/121309053
GlusterFS分布式存储,李泽信,https://blog.csdn.net/qq_43704782/article/details/123721006?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-123721006-blog-109725764.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-4-123721006-blog-109725764.pc_relevant_antiscanv3
|