一、环境信息
操作系统: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
再次查看集群状态:节点已成功加入集群。