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




























































































