mysql 5.7 nginx负载+mysql双主实现
一台不够再加一台
现在先写个一台nginx的,后续修改为热nginx
准备工作
mysql 5.7 安装包
mysql-5.7.31-linux-glibc2.12-x86_64.tar
# 百度云:不推荐,学习下载安装工具,肯定是选找新的来,我是迫于无奈,公司主用的是5.7的 https://pan.baidu.com/s/1zIDvIEouGQSpAfPFR8hSnQ 1234 # 推荐清华镜像站,感谢清华,虽说拒绝了去读书,但是依然为我这个废柴提供了镜像服务 https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/
三台服务器
nginx:172.165.165.121 mysqlA:172.165.165.131 mysqlB:172.165.165.132
nginx安装:
数据库安装:https://blog.csdn.net/qq_37809967/article/details/109396043
mysql配置文件
mysql A 配置文件 /etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] # 跳过登录密码校验,用于重置密码时使用 # skip-grant-tables user=root basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /data/mysql pid-file = /data/mysql/mysql.pid log-error = /data/mysql/mysql.err server-id = 1 auto_increment_offset = 1 auto_increment_increment = 2 #奇数ID log-bin = mysql-bin #打开二进制功能,MASTER主服务器必须打开此项 binlog-format=ROW log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 expire_logs_days=5 max_binlog_size=1024M #binlog单文件最大值 replicate-ignore-db = mysql #忽略不同步主从的数据库 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 explicit_defaults_for_timestamp=true sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' skip-character-set-client-handshake #忽略应用程序想要设置的其他字符集 init-connect='SET NAMES utf8' #连接时执行的SQL character-set-server=utf8 #服务端默认字符集 wait_timeout=1800 #请求的最大连接时间 interactive_timeout=1800 #和上一参数同时修改才会生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe]
mysql B 配置文件 /etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] # 跳过登录密码校验,用于重置密码时使用 # skip-grant-tables user=root basedir = /usr/local/mysql port = 3306 socket = /tmp/mysql.sock datadir = /data/mysql pid-file = /data/mysql/mysql.pid log-error = /data/mysql/mysql.err server-id = 2 auto_increment_offset = 2 auto_increment_increment = 2 #奇数ID log-bin = mysql-bin #打开二进制功能,MASTER主服务器必须打开此项 binlog-format=ROW log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=0 sync_binlog=0 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 expire_logs_days=5 max_binlog_size=1024M #binlog单文件最大值 replicate-ignore-db = mysql #忽略不同步主从的数据库 replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = test replicate-ignore-db = zabbix max_connections = 3000 max_connect_errors = 30 explicit_defaults_for_timestamp=true sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' skip-character-set-client-handshake #忽略应用程序想要设置的其他字符集 init-connect='SET NAMES utf8' #连接时执行的SQL character-set-server=utf8 #服务端默认字符集 wait_timeout=1800 #请求的最大连接时间 interactive_timeout=1800 #和上一参数同时修改才会生效 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式 max_allowed_packet = 10M bulk_insert_buffer_size = 8M query_cache_type = 1 query_cache_size = 128M query_cache_limit = 4M key_buffer_size = 256M read_buffer_size = 16K skip-name-resolve slow_query_log=1 long_query_time = 6 slow_query_log_file=slow-query.log innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout [mysqldump] quick max_allowed_packet = 16M [mysqld_safe]
主要配置都是一样的,注意的是broker-id 不同,自增初始id不同,
mysqA与mysqlB 配置从权限
A 与 B 均执行以下指令
# 进入数据库 /usr/mysql/bin/mysql -uroot -proot # 设置从用户 'slave'@'%' 密码为 'slave' GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave'; # 刷新权限 flush privileges;
区别开始
mysql A 查看master状态
show master status;
mysql B 查看master状态
show master status;
在mysql A上执行指令
change master to master_host = '172.165.165.132', master_user = 'slave', master_password = 'slave', master_log_file = 'mysql-bin.000012', master_log_pos = 1167; # 开始从操作,从主库同步数据 start slave; # 查看从状态 show slave status \G
在mysqlB上执行指令
change master to master_host = '172.165.165.131', master_user = 'slave', master_password = 'slave', master_log_file = 'mysql-bin.000017', master_log_pos = 68153006; # 开始从操作,从主库同步数据 start slave;
nginx配置
安装过程极其简单,主要注意的是要有make安装环境就行,安装结束后,nginx默认是在 /usr/local/nginx 文件夹下
解压
执行configuration
强迫症患者看的难受的话可以在.configuration的时候指定openssl地址,一般没影响,大部分服务器都具备基础环境的,这只是没有显示的指出地址,找不到,又不是不能用。
更多安装详情请看官网说明:http://nginx.org/en/docs/configure.html,
其实大部分软件基础使用,官方都会给出最为权威的文档,一定要看官网
找到openssl地址,在官方案例上 指定openssl库源路径配置nginx
open
./configure\ --sbin-path=/usr/local/nginx/nginx\ --conf-path=/usr/local/nginx/nginx.conf\ --pid-path=/usr/local/nginx/nginx.pid\ --with-http_ssl_module\ --with-stream_ssl_module;
进入nginx安装包文件夹,执行make && make install 指令进行安装
这里我脑子抽了,看到别人的教程,没注意,以为是有个make文件,执行make脚本进行安装。硬是要找make文件,其实make是一个安装环境,一帮的服务器都有的,没有就执行
yum install gcc automake autoconf libtool make
启动nginx
nginx默认使用80端口演示案例
如果无法访问八成是防火墙的原因,请移步Linux常用指令操作防火墙篇
配置nginx代理数据库
在 /usr/local/nginx/conf/nginx.cnf文件里面添加流配置
重启nginx、配置防火墙
/usr/local/nginx/sbin/nginx -s reload
stream { server { listen 3306; proxy_pass db; } upstream db { server 172.165.165.131:3306 weight=2 max_fails=2 fail_timeout=20; server 172.165.165.132:3306 weight=3 max_fails=2 fail_timeout=30; } }
中间有些小问题,
- 警告缺失openssl,这个不装其实也没事,没用到就可以不装,
- 安装openssl又报缺失 perl 5
- mysql代理设置后启动nginx、异常缺失流模块,官方有说明,配置的时候加上这个,然后在nginx.conf文件在stream使用前加上一行
load_module '/usr/local/nginx/modules/ngx_stream_module.so'; 就行
反正缺什么装什么就是了
我的nginx.conf文件
load_module '/usr/local/nginx/modules/ngx_stream_module.so'; #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; stream { server { listen 9000; proxy_pass db; } upstream db { server 172.165.165.131:3306 weight=2 max_fails=2 fail_timeout=20; server 172.165.165.132:3306 weight=3 max_fails=2 fail_timeout=30; } } events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #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 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; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律