mysql-MGR单主部署-8.0版本
- 1.每个节点设置hostname,并添加/etc/hosts
- 2.mysql下载地址
https://downloads.mysql.com/archives/community/
1.彻底删除系统自带的mariadb,postfix和mysql
rpm -qa|grep mariadb postfix yum remove mariadb-libs-5.5.60-1* postfix-2:* -y
rpm -e --nodeps mariadb-libs rpm -qa|grep -i mysql yum remove -y mysql-* #卸载mysql find / -name mysql rm -rf /usr/share/mysql #删除MySQL相关文件 rm -rf /etc/my.cnf rm -rf /var/log/mysqld.log #如果不删除这个文件,则重新安装的Mysql将无法设置password
2.替换为tcmalloc
默认使用glibc的ptmalloc,做内存管理,有内存碎片不归还导致内存泄露的问题。
替换tcmalloc提升20%~30%的tps+解决内存碎片问题。
yum -y install gperftools-devel echo 'LD_PRELOAD=/usr/lib64/libtcmalloc.so' >> /etc/sysconfig/mysql #后续步骤做完启动了mysql,输入下面的命令查看是否生效,能搜到内容就说明生效了 lsof -n | grep tcmalloc
3.服务器初始化
3.1关闭防火墙和selinux
#关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service #临时关闭SELINUX setenforce 0 #vim打开后修改SELINUX=disabled 永久关闭selinux vim /etc/selinux/config
3.2 最大文件打开数
#最底下加入下面两行语句,输入完需要重新登录ssh生效 vim /etc/security/limits.conf * soft noproc 65535 * hard noproc 65535 * soft nofile 65535 * hard nofile 65535
ulimit -a #查看结果
3.3 关闭透明大页
vim /etc/default/grub #GRUB_CMDLINE_LINUX 参数结尾加上 transparent_hugepage=never #配置生效 grub2-mkconfig -o /boot/grub2/grub.cfg reboot #为0就说明关闭了 grep AnonHugePages /proc/meminfo cat /sys/kernel/mm/transparent_hugepage/enabled
3.4修改hosts和主机名
准备三台机器,修改主机名和ip,并写入/etc/hosts 192.168.1.101 mysql1 192.168.1.102 mysql2 192.168.1.103 mysql3
修改主机名 hostnamectl set-hostname mysql1 hostnamectl set-hostname mysql2 hostnamectl set-hostname mysql3
4.rpm安装
yum install perl #可以理解增强版的shell
rpm -ivh mysql-community-client-plugins-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-common-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-client-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-debuginfo-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-embedded-compat-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-icu-data-files-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-compat-8.0.30-1.el7.x86_64.rpm rpm -ivh mysql-community-devel-8.0.30-1.el7.x86_64.rpm --force --nodeps rpm -ivh mysql-community-server-8.0.30-1.el7.x86_64.rpm --force --nodeps rpm -ivh mysql-community-server-debug-8.0.30-1.el7.x86_64.rpm --force --nodeps rpm -ivh mysql-community-test-8.0.30-1.el7.x86_64.rpm --force --nodeps rpm -ivh /root/gperftools-libs-2.6.1-1.el7.x86_64.rpm rpm -ivh /root/gperftools-devel-2.6.1-1.el7.x86_64.rpm
5.初始化启动
my.cnf文件修改如下
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid lower_case_table_names=1 #表名大小写不区分 default-authentication-plugin=mysql_native_password #密码插件
systemctl start mysqld
6.替换my.cnf配置文件
替换my.cnf文件后,重启mysqld
红字2条配置,不同主机注意修改
[mysqld] #skip-grant-tables #root登录跳过密码
server-id = 53 #服务id必须唯一
loose-group_replication_local_address = "node-53:33061" #以本机端口33061接受来自组中成员的传入连接(族中成员相互同步数据使用的端口)
loose-group_replication_group_seeds = "node-52:33061,node-53:33061,node-54:33061" #组复制的集群地址 innodb_buffer_pool_size = 6442450944 #默认134217728byte(也就是128MB),建议修改为机器的70% socket = /var/lib/mysql/mysql.sock #用于socket连接的文件,实现mysql外部连接 pid-file = /var/run/mysqld/mysqld.pid #mysql进程文件 datadir = /var/lib/mysql #数据目录 log-error = /var/log/mysqld.log #错误日志
log_bin = /var/lib/mysql/mysql-bin #开启二进制日志记录,并指定路径名称 skip_name_resolve = 1 #跳过DNS解析 max_connections = 8192 #最大连接数 long_query_time = 30 #查询执行时间超过30s,视为慢查询
slow_query_log = on #启用慢查询日志记录,存在data数据目录下
max_connect_errors = 1000000 #允许的最大连接错误数,如果一个客户端连接错误次数超过阀值,则该客户端将自动禁止连接
replica_preserve_commit_order=ON #从服务器按照主服务器的提交顺序执行事务提交操作,以确保数据一致性
replica_parallel_type=LOGICAL_CLOCK #主从复制-并行复制方式
replica_parallel_workers=4 #从服务器执行并行复制操作使用的最大工作线程数
lower_case_table_names = 1 #表名大小写不敏感 master_info_repository = TABLE #MGR要求把主从复制信息记录到表中 relay_log_info_repository = TABLE #MGR要求把主从复制信息记录到表中 transaction_write_set_extraction = XXHASH6 #必须为每个事务收集写集合,使用XXHASH算法将其编码为散列 authentication_policy = mysql_native_password #设置密码验证插件(可root免密码),8.0开始默认是caching_sha2_password更安全 transaction_isolation = READ-COMMITTED #隔离级别是RC,减少锁粒度 log_replica_updates = 1 #记录已经执行过的binlog binlog_expire_logs_seconds = 259200 #日志的过期时间(单位秒) binlog_format = row #binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row slave_preserve_commit_order = ON #开启备库提交事务顺序 slave_parallel_type = LOGICAL_CLOCK #多线程并行复制 slave_parallel_workers = 4 #工作线程数 gtid_mode = ON #开启GTID enforce_gtid_consistency = ON #强制GTID的一致性 disabled_storage_engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #禁用的存储引擎 binlog_transaction_dependency_tracking = WRITESET_SESSION #保证同一个session内的事务不可并行 plugin_load_add = 'group_replication.so' #加载group_replication插件 plugin-load-add = 'mysql_clone.so' #加载mysql_clone插件
#在使用 loose- 前缀时,表示这些参数为动态变量,可以在 MySQL 运行时进行修改而无需重启服务 loose-group_replication_ip_whitelist = '127.0.0.1/8,192.168.7.0/24' #IP地址白名单 loose-group_replication_group_name = "290da651-da91-11ed-be70-000c29b15814" #组复制中的UUID,所有节点保持一致 loose-group_replication_start_on_boot = off #启动mysql时不会自动开始组复制 loose-group_replication_bootstrap_group = off #不自动启用组复制集群,手动引导启动 super_read_only=on #重启后root用户自动进入只读状态。在从库上启用确保只接受来自主库的更新,不接受来自客户端的更新。从节点变为主节点后会自动改为读写状态。 read_only=on #重启后自动进入只读状态,在从库上启用确保只接受来自主库的更新,不接受来自客户端的更新
#密码策略0:(Low)密码长度最少8个字符; 1:(Mediumpolicy)至少包含1个数字,1个小写字母,1个大写字母和1个特殊字符组成(默认值);
# 2:(Strongpolicy)长度为4或更长的密码子字符串不得与字典文件中的单词匹配
validate_password.policy=1 #密码策略
validate_password.length=8 #密码长度
#port=3307 #默认3306端口,可自行设置
systemctl restart mysqld
7.初始化数据库,创建复制用户(三个节点执行)
systemctl enable mysqld --now && systemctl status mysqld
grep 'temporary password' /var/log/mysqld.log #输入密码 mysql -uroot -p
#修改root账号密码
alter user 'root'@'localhost' identified with mysql_native_password by 'Aa.1234567';
update mysql.user set host='%' where user='root';
set global super_read_only=0; #关闭只读,可写操作 #之后的操作全部不计入binlog,否则会导致同步失败。也可以在操作完后reset master; SET SQL_LOG_BIN=0; #创建复制用账号 CREATE USER rpl_user@'%' IDENTIFIED BY 'Aa.1234567'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%'; GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%'; FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1; #开启记录binlog set global super_read_only=1; #开启只读
reset master; #清空binlog文件,不能将账号密码操作同步到其他主机执行
此时输入show master status; Executed_Gtid_Set应当是空的。
如果不是空说明没按教程来,在确定三台库上执行的操作一致的情况下也可以输入reset master消除binlog差异;
#若使用root免密登录则用以下方式
systemctl enable mysqld --now && systemctl status mysqld mysql -e"UPDATE mysql.user SET authentication_string='*14CF315C27425870B6B841EC78E21378C8BEE3CA' WHERE user='root';" #更改root密码为Aa.123456 mysql -e"flush privileges;" sed -i '/skip-grant-tables/d' /etc/my.cnf #删除跳过密码登录配置 systemctl restart mysqld mysql -uroot -pAa.123456 --connect-expired-password -e"alter user 'root'@'localhost' identified with mysql_native_password by 'Aa.1234567';" #密码策略0:(Low)密码长度最少8个字符, 1:(Mediumpolicy)至少包含1个数字,1个小写字母,1个大写字母和1个特殊字符组成(默认值), 2:(Strongpolicy)长度为4或更长的密码子字符串不得与字典文件中的单词匹配
#mysql -uroot -pAa.1234567 --connect-expired-password -e"set persist validate_password.policy=1;" #需要密码最小字符数,默认为8
#mysql -uroot -pAa.1234567 --connect-expired-password -e"set persist validate_password.length=8;"
mysql -uroot -pAa.1234567 --connect-expired-password -e"set global super_read_only=0;SET SQL_LOG_BIN=0;"
mysql -uroot -pAa.1234567 --connect-expired-password -e"update mysql.user set host='%' where user='root';flush privileges;" mysql -uroot -pAa.1234567 --connect-expired-password -e"CREATE USER rpl_user@'%' IDENTIFIED BY 'Aa.1234567';" mysql -uroot -pAa.1234567 --connect-expired-password -e"GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';" mysql -uroot -pAa.1234567 --connect-expired-password -e"GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';" mysql -uroot -pAa.1234567 --connect-expired-password -e"GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';FLUSH PRIVILEGES;"
mysql -uroot -pAa.1234567 --connect-expired-password -e"set global super_read_only=1;SET SQL_LOG_BIN=1;" mysql -uroot -pAa.1234567 --connect-expired-password -e"reset master;" #重置binlog日志
此时输入show master status; Executed_Gtid_Set应当是空的。
如果不是空说明没按教程来,在确定三台库上执行的操作一致的情况下也可以输入reset master消除binlog差异;
8.在其中一个节点上执行,创建引导组(主节点)
SET SQL_LOG_BIN=0; #关闭binlog
#更改复制源的认证信息
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='Aa.1234567' FOR CHANNEL 'group_replication_recovery';
#启动引导模式,一个服务器被选为初始主服务器,负责初始化Group Replication的状态和配置
SET GLOBAL group_replication_bootstrap_group=ON;
#启动组复制
START GROUP_REPLICATION USER='rpl_user', PASSWORD='Aa.1234567';
#关闭引导模式,关闭后组进入正常模式,后组成员自动选举主
SET GLOBAL group_replication_bootstrap_group=OFF;
SET SQL_LOG_BIN=1; #开启binlog。开启组复制后不允许使用reset master
9.在另外两个节点执行加入组
CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='Aa.1234567' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION USER='rpl_user', PASSWORD='Aa.1234567';
10.查看集群状态
mysql -uroot -pAa.1234567 --connect-expired-password -e"SELECT * FROM performance_schema.replication_group_members;" mysql: [Warning] Using a password on the command line interface can be insecure. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 332573b8-da8d-11ed-8d65-00505689861b | node-53 | 3306 | ONLINE | PRIMARY | 8.0.30 | XCom | | group_replication_applier | 3a99e57b-da8d-11ed-960d-005056896304 | node-54 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom | | group_replication_applier | 418d32d0-da8c-11ed-a069-000c29b15814 | node-52 | 3306 | ONLINE | SECONDARY | 8.0.30 | XCom | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类