集群应用系统

集群应用系统

什么是集群应用系统?

集群应用系统是指将多台计算机(服务器)组成一个集群,以协同处理任务的系统。它通过分布式计算、负载均衡和冗余设计,提升系统的计算能力、可靠性和可用性。集群应用系统通常用于处理大规模数据、运行高性能计算任务或提供高可用性的服务。

常见的集群应用系统类型包括:

  1. 负载均衡集群:将任务分配到不同的服务器,以平衡负载和提高处理效率。
  2. 高可用性集群(HA):保证当一台服务器出现故障时,其他服务器可以接管任务,确保系统持续运行。
  3. 计算集群:多台服务器协作处理大量的计算任务,常用于科学研究、金融分析等领域。

这种系统的优势在于高扩展性和容错能力,适合对稳定性和性能要求较高的场景。

部署操作

IP

主机名

节点

192.168184.140

mycat

Mycat中间件服务节点

192.168.184.141

db1

MariaDB数据库集群主节点

192.168.184.142

db2

MariaDB数据库集群从节点

192.168.184.180

zookeeper1

集群节点

192.168.184.101

zookeeper2

集群节点

192.168.184.102

zookeeper3

集群节点

192.168.184.146

redis

消息队列服务节点

192.168.184.147

jar1

Tomcat1节点

192.168.184.148

jar2

Tomcat2节点

192.168.184.149

nginx

Nginx服务器

关闭防火墙

#  Systemctl  stop  firewalld

#  setenforce  0

环境配置

1.修改主机名

# sudo hostnamectl set-hostname mycat

# bash

# hostnamectl

Static hostname: mycat

         Icon name: computer-vm

           Chassis: vm

        Machine ID: 754f8a1ad2654504b10cacfb2e9d5eb0

           Boot ID: 75789f685c6247ee8418c60b451585af

    Virtualization: kvm

  Operating System: CentOS Linux 7 (Core)

       CPE OS Name: cpe:/o:centos:centos:7

            Kernel: Linux 3.10.0-1160.45.1.el7.x86_64

      Architecture: x86-64

十台虚拟机均进行该操作

2. 修改 hosts 文件

# vi  /etc/hosts

编辑以下内容

192.168.184.140 mysql.mall mycat

192.168.184. 141  db1

192.168.184. 142  db2

192.168.184.180   zk1.mall

192.168.184.101   zk1.mall

192.168.184. 102  zk1.mall

192.168.184. 180  kafka1.mall

192.168.184. 101  kafka1.mall

192.168.184. 102  kafka1.mall

192.168.184. 146  redis.mall

192.168.184. 147  jar1

192.168.184. 148  jar2

192.168.184. 149  nginx

十台虚拟机均进行该操作

3.配置阿里yum源和本地yum源,使用提供的 gpmall-repo 文件上传至 10 个虚拟机的 /root 目录下。

阿里yum源

[1]  备份默认 repo 文件

# cd /etc/yum.repos.d

# sudo mkdir backup

# sudo mv *.repo backup/

[2] 阿里源


[base]

name=CentOS-$releasever - Base - mirrors.aliyun.com baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/

gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates] name=CentOS-$releasever - Updates - mirrors.aliyun.com baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]

name=CentOS-$releasever - Extras - mirrors.aliyun.com baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/

gpgcheck=1

gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[3] 清理缓存

# sudo yum clean all && yum repolist

[4] 把之前 EPEL 给补回来

# sudo yum remove -y epel-release

# sudo yum install -y epel-release

#sudo yum clean all && yum repolist(清理缓存)

本地yum源

[1] 编写yum源

# vi /etc/yum.repos.d/local.repo

编写内容

[mariadb]

name=mariadb

baseurl=file:///root/gpmall-repo

gpgcheck=0

enabled=1

# yum repolist

4 安装JDK 环境
  1. 在 mycat、zookeeper1、zookeeper2、zookeeper3、jar1、jar2 服务器上部署 JDK 1.8 版本

# sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

# java -version

openjdk version "1.8.0_412"

OpenJDK Runtime Environment (build 1.8.0_412-b08)

OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

5 安装数据库、Zookeeper 等服务

(1)在 db1 和 db2 服务器上安装 MariaDB 服务

# 安装 MariaDB 服务
# sudo yum install -y mariadb mariadb-server
# 启动 MariaDB 服务并设置开机自启
# sudo systemctl start mariadb
# sudo systemctl enable mariadb

(2)在db1和db2虚拟机节点上初始化MariaDB数据库,并设置MariaDB数据库root访问用户的密码为123456。

[root@db1 ~]# mysql_secure_installation

/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current

password for the root user.  If you've just installed MariaDB, and

you haven't set the root password yet, the password will be blank,

so you should just press enter here.

Enter current password for root (enter for none):    #默认按回车

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB

root user without the proper authorisation.

Set root password? [Y/n] y

New password:                               #输入数据库root密码123456

Re-enter new password:                        #重复输入密码123456

Password updated successfully!

Reloading privilege tables..

 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them.  This is intended only for testing, and to make the installation

go a bit smoother.  You should remove them before moving into a

production environment.

Remove anonymous users? [Y/n] y

 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This

ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n

 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can

access.  This is also intended only for testing, and should be removed

before moving into a production environment.

Remove test database and access to it? [Y/n] y

 - Dropping test database...

 ... Success!

 - Removing privileges on test database...

 ... Success!

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

Reload privilege tables now? [Y/n] y

 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB

installation should now be secure.

Thanks for using MariaDB!

(3)配置数据库集群主节点

[mysqld]

log_bin = mysql-bin                       #记录操作日志

binlog_ignore_db = mysql                  #不同步MySQL系统数据库

server_id = 141                            #数据库集群中的每个节点id都要不同,一般使用IP地址的最后段的数字,例如192.168.184.141server_id就写141

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

编辑完成配置文件my.cnf后,重启MariaDB服务。

[root@db1 ~]# systemctl restart mariad

(4)开放主节点的数据库权限

    在主节点db1虚拟机上使用mysql命令登录MariaDB数据库,授权在任何客户端机器上可以以root用户登录到数据库。

[root@db1 ~]# mysql -uroot -p123456

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 137

Server version: 10.3.18-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> grant all privileges  on *.* to root@'%' identified by "123456";

在主节点db1数据库上创建一个user用户让从节点db2连接,并赋予从节点同步主节点数据库的权限,命令如下。

MariaDB [(none)]> grant replication slave on *.* to 'user'@'db2' identified by '123456';

(5)配置从节点db2同步主节点db1

在从节点db2虚拟机上使用mysql命令登录MariaDB数据库,配置从节点连接主节点的连接信息。master_host为主节点主机名db1,master_user为在步骤(4)中创建的用户user,命令如下。

[root@db2 ~]# mysql -uroot -p123456

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 88

Server version: 10.3.18-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>  change master to master_host='db1',master_user='user',master_password='123456';

配置完毕主从数据库之间的连接信息之后,开启从节点服务。使用show slave status\G; 命令并查看从节点服务状态,如果Slave_IO_Running和Slave_SQL_Running的状态都为YES,则从节点服务开启成功。

MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave status\G;

(6)验证主从数据库的同步功能

先在主节点db1的数据库中创建库test,并在库test中创建表company,插入表数据。创建完成后,查看表company数据,如下所示。

MariaDB [(none)]> create database test;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> use test

Database changed

MariaDB [test]> create table company(id int not null primary key,name varchar(50),addr varchar(255));

Query OK, 0 rows affected (0.165 sec)

MariaDB [test]> insert into company values(1,"facebook","usa");            

Query OK, 1 row affected (0.062 sec)

MariaDB [test]> select * from company;

+----+----------+------+

| id | name     | addr |

+----+----------+------+

|  1 | facebook | usa  |

+----+----------+------+

1 row in set (0.000 sec)

这时从节点db2的数据库就会同步主节点数据库创建的test库,可以在从节点查询test数据库与表company,如果可以查询到信息,就能验证主从数据库集群功能在正常运行。查询结果如下所示。

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.001 sec)

MariaDB [(none)]> select * from test.company;

+----+----------+------+

| id | name     | addr |

+----+----------+------+

|  1 | facebook | usa  |

+----+----------+------+

1 row in set (0.001 sec)                                      

(6)验证主从数据库的同步功能

先在主节点db1的数据库中创建库test,并在库test中创建表company,插入表数据。创建完成后,查看表company数据,如下所示。

MariaDB [(none)]> create database test;

Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> use test

Database changed

MariaDB [test]> create table company(id int not null primary key,name varchar(50),addr varchar(255));

Query OK, 0 rows affected (0.165 sec)

MariaDB [test]> insert into company values(1,"facebook","usa");            

Query OK, 1 row affected (0.062 sec)

MariaDB [test]> select * from company;

+----+----------+------+

| id | name     | addr |

+----+----------+------+

|  1 | facebook | usa  |

+----+----------+------+

1 row in set (0.000 sec)

这时从节点db2的数据库就会同步主节点数据库创建的test库,可以在从节点查询test数据库与表company,如果可以查询到信息,就能验证主从数据库集群功能在正常运行。查询结果如下所示。

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.001 sec)

MariaDB [(none)]> select * from test.company;

+----+----------+------+

| id | name     | addr |

+----+----------+------+

|  1 | facebook | usa  |

+----+----------+------+

1 row in set (0.001 sec)                                      

在 mycat 服务器上使用提供的 Mycat 包 来安装 Mycat 服务。

# 下载 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
# sudo wget https://moka.anitsuri.top/images/mycat_db/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
# 解压到 /usr/local,并赋予权限
# sudo tar -zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
# sudo chown -R 777 /usr/local/mycat/

# 给 mycat 添加到系统变量中并生效系统变量
# echo MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
# source /etc/profile   

部署 mycat 服务

编辑 mycat 的配置文件

​ 配置 mycat 服务读写分离的 schema.xml 配置文件在 /usr/local/mycat/conf/ 目录下

$ sudo vi /usr/local/mycat/conf/schema.xml

# 修改成以下内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 定义逻辑库 USERDB 并关联数据节点 dn1 -->
    <schema name="gpmall" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>

    <!-- 定义数据节点 dn1,关联到数据主机 localhost1 -->
    <dataNode name="dn1" dataHost="localhost1" database="gpmall"></dataNode>

    <!-- 定义数据主机 localhost1,关联到物理数据库服务器 -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
              dbType="mysql" dbDriver="native" writeType="0" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>

        <!-- 主节点 db1 的 IP 地址及 MySQL 配置信息 -->
        <writeHost host="hostM1" url="192.168.104.131:3306" user="root" password="123456">
            <!-- 从节点 db2 的 IP 地址及 MySQL 配置信息 -->
            <readHost host="hostS1" url="192.168.104.132:3306" user="root" password="123456"></readHost>
        </writeHost>
    </dataHost>
</mycat:schema>

注:

sqlMaxLimit:配置默认查询数量

database:配置真实数据库名

balance="0":不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上

balance="1":全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡

balance="2":所有读操作都随机的在 writeHost、readHost 上分发

balance="3":所有读请求随机地分发到 writeHost 对应的 readHost 执行,writeHost 不负担读压力(注:这个东西只在 1.4 及其之后的版本才有,1.3 之前的版本都没有)

writeType="0":所有写操作发送配置的第一个 writeHost,第一个挂了需要切换到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件 dnindex.properties 中注:

sqlMaxLimit:配置默认查询数量

database:配置真实数据库名

balance="0":不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上

balance="1":全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡

balance="2":所有读操作都随机的在 writeHost、readHost 上分发

balance="3":所有读请求随机地分发到 writeHost 对应的 readHost 执行,writeHost 不负担读压力(注:这个东西只在 1.4 及其之后的版本才有,1.3 之前的版本都没有)

writeType="0":所有写操作发送配置的第一个 writeHost,第一个挂了需要切换到还生存的第二个 writeHost,重新启动后以切换后的为准,切换记录在配置文件 dnindex.properties 中

然后修改 schema.xml 的用户权限

#  sudo chown root.root /usr/local/mycat/conf/schema.xml

编辑 mycat 的访问用户

​ 修改 /usr/local/mycat/conf 目录下的 server.xml 文件,修改 root 用户的访问密码与数据库,密码设置为 123456,访问 MyCat 的逻辑库为 gpmall

$ sudo vi /usr/local/mycat/conf/server.xml

# 在文件的最后部分修改
              <user name="root">
                <property name="password">123456</property>
                <property name="schemas">gpmall</property>
        </user>

# 在文件的最后删除掉
<user name="user">
              <property name="password">user</property>
              <property name="schemas">TESTDB</property>
              <property name="readOnly">true</property>
</user>

最后 /usr/local/mycat/conf/server.xml 最后部分将会变成这个样子

# sudo tail -16 /usr/local/mycat/conf/server.xml
<user name="root">
              <property name="password">123456</property>
              <property name="schemas">gpmall</property>
             
              <!--
表级 DML 权限设置 -->
              <!--             
启动 mycat 服务
              <privileges check="false">
                     <schema name="TESTDB" dml="0110" >
                            <table name="tb01" dml="0000"></table>
                            <table name="tb02" dml="1111"></table>
                     </schema>
              </privileges>       
               -->
       </user>


</mycat:server>

启动 mycat 服务

# 启动 MyCat 数据库中间件服务
$ sudo /bin/bash /usr/local/mycat/bin/mycat start

# 安装 net-tools,以便后续使用 netstat
$ sudo yum install -y net-tools

# 查看 8066 和 9066 端口是否开放,如果开放则说明 MyCat 服务开启成功
$ netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      568/rpcbind        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1536/sshd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1041/master        
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      16487/java         
tcp6       0      0 :::111                  :::*                    LISTEN      568/rpcbind        
tcp6       0      0 :::34966                :::*                    LISTEN      16487/java         
tcp6       0      0 :::22                   :::*                    LISTEN      1536/sshd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1041/master        
tcp6       0      0 :::1984                 :::*                    LISTEN      16487/java         
tcp6       0      0 :::8066                 :::*                    LISTEN      16487/java         
tcp6       0      0 :::37093                :::*                    LISTEN      16487/java         
tcp6       0      0 :::9066                 :::*                    LISTEN      16487/java

在 zookeeper1、zookeeper2、zookeeper3 服务器上使用提供的 ZooKeeper 和 Kafka 包来安装 ZooKeeper 和 Kafka 服务
安装 ZooKeeper

# sudo wget https://moka.anitsuri.top/images/gpmall/zookeeper-3.4.14.tar.gz
# tar -zxf zookeeper-3.4.14.tar.gz
# 安装 Kafka
# sudo wget https://moka.anitsuri.top/images/gpmall/kafka_2.11-1.1.1.tgz
# sudo tar -zxf kafka_2.11-1.1.1.tgz

部署 ZooKeeper 集群服务

修改 ZooKeeper 配置文件

​在 zookeeper1、zookeeper2、zookeeper3 上都修改

# cd zookeeper-3.4.14/conf/
# sudo mv zoo_sample.cfg zoo.cfg
# sudo vi zoo.cfg
# 在下面加入
server.1=192.168.184.180:2888:3888
server.2=192.168.184.101:2888:3888
server.3=192.168.184.102:2888:3888

# zoo.cfg 的全部内容如下
$ cat zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

server.1=192.168.104.133:2888:3888
server.2=192.168.104.134:2888:3888
server.3=192.168.104.135:2888:3888

内容解析

tickTime:tickTime 是 initLimit 和 syncLimit 两个超时配置的基本单位,例如对于 initLimit,其配置值为 5 ,且 tickTime 为 2000 时,则说明其超时时间为 2000ms × 5 =10s

initLimit:ZooKeeper 集群模式下包含多个 zk 进程(zk 进程: ZooKeeper 集群中的各个服务器进程),其中一个进程为 leader,余下的进程为 follower

当 follower 最初与 leader 建立连接时,他们之间会传输相当多的数据,尤其是 follower 的数据落后 leader 很多

initLimit 配置 follower 与 leader 之间建立连接后进行同步的最长时间

syncLimit:配置 follower 与 leader 之间发送消息,请求与应答的最大时间长度

dataDir:用于指定 ZooKeeper 存储数据的目录,包括事务日志和快照(snapshot)

在集群模式下,这个目录还包含一个 myid 文件,用于标识每个节点的唯一身份(ID),myid 文件的内容只有一行,且内容只能为 1~255 之间的数字,这个数字即为 <server.id> 中的 ID,表示 zk 进程的 ID

<server.id>=<host>:<port1>:<port2>:

<server.id>:这是一个数字,表示 ZooKeeper 集群中每个节点的唯一标识(ID)。这个 ID 需要与对应节点的 myid 文件中的内容一致。

<host>:这个字段指定了节点的IP地址。在集群内部通信时,通常使用内网IP。

<port1>:这是集群中 follower 和 leader 之间进行消息交换的端口。ZooKeeper 集群中,follower 节点通过这个端口与 leader 节点进行数据同步和其他通信。

<port2>:这是用于 leader 选举的端口。当集群中的节点需要选举新的 leader 时,它们通过这个端口进行通信。

创建myid文件

在3台机器dataDir目录(此处为/tmp/zookeeper)下,分别创建一个myid文件,文件内容分别只有一行,其内容为1,2,3。即文件中只有一个数字,这个数字即为上面zoo.cfg配置文件中指定的值。ZooKeeper是根据该文件来决定ZooKeeper集群各个机器的身份分配。

创建myid文件,命令如下:

zookeeper1节点:

[root@zookeeper1 ~]# mkdir /tmp/zookeeper

[root@zookeeper1 ~]# vi /tmp/zookeeper/myid

[root@zookeeper1 ~]# cat /tmp/zookeeper/myid

1

zookeeper2节点:

[root@zookeeper2 ~]# mkdir /tmp/zookeeper

[root@zookeeper2 ~]# vi /tmp/zookeeper/myid

[root@zookeeper2 ~]# cat /tmp/zookeeper/myid

2

zookeeper3节点:

[root@zookeeper3 ~]# mkdir /tmp/zookeeper

[root@zookeeper3 ~]# vi /tmp/zookeeper/myid

[root@zookeeper3 ~]# cat /tmp/zookeeper/myid

3

启动ZooKeeper服务

在3台机器的zookeeper-3.4.14/bin目录下执行命令如下:

zookeeper1节点:

[root@zookeeper1 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@zookeeper1 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: follower

zookeeper2节点:

[root@zookeeper2 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... already running as process 10175.

[root@zookeeper2 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: leader

zookeeper3节点:

[root@zookeeper3 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@zookeeper3 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: follower

可以看到,3个节点,zookeeper2为leader,其他的都是follower。

至此,ZooKeeper集群配置完毕。

ZooKeeper 架构演变过程解析

ZooKeeper 架构演变可以理解为分布式协调服务从单节点部署发展到多节点集群模式,以满足高可用性和分布式系统中数据一致性需求的过程。

  • 初始架构:ZooKeeper 最初为单机模式,适用于测试和开发环境。在这种架构下,ZooKeeper 并不具备高可用性,单点故障会导致系统不可用。
  • 集群模式:随着需求的增加,ZooKeeper 架构演变为多节点集群架构。集群模式中的节点分为 LeaderFollower,其中 Leader 负责处理写请求,Follower 处理读请求。通过 ZAB 协议(ZooKeeper Atomic Broadcast),ZooKeeper 能够确保数据的一致性和高可用性。
  • 节点角色划分
    • Leader:负责处理所有写操作请求,并将这些操作广播给 Follower。
    • Follower:处理读操作,并从 Leader 那里接收并应用写操作。
    • Observer(可选):不参与投票选举,仅用于处理读取操作,适合只读请求较多的场景。

这种架构确保了即使部分节点发生故障,剩余节点也能继续提供服务,从而增强了系统的可靠性。

ZooKeeper 部署过程中具体应用模块日志的位置

ZooKeeper 的日志主要分为 运行时日志事务日志,这些日志记录了 ZooKeeper 的运行状态、客户端请求、事务执行等关键信息。通过日志,你可以监控 ZooKeeper 的健康状态并排查故障。

  • ZooKeeper 运行时日志
    • 运行时日志记录 ZooKeeper 服务启动、停止、连接状态、错误等信息。默认情况下,日志文件保存在配置的 dataDir 目录中。如果你使用了默认配置,日志文件路径为 /tmp/zookeeper。
    • 日志文件:/tmp/zookeeper/version-2/log-XXXXXXX,其中 XXXXXXX 是日志编号。
  • ZooKeeper 事务日志
    • 事务日志用于记录所有的事务性操作,以确保 ZooKeeper 集群能够在故障后通过重放日志恢复数据。
    • 事务日志的位置通过 zoo.cfg 中的 dataDir 和 dataLogDir 配置,默认也存储在 /tmp/zookeeper/ 目录下

查看 ZooKeeper 日志的命令

# 查看运行时日志

cat /tmp/zookeeper/version-2/log-XXXXXXX

# 实时查看日志更新

tail -f /tmp/zookeeper/version-2/log-XXXXXXX

ZooKeeper 日志字段解析

ZooKeeper 日志文件包含多个关键字段,这些字段提供了详细的运行信息,有助于排查系统问题。

  • 时间戳:每条日志都会带有时间戳,记录了事件发生的具体时间。例如:

2024-09-13 10:23:45,678

  节点 ID:在集群模式下,日志记录中会包含节点的唯一 ID(例如 myid:2 表示该日志由 ID 为 2 的 ZooKeeper 节点生成)。

  日志级别:ZooKeeper 使用常见的日志级别,包括 INFO、WARN、ERROR 等。

  • INFO:一般信息,表示系统的正常操作。
  • WARN:警告,可能不影响系统正常运行,但需要注意。
  • ERROR:错误,可能影响系统运行,需要及时处理。

  日志消息:提供了具体的事件描述。例如:

2024-09-13 10:23:45,678 [myid:1] INFO  QuorumPeerMain - ZooKeeper server is running.

示例

2024-09-13 12:35:56,456 [myid:2] - WARN  NIOServerCnxn - Session 0x10004ff25ab0003 expired

  时间:2024-09-13 12:35:56,456 事件发生时间。

  节点 ID:myid:2 表示节点 ID 为 2。

  日志级别:WARN 表示警告。

  :NIOServerCnxn 是生成该日志的类。

  消息:Session 0x10004ff25ab0003 expired 表示客户端会话超时

Kafka集群部署
(1)使用ZooKeeper集群搭建的3个节点来构建Kafka集群,因为Kafka服务依赖于ZooKeeper服务,所以不再多创建云主机来进行试验。

在 zookeeper1、zookeeper2、zookeeper3 上都修改

(*注意: broker.id 应不一样)

$ cd /root/kafka_2.11-1.1.1/config/
$ sudo vi server.properties

# 找到以下内容并在前面添加上井号
broker.id=0 #第21行
zookeeper.connect=localhost:2181 #第123行

# 然后再在下面填上以下三个配置
broker.id=1
zookeeper.connect=192.168.184.180:2181,192.168.184.101:2181,192.168.184.102:2181
listeners=PLAINTEXT://192.168.184.180:9092

zookeeper2节点:

broker.id=2

zookeeper.connect=172.16.51.23:2181,172.16.51.32:2181,172.16.51.41:2181

listeners = PLAINTEXT://172.16.51.32:9092

zookeeper3节点:

broker.id=3

zookeeper.connect=172.16.51.23:2181,172.16.51.32:2181,172.16.51.41:2181

listeners = PLAINTEXT://172.16.51.41:9092

内容解析:

broker.id:每台机器都不一样,相当于在 ZooKeeper 中的 <server.id>

zookeeper.connect:因为有 3 台 ZooKeeper 服务器,所以这里都得配置上

listeners:listeners 配置项用于指定 Kafka broker 的监听地址和端口。通常设置为当前节点的内网IP和默认的 Kafka 端口 9092

(2)启动服务

在zookeeper1节点,进入kafka_2.11-1.1.1/bin目录下,启动服务命令如下。

zookeeper1节点:

[root@zookeeper1 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper1 bin]# jps

11416 Kafka

11464 Jps

10479 QuorumPeerMain

zookeeper2节点:

[root@zookeeper2 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper2 bin]# jps

11121 Kafka

11188 Jps

10175 QuorumPeerMain

zookeeper3节点:

[root@zookeeper3 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper3 bin]# jps

11080 Kafka

10188 QuorumPeerMain

11149 Jps

(3)测试服务

在zookeeper1节点,进入kafka_2.11-1.1.1/bin目录下,创建topic命令如下。

zookeeper1节点:

[root@zookeeper1 bin]# ./kafka-topics.sh --create --zookeeper 172.16.51.23:2181 --replication-factor 1 --partitions 1 --topic test

Created topic "test".

如果成功的话,会输出“Created topic "test".”。

查看topic,虽然topic是在172.16.51.23上创建的,但是在其他机器上也能看到。例如在任意启动的机器kafka_2.11-1.1.1/bin的目录中执行命令如下:

zookeeper2节点:

[root@zookeeper2 bin]# ./kafka-topics.sh --list --zookeeper 172.16.51.32:2181

Test

zookeeper3节点:

[root@zookeeper3 bin]# ./kafka-topics.sh --list --zookeeper 172.16.51.41:2181

Test

测试成功。

Redis
在 Redis 服务器上安装 redis 服务

#  sudo yum install -y redis

在 Redis 服务器上,修改 redis 配置文件,编辑 /etc/redis.conf 文件

$ sudo vi /etc/redis.conf
# 注释掉
bind 127.0.0.1 #第61行
# 将下面的 yes 改成 no
protected-mode no #第80行

然后启动 Redis 服务

$ sudo systemctl start redis
$ sudo systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

# 检查 Redis 服务是否启动,如果检查到 6379 端口,则说明 Redis 服务运行成功
$ netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1038/master        
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      16276/redis-server 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      563/rpcbind        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1508/sshd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1038/master        
tcp6       0      0 :::6379                 :::*                    LISTEN      16276/redis-server 
tcp6       0      0 :::111                  :::*                    LISTEN      563/rpcbind        
tcp6       0      0 :::22                   :::*                    LISTEN      1508/sshd

*注:(错误)日志的位置

MariaDB:看 /etc/my.cnf 我配置的是 log_error = /var/log/mysql/mariadb_error.log

mycat:/usr/local/mycat/logs/mycat.log

ZooKeeper:看 /root/zookeeper-3.4.14/conf/zoo.cfg 这里使用的是默认配置 dataDir=/tmp/zookeeper 那么也就是说日志文件在 /tmp/zookeeper/version-2/log-XXXXXXX(这个XXXXX因情况而异)

Kafka:

主日志:/root/kafka_2.11-1.1.1/logs/server.log

输出日志:/root/kafka_2.11-1.1.1/logs/kafkaServer.out

配置后端

​ 将提供的 4 个 jar 包,上传至 jar1、jar2 节点的/root 目录下,然后在 jar1 和 jar2 两个机器上运行这 4 个 jar 包

$ sudo wget https://moka.anitsuri.top/images/gpmall_plural/user-provider-0.0.1-SNAPSHOT.jar
$ sudo wget https://moka.anitsuri.top/images/gpmall_plural/shopping-provider-0.0.1-SNAPSHOT.jar
$ sudo wget https://moka.anitsuri.top/images/gpmall_plural/gpmall-shopping-0.0.1-SNAPSHOT.jar
$ sudo wget https://moka.anitsuri.top/images/gpmall_plural/gpmall-user-0.0.1-SNAPSHOT.jar

$ sudo nohup java -jar user-provider-0.0.1-SNAPSHOT.jar &
$ sudo nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar &
$ sudo nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &
$ sudo nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar &

检查jar包是否运行,命令如下:

[root@jar2 ~]# ps -ef |grep java

在 Nginx 服务器上安装 nginx 服务

#  sudo yum install -y nginx

上传前端代码

将提供的dist文件夹上传至Nginx节点的/root目录下,然后将dist中的内容复制到nginx的项目目录,命令如下:

首先将Nginx默认项目目录的文件删除:

[root@nginx ~]# rm -rf /usr/share/nginx/html/*

然后将dist中的文件复制至/usr/share/nginx/html目录下:

[root@nginx ~]# cp -rvf dist/* /usr/share/nginx/html/

修改Nginx配置文件

修改Nginx配置文件/etc/nginx/conf.d/default.conf如下,添加红框中的部分,IP地址为运行JAR包的2个服务器的IP。

upstream myuser {

          server 192.168.184.147:8082;

            server 192.168.184.148:8082;

            ip_hash;

        }

        upstream myshopping {

            server 192.168.184.147:8081;

            server 192.168.184.148:8081;

            ip_hash;

        }

        upstream mycashier {

            server 192.168.184.147:8083;

            server 192.168.184.148:8083;

            ip_hash;

        }

server {

    listen       80;

    server_name  localhost;

    #charset koi8-r;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {

        root   /usr/share/nginx/html;

        index  index.html index.htm;

    }

    location /user {

            proxy_pass http://myuser;

        }

    location /shopping {

            proxy_pass http://myshopping;

        }

    location /cashier {

            proxy_pass http://mycashier;

        }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    #

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   /usr/share/nginx/html;

    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80

    #

    #location ~ \.php$ {

    #    proxy_pass   http://127.0.0.1;

    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    #location ~ \.php$ {

    #    root           html;

    #    fastcgi_pass   127.0.0.1:9000;

    #    fastcgi_index  index.php;

    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

    #    include        fastcgi_params;

    #}

    # deny access to .htaccess files, if Apache's document root

    # concurs with nginx's one

    #

    #location ~ /\.ht {

    #    deny  all;

    #}

}

启动Nginx服务

在nginx节点,启动Nginx服务,命令如下:

[root@nginx ~]# systemctl start nginx

查看Nginx是否启动,命令如下(查看80端口是否启动):

[root@nginx ~]#yum -y install net-tools

[root@nginx ~]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10287/nginx: master

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      946/sshd           

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      864/master         

tcp6       0      0 :::22                   :::*                    LISTEN      946/sshd           

tcp6       0      0 ::1:25                  :::*                    LISTEN      864/master       

网站访问

打开浏览器,在地址栏中输入http://192.168.184.149,访问界面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值