搭建Mysql

目录

搭建mysql5.7

mysql主从复制:

备份数据 :

从服务器(slave):

配置半同步复制

设置 并行复制 组提交 

mysql+keepalived实现容灾:


搭建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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值