搭建nacos高可用集群

579 阅读2分钟

一、nacos简介

欢迎来到 Nacos 的世界!

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

nacos是spring cloud 的中心化组件,既作为注册中心,又作为配置中心,因此需要构建高可用的nacos集群

二、架构设计

这是nacos官网所提供的nacos集群架构图:

image-20230714150331092.png

同时nacos提供了数据持久化方案

image-20230714152817564.png

DB层采用MGR高可用方案的mysql集群,nacos集群采用无状态部署,由上层的nginx做将流量负载到多个nacos节点上,nginx节点使用一个备用节点,通过VIP+keepalived实现ip的漂移,当nginx1节点挂了,vip立马会指向nginx2节点,同时nginx还可以横向进行扩展。

三、部署

系统版本为centos7.9

1、mysql(version:8.0)

2、nacos(version:2.2)

3、nginx(version:1.25.1)

3.1 部署mysql集群

主节点:192.168.150.220

从节点:192.168.150.221,192.168.150.222

在三台设备上安装MySQL

临时关闭selinux防火墙

setenforce 0

放行端口,3306是MySQL默认端口,24901是MGR通信端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent 
firewall-cmd --zone=public --add-port=24901/tcp --permanent 
firewall-cmd --reload

将Hosts文件写入n0/n1/n2节点与IP对应关系,后面配置采用域名访问

sudo cat > /etc/hosts <<-'EOF' 
192.168.150.220 n0 
192.168.150.221 n1 
192.168.150.222 n2 
EOF 

修改当前主机的名字,230->n0,231->n1,232->n2

hostnamectl set-hostname n0

安装MySQL8

cd /home/ 
wget --no-check-certificate https://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm
yum localinstall -y mysql80-community-release-el7-5.noarch.rpm 
yum install -y mysql-community-server

配置MySQL

master n0

sudo cat >> /etc/my.cnf <<-'EOF' 
#使用mysql_native_password密码策略,防止navicat连不上mysql8 
default_authentication_plugin=mysql_native_password 
#设置MySQL插件所在目录,因为MGR基于插件,所以必须设置插件路径 
plugin_dir=/usr/lib64/mysql/plugin 
#服务器编号,Master=1 
server_id=1 
#开启binlog的GTID模式 
gtid_mode=ON 
#开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行 
enforce_gtid_consistency=ON 
#关闭binlog校验 
binlog_checksum=NONE 
#定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为  XXHASH64。 
transaction_write_set_extraction=XXHASH64 
#确定组复制恢复时是否应该应用  SSL,通常设置为“开”,但默认设置为“关”。 
loose-group_replication_recovery_use_ssl=ON 
#该服务器的实例所在复制组的名称,必须是有效的  UUID,所有节点必须相同。 
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee" 
#确定服务器是否应该在服务器启动期间启动组复制。 
loose-group_replication_start_on_boot=OFF 
#为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。 
#很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换 
#所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可 
loose-group_replication_local_address="n0:24901" 
#用于建立新成员到组的连接组成员列表。 
#这个列表指定为由分隔号间隔的组成员网络地址列表,类似  host1:port1、host2:port2  的格式。 #同样采用n0~n2的主机名替代 
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901" 
#配置此服务器为引导组,这个选项必须仅在一台服务器上设置, 
#并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。 
loose-group_replication_bootstrap_group=OFF 
EOF

启动MySQL-maser

systemctl start mysqld

slave1 n1

sudo cat >> /etc/my.cnf <<-'EOF' 
default_authentication_plugin=mysql_native_password 
plugin_dir=/usr/lib64/mysql/plugin 
#设置唯一的服务器编号 
server_id=2 
gtid_mode=ON 
enforce_gtid_consistency=ON 
binlog_checksum=NONE 
#这个参数决定primary节点到secondary节点的请求是否为基于RSA密钥对的密码交换所需的公钥 
loose-group_replication_recovery_get_public_key=ON 
loose-group_replication_recovery_use_ssl=ON 
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee" 
loose-group_replication_start_on_boot=OFF
#设置本机地址n1:24901 
loose-group_replication_local_address="n1:24901" 
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901" 
loose-group_replication_bootstrap_group=OFF 
EOF

启动MySQL-slave1

systemctl start mysqld

slave2 n2

sudo  cat  >>  /etc/my.cnf  <<-'EOF' 
default_authentication_plugin=mysql_native_password 
plugin_dir=/usr/lib64/mysql/plugin 
#设置唯一的服务器编号 
server_id=3 
gtid_mode=ON 
enforce_gtid_consistency=ON 
binlog_checksum=NONE 
#这个参数决定primary节点到secondary节点的请求是否为基于  RSA  密钥对的密码交换所需的公钥 
loose-group_replication_recovery_get_public_key=ON 
loose-group_replication_recovery_use_ssl=ON 
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee" 
loose-group_replication_start_on_boot=OFF 
#设置本机地址n2:24901 
loose-group_replication_local_address="n2:24901" 
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901" 
loose-group_replication_bootstrap_group=OFF 
EOF

启动MySQL-slave2

systemctl start mysqld

初始化MySQL并构建MGR

获取root用户初始密码

grep 'temporary password' /var/log/mysqld.log

连接MySQL

mysql -uroot -p'${上一条命令的输出即MySQL初始密码}'

修改root用户初始密码并设置主从同步账户

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Root123456!';
###创建rpl_user账户,用于实现主从数据同步 
CREATE USER rpl_user @'%' IDENTIFIED BY 'Rpl123456!'; 
#赋予主从同步权限 
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; 
### 创建一个远程连接用户,用于nacos服务器连接
create user 'nacos'@'%' identified with mysql_native_password by 'Nacos123456!'; 
#为remote用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to nacos@'%';
###让刚才的修改生效 
FLUSH PRIVILEGES;
### RESET MASTER,删除已产生的Binlog,因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的 
RESET MASTER;

安装MGR插件

INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#执行查询判断MGR插件是否安装成功,如果结果中看到PLUGIN_STATUS:ACTIVE,说明安装成功
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication'\G; 

组网数据同步

master n0

SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION; 
SET GLOBAL group_replication_bootstrap_group=OFF; # 关闭数据自动复制,使集群更安全

slave1 n1、slave2 n2

#指定主从账户与指定通信频道 
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="Rpl123456!" FOR CHANNEL 'group_replication_recovery'; 
#开启组网数据同步 
START GROUP_REPLICATION;

集群验证,查看集群状态

SELECT  *  FROM performance_schema.replication_group_members;

image-20230714174908762.png

3.2部署nacos集群

nacos1:192.168.150.210

nacos2:192.168.150.211

nacos3:192.168.150.212

请确保是在环境中安装使用:

  1. 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
  2. 64 bit JDK 1.8+;下载.配置
  3. Maven 3.2.x+;下载.配置
  4. 3个或3个以上Nacos节点才能构成集群。

下载安装包

wget https://codeload.github.com/alibaba/nacos/tar.gz/refs/tags/2.2.4

解压

tar -zxvf nacos-2.2.4.tar.gz

配置数据源

vim nacos/config/application.properties

增加下面这段配置

spring.datasource.platform=mysql
spring.sql.init.platform=mysql
### Count of DB:
db.num=3
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.150.220:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=Nacos123456!
db.url.1=jdbc:mysql://192.168.150.221:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.1=nacos
db.password.1=Nacos123456!
db.url.2=jdbc:mysql://192.168.150.222:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.2=nacos
db.password.2=Nacos123456!

在MySQL创建数据库并执行nacos官网提供的sql脚本初始化表结构(略)

启动nacos

sh /bin/startup.sh

image-20230714175215903.png

3.3部署nginx和keepalived

nginx1:192.168.150.230

nginx2:192.168.150.231

VIP:192.168.150.240

安装nginx1

yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.25.1.tar.gz
cd nginx-1.25.1
./configuration
make&make install

安装keepalived

yum install -y keepalived

编写check_ngnix脚本

Keepalived会定时执⾏“ps-Cnginx--no-heading|wc-l”命令, 如果返回0,代表Nginx挂了,然后尝试重启,如果重启失败,停⽌keepalived触发故障转移 如果返回⼤于0,代表Nginx正常运⾏,啥都不⼲~

sudo cat >/etc/keepalived/check_nginx.sh<<-'EOF' 
#!/bin/bash 
counter=$(ps -C nginx --no-heading|wc -l) 
if [ "${counter}" = "0" ]; then 
    systemctl start nginx 
    sleep 2 
    counter=$(ps -C nginx --no-heading|wc -l)    
    if [ "${counter}" = "0" ]; then 
        systemctl stop keepalived 
    fi 
fi 
EOF
chmod 755 /etc/keepalived/check_nginx.sh

修改keepalived.conf master配置⽂件

sudo cat >/etc/keepalived/keepalived.conf<<-'EOF' 
! Configuration File for keepalived 
# 全局配置,路由ID,固定不变 
global_defs { 
    router_id LVS_DEVEL 
} 
# 定义Nginx状态脚本 
vrrp_script chk_nginx { 
    script "/etc/keepalived/check_nginx.sh" 
    # 间隔时间,单位为秒,默认1秒 
    interval 2 
    # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少     weight -5 
}
#VRRP实例
vrrp_instance VI_1 { 
    # 主节点 
    state MASTER 
    # 绑定的⽹卡,使⽤ifconfig命令查看获取 
    interface ens33 
    # 虚拟路由id,保证相同 
    virtual_router_id 51 
    # 优先级,抢占模式下优先级⾼的称为主 
    priority 100
    # 指定发送VRRP通告的间隔。单位是秒。 
    advert_int 2 
    # 安全认证⽤的密码,⾃定义即可 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    # 对外暴露的VIP地址 
    virtual_ipaddress { 
        192.168.150.240 
    } 
    # 指定Nginx执⾏状态脚本 
    track_script { 
       chk_nginx 
    } 
}
EOF

启动keepalived

systemctl start keepalived 

KeepAlivedBackup(231) 其他步骤完全相同,只有keepalived.conf有细微差别,过程略

yum install -y keepalived 
sudo cat >/etc/keepalived/check_nginx.sh<<-'EOF' #!/bin/bash 
counter=$(ps -C nginx --no-heading|wc -l) 
if [ "${counter}" = "0" ]; then 
    systemctl start nginx 
    sleep 2 
    counter=$(ps -C nginx --no-heading|wc -l)     if [ "${counter}" = "0" ]; then 
        systemctl stop keepalived 
    fi 
fi 
EOF 
chmod 755 /etc/keepalived/check_nginx.sh

keepalived.conf slave配置⽂件

sudo cat >/etc/keepalived/keepalived.conf<<-'EOF'
! Configuration File for keepalived 
global_defs { 
    router_id LVS_DEVEL 
} 
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
} 
vrrp_instance VI_1 { 
    # 初始⻆⾊Backup 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    # 优先级⽐master低 
    priority 100 
    advert_int 2 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.150.240 
    } 
    track_script { 
       chk_nginx 
    } 
} 
EOF

启动keepalived-slave

systemctl start keepalived 

修改nginx.config文件,启动nginx

upstream nacos-cluster {
    server 192.168.150.210:8848;
    server 192.168.150.211:8848;
    server 192.168.150.212:8848;
}
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://nacos-cluster:8848;
    }
}
./nginx

image-20230714175505294.png