【工作场景实操】MySQL_Galera_Cluster 部署,nginx 负载均衡。

分享 芋圆味洋葱 ⋅ 于 2024-09-11 17:31:28 ⋅ 394 阅读

一、背景
1、某项目现场系统多,每个系统都需要用到数据库,并且数据库都是单节点,无法保证数据库宕机后业务的正常运转,不易运维人员后期维护和管理。现需要在三台服务器上部署一套高可用数据库集群,后续所有系统公用一套数据库。
2、经过调研分析,最后采用开源的Mysql Galera Cluster方案。Galera Cluster是一种同步多主复制技术,它通过在多个MySQL节点之间保持数据一致性来实现高可用性和水平扩展。Galera Cluster使用了全球事务标识符(GTID)来跟踪和保证事务的一致性。Galera Cluster中的所有节点都是对等的,可以接收写操作,并且数据的复制是同步进行的,确保所有节点上的数据保持一致。
3、现将我在工作中实施部署的过程记录分享在此,欢迎每个小海牛学习和探讨。
二、部署
服务器准备
192.168.20.21 centos7.9
192.168.20.22 centos7.9
192.168.20.23 centos7.9
nginx代理一台,也可以随意放在集群任意一台
192.168.1.4 centos7.9
集群部署
1、rpm包准备
galera包url:http://releases.galeracluster.com/galera-3/centos/7/x86_64/
mysql_wsrep包url:http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
file
2、环境准备
①、修改主机名,并加入hosts(每台机器都操作)
②、关闭SELINUX(三台都执行)

1)查看关闭状态
/usr/sbin/sestatus -v
2)关闭方法
vim /etc/selinux/config
把文件里的SELINUX=disabled
3)临时关闭selinux(无需重启),从enforcing(强制模式:拦截访问)到permissive(启动宽松模
式:不拦截访问)
setenforce 0
4)查看当前模式
getenforce

/usr/sbin/sestatus -v 查看selinux的修改状态
③、关闭防火墙(三台都执行)

systemctl stop firewalld
systemctl disabled firewalld

④、删除系统自带的mariadb和mysql(三台都执行)

rpm -qa |grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
rpm -qa |grep mysql

⑤、安装依赖(三台都执行)

yum -y install socat stunnel
yum -y install gcc gcc-c++ boost-devel rsync lsof scons check-devel openssl-devel

⑥、rpm安装mysql-5.7.44(按照顺序执行,包之间有依赖关系)(三台都执行)

rpm -ivh mysql-wsrep-common-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-client-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-compat-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-server-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh mysql-wsrep-devel-5.7-5.7.44-25.36.el7.x86_64.rpm
rpm -ivh galera-3-25.3.37-1.el7.x86_64.rpm

⑦、如果数据存在默认生成的路径(/var/lib/msyql),用下面这个配置(三台一样)
vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

binlog_format = ROW
log-bin= /data01/mysql/logs/mysql-bin

default-time_zone = '+8:00'
log_timestamps=SYSTEM  #使用系统本地时间来记录时间打印时间

character_set_server=utf8
symbolic-links=0
explicit_defaults_for_timestamp=true
max_allowed_packet=100M
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=1000

如果数据存在指定路径(/data01/msyql),用下面这个配置(三台一样)

[mysqld]
port=3306
basedir=/data01/mysql
datadir=/data01/mysql/data
socket=/var/lib/mysql/mysql.sock
lc-messages-dir = /usr/share/mysql
log-error=/data01/mysql/logs/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

binlog_format = ROW
log-bin= /data01/mysql/logs/mysql-bin

default-time_zone = '+8:00' #数据库时间使用东八区时间
log_timestamps=SYSTEM  #使用系统本地时间来记录时间打印时间

character_set_server=utf8
symbolic-links=0
explicit_defaults_for_timestamp=true
max_allowed_packet=100M
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=1000

⑧、启动mysql,初始化的密码在/var/log/mysqld.log里(三台都执行)

mysql -uroot -p
#降低密码策略,可直接设置12345678
set global validate_password_policy=LOW;
alter user 'root'@'localhost' identified by 'Safe1!2@3#.';

#创建同步用户
create user 'rf'@'%' IDENTIFIED BY 'Safe1!2@3#.';
grant all on *.* to 'rf'@'%';
grant all privileges on *.* to 'root'@'%' identified by 'Safe1!2@3#.';
flush privileges;


1)、先修改第一台节点的配置文件
在原有的基础上加如下配置

server-id=21
default_storage_engine=InnoDB  
innodb_file_per_table=1
innodb_autoinc_lock_mode=2

wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://'    #这里先不写ip,等后两台启动成功后,在加入ip
wsrep_node_name='mysql_ha_1'               #集群中这个节点的名称不不能与其他节点重复
wsrep_node_address='192.168.20.21'
wsrep_sst_auth=rf:"123456"   #最开始创建的用户,放在这里用来同步数据
wsrep_sst_method=rsync    #注意没有rsync需要yum下载
#停掉mysql,然后在启动该命令会启动本机的 mysqld 服务,命令只在集群第一个节点启动时使用,因为该脚本中带有一个参数:–wsrep-new-cluster,代表新建集群。
systemctl stop mysqld
/usr/bin/mysqld_bootstrap
#进入mysql,查看集群状态
show status like 'wsrep_incoming%';      #galera集群创建成功目前只有一个节点

file
2)、 在修改第二台节点的配置文件
在原有的基础上加如下配置

server-id=22
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2

wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.20.21,,192.168.20.23'   #这里加上除自己以外的其他节点ip
wsrep_node_name='mysql_ha_2'
wsrep_node_address='192.168.20.22'
wsrep_sst_auth=rf:"123456"
wsrep_sst_method=rsync
#重启mysql
systemctl restart mysqld
#进入mysql,查看集群状态
show status like 'wsrep_incoming%';      #集群有两个节点了

file
3)、 最后修改第三台节点的配置文件
在原有的基础上加如下配置

server-id=23
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2

wsrep_on=ON
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.20.21,192.168.20.22'
wsrep_node_name='mysql_ha_3'
wsrep_node_address='192.168.20.23'
wsrep_sst_auth=rf:"123456"
wsrep_sst_method=rsync
#重启mysql
systemctl restart mysqld
#进入mysql,查看集群状态
show status like 'wsrep_incoming%';      #可以看到最后一个节点也加入集群了

file
4)待所有节点都加入集群之后,再回头依次改每台机器的配置(先改第一台,没有加ip的那台),把所有ip加入到配置文件中。其他节点千万不要停止运行,改一个重启一个!!!!!

wsrep_cluster_address='gcomm://192.168.20.21,192.168.20.22,192.168.20.23' 

改完之后,登录数据库看集群状态

show status like 'wsrep_incoming%';  
show status like '%wsrep%';

三、nginx负载均衡代理
1、解压,进入源码包路径,编译安装

./configure --sbin-path=/usr/local/nginx/bin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --with-pcre --with-stream  --with-http_ssl_module
make
make install

2、修改配置文件

#进入编译好的nginx路径,备份自带的配置文件
cd /usr/local/nginx
mv conf/nginx.conf conf/nginx.conf-bak
#修改配置文件
vim conf/nginx.conf
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}
#http {
#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';
#}
stream {
    upstream mysql_ha {
        #负载均衡方式:连接数,谁少连谁
        least_conn;    
        server 192.168.20.21:3306 max_fails=3 fail_timeout=30s;  #失败时间30s,失败次数3次
        server 192.168.20.22:3306 max_fails=3 fail_timeout=30s;
        server 192.168.20.23:3306 max_fails=3 fail_timeout=30s;
        }
server {
        listen 3306;   
        proxy_pass mysql_ha;
        # 设置超时
        proxy_connect_timeout 10s;
        proxy_timeout 30s;
        }
}

3、相关命令

#检查配置是否有问题
bin/nginx -t
#启动
bin/nginx
#重新加载配置文件
bin/nginx -s reload
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-芋圆味洋葱,http://hainiubl.com/topics/76575
本帖已被设为精华帖!
本帖由 青牛 于 2月前 加精
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter