当前位置: 首页 > news >正文

做渔家乐哪个网站最好怎么注册网站免费的

做渔家乐哪个网站最好,怎么注册网站免费的,商业规划设计公司,华大集团 做网站二阶段测试 1、部署框架前准备工作 服务器类型部署组件ip地址DR1调度服务器 主(ha01)KeepalivedLVS-DR192.168.168.21DR2调度服务器 备 (ha02)KeepalivedLVS-DR192.168.168.22web1节点服务器 (slave01)NginxTomcatMySQL 备MHA managerMHA node192.168.1…

二阶段测试

在这里插入图片描述

1、部署框架前准备工作

服务器类型部署组件ip地址
DR1调度服务器 主(ha01)Keepalived+LVS-DR192.168.168.21
DR2调度服务器 备 (ha02)Keepalived+LVS-DR192.168.168.22
web1节点服务器 (slave01)Nginx+Tomcat+MySQL 备+MHA manager+MHA node192.168.168.12
web2节点服务器 (slave02)Nginx+Tomcat +MySQL 备+MHA node192.168.168.13
NFS存储服务器(master01)MySQL 主+NFS+MHA node192.168.168.11
vip虚拟ip192.168.168.100
1、实验思路---服务器架构ha01  192.168.168.21  keepalive+lvs-DRha02 192.168.168.22  keepalive+lvs-DRmaster01 192.168.168.11  mysql+NFS+mha+nodeslave01 192.168.168.12  nginx+tomcat+mysql+mha+node+managerslave02 192.168.168.13  nginx+tomcat+mysql+mha+node三台数据库均以mysql8.0版本安装好虚拟地址vip:192.168.168.100

2、关闭防护墙、修改主机名

[root@localhost ~]# systemctl stop firewalld.service && setenforce 0
[root@localhost ~]# hostnamectl set-hostname ha01
[root@localhost ~]# hostnamectl set-hostname ha02
[root@localhost ~]# hostnamectl set-hostname slave01
[root@localhost ~]# hostnamectl set-hostname slave02
[root@localhost ~]# hostnamectl set-hostname master01[root@localhost ~]# su

----------以下两台调度器同时配置---------------

3、部署LVS-DR

[root@ha01 ~]# modprobe ip_vs
[root@ha01 ~]# cat /proc/net/ip_vs## 加载ip_vs模块,并查看版本信息IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@ha01 ~]# yum install -y ipvsadm

4、配置虚拟地址

配置虚拟ip地址(IPADDR=192.168.168.100)
[root@ha01 ~]# cd /etc/sysconfig/network-scripts/
[root@ha01 network-scripts]# ls
ifcfg-ens33  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes       network-functions
ifcfg-lo     ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit          network-functions-ipv6
ifdown       ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep  ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth   ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib    ifdown-sit     ifup-eth         ifup-post   ifup-wireless
ifdown-ippp  ifdown-Team    ifup-ib          ifup-ppp    init.ipv6-global
[root@ha01 network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@ha01 network-scripts]# vim ifcfg-ens33:0DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.168.100
NETMASK=255.255.255.255
[root@ha02 network-scripts]# ifup ifcfg-ens33:0
ERROR     : [/etc/sysconfig/network-scripts/ifup-eth] Error, some other host (00:0C:29:1F:FB:2F) already uses address 20.0.0.10.
[root@ha02 network-scripts]# systemctl restart network
[root@ha02 network-scripts]# ifup ifcfg-ens33:0[root@ha01 network-scripts]# ifup ifcfg-ens33:0 [root@ha01 network-scripts]# ifconfig 

在这里插入图片描述

在这里插入图片描述

[root@ha01 ~]#route add -host 192.168.168.100 dev ens33:0[root@ha01 ~]# vim /etc/rc.local/usr/sbin/route add -host 192.168.168.100 dev ens33:0

3、配置ARP内核响应参数防止更新VIP中的MAC地址,避免发生冲突

[root@ha01 network-scripts]# vim /etc/sysctl.conf net.ipv4.ip_forward = 0
#proc响应关闭重定向功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@ha01 network-scripts]# sysctl -p##加载配置文件生效net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

4、配置负载均衡分配策略

[root@ha01 network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm## 保持策略[root@ha01 network-scripts]# systemctl start ipvsadm.service## 开启ipvsadm服务[root@ha01 network-scripts]# ipvsadm -C## 情况策略,添加虚拟ip地址,指定负载均衡算法给两台web节点服务器[root@ha01 network-scripts]# ipvsadm -A -t 192.168.168.100:80 -s rr
[root@ha01 network-scripts]# ipvsadm -a -t  192.168.168.100:80 -r 192.168.168.12:80 -g
[root@ha01 network-scripts]# ipvsadm -a -t 192.168.168.100:80 -r 192.168.168.13:80 -g
[root@ha01 network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  ha01:http rr-> 192.168.168.12:http              Route   1      0          0         -> 192.168.168.12:http              Route   1      0          0         

5、配置web节点服务器(两台slave同时部署 192.168.168.12、192.168.168.13)

1、配置虚拟ip地址(VIP:192.168.168.100)

[root@slave01 ~]# cd /etc/sysconfig/network-scripts/
[root@slave01 network-scripts]# ls
ifcfg-ens33  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes       network-functions
ifcfg-lo     ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit          network-functions-ipv6
ifdown       ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep  ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth   ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib    ifdown-sit     ifup-eth         ifup-post   ifup-wireless
ifdown-ippp  ifdown-Team    ifup-ib          ifup-ppp    init.ipv6-global
[root@slave01 network-scripts]# cp ifcfg-ens33 ifcfg-lo:0
[root@slave01 network-scripts]# vim ifcfg-lo:0DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.168.100
NETMASK=255.255.255.255[root@slave01 network-scripts]# ifup ifcfg-lo:0## 开启虚拟网卡[root@slave01 network-scripts]# ifconfig## 查看网卡
[root@slave01 network-scripts]# route add -host 192.168.168.100 dev lo:0
[root@slave01 network-scripts]# vim /etc/rc.local ## 配置永久添加路由route add -host 192.168.168.100 dev lo:0
2、配置ARP内核响应参数防止更新VIP中的MAC地址,避免发生冲突
[root@slave01 network-scripts]# vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2[root@slave01 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

6、部署NFS存储服务器(NFS共享存储ip地址:192.168.168.11)

[root@master01 ~]# rpm -q rpcbind nfs-utils ## 检查是否有安装nfsrpcbind-0.2.0-42.el7.x86_64
nfs-utils-1.3.0-0.48.el7.x86_64[root@master01 ~]# systemctl start nfs
[root@master01 ~]# systemctl start rpcbind
##开启服务[root@master01 ~]# systemctl enable nfs## 设置开机自启Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@master01 ~]# systemctl enable rpcbind[root@master01 ~]# mkdir /opt/web1 /opt/web2## 创建web目录[root@master01 web1]# echo '<h1>This is node web1</h1>' >  /opt/web1/index.html
[root@master01 web1]# echo '<h1>This is node web2</h1>' >  /opt/web2/index.html## 添加网页内容
[root@master01 ~]# vim /etc/exports
/opt/web1 192.168.168.0/24(ro)
/opt/web2 192.168.168.0/24(ro)
[root@master01 ~]# exportfs -rv## 发布共享exporting 20.0.0.0/24:/opt/web2
exporting 20.0.0.0/24:/opt/web1

7、节点服务器安装web服务(Nginx)并挂载共享目录

1、安装Nginx

将安装包拖入/opt/目录下

【安装 Nginx 服务】
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make2、创建运行用户
useradd -M -s /sbin/nologin nginx3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_modulemake && make install4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target[Unit]:这个部分定义了服务单元的元数据。
Description: 描述该服务单元的信息,描述为"nginx"。
After: 定义服务单元所依赖的其他单元,这里表示服务需要在网络加载完成之后启动。[Service]:这个部分定义了服务的运行配置。
Type: 指定服务的类型,这里是forking,表示服务是一个后台进程(通常是fork出子进程)。
PIDFile: 指定保存主进程ID的文件路径,Nginx将会把主进程ID写入这个文件,以便Systemd可以追踪和管理进程。
ExecStart: 指定启动服务的命令。这里是启动Nginx的命令/usr/local/nginx/sbin/nginx。
ExecReload: 指定重新加载配置的命令。当执行此命令时,Systemd将发送HUP信号给主进程,Nginx将重新加载配置文件。
ExecStop: 指定停止服务的命令。当执行此命令时,Systemd将发送QUIT信号给主进程,Nginx将优雅地停止服务。
PrivateTmp: 将此项设置为true,表示为服务提供独立的临时目录。[Install]:这个部分定义了服务的安装配置。
WantedBy: 指定服务所属的目标(target),这里是multi-user.target,表示服务在多用户模式下启动。chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

2、节点服务器挂载共享目录 (slave1 slave2分别挂载/opt/web1 /opt/web2)

[root@slave01 sbin]# cd 
[root@slave01 ~]# showmount -e 192.168.168.11
Export list for 192.168.168.11:
/opt/web2 192.168.168.0/24
/opt/web1192.168.168.0/24
[root@slave01 ~]# mount.nfs 192.168.168.11:/opt/web1 /usr/local/nginx/html/
[root@slave01 ~]# cd /usr/local/nginx/html/
[root@slave01 html]# ls
index.html
[root@slave01 html]# cat index.html <h1>This is node web1</h1>

8、部署Nginx+Tomcat的动静分离

1、安装Tomcat作为后端服务器

将tomcat和jdk安装包放入/opt/目录下

[root@slave01 html]# cd /opt/
[root@slave01 opt]# ls
apache-tomcat-9.0.20.tar.gz  jdk-8u201-linux-x64.rpm  nginx-1.12.2  nginx-1.12.2.tar.gz  rh[root@slave01 opt]# cd 
[root@slave01 ~]# vim tomcat.sh#!/bin/bash#安装部署tomcatsystemctl stop firewalld
systemctl disable firewalld
setenforce 0#安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm &> /dev/null
java -version    #设置JDK环境变量
cat > /etc/profile.d/java.sh <<EOF
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar                      
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile.d/java.shif [ $? -eq 0 ];then
echo -e  "\033[34;1m JDK安装完成! \033[0m"
fi
java -version#安装启动Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz &> /dev/null
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat 
/usr/local/tomcat/bin/startup.shif [ $? -eq 0 ];then
echo -e  "\033[34;1m tomcat安装完成! \033[0m"
fi
[root@slave01 ~]# chmod +x tomcat.sh 
[root@slave01 ~]# ./tomcat.sh 

2、动静分离Tomcat server配置(192.168.168.12、192.168.168.13)

配置Tomcat的动态网页显示内容

slave01 192.168.168.12

[root@slave01 opt]# mkdir /usr/local/tomcat/webapps/test## 创建目录[root@slave01 opt]# cd /usr/local/tomcat/webapps/
[root@slave01 webapps]# ls
docs  examples  host-manager  manager  ROOT  test
[root@slave01 webapps]# cd test/
[root@slave01 test]# vim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html><head>
<title>tomcat1</title>
</head><body>
<% out.println("This is tomcat1 server");%><div>动态页面1</div><br/></body>
</html>[root@slave01 test]# ls
index.jsp

slave01 192.168.168.13

[root@slave01 opt]# mkdir /usr/local/tomcat/webapps/test## 创建目录[root@slave01 opt]# cd /usr/local/tomcat/webapps/
[root@slave01 webapps]# ls
docs  examples  host-manager  manager  ROOT  test
[root@slave01 webapps]# cd test/
[root@slave01 test]# vim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html><head>
<title>tomcat2</title>
</head><body>
<% out.println("This is tomcat2 server");%><div>动态页面2</div><br/></body>
</html>[root@slave01 test]# ls
index.jsp

3、Tomcat实例主配置删除前面的 Host配置,增添新的Host配置

两个web节点服务器配置相同

[root@slave01 test]# cd /usr/local/tomcat/conf/
[root@slave01 conf]# ls
catalina.policy      context.xml           jaspic-providers.xsd  server.xml        tomcat-users.xsd
catalina.properties  jaspic-providers.xml  logging.properties    tomcat-users.xml  web.xml[root@slave01 conf]# cp server.xml{,.bak}## 备份配置文件[root@slave01 conf]# vim server.xml<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />​    </Host>
   <Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase".  Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm.  --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" /><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><!--   <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />--></Host></Engine></Service>
</Server>
[root@slave01 conf]# /usr/local/tomcat/bin/shutdown.sh [root@slave01 conf]# /usr/local/tomcat/bin/startup.sh [root@slave01 conf]# netstat -natp | grep 8080## 查看端口是否打开tcp6       0      0 :::8080                 :::*                    LISTEN      45514/java          
4、 Nginx server 配置( 192.168.168.12、 192.168.168.13)两者配置相同
#### ```
[root@slave01 conf]# cd /usr/local/nginx/conf/[root@slave01 conf]# ls
fastcgi.conf            koi-utf             nginx.conf           uwsgi_params
fastcgi.conf.default    koi-win             nginx.conf.default   uwsgi_params.default
fastcgi_params          mime.types          scgi_params          win-utf
fastcgi_params.default  mime.types.default  scgi_params.default
[root@slave01 conf]# cp nginx.conf{,.bak}
[root@slave01 conf]# vim nginx.conf
##复制备份修改配置文件upstream tomcat {server 192.168.168.12:8080 weight=1;server 192.168.168.13:8080 weight=1;
}server {listen       80;server_name  localhost;server_name  www.web1.com;charset utf-8;​     location ~ .*.jsp$ {
​         proxy_pass http://tomcat;
​         proxy_set_header HOST $host;
​         proxy_set_header X-Real-IP $remote_addr;
​          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
​     }​     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
​         root /usr/local/nginx/html;
​         expires 10d;
​     }
```[root@slave02 conf]# cd /usr/local/nginx/sbin/
[root@slave01 sbin]# nginx -s reload

9、 配置keeplived(主(ha01)、备(ha02)DR 服务器都需要配置)

主 DR服务器 ha01:192.168.168.21

[root@ha01 ~]# yum install ipvsadm keepalived -y
[root@ha01 ~]# cd /etc/keepalived/
[root@ha01 keepalived]# ls
keepalived.conf
[root@ha01 keepalived]# cp keepalived.conf{,.bak}
[root@ha01 keepalived]# vim keepalived.conf## 按图修改配置文件vim keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_01vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_iptables
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 120advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.168.100}
}virtual_server 192.168.168.100 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 0protocol TCPreal_server 192.168.168.12 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}real_server 192.168.168.13 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}
}
[root@ha01 keepalived]# systemctl start keepalived.service 
[root@ha01 keepalived]# ip addr show dev ens33
[root@ha01 keepalived]# scp keepalived.conf  192.168.168.21:/etc/keepalived/## 注意备ha02调度服务器要先下载 yum install ipvsadm keepalived -y ,在scp传输keepalived.conf文件

备 DR服务器 ha02:192.168.168.22

[root@ha01 ~]# yum install ipvsadm keepalived -y
[root@ha02 network-scripts]# cd /etc/keepalived/
[root@ha02 keepalived]# systemctl start keepalived.service 
[root@ha02 keepalived]# vim keepalived.conf ! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_02vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_iptables
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.168.100}
}virtual_server 192.168.168.100 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 0protocol TCPreal_server 192.168.168.12 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}real_server 192.168.168.13 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}
}[root@ha01 keepalived]# systemctl start keepalived.service 
[root@ha01 keepalived]# ip addr show dev ens33                          
测试keepalived是否能主备切换成功

关闭主DR服务器ha01中的keepaliverd服务
主DR服务器ha01

10、部署MySQL集群MHA高可用

1、安装MySQL(slave01,slave02,master同时配置)
1.1、编译及安装MySQL

安装mysql8.0

[root@ha01 keepalived]# systemctl stop keepalived.service 
[root@ha01 keepalived]# ip addrmysql8.0.30安装:
安装过程:
[root@mysql1 opt]# tar -xf mysql-8.0.30-el7-x86_64.tar.gz [root@mysql1 opt]# mv mysql-8.0.30-el7-x86_64 mysql[root@mysql1 opt]# mv mysql /usr/local/#创建程序用户管理
useradd -s /sbin/nologin mysql#修改mysql目录和配置文件的权限
[root@mysql1 mysql]# chown -R mysql:mysql /usr/local/mysql/
[root@mysql1 mysql]# chown mysql:mysql /etc/my.cnf#修改配置文件
[root@mysql1 bin]# vim /etc/my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION#设置环境变量,申明/宣告mysql命令便于系统识别
[root@mysql1 mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@mysql1 mysql]# source /etc/profile#初始化数据库:
[root@mysql1 mysql]# cd /usr/local/mysql/bin/
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data#设置系统识别,进行操作:
[root@mysql1 bin]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@mysql1 bin]# chmod +x /etc/init.d/mysqld
[root@mysql1 bin]# systemctl daemon-reload
[root@mysql1 bin]# systemctl restart mysqld#初始化数据库密码:
[root@mysql1 bin]# mysqladmin -u root -p password "123456"
直接回车即可#进入数据库:
[root@mysql1 bin]# mysql -u root -p123456
#创建用户并设置密码:
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)#赋予远程连接的权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.00 sec)#刷新生效
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)#修改加密方式,可以进行远程连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

三台数据库服务器

systemctl stop firewalld
setenforce 0

1、Master、Slave1、Slave2 节点上安装 mysql8.0

yum -y install ntp##同步时间工具date##同步时间

2.修改 Master、Slave1、Slave2 节点的主机名

hostnamectl set-hostname Master01
hostnamectl set-hostname Slave01
hostnamectl set-hostname Slave02hostnamectl set-hostname master01
suhostnamectl set-hostname slave01
suhostnamectl set-hostname slave02
su
##本地映射vim /etc/hosts
192.168.168.11 master01
192.168.168.12 slave01
192.168.168.13 slave02

3.修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf


##Master01 节点##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = truerelay_log_recovery=1log_bin = master-bin:
用于记录主服务器上的更改操作的日志文件。
这个配置用于主服务器,将生成的二进制日志文件保存为"master-bin"(可以是其他自定义的名称)。log-slave-updates = true:
从服务器是否要记录它自己执行的更改操作到自己的二进制日志文件中。
设置为"true"表示从服务器会记录自己执行的更改操作,将其写入从服务器的二进制日志文件中。relay_log_recovery=1##配置从服务器在启动时是否执行二进制日志的恢复操作(和主库同步),1开启开启。systemctl restart mysqld##Slave01 节点##
vim /etc/my.cnf
server-id = 2 						#三台服务器的 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.indexlog_bin = master-bin:
指定主服务器(master)的二进制日志文件名称,用于记录主服务器上的更改操作的日志文件。relay-log = relay-log-bin:
指定从服务器的中继日志文件名称,即用于记录主服务器的二进制日志在从服务器上执行的中继日志。
从服务器会读取主服务器的二进制日志并将其记录到中继日志中。这个配置用于从服务器。relay-log-index = slave-relay-bin.index:
指定从服务器的中继日志索引文件的名称,该索引文件用于跟踪中继日志文件的位置和顺序。
通过这个索引文件,从服务器知道哪个中继日志文件是下一个要读取和执行的。这个配置用于从服务器。systemctl restart mysqld###Slave02 节点##
vim /etc/my.cnf						#三台服务器的 server-id 不能一样
server-id = 3 
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index#slave2不用设置master,指定主的备服务器为slave1即可。systemctl restart mysqld

4.在 Master01、Slave01、Slave02 节点上都创建两个软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

5.配置 mysql 一主两从

(1)所有数据库节点进行 mysql 授权
mysql -uroot -p123456#从数据库同步使用
CREATE USER 'myslave'@'192.168.168.%' IDENTIFIED WITH mysql_native_password BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.168.%';			#manager 使用
CREATE USER 'mha'@'192.168.168.%' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'192.168.168.%' WITH GRANT OPTION;#防止从库通过主机名连接不上主库
CREATE USER 'mha'@'master01' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'master01';CREATE USER 'mha'@'slave01' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'slave01';CREATE USER 'mha'@'slave02' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'slave02';flush privileges;

(2)在 Master 节点查看二进制文件和同步点

show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |    1747  |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

(3)在 Slave1、Slave2 节点执行同步操作

change master to master_host='192.168.168.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1747; start slave;

(4)在 Slave01、Slave02 节点查看数据同步结果

show slave status\G;
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

​ (5)两个从库必须设置为只读模式:

set global read_only=1;##set global read_only=0;关闭只读

(6)插入数据测试数据库同步
##在 Master 主库插入条数据,测试是否同步##

create database test_db;
use test_db;
create table test(id int);
insert into test(id) values (1);

底行模式:set paste 文本复制模式

mysql>set global read_only=1;一般设置为从数据库为只读

mysql>set global read_only=0;关闭数据库为只读

----------------------------------------以上主从数据库配置完成--------------------------------------------------

二、安装MHA所有组件

6.安装 MHA 软件
(1)所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

yum install epel-release --nogpgcheck -yyum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

(2)安装 MHA 软件包,先在所有服务器上必须先安装 node 组件
对于每个操作系统版本不一样,这里 CentOS7.6选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,
因为 manager 依赖 node 组件。

cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

(3)在 MHA manager 节点上安装 manager 组件

cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者 手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop 关闭manager

#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本
(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

save_binary_logs 保存和复制 master 的二进制日志

apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave

filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)

purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)

7.在所有服务器上配置无密码认证

(1)在 manager 节点上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.168.11
ssh-copy-id 192.168.168.12
ssh-copy-id 192.168.168.13(2)在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.168.12
ssh-copy-id 192.168.168.13(3)在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.168.11
ssh-copy-id 192.168.168.13(4)在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.168.11
ssh-copy-id 192.168.168.12

8.在 manager 节点上配置 MHA
(1)在 manager 节点上复制相关脚本到/usr/local/bin 目录

cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

//拷贝后会有四个执行文件

ll /usr/local/bin/scripts/

在这里插入图片描述

master_ip_failover #自动切换时 VIP 管理的脚本
master_ip_online_change #在线切换时 vip 的管理
power_manager #故障发生后关闭主机的脚本

send_report #因故障切换后发送报警的脚本

(2)复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,
这里使用master_ip_failover脚本来管理 VIP 和故障切换

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

(3)修改内容如下:(删除原有内容,直接复制并修改vip相关参数)
vim /usr/local/bin/master_ip_failover

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';use Getopt::Long;my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip = '192.168.168.110';									#指定vip的地址
my $brdc = '192.168.168.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.168.110
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.168.110 down
my $exit_code = 0;											#指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);exit &main();sub main {print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}A simple system call that disable the VIP on the old_mastersub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";}

管理 MySQL 主从复制设置中的虚拟 IP 故障切换而设计的,可能用于主服务器需要切换到另一台服务器的情景。

它使用 SSH 在远程服务器上执行命令来控制虚拟 IP 地址

(4)创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterhavim /etc/masterha/app1.cnf						#删除原有内容,直接复制并修改节点服务器的IP地址[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.168.12 -s 192.168.168.13 
#从对主监听
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.168.11 
#主服务器
port=3306[server2]
candidate_master=1   
check_repl_delay=0
hostname=192.168.168.12  
#备用主服务器
port=3306[server3]
hostname=192.168.168.13  
#从服务器2
port=3306----------------------------------------------------------------------------------------------------------

[server default]
manager_log=/var/log/masterha/app1/manager.log      #manager日志
manager_workdir=/var/log/masterha/app1         #manager工作目录
master_binlog_dir=/usr/local/mysql/data/         #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover  #设置自动failover时候的切换脚本,也就是上面的那个脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change  #设置手动切换时候的切换脚本
password=manager #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_password=123 #设置复制用户的密码
repl_user=myslave #设置复制用户的用户
report_script=/usr/local/send_report     #设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.168.12 -s 192.168.168.13 #指定检查的从服务器IP地址
shutdown_script=“” #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root #设置ssh的登录用户名
user=mha #设置监控用户root

[server1]
hostname=192.168.168.11
port=3306

[server2]
hostname=192.168.168.12
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,
即使这个从库不是集群中最新的slave

check_repl_delay=0
#默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master,
因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,
MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,
因为这个候选主在切换的过程中一定是新的master

[server3]
hostname=192.168.168.13

port=3306

9.第一次配置需要在 Master 节点上手动开启虚拟IP

/sbin/ifconfig ens33:1 192.168.168.110/24

10.在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully,如下所示。

masterha_check_ssh -conf=/etc/masterha/app1.cnf

在这里插入图片描述

Tue Nov 26 23:09:45 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Nov 26 23:09:45 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf…
Tue Nov 26 23:09:45 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf…
Tue Nov 26 23:09:45 2020 - [info] Starting SSH connection tests…
Tue Nov 26 23:09:46 2020 - [debug]
Tue Nov 26 23:09:45 2020 - [debug] Connecting via SSH from root@192.168.80.11(192.168.80.11:22) to root@192.168.80.12(192.168.80.12:22)…
Tue Nov 26 23:09:46 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [debug]
Tue Nov 26 23:09:46 2020 - [debug] Connecting via SSH from root@192.168.80.12(192.168.80.12:22) to root@192.168.80.11(192.168.80.11:22)…
Tue Nov 26 23:09:47 2020 - [debug] ok.
Tue Nov 26 23:09:47 2020 - [info] All SSH connection tests passed successfully.

11.在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常。如下所示。
masterha_check_repl -conf=/etc/masterha/app1.cnf

在这里插入图片描述

Tue Nov 26 23:10:29 2020 - [info] Slaves settings check done.
Tue Nov 26 23:10:29 2020 - [info]
192.168.80.11(192.168.80.11:3306) (current master)
±-192.168.80.12(192.168.80.12:3306)

Tue Nov 26 23:10:29 2020 - [info] Checking replication health on 192.168.80.12…
Tue Nov 26 23:10:29 2020 - [info] ok.
Tue Nov 26 23:10:29 2020 - [info] Checking master_ip_failover_script status:
Tue Nov 26 23:10:29 2020 - [info] /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.80.11 --orig_master_ip=192.168.80.11 --orig_master_port=3306

IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 192.168.80.200===

Checking the Status of the script… OK
Tue Nov 26 23:10:29 2020 - [info] OK.
Tue Nov 26 23:10:29 2020 - [warning] shutdown_script is not defined.
Tue Nov 26 23:10:29 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

12.在 manager 节点上启动 MHA

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

#生产中java 服务启动的方式
nohup java -jar 微服务名称-( war jar)&

nohup java -jar test.jar &
tail -f nohup.out
#生产中启动jar包的方式

#限制资源启动:
nohup java -Xmx512m -Xms256m -Xss256k -XX:+UseParallelGC -jar test.jar &

-Xmx512m: 设置 Java 虚拟机最大堆内存为 512 MB。
-Xms256m: 设置 Java 虚拟机初始堆内存为 256 MB。
-Xss256k: 设置线程堆栈大小为 256 KB。
-XX:+UseParallelGC: 启用并行垃圾回收器。


–remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
–manger_log:日志存放位置。
–ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,
且两次宕机间隔不足 8 小时的话,则不会进行 Failover,
之所以这样限制是为了避免 ping-pong 效应。
该参数代表忽略上次 MHA 触发切换产生的文件,
默认情况下,MHA 发生切换后会在日志记录,
也就是上面设置的日志app1.failover.complete文件,
下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,

除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。

13.查看 MHA 状态,可以看到当前的 master 是 master 节点。

masterha_check_status --conf=/etc/masterha/app1.cnfapp1 (pid:17761) is running(0:PING_OK), master:192.168.168.11
  1. 查看 MHA 日志,也以看到当前的 master 是 192.168.233.21,如下所示。

    cat /var/log/masterha/app1/manager.log | grep "current master"
    

    在这里插入图片描述

  2. 查看master 的 VIP 地址 192.168.233.100 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失。

    ifconfig  ##查看vip
    

    //若要关闭 manager 服务,可以使用如下命令。

masterha_stop --conf=/etc/masterha/app1.cnf

nore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &


#生产中java 服务启动的方式
nohup  java -jar  微服务名称-( war jar)&   nohup java -jar test.jar &
tail -f nohup.out
#生产中启动jar包的方式#限制资源启动:
nohup java -Xmx512m -Xms256m -Xss256k -XX:+UseParallelGC -jar test.jar &-Xmx512m: 设置 Java 虚拟机最大堆内存为 512 MB。
-Xms256m: 设置 Java 虚拟机初始堆内存为 256 MB。
-Xss256k: 设置线程堆栈大小为 256 KB。
-XX:+UseParallelGC: 启用并行垃圾回收器。------------------------------------------------------------------------------------------------------------remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,
且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 
之所以这样限制是为了避免 ping-pong 效应。
该参数代表忽略上次 MHA 触发切换产生的文件,
默认情况下,MHA 发生切换后会在日志记录,
也就是上面设置的日志app1.failover.complete文件,
下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。13.查看 MHA 状态,可以看到当前的 master 是 master 节点。

masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:17761) is running(0:PING_OK), master:192.168.168.11


14. 查看 MHA 日志,也以看到当前的 master 是 192.168.233.21,如下所示。```cat /var/log/masterha/app1/manager.log | grep "current master"```[外链图片转存中...(img-PRajN5kQ-1722178621595)]15. 查看master 的 VIP 地址 192.168.233.100 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失。```ifconfig  ##查看vip```//若要关闭 manager 服务,可以使用如下命令。

masterha_stop --conf=/etc/masterha/app1.cnf


或者可以直接采用 kill 进程 ID 的方式关闭。
http://www.15wanjia.com/news/48607.html

相关文章:

  • 网站共用数据库国内seo工具
  • 学做卤菜网站网站建站哪家公司好
  • 找人做个网站大概多少钱一个域名大概能卖多少钱
  • 中山手机网站建设哪家好网站优化外包多少钱
  • 淘宝单页面网站阐述网络推广的主要方法
  • 如何做网站后台管理站长工具名称查网站
  • 南宁网站建设哪家seo值是什么意思
  • 郑州网站建设哪里好全网推广的方式有哪些
  • 廊坊seo管理seo实战论坛
  • 着力加强网站内容建设自己在家做电商
  • 建设旅游信息网站的好处阿里巴巴怎么优化关键词排名
  • wordpress oss图片潍坊seo培训
  • 免费做流程图的网站如何做网站优化
  • 软件开发外包网seo优化靠谱吗
  • 用github做网站推广一个产品有哪些方式
  • html编辑器的功能介绍怎么优化标题和关键词排名
  • 建设银行网站官网北京seo排名方法
  • 建设部科研申报网站用着不好seo推广系统
  • 南海网站建设央视新闻今天的内容
  • 传统建筑网站南昌seo招聘信息
  • 东莞大岭山疫情天津seo结算
  • 做的比较好的猎头网站seo排名课程咨询电话
  • 南昌制作网站的公司如何外贸推广
  • 中小企业官方网站关键词优化排名网站
  • 提供赣州网站建设正规推广平台有哪些
  • 建设部网站怎么查岗位人员小程序商城
  • dreamweaver制作网站教程谷歌google官方网站
  • 织梦可以做视频网站么小网站搜什么关键词好
  • 叶榭做网站无锡seo公司找哪家好
  • 网站没有备案会怎样江阴企业网站制作