目录
搭建mysql5.7
1.查看有没有残留的mysql文件:
# 查看系统自带的Mariadb
rpm -qa | grep mariadb
# 卸载系统自带的Mariadb
rpm -e --nodeps mariadb-lib
# 删除etc目录下的my.cnf ,一定要删掉,等下再重新建
rm -rf /etc/.my.cnf
rm -rf /var/lib/mysql
# 检查mysql 用户组是否存在
cat /etc/group | grep mysql
# 创建mysql 用户组和用户
groupadd mysql
useradd -r -g mysql mysql
2.去官网下载mysql5.7的软件包:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.40-el7-x86_64.tar.gz
tar -zxvf mysql-5.7.40-el7-x86_64.tar.gz
chown -R mysql:mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
# 初始化,会生成密码:
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
2023-01-16T09:15:52.699402Z 1 [Note] A temporary password is generated for root@localhost: ermuj3Zre)x;
3.修改配置文件:
# 进入配置文件
vi /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小写不明感,敏感为
lower_case_table_names=1
# 修改配置文件的权限
chmod -R 775 /etc/my.cnf
# 查询服务
ps -ef|grep mysql
ps -ef|grep mysqld
4.设置mysql服务状态和命令的快捷方式:
# 开启服务
/usr/local/mysql/support-files/mysql.server start
# 创建软连接
ln -s /usr/local/mysql/support-files/mysql.server /usr/lib/systemd/system/mysql.service
ln -s /usr/local/mysql/support-files/mysql.server /usr/local/bin/mysql.server
# 重启服务
service mysql restart
# 进入数据库,密码是初始化生成的
mysql -u root -p
# 修改root账号的密码为redhat
set password for root@localhost = password('redhat');
5. 设置开机启动,并放行防火墙:
# 创建开机启动的服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
# 添加开机自动启动的服务
chkconfig --add mysqld
chkconfig --list
# 放行防火墙
firewall-cmd --add-port=3306/tcp
firewall-cmd --add-port=3306/tcp --permanent
mysql主从复制:
MySQL主从复制的三种同步模式
1.异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题:主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。2.全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。3.半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
可按照上述方法在搭建一个;我这里选择用docker快速搭建一个作为主服务器:
# 获取镜像:版本号
docker pull mysql:5.7
# 建mysql容器
docker run -p 3306:3306 --name mysql_test \
-v /test/mysql/data:/var/lib/mysql \
-v /test/mysql/conf/my.conf:/etc \
-v /test/mysql/log:/var/log/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
# 查看日志
docker logs --tail 50 --follow --timestamps mysql
docker logs -f mysql
# 开机自动启动
docker update --restart=always mysql
docker inspect mysql
# 进入容器
docker exec -it mysql /bin/bash
# 使用MySQL命令打开客户端:
mysql -uroot -p123456 --default-character-set=utf8
# 创建mall数据库:
create database mall character set utf8;
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-v /mydata/mysql/log:/var/log \
-e MYSQL_ROOT_PASSWORD=redhat \
-d mysql:5.7
主服务器(master):
show master status;
grant replication slave on *.* to 'repl'@'%' identified by 'redhat';
flush privileges;
获得两个数据 :
master_log_file='mysql-bin.000001',
master_log_pos=154;
备份数据 :
主服务器:
# 加只读锁,防止备份期间数据发生丢失,不要退出终端,否在这个锁就失效了
flush tables with read lock;
# 退出数据库
exit;
# 生成数据库的备份文件
mysqldump -uroot -predhat --all-databases > all.sql
# 退出docker
exit
# 传到从服务器上
docker cp mysql:/all.sql .
scp all.sql 172.25.250.104:/root/.
# 进入mysql解锁
docker exec -it mysql /bin/bash
mysql -uroot -predhat
unlock tables;
从服务器:
mysql -uroot -predhat < /root/all.sql
mysql -uroot -predhat
从服务器(slave):
stop slave;
change master to master_host='172.25.250.99',
master_port=3306,
master_user='repl',
master_password='redhat',
master_log_file='mysql-bin.000001',
master_log_pos=154;
start slave;
show slave status\G;
配置半同步复制
主服务器:
find / -name semisync_*.so
select @@have_dynamic_loading;
select * from mysql.plugin;
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
show plugins;
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=10000;
show status like 'Rpl_semi_sync_master_status';
show status like '%semi_sync%';
grant replication slave on *.* to 'repl'@'%' identified by 'redhat';
SHOW GRANTS FOR 'repl'@'%';
show variables like '%rpl%';
配置参数:
rpl_semi_sync_master_enabled=NO;
#开启
rpl_semi_sync_master_timeout=10000;
#半同步复制延迟的时间为10秒
rpl_semi_sync_master_trace_level=32;
#跟踪调试级别,不用管rpl_semi_sync_master_wait_for_slave_count=1
如果是1主4从 这个参数表示可以设置几个从机数据同步后,返回信号给主机, 默认是1个从机。 master提交后所需的应答数量。
rpl_semi_sync_master_wait_no_slave 参数说明
当状态变量Rpl_semi_sync_master_clients中的值于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即异步复制。
说得直白一点,如果我的架构是1主2从,2个从都采用了半同步复制,且设置的是rpl_semi_sync_master_wait_for_slave_count=2,如果其中一个挂掉了,对于rpl_semi_sync_master_wait_no_slave设置为ON的情况,此时显示的仍然是半同步复制,如果rpl_semi_sync_master_wait_no_slave设置为OFF,则会立刻变成异步复制。
rpl_semi_sync_master_wait_point参数说明
AFTER_SYNC意味着半同步复制,在binary log被flush之后,在存储引擎commit前进入等待,这可以保证数据在被复制到从库前不被其他会话可见;
AFTER_COMMIT意味着半同步复制在存储引擎commit之后进入等待,尽管发起commit的会话还未收到commit成功的提示,其他的会话已经可以看到commit后的数据。
after_sync性能比after_commit要好,因为在组提交的情况下after_sync比after_commit每组的事务更多。rpl_stop_slave_timeout参数说明
5.6.13之后引入的参数,控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave,命令 stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能,可以通过rpl_stop_slave_timeout参数控制stop slave 的执行时间。默认值是31536000秒=1年
从服务器:
find / -name semisync_*.so
select @@have_dynamic_loading;
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
show plugins;
set global rpl_semi_sync_slave_enabled=1;
stop slave io_thread;
start slave io_thread;
show status like '%semi_sync%';
Rpl_semi_sync_master_clients #半同步复制客户端的个数
Rpl_semi_sync_master_net_avg_wait_time #平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time #总共等待时间
Rpl_semi_sync_master_net_waits #等待次数
Rpl_semi_sync_master_no_times #关闭半同步复制的次数
Rpl_semi_sync_master_no_tx #表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status #表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures #调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time #事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time #事物的总共传输时间
Rpl_semi_sync_master_tx_waits #事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse #可以理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions #当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数
验证:
create database test04;
show status like '%semi_sync%';
设置 并行复制 组提交
set global binlog_group_commit_sync_delay=1000;
set global binlog_group_commit_sync_no_delay_count=100;
show variables like '%binlog_group%';
binlog_group_commit_sync_delay=1000 #组提交的延迟设为1秒
binlog_group_commit_sync_no_delay_count=100;
#每组最大的提交数设为100个
mysql+keepalived实现容灾:
Keepalived工具介绍:
keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,keepalived 除了能够管理 LVS 集群外,还可以为其他服务(例如:Nginx、Haproxy、MySQL等)实现高可用。
keepalived 软件主要是通过 VRRP 协议实现高可用功能的。VRRP 是 Virtual Router Redundancy Protocol(虚拟路由器冗余协议的缩写,VRRP 出现的目的就是为了解决静态路由单点故障的问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用。
#docker search keepalived
#docker pull osixia/keepalived
#docker run -d \
#--name keepalived \
#-net host \
#-v /mydata/keepalived/conf:/etc/keepalived \
#osixia/keepalived
#docker exec -it keepalived /bin/bash
# 容器不能和主机在同一网络,所以选择在主机上安装keepalived
yum install keepalived -y
修改配置文件:
主服务器:
router_id
:标识,两台需不一样state MASTER
:表明这台是Master角色priority
:优先级,MASTER角色比BACKUP高virtual_router_id
:虚拟路由编号,两台需要一致,两个节点不能一样
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id db01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.250.100
}
}
virtual_server 172.25.250.100 3306 {
delay_loop 6
persistence_timeout 50
protocol TCP
real_server 172.25.250.99 3306 {
notify_down /etc/keepalived/kill_keepalived.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
connect_port 3306
delay_before_retry 3
}
}
}
检查mysqld服务有没有关闭,如果关闭就执行下面脚本:关闭keepalived
vim /etc/keepalived/kill_keepalived.sh
#!/bin/bash
systemctl stop keepalived.service
chmod +x /etc/keepalived/kill_keepalived.sh
systemctl restart keepalived
systemctl enabled keepalived
firewall-cmd --add-protocol=vrrp
firewall-cmd --add-protocol=vrrp –per
从服务器:
yum install keepalived -y
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id db02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 50
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.250.100
}
}
virtual_server 172.25.250.100 3306 {
delay_loop 6
persistence_timeout 50
protocol TCP
real_server 172.25.250.104 3306 {
notify_down /etc/keepalived/kill_keepalived.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
connect_port 3306
delay_before_retry 3
}
}
}
检查mysqld服务有没有关闭,如果关闭就执行下面脚本:关闭keepalived
vim /etc/keepalived/kill_keepalived.sh
#!/bin/bash
systemctl stop keepalived.service
chmod +x /etc/keepalived/kill_keepalived.sh
systemctl restart keepalived
systemctl enabled keepalived
firewall-cmd --add-protocol=vrrp
firewall-cmd --add-protocol=vrrp –per
如果杀掉主机上的mysql
- VIP会漂移到备机上,ifconfig能看到VIP信息
- 备机的Keepalived从BACKUP状态转换为了MASTER状态
- Master备机上做写操作,第一次写会发生半同步等待(10s左右),第二次写会退化成异步复制
恢复主机mysql
- ifconfig看下VIP会漂移回来,并且备机上的VIP会消失
- 刚才在Master备机上写入的数据同步过来了
- Keepalived的状态是从FAULT转变为BACKUP,最后变成MASTER