提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Docker中部署Mysql5.7双主 +Nginx反向代理
前言
系统环境为BC-LINUX8.6
一、现实目标?
实现2台数据库配置双主,Nginx配置反向代理实现Mysql双活。
二、部署步骤
1.Docker安装
代码如下(示例):
参考移动云网站:https://mirrors.cmecloud.cn/
2.拉取Mysql镜像
代码如下(示例):
拉取镜像:
docker pull mysql:5.7
3.配置双主&启动Docker
3.1.新建数据库映射文件和目录
代码如下(示例):
目录新建
mkdir -p /data/mysql /data/mysql/conf.d /data/mysql/data/
文件新建;
touch /data/mysql/my.cnf
3.2.修改配my.cnf文件
服务器A:
**服务器A:**
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
max_connections=1000
wait_timeout=31536000
interactive_timeout=31536000
server-id = 12 ##这个参数指定了 MySQL 服务器的唯一标识符。在主从复制(replication)设置中,每个服务器必须有唯一的 ID
log-bin = mysql-bin ##启用二进制日志(binary logging)并设置二进制日志文件的名称前缀为 mysql-bin。二进制日志用于记录数据库的变更操作,
binlog-ignore-db = mysql,information_schema ##排除了系统数据库 mysql 和 information_schema,它们的变更通常不需要被复制到从服器
sync_binlog = 1 ##控制二进制日志的刷新频率。这里设置为 1,表示每次事务提交时都会将日志同步写入磁盘,确保事务的持久性。
binlog_checksum = none ##指定二进制日志的校验方式。这里设置为 none,表示不启用校验和功能
binlog_format = mixed ##设置二进制日志的格式。mixed 表示二进制日志的格式可以是 statement、row 或 mixed,具体格式由具体的语句决定
auto-increment-increment = 2 ## 设置自增长列的增量值。这里设置为 2,控制主键自增的步长,几台服务器就设置几
auto-increment-offset = 2 ## 设置自增长列的起始值偏移量。这里设置为 2,这个是第2台,那么为2,下一台则为3。
slave-skip-errors = all ##在从服务器(slave)复制过程中遇到错误时的处理方式all 表示当出现任何错误时从服务器都会跳过并继续执行后续的操作。
replicate-do-db=mas_gxhos_admin ##这里分别指定了 mas_gxhos_admin 和 mas_gxhos_sms 两个数据库,意味着主服务器上对这两个数据库的变更会被复制到从服务器。
replicate-do-db=mas_gxhos_sms
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
服务器B:
**服务器B:**
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
max_connections=1000
wait_timeout=31536000
interactive_timeout=31536000
server-id = 11
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2 几台服务器就设置几
auto-increment-offset = 1 设置自增长列的起始值偏移量。这里设置为 1(这个是第1台,那么为1,下一台则为2)。
slave-skip-errors = all
replicate-do-db=mas_gxhos_admin
replicate-do-db=mas_gxhos_sms
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
3.3.启动2台mysql容器
A服务器:
docker run -di -v /data/mysql/data/:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=您的密码 mysql:5.7
B服务器:
docker run -di -v /data/mysql/data/:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -v /data/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=您的密码 mysql:5.7
3.4.二台数据库分别建立复制帐号,并分配复制权限
代码如下(示例):
create user 'repl'@'%' identified with mysql_native_password by '#refpL123@hQ';
grant replication slave,replication client on *.* to 'refpl'@'%';
flush privileges;
3.5.分别设置同步,开启同步
代码如下(示例):
show master status;
得到其log_file,log_pos用于下一步参数填写
从服务器配置:复制来自主服务器的数据
CHANGE MASTER TO
MASTER_HOST = IP, -- 主服务器的主机名或IP地址
MASTER_USER = 'repl', -- 连接到主服务器的复制用户名
MASTER_PASSWORD = 'your_password',-- 连接到主服务器的复制用户密码
MASTER_PORT = 3306, -- 主服务器的端口号
MASTER_LOG_FILE = 'mysql-bin.000007', -- 主服务器当前的二进制日志文件名
MASTER_LOG_POS = 数字; -- 主服务器当前的二进制日志文件的位置
配置A从,B主
A服务器操作:
change master to master_host='192.168.0.8(B服器IP)',master_user='repl',master_password='#refpL123@hQ',master_log_file='mysql-bin.000001(B)',master_log_pos=150(B);
start slave;
#查看同步状态是否正确
show slave status \G;
配置A主,B从
B服务器操作:
change master to master_host='192.168.0.7(A服器IP)',master_user='repl',master_password='#refpL123@hQ',master_log_file='mysql-bin.000001(A)',master_log_pos=150(A);
start slave;
#查看同步状态是否正确
show slave status \G;
2台数据库:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4.双活配置
4.1.Nginx安装
代码如下(示例):
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
安装nginx
yum install nginx -y
# 开启
systemctl start nginx
#停止
systemctl stop nginx
#重载nginx
systemctl reload nginx
详细介绍见官网
4.2.配置Nginx
代码如下(示例):
vim /etc/nginx/nginx.conf
[root@test1 ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/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"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time';
access_log /var/log/nginx/stream-access.log basic buffer=32k;
include /etc/nginx/conf.d/*.stream;
upstream mysql {
#hash $remote_addr consistent;
server 192.168.0.8:3306;
server 192.168.0.7:3306 backup;
}
server {
listen 13306;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass mysql;
}
}
4.3.双活测试
直接连接nginx服务器暴露的 13306 端口