Ubuntu 24.04 部署 GreatSQL 主从及 VIP 切换

环境说明

操作系统版本:Ubuntu 24.04.1 LTS
GLIBC 版本:2.39
GreateSQL版本: GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64
# 这里要注意 glibc 的版本
IP 角色 VIP
172.16.16.82 主节点 172.16.16.88
172.16.16.83 从节点

二进制安装

2台服务器都需要安装,这样需要注意! 先不要启动 GreatSQL 和设置 root 的密码,搭建完集群时统一操作; 原因:启动 MGR集群前时不要产生事务,若是在要操作可以采用:set session sql_log_bin=0; 可以通过 show master status \G; 命令查看目前的 gtid 。
安装参考:https://www.cnblogs.com/klvchen/p/18877381

修改 my.cnf 配置

主节点:

cat > /etc/my.cnf << -'EOF'
[client]
socket    = /data/GreatSQL/mysql.sock
[mysql]
loose-skip-binary-as-hex
prompt = "(\\D)[\\u@GreatSQL][\\d]>"
no-auto-rehash
[mysqld]
user    = mysql
port    = 3306
server_id = 3306
basedir = /usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64
datadir = /data/GreatSQL
socket  = /data/GreatSQL/mysql.sock
pid-file = mysql.pid
character-set-server = UTF8MB4
skip_name_resolve = ON
default_time_zone = "+8:00"
bind_address = "0.0.0.0"
secure_file_priv = /data/GreatSQL

server_id=82
log-bin
log_slave_updates=1
gtid_mode=ON
enforce_gtid_consistency=ON

#mgr
# 开启插件
plugin_load_add=greatdb_ha.so;group_replication.so

# MGR集群名,要保证集群各节点的选项值一样才行,否则就是不同的集群了。
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"

# 注意配置的端口写的是 33061 而不是 3306,这是为MGR服务指定专用的通信端口,区别于MySQL正常的读写服务端口。这里的 33061 端口号可以自定义,例如写成 12345 也可以,注意该端口不能被防火墙拦截。
loose-group_replication_local_address = "172.16.16.82:33061"
loose-group_replication_group_seeds = "172.16.16.82:33061,172.16.16.83:33061"

# 向MGR其他节点报告本节点使用的地址,避免某个服务器上有多个主机名时,可能无法正确找到对应关系而使得MGR无法启动的问题。
report-host = 172.16.16.82

# 配置开启浮动IP功能
loose-greatdb_ha_enable_mgr_vip = ON

# 配置写浮动ip,写vip会随着mgr主的切换漂移到新主上
loose-greatdb_ha_mgr_vip_ip = "172.16.16.88"

# 配置ARP包广播重复次数。当节点绑定浮动IP以后,会广播ARP包来更新广播域内的ARP缓存,此参数是广播次数,默认是5次,合法取值范围为3-20。
loose-greatdb_ha_send_arp_packge_times = 5

# 配置通信端口,主节点会连接从节点的HA port,发送新的VIP绑定关系(每隔20s重新发,从节点收到消息后会验证VIP绑定并广播ARP报文)
loose-greatdb_ha_port = 33062

# 置网卡,插件会将vip绑定到MGR主所在机器的指定网卡上
loose-greatdb_ha_mgr_vip_nic = 'ens33'

# 配置掩码
loose-greatdb_ha_mgr_vip_mask = '255.255.255.0'

# 网关IP信息的配置,2节点集群中的GreatDB实例会周期性探测该IP的连通性,以确认自身的网络健康情况。2节点集群内的GreatDB实例的网关IP参数必须配置相同。
loose-greatdb_ha_gateway_address="172.16.16.1"   

# 目前只支持单主MGR模式,所以需要设置:
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF
-EOF

从节点:

cat > /etc/my.cnf << -'EOF'
[client]
socket    = /data/GreatSQL/mysql.sock
[mysql]
loose-skip-binary-as-hex
prompt = "(\\D)[\\u@GreatSQL][\\d]>"
no-auto-rehash
[mysqld]
user    = mysql
port    = 3306
server_id = 3306
basedir = /usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64
datadir = /data/GreatSQL
socket  = /data/GreatSQL/mysql.sock
pid-file = mysql.pid
character-set-server = UTF8MB4
skip_name_resolve = ON
default_time_zone = "+8:00"
bind_address = "0.0.0.0"
secure_file_priv = /data/GreatSQL

server_id=83
log-bin
log_slave_updates=1
gtid_mode=ON
enforce_gtid_consistency=ON

#mgr
plugin_load_add=greatdb_ha.so;group_replication.so
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
loose-group_replication_local_address= "172.16.16.83:33061"
loose-group_replication_group_seeds= "172.16.16.82:33061,172.16.16.83:33061"
report-host=172.16.16.83

loose-greatdb_ha_enable_mgr_vip = ON
loose-greatdb_ha_mgr_vip_ip = "172.16.16.88"
loose-greatdb_ha_send_arp_packge_times = 5
loose-greatdb_ha_port = 33062
loose-greatdb_ha_mgr_vip_nic = 'ens33'
loose-greatdb_ha_mgr_vip_mask = '255.255.255.0'
loose-greatdb_ha_gateway_address="172.16.16.1"
loose-group_replication_single_primary_mode = ON
loose-group_replication_enforce_update_everywhere_checks = OFF
-EOF

修改 greatsql.service 脚本,保证VIP功能可用, 主从节点都要操作

cat > /lib/systemd/system/greatsql.service << EOF
[Unit]
Description=GreatSQL Server
Documentation=https://greatsql.cn/docs/

After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]

# some limits
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=65535
# processes/threads
LimitNPROC=65535
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false

User=mysql
Group=mysql

Type=simple
ExecStart=/usr/local/GreatSQL-8.0.32-27-Linux-glibc2.28-x86_64/bin/mysqld --defaults-file=/etc/my.cnf 
Restart=on-failure
PrivateTmp=false

#在最后增加这行以保证MGR VIP功能可用
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW

EOF

# 重载
systemctl daemon-reload

部署 MGR 主从集群

主节点:

systemctl start greatsql
systemctl status greatsql

mysql -uroot -p   # 空密码,直接回车

# 创建主从同步的用户
set session sql_log_bin=0;
create user repl@'%' identified with mysql_native_password by 'repl';
GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
set session sql_log_bin=1;

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

# 接着执行下面的命令,将其设置为MGR的引导节点(只有第一个节点需要这么做)后即可直接启动MGR服务:
set global group_replication_bootstrap_group=ON;
start group_replication;

# 查看MGR服务状态:
select * from performance_schema.replication_group_members;

从节点:

systemctl start greatsql
systemctl status greatsql

mysql -uroot -p   # 空密码,直接回车

set session sql_log_bin=0;
create user repl@'%' identified with mysql_native_password by 'repl';
GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
set session sql_log_bin=1;

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';

start group_replication;

在主节点检查 MGR集群状态

select * from performance_schema.replication_group_members;

测试写入数据

连接到主节点,创建测试库表并写入数据:

mysql  -uroot -p
create database mgr;
use mgr;
create table t1(c1 int unsigned not null primary key);
insert into t1 select rand()*10240;
select * from t1;

连接到从节点,查看数据:

select * from mgr.t1;

测试主从切换

在主节点查看 ip 信息

ip add


关闭数据库并再次查看 ip 信息

systemctl stop greatsql

ip add

在从节点查看 ip 信息

VIP 已经漂移到从节点,注意这里主节点重新启动 greatsql 后,MGR 的 PRIMARY 节点不会自动切回主节点

主从同步异常:节点的事务异常处理

# 主节点:
show master status \G; # 拿到事务id

# 从节点:
reset master;

# 设置 事务id,eg:
set global gtid_purged='81aca87e-309f-11f0-8986-000c294495c1:1-2,aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1:1-5' ;

start group_replication ;

参考

https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/deep-dive-mgr/deep-dive-mgr-03.md

posted @ 2025-05-19 17:19  klvchen  阅读(47)  评论(0)    收藏  举报