一、背景
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/
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集群创建成功目前只有一个节点
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%'; #集群有两个节点了
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%'; #可以看到最后一个节点也加入集群了
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