企业级MySQL重习

Mysql的源码编译

# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz 下载安装包

# dnf install cmake3 gcc git bison openssl-devel ncurses-devel systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc -y

# tar zxf mysql-boost-8.3.0.tar.gz

mysql-8.3.0]# mkdir build

# cd build/

# cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DWITH_SSL=system -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=bundled -DWITH_DEBUG=OFF

# make

# make install

# cd /usr/local/mysql/

# vim ~/.bash_profile

# source ~/.bash_profile

# useradd -r -s /sbin/nologin -M mysql

# mkdir -p /data/mysql

# chown mysql.mysql /data/mysql/

# vim /etc/my.cnf

mysqld

datadir=/data/mysql

socket=/data/mysql/mysql.sock

mysql数据结构初始化

mysql1 ~]# mysqld --initialize --user=mysql

启动mysql

# dnf install initscripts -y

# cd /usr/local/mysql/support-files/

# cp -p mysql.server /etc/init.d/mysqld

# /etc/init.d/mysqld start

# chkconfig --level 35 mysqld on

mysql的安全初始化

# mysql_secure_installation 安全初始化命令

Mysql集群实战--主从复制

编写my.cnf 主配置文件

mysql1和2和3 ~]# vim /etc/my.cnf

# /etc/init.d/mysqld restart

> SELECT @@server_id;

建立同步时需要用到的数据库账号

mysql1 ~]# mysql -uroot -plee

mysql2 ~]# mysql -ulee -plee -h172.25.254.10

配置数据库一主一从

在slave主机中

mysql2 ~]# mysql -ulee -plee

> CHANGE MASTER TO MASTER_HOST= '172.25.254.10',MASTER_USER='lee',

MASTER_PASSWORD='lee',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=659;

> start slave;

> show slave status \G;

测试同步

mysql1 ~]# mysql -uroot -plee #在master中建立库

> create database timinglee;

> show databases;

mysql2 ~]# mysql -uroot -plee

> show databases;

向当前一主一从中加入新的数据库

mysql1 ~]# mysql -uroot -plee

> CREATE TABLE timinglee.userlist (

-> name VARCHAR(10) not null,

-> pass VARCHAR(50) not null);

> INSERT INTO timinglee.userlist values ('user1','123');

> SELECT * FROM timinglee.userlist;

# mysqldump -uroot -p timinglee > timinglee.sql

# scp timinglee.sql root@172.25.254.30:/root/

mysql3 ~]# mysql -uroot -plee -e "create database timinglee;"

# mysql -uroot -plee timinglee < timinglee.sql

# mysql -uroot -plee

> select * from timinglee.userlist;

将新库加入主从结构中

mysql1 ~]> SHOW MASTER STATUS; #在master中查看日志的id

mysql3 ~]#mysql -uroot -plee

> CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='lee',

MASTER_PASSWORD='lee',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1115;

> start slave;

> show slave status\G;

测试一主两从

mysql1 ~]> INSERT INTO timinglee.userlist values ( 'user2','123');

mysql2和3 ~]> select * from timinglee.userlist;

mysql主从架构中的使用技巧及优化

在指定需要延迟同步的slave主机中,如果主机中安装数据库的版本是8以上

> STOP REPLICA;

> CHANGE REPLICATION SOURCE TO SOURCE_DELAY=60;

> START REPLICA;

# mysql -uroot -plee -e "show slave status\G;" | grep SQL_Delay

> delete from timinglee.userlist where name='user1'; 在master主机中对数据进行更改

> select * from timinglee.userlist;

> select * from timinglee.userlist; 在未被延迟的slave查看是否数据操作动作被同步

> select * from timinglee.userlist; 在被设定延迟复制的主机中查看动作是否被同步

> select * from timinglee.userlist; 等待延迟时间过后再次查看

慢查询日志

> SHOW variables like "slow%"; 慢查询日志是否开启

> SET GLOBAL slow_query_log=ON; 开启慢查询日志

> SHOW VARIABLES like "long%"; #慢查询阈值

> SET long_query_time=4;

> select sleep (3); #不会生成慢查询日志

> select sleep (4);

# cat /data/mysql/mysql-node1-slow.log

gtid模式

> show variables like '%gtid%'; 在master和slave中默认gtid模式是未开启的

mysql1到3 ~]# vim /etc/my.cnf 在所有主机中加入参数

gtid_mode=ON

enforce-gtid-consistency=ON

# /etc/init.d/mysqld restart

> show variables like '%gtid%'; 在三台主机中分别查看gtid模式是否开启

在从库中停止slave功能;

mysql1 ~]> SHOW MASTER STATUS; #在master中查看日志的id

mysql2 ~]> stop slave;

> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='lee', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;

> start slave ;

> SHOW SLAVE STATUS \G;

多线程回放

> show processlist; 在slave主机中默认回方日志时使用单线程回放

开启多线程回放日志(在slave主中)

默认情况下slave中使用的是sql单线程回放

在master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重

开启MySQL的多线程回放可以解决上述问题

# vim /etc/my.cnf

slave-parallel-type=LOGICAL_CLOCK #基于组提交,

slave-parallel-workers=6 #开启线程数量

relay_log_recovery=ON #日志回放恢复功能开启

# /etc/init.d/mysqld restart

> show processlist; ## 查看结果:

半同步模式

mysql1和2和3 ~]# echo " rpl_semi_sync_master_enabled=1" >> /etc/my.cnf

> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

> SET GLOBAL rpl_semi_sync_master_enabled = 1;

# vim /etc/my.cnf

rpl_semi_sync_slave_enabled=1 #修改为这个

> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

> SET GLOBAL rpl_semi_sync_slave_enabled =1;

> STOP SLAVE IO_THREAD;

> START SLAVE IO_THREAD;

> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

> SHOW VARIABLES LIKE 'rpl_semi_sync%';

> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql1 ~]> create database timinglee;

> SHOW VARIABLES LIKE 'rpl_semi_sync%';

模拟ack故障 在所有slave主机中

> STOP SLAVE IO_THREAD;

> INSERT INTO timinglee.userlist values ('user3','123');

> SHOW STATUS LIKE 'Rpl_semi_sync%';

恢复故障 在所有slave主机中

> start SLAVE IO_THREAD;

Mysql-MHA高可用集群

配置Mha-manager

mha ~]# unzip MHA-7.zip

# cd MHA-7/

# dnf install perl perl-DBD-MySQL perl-CPAN -y

# cpan

cpan[1]> install Config::Tiny

cpan[2]> install Log::Dispatch

cpan[3]> install Mail::Sender

cpan[4]> install Parallel::ForkManager

cpan[5]> exit

mha ~]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps

所有mysql节点 ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps

在slave中安装相应软件

# for i in 10 20 30 ; do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.i:/mnt**** ****ssh -l root 172.25.254.i "rpm -ivh /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps" ; done

修改MHA-Manager中的检测代码

# vim /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm

MHA建立远程登录用户

在master主机中

mysql> create user root@'%' identified with mysql_native_password by 'lee';

mysql> GRANT ALL ON *.* TO root@'%' ;

生成MHA-manager的配置文件模板

mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz

# cd mha4mysql-manager-0.58

# mkdir /etc/masterha/ -p

# cat samples/conf/masterha_default.cnf samples/conf/app1.cnf > /etc/masterha/app1.cnf

修改配置文件

# vim /etc/masterha/app1.cnf

server default

user=root

password=lee

ssh_user=root

repl_user=lee

repl_password=lee

master_binlog_dir= /data/mysql

remote_workdir=/tmp

secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.2

ping_interval=3

master_ip_failover_script= /script/masterha/master_ip_failover

shutdown_script= /script/masterha/power_manager

report_script= /script/masterha/send_report

master_ip_online_change_script= /script/masterha/master_ip_online_change

server default

manager_workdir=/etc/masterha

manager_log=/etc/masterha/mha.log

server1

hostname=172.25.254.10

candidate_master=1

check_repl_delay=0

server2

hostname=172.25.254.20

candidate_master=1

check_repl_delay=0

server3

hostname=172.25.254.30

no_master=1

检测环境

# masterha_check_ssh --conf=/etc/masterha/app1.cnf

# masterha_check_repl --conf=/etc/masterha/app1.cnf

Mysql-MHA高可用集群环境配置

保证数据一致性(所有的mysql节点)

mysql1-3 ~]# /etc/init.d/mysqld stop

# rm -fr /data/mysql/*

# mysqld --initialize --user mysql

# /etc/init.d/mysqld start

# mysql_secure_installation 安全初始化命令

# mysql -uroot -plee -e "create user lee@'%' identified with mysql_native_password by 'lee';"

# mysql -uroot -plee -e "GRANT replication slave ON *.* to lee@'%';"

# mysql -uroot -plee -e "show master status;"

重新配置主从 在slave主机

mysql2-3 ~]# mysql -uroot -plee -e "CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='lee', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;"

# mysql -uroot -plee -e "show slave status\G;"

在slave中安装mha-node软件依赖

mysql1-3 ~]# dnf install perl perl-DBD-MySQL perl-CPAN -y 在所有的数据库主机中安装依赖

# tar zxf cpan_plugin.tar.gz

# cpan

cpan[1]> install Config::Tiny

cpan[2]> install Log::Dispatch

cpan[3]> install Mail::Sender

cpan[4]> install Parallel::ForkManager

cpan[5]>exit

验证组建是否安装成功

# perl -MConfig::Tiny -e 'print "OK\n"' ; perl -MLog::Dispatch -e 'print "OK\n"' ; perl -MMail::Sender -e 'print "OK\n"' ; perl -MParallel::ForkManager -e 'print "OK\n"'

集群切换操作

master无故障手动切换

mysql2 ~]# mysql -uroot -plee -e "show slave status\G;" | head -n 1 5

执行切换,把master切换到20

mha ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive

--new_master_host=172.25.254.20 --new_master_port=3306 --orig_master_is_new_slave

--running_updates_limit=10000

mysql1 ~]# mysql -uroot -plee -e "show slave status\G;" | head -n 15

mysql3 ~]# mysql -uroot -plee -e "show slave status\G;" | head -n 15

master故障后切换

mha ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.10 --dead_master_port=3306 --new_master_host=172.25.254.20 --new_master_port=3306 --ignore_last_failover

mysql3 ~]# mysql -uroot -plee -e "show slave status\G;" | head -n 15

故障恢复

mha ~]# ls /etc/masterha/ 故障切换后,mha主机会有锁文件,文件存在后不能再执行切换

自动切换

mha ~]# > /etc/masterha/*.log

# watch -n 1 cat /etc/masterha/mha.log 为了方便观察建议开启两个shell

# masterha_manager --conf=/etc/masterha/app1.cnf & #开启自动切换功能

# jobs

mysql1 ~]# /etc/init.d/mysqld stop 模拟故障

vip功能及vip的启动切换

mha ~]# ll MHA-7/master_ip_*

# mkdir /etc/masterha/scripts

# cp MHA-7/master_ip_* /etc/masterha/scripts

# vim /etc/masterha/app1.cnf

# vim /etc/masterha/scripts/master_ip_failover

# vim /etc/masterha/scripts/master_ip_online_change

# ip a a 172.25.254.100/24 dev eth0

# masterha_manager --conf=/etc/masterha/app1.cnf &

# jobs

mysql1 ~]# /etc/init.d/mysqld stop 关闭mysql master

mysql2 ~]# ip a

还原mysql所有节点

利用ansible还原所有节点

mha ~]# cat > /etc/yum.repos.d/epel.repo <<EOF

> [epel]

> name = epel

> baseurl = https://mirrors.aliyun.com/epel-archive/9.6/Everything/x86_64/

> gpgcheck = 0

> EOF

# dnf install ansible -y

# ansible --version

# useradd devops

# echo lee | passwd --stdin devops

# su - devops

$ mkdir ansible

$ cat >ansible.cfg <<EOF

[defaults]

inventory=./inventory

remote_user=root

host_key_checking=false

[privilege_escalation]

become=False

EOF

在 mysql 组的所有主机上创建名为 devops 的系统用户

$ ansible mysql -m user -a 'name=devops'

为刚创建的 devops 用户设置密码(密码设为"devops")

$ ansible mysql -m shell -a 'echo devops | passwd --stdin devops'

给 devops 用户添加 sudo 权限,且执行 sudo 时不需要输入密码

$ ansible mysql -m shell -a 'echo "devops ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers'

在所有主机上为 devops 用户创建 SSH 配置目录

$ ansible all -m file -a 'path=/home/devops/.ssh owner=devops group=devops mode="0700" state=directory'

将本地的 SSH 授权公钥文件复制到所有远程主机

$ ansible all -m copy -a 'src=/home/devops/.ssh/authorized_keys dest=/home/devops/.ssh/authorized_keys owner=devops group=devops mode='0600''

$ cat >ansible.cfg <<EOF

[defaults]

inventory=./inventory

remote_user=devops

host_key_checking=false

[privilege_escalation]

become=True

become_ask_pass=False

become_method=sudo

become_user=root

EOF

$ ansible all -m shell -a 'whoami'

$ vim clear_mysql.yml

  • name: reset mysql

hosts: mysql

tasks:

  • name: stop mysql

shell: '/etc/init.d/mysqld stop'

ignore_errors: yes

  • name: delete mysql data

file:

path: /data/mysql

state: absent

  • name: crate data directroy

file:

path: /data/mysql

state: directory

owner: mysql

group: mysql

  • name: initialize mysql

shell: '/usr/local/mysql/bin/mysqld --initialize --user=mysql'

$ ansible-playbook clear_mysql.yml -vv | grep password 输出初始化,可查看输出密码

手动还原方式

mysql1 ~]# /etc/init.d/mysqld stop

# rm -rf /data/mysql/* 所有节点初始化数据

# cat > /etc/my.cnf <<EOF

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=10 #不同主机server-id一定要根据实际情况做相应改变

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

default_authentication_plugin=mysql_native_password

log_slave_updates=ON

binlog_format=ROW

binlog_checksum=NONE

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

EOF

# mysqld --user=mysql --initialize

部署组复制

mysql1 ~]# vim /etc/hosts

# cat >> /etc/my.cnf <<EOF

plugin_load_add='group_replication.so'

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off

group_replication_local_address="172.25.254.10:33061" #其他两台主机一定要根据ip进行修改

group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"

group_replication_bootstrap_group=off

group_replication_single_primary_mode=OFF

EOF

# /etc/init.d/mysqld start

# mysql -uroot -p' e s -CB4vQB8r+ ' 配置组复制-在首台主机中

> alter user root@localhost identified by 'lee';

> SET SQL_LOG_BIN=0;

> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';

> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';

> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

> FLUSH PRIVILEGES;

> SET SQL_LOG_BIN=1;

> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';

> SHOW PLUGINS; #查看组复制插件是否激活

> SET GLOBAL group_replication_bootstrap_group=ON;

> START GROUP_REPLICATION USER='rpl_user', PASSWORD='lee';

> SET GLOBAL group_replication_bootstrap_group=OFF;

> SELECT * FROM performance_schema.replication_group_members;

配置组复制在其余主机中

mysql2-3 ~]# /etc/init.d/mysqld start

# mysql -uroot -p' AxB/cbY : 1gl+ '

mysql> alter user root@localhost identified by 'lee';

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

mysql> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';

mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';

mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';

mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='lee';

mysql> reset master; #用过此命令解决以上报错

mysql> START GROUP_REPLICATION USER='rpl_user', PASSWORD='lee';

mysql> SELECT * FROM performance_schema.replication_group_members;

测试所有节点是否可以执行读写并数据是否同步

mysql1 ~]> create database timinglee;

> create table timinglee.userlist (

-> username VARCHAR(10) PRIMARY KEY NOT NULL,

-> password VARCHAR(50) NOT NULL );

> INSERT INTO timinglee.userlist VALUES ('user1','111');

> select * from timinglee.userlist; #在mysql2 中查看并插入新的数据

> insert into timinglee.userlist values ('user2','222');

> select * from timinglee.userlist; #在mysql3中查看并插入数据

> insert into timinglee.userlist values ('user3','333');

> select * from timinglee.userlist; #在mysql1和2中都可以查看到数据

Mysqlrouter软件下载

mysqlrouter ~]# wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.4.7-1.el9.x86_64.rpm

安装mysqlrouter

# dnf install mysql-router-community-8.4.7-1.el9.x86_64.rpm -y

mysqlrouter配置文件

# rpm -qc mysql-router-community

# systemctl status mysqlrouter.service #启动脚本

配置mysqlrouter

# vim /etc/mysqlrouter/mysqlrouter.conf

routing:ro

bind_address = 0.0.0.0

bind_port = 7001

destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306

routing_strategy = round-robin

routing:rw

bind_address = 0.0.0.0

bind_port = 7002

destinations = 172.25.254.30:3306,172.25.254.20:3306,172.25.254.10:3306

routing_strategy = first-available

# systemctl enable --now mysqlrouter.service

# netstat -antlupe | grep mysql

在mysql节点的任意主机中添加root远程登录

# mysql -uroot -plee

> CREATE USER root@'%' identified by 'lee';

> GRANT ALL ON *.* TO root@'%';

# mysql -uroot -plee -h172.25.254. 2 0 / mysql -uroot -plee -h172.25.254. 3 0

# watch -n1 lsof -i :3306

# mysql -uroot -plee -h172.25.254.40 -P7002 登陆mysql

相关推荐
攻城狮7号2 小时前
面向未来的时序数据库选型指南:当数据存储遇上原生AI
数据库·人工智能·时序数据库·apache iotdb
移动云开发者联盟2 小时前
告别AI失忆!移动云大云海山数据库解锁OpenClaw云端长期记忆
数据库·人工智能
tswowo62 小时前
Markdown笔记
笔记
YOU OU2 小时前
MySQL面试题
sql·mysql
野生技术架构师2 小时前
一个简单SQL的深度解析
android·数据库·sql
麦聪聊数据2 小时前
数据库安全与运维管控(五):基于AST的SQL拦截与动态审批
运维·数据库·sql
同聘云2 小时前
阿里云国际站 服务器的“客户端” (Client) 和 “服务器” (Server)到底是什么?有什么区别?
服务器·网络·阿里云·云计算·云小强
有味道的男人2 小时前
电商效率翻倍:用 Open Claw 对接 1688 接口,快速实现图片选品 + 货源监控
java·开发语言·数据库
Omics Pro2 小时前
马普所:生命蛋白质宇宙聚类
数据库·人工智能·算法·机器学习·数据挖掘·aigc·聚类