GreatSQL高可用之动态VIP

2024年 4月 28日 64.1k 0

一、环境信息

操作系统:AnolisOS8.8

数据库版本:GreatSQL-8.0.32-25

软件目录:/usr/local/GreatSQL

数据目录:/data/greatsql/

注:本示例使用GreatSQL-Shell方式部署管理MGR集群环境:

MGR1:192.168.68.101、192.168.68.102、192.168.68.103

RW_VIP:192.168.68.100/24

RO_VIP:192.168.68.200/24

二、安装准备

此示例以二进制包方式进行部署(实例端口:3306,通信端口:33061、33062)。

1、关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

systemctl is-enabled firewalld

2、禁用SELINUX

setenforce 0

vi /etc/selinux/config

SELINUX=disabled

或者执行命令替换配置: sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config

3、关闭swap

echo "vm.swappiness = 0">> /etc/sysctl.conf

sysctl -p

swapoff -a  #禁用swap后还需要注释掉 /etc/fstab 中关于swap加载项

free -h

4、修改数据盘IO策略

将数据库的数据存放目录所在磁盘的IO测试设置为 noop / deadline

先查看当前设置(nvme0n1为磁盘分区)

cat /sys/block/nvme0n1/queue/scheduler

这样没问题,如果不是 noop 或 deadline,可以执行如下命令修改:

echo 'noop' > /sys/block/nvme0n1/queue/scheduler

这样修改后立即生效,无需重启。

5、确认CPU性能模式设置

先检查当前的设置模式,执行如下命令查看;

cpupower frequency-info --policy

如果输出内容不是 The governor "performance" 而是 The governor "powersave" 的话,则要注意了。

The governor "powersave" 表示 cpufreq 的节能策略使用 powersave,需要调整为 performance 策略。

如果是虚拟机或者云主机,则不需要调整,命令输出通常为 Unable to determine current policy。

6、关闭透明大页

建议关闭透明大页(Transparent Huge Pages / THP)。

OLTP型数据库内存访问模式通常是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟,反而影响性能。

先检查当前设置:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出结果不是 never 的话,则需要执行下面的命令关闭:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

7、优化内核参数

建议调整优化下面几个内核参数:

echo "fs.file-max = 1000000" >> /etc/sysctl.conf

echo "net.core.somaxconn = 32768" >> /etc/sysctl.conf

echo "net.ipv4.tcp_syncookies = 0" >> /etc/sysctl.conf

echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf

sysctl -p

8、修改mysql用户使用资源上限

修改 /etc/security/limits.conf 系统文件,调高mysql系统账户的上限:

vim /etc/security/limits.conf   #添加如下配置项

mysql           soft    nofile         65535

mysql           hard    nofile         65535

mysql           soft    stack          32768

mysql           hard    stack          32768

mysql           soft    nproc          65535

mysql           hard    nproc          65535

9、确认NUMA模式

推荐开启NUMA模式以获得更好的性能表现。

以CentOS为例,打开/etc/default/grub文件,确保文件内容中没有 NUMA=OFF 字样,如果有的话就删掉:

如果修改了 /etc/default/grub 文件,需要重新生成UEFI启动文件:

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

然后重启操作系统,使之生效。

操作系统层开启NUMA后,还要记得修改GreatSQL配置选项 innodb_numa_interleave = ON,确保InnoDB在分配内存时使用正确的NUMA策略。

如果采用手动方式启动GreatSQL服务进程,还可以在启动时加上 numactl --interleave=all,例如:

numactl --interleave=all /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64/bin/mysqld &

如果采用 systemd 来启动 GreatSQL服务进程,则可以修改 /etc/systemd/system.conf 配置文件,增加如下的相关配置项:

[Manager]

NUMAPolicy=interleave

#NUMAMask=

修改完毕后,重新加载 systemd 配置,确保NUMA策略生效:

systemctl daemon-reload

10、时间服务及时区设置

时间服务建议使用chrony。

yum install -y chrony

systemctl start chronyd

systemctl is-enabled chronyd  #systemctl enable chronyd

查看时间同步:

chronyc sources

显示当前语言环境状态:localectl status

查看LANG语言环境变量:echo $LANG

列出可用的语言环境:localectl list-locales | grep zh

注:如果需要可设置语言环境,相关命令如下:

编辑/etc/locale.conf文件

vi /etc/locale.conf

#中文 LANG=zh_CN.UTF-8

#英文 LANG=en_US.UTF-8

或,执行如下命令设置简体中文语言环境:

localectl  set-locale  LANG=zh_CN.UTF-8

简体英文语言环境:

localectl  set-locale  LANG=en_US.UTF-8

加载语言环境

source  /etc/locale.conf

三、部署GreatSQL

二进制包文件下载地址:https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.32-25

注:查看机器的glibc版本,以选择正确的安装包:ldd --version

如果您的glibc版本为2.28或更高版本,请选择带有"glibc2.28"标识的安装包;如果您的glibc版本为2.17,请选择带有"glibc2.17"标识的安装包。

1、创建mysql用户

groupadd mysql

useradd -g mysql mysql -s /sbin/nologin

id mysql

2、安装jemalloc

建议采用jemalloc代替glibc自带的malloc库,其优势在于减少内存碎片和提升高并发场景下内存的分配效率,提高内存管理效率的同时还能降低数据库运行时发生OOM的风险。

yum install -y gcc gcc-c++ cmake tar bzip2 vim tree

tar  -xvf  jemalloc-5.3.0.tar.bz2

cd jemalloc-5.3.0

./configure

make && make install

vi /etc/ld.so.conf.d/greatsql.conf

/usr/local/lib/

/sbin/ldconfig

ldconfig -p | grep libjemalloc

添加/修改系统文件 /etc/sysconfig/greatsql

LD_PRELOAD=/usr/local/lib/libjemalloc.so

THP_SETTING=never

注:启动greatsql服务后,可执行命令查看是否使用的jemalloc内存管理:lsof -n | grep libjemalloc

3、安装依赖包

yum install -y pkg-config perl libaio-devel numactl-devel numactl-libs net-tools openssl openssl-devel perl-Data-Dumper perl-Digest-MD5 python2 perl-JSON perl-Test-Simple

建议提前安装DBA常用的辅助工具包:

yum install -y net-tools perf sysstat iotop tmux tree lsof

4、创建数据目录

mkdir -p /data/greatsql/greatsqldata3306/{mydata,binlog,innodb_log,innodb_ts,innodb_dblwr,innodb_undo,innodb_temp,relaylog,log,sock,tmpdir}

5、解压安装文件

将二进制安装包文件解压到/usr/local目录下,并建立软连接/usr/local/GreatSQL:

tar -xvf GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64.tar.xz -C /usr/local/

ln -s /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64 /usr/local/GreatSQL

#相关目录属主属性修改

chown -R mysql.mysql /data/greatsql /usr/local/GreatSQL-8.0.32-25-Linux-glibc2.28-x86_64 /usr/local/GreatSQL

6、配置环境变量

在配置文件/etc/profile中添加PATH信息:

vi /etc/profile

# set for GreatSQL

export MYSQL_HOME=/usr/local/GreatSQL

export MYSQL_USER=mysql

export PATH=$PATH:$MYSQL_HOME/bin

source /etc/profile

mysql -V

7、配置文件/etc/my.cnf

创建数据库配置文件:/etc/my.cnf

vi /etc/my.cnf   #此已101服务器为例,其它修改server_id为相应值。

[mysql]

prompt="(\R:\m:\s)[\u@GreatSQL][\d]>"

no-auto-rehash

loose-skip-binary-as-hex

default-character-set=utf8mb4

show-warnings

[mysqld]

user=mysql

port=3306

server_id=1013306

bind_address="0.0.0.0"

basedir=/usr/local/GreatSQL

datadir=/data/greatsql/greatsqldata3306/mydata

pid_file=/data/greatsql/greatsqldata3306/sock/greatsql.pid

socket=/data/greatsql/greatsqldata3306/sock/greatsql.sock

skip_name_resolve

log_bin=/data/greatsql/greatsqldata3306/binlog/greatsql-bin

log_bin_index=/data/greatsql/greatsqldata3306/binlog/greatsql-bin.index

binlog_format = ROW

log_slave_updates=1

relay_log_index=/data/greatsql/greatsqldata3306/relaylog/greatsql-relay-bin.index

relay_log=/data/greatsql/greatsqldata3306/relaylog/greatsql-relay-bin

log_error=/data/greatsql/greatsqldata3306/log/error.log

general_log_file=/data/greatsql/greatsqldata3306/log/general.log

slow_query_log_file=/data/greatsql/greatsqldata3306/log/slow-query.log

tmpdir=/data/greatsql/greatsqldata3306/tmpdir

slave-load-tmpdir=/data/greatsql/greatsqldata3306/tmpdir

innodb_buffer_pool_size=8G

innodb_buffer_pool_instances = 2

innodb_doublewrite_dir=/data/greatsql/greatsqldata3306/innodb_dblwr

innodb_undo_directory=/data/greatsql/greatsqldata3306/innodb_undo

innodb_temp_tablespaces_dir=/data/greatsql/greatsqldata3306/innodb_temp

innodb_data_home_dir=/data/greatsql/greatsqldata3306/innodb_ts

innodb_data_file_path=ibdata1:4096M:autoextend

innodb_log_group_home_dir=/data/greatsql/greatsqldata3306/innodb_log

gtid_mode = ON

enforce_gtid_consistency = TRUE

8、实例初始化

chown mysql.mysql /etc/my.cnf

/usr/local/GreatSQL/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/GreatSQL --datadir=/data/greatsql/greatsqldata3306/mydata --innodb_data_home_dir=/data/greatsql/greatsqldata3306/innodb_ts --innodb_data_file_path=ibdata1:4096M:autoextend --innodb_log_group_home_dir=/data/greatsql/greatsqldata3306/innodb_log --innodb-doublewrite-dir=/data/greatsql/greatsqldata3306/innodb_dblwr --innodb-undo-directory=/data/greatsql/greatsqldata3306/innodb_undo --innodb_temp_tablespaces_dir=/data/greatsql/greatsqldata3306/innodb_temp --initialize-insecure

9、实例启停脚本

编辑systemd系统服务文件,增加GreatSQL服务文件:

vim /lib/systemd/system/greatsql.service

[Unit]

Description=GreatSQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

Type=notify

TimeoutSec=0

PermissionsStartOnly=true

#ExecStartPre=/usr/local/GreatSQL/bin/mysqld_pre_systemd

ExecStart=/usr/local/GreatSQL/bin/mysqld $MYSQLD_OPTS

EnvironmentFile=-/etc/sysconfig/greatsql

LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false

#增加这行以保证MGR VIP功能可用

AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW

重新加载systemd,使其生效:

systemctl daemon-reload

启动数据库实例、登录并修改管理员账号密码:

systemctl start greatsql

mysql -h localhost -u root -S /data/greatsql/greatsqldata3306/sock/greatsql.sock

alter user root@localhost identified with mysql_native_password by 'root@PWD123';

创建一个系统管理账号:sysadmin

create user sysadmin@'%' identified with mysql_native_password by 'sysadmin@PWD123';

grant all privileges on *.* to sysadmin@'%' with grant option;

flush privileges;

四、配置MGR集群

使用脚本(GreatSQL Shell)方式配置MGR集群步骤如下:

1、安装GreatSQL Shell

tar -xvf greatsql-shell-8.0.32-25-glibc2.28-x86_64.tar.xz -C /usr/local

ln -s /usr/local/greatsql-shell-8.0.32-25-glibc2.28-x86_64 /usr/local/greatsql-shell

export MYSQL_SHELL=/usr/local/greatsql-shell

export PATH=$PATH:$MYSQL_SHELL/bin

#安装相应版本python3

cd /usr/local/greatsql-shell/bin/

ldd ./mysqlsh | grep libpython3

由上图所示:mysqlsh使用的python3版本是3.8。

yum install -y python38

#验证部署安装

mysqlsh -V

由上图所示:还缺少依赖的部分软件程序,查看日志文件

less ./.mysqlsh/mysqlsh.log

根据日志提示,安装缺少的软件程序:

pip3 install certifi

pip3 install PyYAML

2、修改配置文件

在192.168.68.101-103三个节点配置文件(/etc/my.cnf)中添加如下配置项后,重启数据库服务:

#节点192.168.68.101

#GreatSQL MGR vip

plugin_load_add="mysql_clone.so;group_replication.so;greatdb_ha.so"

loose-group_replication_local_address="192.168.68.101:33061"

loose-greatdb_ha_enable_mgr_vip=ON

loose-greatdb_ha_mgr_vip_ip="192.168.68.100"

loose-greatdb_ha_mgr_vip_mask="255.255.255.0"

loose-greatdb_ha_mgr_vip_nic="ens160"

loose-greatdb_ha_port=33062

loose-greatdb_ha_mgr_read_vip_ips="192.168.68.200"

loose-greatdb_ha_mgr_read_vip_floating_type="TO_ANOTHER_SECONDARY"

loose-greatdb_ha_send_arp_packge_times=5

report-host=192.168.68.101

report-port=3306

#single-primary mode

loose-group_replication_single_primary_mode=1

loose-group_replication_enforce_update_everywhere_checks=0

#节点192.168.68.102

#GreatSQL MGR vip

plugin_load_add="mysql_clone.so;group_replication.so;greatdb_ha.so"

loose-group_replication_local_address="192.168.68.102:33061"

loose-greatdb_ha_enable_mgr_vip=ON

loose-greatdb_ha_mgr_vip_ip="192.168.68.100"

loose-greatdb_ha_mgr_vip_mask="255.255.255.0"

loose-greatdb_ha_mgr_vip_nic="ens160"

loose-greatdb_ha_port=33062

loose-greatdb_ha_mgr_read_vip_ips="192.168.68.200"

loose-greatdb_ha_mgr_read_vip_floating_type="TO_ANOTHER_SECONDARY"

loose-greatdb_ha_send_arp_packge_times=5

report-host=192.168.68.102

report-port=3306

#single-primary mode

loose-group_replication_single_primary_mode=1

#节点192.168.68.103

#GreatSQL MGR vip

plugin_load_add="mysql_clone.so;group_replication.so;greatdb_ha.so"

loose-group_replication_local_address="192.168.68.103:33061"

loose-greatdb_ha_enable_mgr_vip=ON

loose-greatdb_ha_mgr_vip_ip="192.168.68.100"

loose-greatdb_ha_mgr_vip_mask="255.255.255.0"

loose-greatdb_ha_mgr_vip_nic="ens160"

loose-greatdb_ha_port=33062

loose-greatdb_ha_mgr_read_vip_ips="192.168.68.200"

loose-greatdb_ha_mgr_read_vip_floating_type="TO_ANOTHER_SECONDARY"

loose-greatdb_ha_send_arp_packge_times=5

report-host=192.168.68.103

report-port=3306

#single-primary mode

loose-group_replication_single_primary_mode=1

loose-group_replication_enforce_update_everywhere_checks=0

3、使用GreatSQL Shell构建MGR集群

利用GreatSQL Shell构建MGR集群比较简单,主要有几个步骤:

1)、检查实例是否满足条件。

2)、创建并初始化一个集群。

3)、逐个添加实例。

首先,用管理员账号 root 连接到第一个节点:

mysqlsh --uri root@localhost:3306 -S /data/greatsql/greatsqldata3306/sock/greatsql.sock -proot@PWD123 --py

执行命令 status 查看当前节点的状态,确认连接正常可用。

执行 dba.configure_instance() 命令开始检查当前实例是否满足安装MGR集群的条件,如果不满足可以直接配置成为MGR集群的一个节点:

提示当前的用户是管理员,不能直接用于MGR集群,需要新建一个账号(mgradmin/mgradmin@PWD123):

完成检查并创建完新用户后,退出当前的管理员账户,并用新创建的MGR专用账户登入,准备初始化创建一个新集群:

mysqlsh --uri mgradmin@192.168.68.101:3306 -pmgradmin@PWD123 --py

mymgr = dba.create_cluster('MGR1');

mymgr.status();

如上步骤完成了MGR集群的初始化并加入第一个节点(引导节点)。

接下来,用同样方法先用 root 账号分别登入到另外两个节点,完成节点的检查并创建最小权限级别用户(此过程略过。。。注意各节点上创建的用户名、密码都要一致),之后回到第一个节点,执行如下命令添加另外两个节点。

mymgr.add_instance('mgradmin@192.168.68.102:3306');

mymgr.add_instance('mgradmin@192.168.68.103:3306');

再次执行:mymgr.status(); 命令可查看到3个节点已正常创建,或者切换到SQL模式查看,如下:

sql

select * from performance_schema.replication_group_members G

4、测试验证MGR集群

登录MGR集群,创建数据库对象并插入记录,查看数据是否成功同步从节点。

#登录VIPD地址:192.168.68.100,执行如下命令:

mysql -h 192.168.68.100 -P 3306 -u sysadmin -psysadmin@PWD123

create database testdb;

use testdb;

create table t1 (id int not null primary key, name varchar(30), crte_time timestamp);

insert into t1 values(1, '张三', now()), (2, '李四', now()), (3, '王五', now());

select * from t1;

#在从节点192.168.68.102、192.168.68.103,执行如下命令,查看数据是否成功同步:

mysql -h 192.168.68.102 -P 3306 -u sysadmin -psysadmin@PWD123

use testdb;

select * from t1;

show variables like 'server_id';

show variables like 'report_host';

mysql -h 192.168.68.103 -P 3306 -u sysadmin -psysadmin@PWD123

use testdb;

select * from t1;

show variables like 'server_id';

show variables like 'report_host';

五、集群功能验证

动态VIP配置相关功能验证如下:

1、动态VIP绑定主机

当前集群中主节点为:192.168.68.101,从节点为192.168.68.102、192.168.68.103

查看主机IP地址,以确认读写VIP绑定到主节点,只读VIP绑定到从节点:

#192.168.68.101

ifconfig | grep 192.168.68

#192.168.68.102

ifconfig | grep 192.168.68

#192.168.68.103

ifconfig | grep 192.168.68

#分别使用读写和只读VIP地址登录,以验证VIP绑定成功,正确提供数据库服务。

mysql -h 192.168.68.100 -P 3306 -u sysadmin -psysadmin@PWD123

mysql -h 192.168.68.200 -P 3306 -u sysadmin -psysadmin@PWD123

2、RW_VIP验证

#查看当前集群主、从角色节点分布:

mysqlsh --uri mgradmin@192.168.68.100:3306 -pmgradmin@PWD123 --py

mymgr=dba.get_cluster();

mymgr.status();

sql

select member_id, member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

由上图所知,当前主机节点为:192.168.68.101

手动切换主节点为:192.168.68.103

mymgr.set_primary_instance('192.168.68.103:3306');

再重连登录查看节点角色:主节点已切换到192.168.68.103

登录主机查看VIP是否已成功漂移到新主机节点:192.168.68.103

ifconfig | grep 192.168.68

如上图所示:主节点切换后,VIP已相应地漂移到了相应的主机上。

3、RO_VIP验证

#查看当前集群主、从角色节点分布:

mysqlsh --uri mgradmin@192.168.68.100:3306 -pmgradmin@PWD123 --py

mymgr=dba.get_cluster();

mymgr.status();

sql

select member_id, member_host, member_port, member_state, member_role from performance_schema.replication_group_members;

ifconfig | grep 192.168.68

由上图所知,当前从节点为:192.168.68.101、192.168.68.102,且只读VIP在主机192.168.68.102上。

#手动停止从节点192.168.68.102

systemctl stop greatsql

再次查看节点角色分布及VIP绑定情况:

如上图所示:停止绑定了只读VIP的从节点后,其VIP地址成功漂移到了另外一个从节点主机上。

重新启动停止的服务:192.168.68.102:3306

systemctl start greatsql

再次查看集群状态:节点已成功加入集群。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论