注意:mysql不可以使用基于gtid进行复制的高可用功能,因为mysql和mariadb的gtid格式不同
环境
【实验系统为ubuntu 22.04】
主机IP | 角色 | 系统 |
192.168.1.101 | 主服务器【初始状态】 | ubuntu22.04 |
192.168.1.102 | 从服务器【初始状态】 | ubuntu22.04 |
192.168.1.103 | 从服务器【初始状态】 | ubuntu22.04 |
192.168.1.104 | maxscale服务器 | ubuntu22.04 |
主服务器配置
vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
log_bin=mysql-bin
server-id=1
bind-address=0.0.0.0
binlog_format=mixed
sync_binlog=1
gtid_strict_mode=1
relay_log=mysql-relay-bin
replicate-do-db=employees
重启服务器
systemctl restart mysql
创建监控用户
mysql -u root -p
CREATE USER 'maxscale_mon'@'192.168.1.%' IDENTIFIED BY 'wakamizu';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SLAVE MONITOR, REPLICATION SLAVE ADMIN, RELOAD , READ_ONLY ADMIN , BINLOG ADMIN ON *.* TO 'maxscale_mon'@'192.168.1.%';
创建路由用户
主服务器执行
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'wakamizu';
#赋予maxscale查看数据库相关信息,如表权限等
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
GRANT SELECT ON mysql.* TO 'maxscale'@'%';
#授予测试数据库所有权限,按需授予
GRANT ALL PRIVILEGES ON employees.* TO 'maxscale'@'%';
从服务器配置
vim /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
server-id=2
#第三配置为server-id=3
bind-address=0.0.0.0
log_bin=mysql-bin
relay_log=mysql-relay-bin
replicate-do-db=employees
gtid_strict_mode=1
log_slave_updates=1
重启服务器
systemctl restart mysql
创建集群监控用户
mysql -u root -p
CREATE USER 'maxscale_mon'@'192.168.1.%' IDENTIFIED BY 'wakamizu';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SLAVE MONITOR, REPLICATION SLAVE ADMIN, RELOAD , READ_ONLY ADMIN , BINLOG ADMIN ON *.* TO 'maxscale_mon'@'192.168.1.%';
创建maxscale用户
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'wakamizu';
#赋予maxscale查看数据库相关信息,如表权限等
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';
GRANT SELECT ON mysql.* TO 'maxscale'@'%';
#授予测试数据库所有权限,按需授予
GRANT ALL PRIVILEGES ON employees.* TO 'maxscale'@'%';
重新配置基于gtid的主从复制
change master to master_host='192.168.1.101', master_user='maxscale_mon', master_password='wakamizu', master_use_gtid = slave_pos;
maxscale服务器配置
下载安装maxscale
apt install maxscale-23.08.5-1.ubuntu.jammy.x86_64.deb -y
生成加密密码
#生成加密文件,默认路径在/var/lib/maxscale/.secrets
maxkeys
#生成加密密码
maxpasswd wakamizu
配置maxscale
vim /etc/maxscale.cnf
[server1]
type=server
address=192.168.1.101
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.1.102
port=3306
protocol=MariaDBBackend
[server3]
type=server
address=192.168.1.103
port=3306
protocol=MariaDBBackend
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=maxscale_mon
password=E38A4DC32AF8692DB663BD5DABC88A254F4823875FE2F5E7D48784292F9965AC
monitor_interval=2s
#自动故障转移
auto_failover=true
#重新加入集群
auto_rejoin=true
#配置读写分离池
[Read-Write-Service]
type = service
router = readwritesplit
servers = server1,server2,server3
user = maxscale
password = E38A4DC32AF8692DB663BD5DABC88A254F4823875FE2F5E7D48784292F9965AC
enable_root_user = true
[Read-Write-Listener]
type = listener
service = Read-Write-Service
protocol = MariaDBClient
port = 4006
重启服务
systemctl restart maxscale
注意!
如果主从配置后没有执行任何事务,使用SHOW VARIABLES LIKE '%gtid%' 查看gtid_binlog_pos,从服务器gtid_binlog_pos默认值为空,那么当它提升为主服务器时,其他服务器并不会指向该服务器,需要提交一个事务才能生成gtid_binlog_pos值
读写分离测试
查看数据库状态
maxctrl list servers
┌─────────┬───────────────┬──────┬─────────────┬─────────────────┬─────────┬─────────────────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │ Monitor │
├─────────┼───────────────┼──────┼─────────────┼─────────────────┼─────────┼─────────────────┤
│ server1 │ 192.168.1.101 │ 3306 │ 0 │ Slave, Running │ 0-3-186 │ MariaDB-Monitor │
├─────────┼───────────────┼──────┼─────────────┼─────────────────┼─────────┼─────────────────┤
│ server2 │ 192.168.1.102 │ 3306 │ 0 │ Master, Running │ 0-3-186 │ MariaDB-Monitor │
├─────────┼───────────────┼──────┼─────────────┼─────────────────┼─────────┼─────────────────┤
│ server3 │ 192.168.1.103 │ 3306 │ 0 │ Slave, Running │ 0-3-186 │ MariaDB-Monitor │
└─────────┴───────────────┴──────┴─────────────┴─────────────────┴─────────┴─────────────────┘
查看读写池状态
maxctrl list services
┌────────────────────┬────────────────┬─────────────┬───────────────────┬───────────────────────────┐
│ Service │ Router │ Connections │ Total Connections │ Targets │
├────────────────────┼────────────────┼─────────────┼───────────────────┼───────────────────────────┤
│ Read-Write-Service │ readwritesplit │ 0 │ 2 │ server1, server2, server3 │
└────────────────────┴────────────────┴─────────────┴───────────────────┴───────────────────────────┘
#4006端口会自动路由sql语句到对应的服务器
mysql -u maxscale -p -h 127.0.0.1 -P 4006
#可以在从节点新建一个表,然后分别在4006端口和主节点对这个表进行查询和删除操作
故障转移测试
停止主节点服务,观察日志和查询服务状态
拓展
如果测试时候不想先加入自动转移参数,可以先手动转移
maxctrl call command mariadbmon failover MariaDB-Monitor
#MariaDB-Monitor为配置名
还有就是转换主节点
maxctrl call command mariadbmon switchover MariaDB-Monitor server1 server2
#MariaDB-Monitor为配置名,serve1为新的主节点,server2为旧的主节点