mysql-MGR单主部署-8.0版本

  • 1.每个节点设置hostname,并添加/etc/hosts
  • 2.mysql下载地址
https://downloads.mysql.com/archives/community/

1.彻底删除系统自带的mariadb,postfixmysql

复制代码
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                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
复制代码

 

posted @   阿锋888  阅读(110)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示