记录一下mysql8.0配置双机热备后使用Haproxy实现负载均衡,本文重点在mysql配置及Haproxy配置,忽略mysql安装等过程。
一、服务器A配置
配置my.cnf
假设有A、B两台服务器,A服务器ip地址为192.168.0.1,B服务器ip地址为192.168.0.2,数据库版本都为8.0。
A的my.cnf配置如下:
server-id=1 #mysql实例的唯一标识,不能重复
log-bin=mysql-bin #启用binlog,并将binlog日志前缀指定为mysql-bin,mysql双机热备数据同步依赖binlog记录数据更改的操作
binlog_format=ROW #binlog记录的格式,可选row(行)或者mixed(混合)
binlog-do-db=test #记录指定数据库的变更,有多个库就多行,每个库一行,如果binlog-do-db和bin-ignore-db都未配置则默认同步所有库
binlog-do-db=test1
binlog-ignore-db=mysql #忽略指定数据库的变更,与binlog-do-db互斥,如过两个都填,只有binlog-do-db生效
auto-increment-increment=2 #自增列的增值量,用于避免自增列id重复,填服务器实例的数量
auto-increment-offset=1 #自增列的偏移量,A服务器为1,则B服务器为2
relay_log=mysql-relay-bin #开启中继日志
log_slave_updates=1 #将主服务器接收并应用的更改同时记录到本地的二进制日志中
查看数据库master信息
A服务器mysql执行:
show master status;
记录执行结果的File和Position,后面配置master要用:
File: mysql-bin.000001
Position: 157
创建用于主从复制的用户
用户名跟密码根据自己需求替换
create user 'copy'@'%' identified with mysql_native_password by 'copyuser#2024';
gran replication slave on *.* to 'copy'@'%';
flush privileges;
二、服务器B配置
配置my.cnf
B的my.cnf配置如下,区别只是server-id和auto-increment-offset不同:
server-id=1 #mysql实例的唯一标识,不能重复
log-bin=mysql-bin #启用binlog,并将binlog日志前缀指定为mysql-bin,mysql双机热备数据同步依赖binlog记录数据更改的操作
binlog_format=ROW #binlog记录的格式,可选row(行)或者mixed(混合)
binlog-do-db=test #记录指定数据库的变更,有多个库就多行,每个库一行,如果binlog-do-db和bin-ignore-db都未配置则默认同步所有库
binlog-do-db=test1
binlog-ignore-db=mysql #忽略指定数据库的变更,与binlog-do-db互斥,如过两个都填,只有binlog-do-db生效
auto-increment-increment=2 #自增列的增值量,用于避免自增列id重复,填服务器实例的数量
auto-increment-offset=1 #自增列的偏移量,A服务器为1,则B服务器为2
relay_log=mysql-relay-bin #开启中继日志
log_slave_updates=1 #将主服务器接收并应用的更改同时记录到本地的二进制日志中
B的my.cnf配置如下:
server-id=2 #mysql实例的唯一标识,不能重复
log-bin=mysql-bin #启用binlog,并将binlog日志前缀指定为mysql-bin,mysql双机热备数据同步依赖binlog记录数据更改的操作
binlog_format=ROW #binlog记录的格式,可选row(行)或者mixed(混合)
binlog-do-db=test #记录指定数据库的变更,有多个库就多行,每个库一行,如果binlog-do-db和bin-ignore-db都未配置则默认同步所有库
binlog-do-db=test1
binlog-ignore-db=mysql #忽略指定数据库的变更,与binlog-do-db互斥,如过两个都填,只有binlog-do-db生效
auto-increment-increment=2 #自增列的增值量,用于避免自增列id重复,填服务器实例的数量
auto-increment-offset=2 #自增列的偏移量,A服务器为1,则B服务器为2
relay_log=mysql-relay-bin #开启中继日志
log_slave_updates=1 #将主服务器接收并应用的更改同时记录到本地的二进制日志中
查看数据库master信息
B服务器mysql执行:
show master status;
记录执行结果的File和Position,后面配置master要用:
File: mysql-bin.000001
Position: 157
创建用于主从复制的用户
用户名跟密码根据自己需求替换
create user 'copy'@'%' identified with mysql_native_password by 'copyuser#2024';
gran replication slave on *.* to 'copy'@'%';
flush privileges;
三、配置主主复制
设置A同步B
master_host填A服务器ip
master_user填B服务之前设置的同步用的用户名
master_password填B服务之前设置的同步用的密码
master_log_file填上面查看A服务master信息的file
master_log_pos填上面查看A服务master信息的position
change master to
master_host='192.168.0.2',
master_user='copy',
master_password='copyuser#2024',
master_log_file='mysql-bin.000001',
master_log_pos=157;
启动同步进程
start slave ;
查看同步进程状态
那个\G是用于美化输出格式的,不加也可以。
show slave status\G
Slave_IO_Running和Slave_SQL_Running都为Yes说明同步进程正常
设置B同步A
master_host填A服务器ip
master_user填B服务之前设置的同步用的用户名
master_password填B服务之前设置的同步用的密码
master_log_file填上面查看A服务master信息的file
master_log_pos填上面查看A服务master信息的position
change master to
master_host='192.168.0.1',
master_user='copy',
master_password='copyuser#2024',
master_log_file='mysql-bin.000001',
master_log_pos=157;
启动同步进程
start slave ;
查看同步进程状态
那个\G是用于美化输出格式的,不加也可以。
show slave status\G
Slave_IO_Running和Slave_SQL_Running都为Yes说明同步进程正常
测试主主复制
在A服务的msyql中创建一个test库,正常在B服务的mysql中能看到该库。
在B服务的msyql中创建一个test1库,正常在A服务的mysql中也能看到该库。
如果都能同步,说明配置正常,到此双机热备配置完成。
四、配置Haproxy负载均衡
安装haproxy,这里使用的是centos7,直接yum install haproxy即可。
修改/etc/haproxy/haproxy.cfg ,如下:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend mysql_frontend
bind *:3307
mode tcp
default_backend mysql_backend
backend mysql_backend
mode tcp
balance roundrobin
server mysql1 10.0.20.16:3306 check
server mysql2 10.0.8.12:3306 check
主要是修改 frontend mysql_frontend的bind端口和backend mysql_backend,有几个服务就加到backend mysql_backend的server。balance是负载均衡方式这里是轮训。
主要有以下几种,按需选择:
roundrobin:这是默认的算法,它按顺序轮流将请求分发给服务器。这种方法简单且公平,尤其适合没有持久连接的场景。
leastconn:选择当前活跃连接数最少的服务器。这个算法适合那些持有连接时间较长的应用,比如数据库连接。
source:根据客户端IP地址的散列值来选择服务器,确保来自同一IP的请求总是被分发到同一个服务器上,适用于需要会话保持的应用。
uri:根据请求的URI进行散列,可以用于实现URL路由。
url_param:根据请求中的URL参数进行散列,用于实现更复杂的会话保持。
hdr(name):根据HTTP请求头中的某个指定的头字段的值来进行选择。