【mysql的高可用】

中间件mycat

读写分离

在这里插入图片描述

用mycat实现
#相关环境,四台主机,
10.0.0.7 client:yum -y install mysql-server
10.0.0.8:wegt http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-test-20191022170541-linux.tar.gz         #最新版本,可选相关,实验以1.6.7.4为例
10.0.0.18:yum -y install mysql-server   #主服务器
10.0.0.28:yum -y install mysql-server   #从服务器

#首先搭建主从关系18和28,相关步骤看上面

#在主服务器10.0.0.18上创建账号授权针对hellodb数据库
mysql> create user wei@'10.0.0.%' identified by '123456';
mysql> grant all on hellodb.* to wei@'10.0.0.%';

#在10.0.0.8上
#需安装依赖java,较占内存,建议3G或以上
yum -y install java
java -version              #可查看Java版本

#解压软件包
mkdir /apps/; tar xf Mycat-server-1.6.7.4-test-20191022170541-linux.tar.gz -C /apps/
vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH                         #写到变量中,执行时不用写全路径

. /etc/profile.d/mycat.sh

#更改mycat配置文件
vim /apps/mycat/conf/server.xml
<!--         #找到该位置,将这一行复制到下面
	<property name="serverPort">8066</property> <property name="managerPort">9066</property> 

<property name="handleDistributedTransactions">0</property>     #复制到这行的下面,中间相隔不远
<property name="serverPort">3306</property> <property name="managerPort">9066</property> 
                                                                #内置的账号密码可在该文件下面更改
																#mycat默认自带账号root,密码为123456

vim /apps/mycat/conf/schema.xml         #在相关位置更改
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
   							      #true改为false                     新添加选项
   </schema>                    
    <dataNode name="dn1" dataHost="localhost1" database="hellodb" />     #在此指定mycat访问的数据库
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"    #更改为balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host1" url="10.0.0.18:3306" user="wei" password="123456">
        #负责写操作指向10.0.0.18:3306主服务器,及相关连接账号密码,也可不指定固定地址
        <readHost host="host2" url="10.0.0.28:3306" user="wei" password="123456" />
        #负责读操作指向10.0.0.28:3306从服务器,及相关连接账号密码
        </writeHost>
    </dataHost>
</mycat:schema>


#启动mycat
mycat start
	#默认没更改配置文件,启动后会对外打开端口8066和9066,8066用于接收访问mycat
	#日志文件路径在 /apps/mycat/logs/wrapper.log

#在10.0.0.7上已经可以访问连接,此时看到的数据库是hellodb,连接的是3306端口
mysql -uroot -p123456 -h 10.0.0.8   
#mycat默认自带账号root,密码为123456

在这里插入图片描述

检查读写操作
#可用通用日志功能来检查
#开启功能
mysql> set global general_log=on;

#查看日志文件
tail -f /var/lib/mysql/当前终端主机名.log

[root@rocky2  ~]#tail -f /var/lib/mysql/rocky2.log
/usr/libexec/mysqld, Version: 8.0.26 (Source distribution). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
2023-05-17T03:42:54.774116Z	    8 Quit	   select user()

#也可用server_id来检查
select @@server_id;                         #在客户端查看server_id变量,会看到从服务器的server_id
update students set age=@@server_id where tai=11;    #更改实验用数据的数值用server_id来代替可看到主服务器的server_id
服务器存活性健康检测,定期发送SQL指令:select user()

从服务器损坏,读操作会自动转发到主服务器

主服务器损坏,全局会无法执行写操作

mycat中间件损坏,会无法执行读写分离优化

mysql高可用

在这里插入图片描述

MHA

解决单点失败问题,还是会丢数据

工作逻辑

在这里插入图片描述

  1. MHA利用SELECT 1 As Value指令判断主服务器的健康性,一旦主服务器宕机,MHA从宕机崩溃的主服务器上保存二进制日志事件(binlog events)
  2. 识别含有最新或最全,也可指定更新的slave
  3. 应用差异的中继日志(relay log)到其他的slave,其他的slave上已拷贝有一部分主服务器同步数据到了中继日志中,保证从服务器间的数据一致性
  4. 应用从master保存的二进制日志事件(binlog events)到所有slave节点,尽可能减少主从服务器间的数据差,操作系统存活状态下
  5. 提升一个slave为新的master,第二步为此铺垫
  6. 使其他的slave连接新的master进行复制
  7. 故障服务器自动被剔除集群(masterha_ conf _host)将配置信息去掉,拿去修
  8. 旧的master的VIP虚拟ip会漂移到新的master上,用户可访问新的master,mycat上配置的执行操作的主机ip可不设定为固定ip
  9. MHA是一次性的高可用性解决方 案Manager会自动退出,再次使用需重新启动
实现步骤

在这里插入图片描述

相关环境
环境:四台主机,实验用MHA管理端版本仅支持在CentOS7使用,mysql用的8.0.26版本,10.0.0.7安装 MHA管理端和node端,其他只需安装node端
110.0.0.7 CentOS7       MHA管理端
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
将node端的rpm包拷贝到其他机器
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm 10.0.0.8:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm 10.0.0.18:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm 10.0.0.28210.0.0.8 CentOS8       Master       yum -y install mysql-server      systemctl enable --now mydqld
310.0.0.18 CentOS8      Slave1       yum -y install mysql-server      systemctl enable --now mydqld
410.0.0.28 CentOS8      Slave2       yum -y install mysql-server      systemctl enable --now mydqld
相关步骤
在10.0.0.8上
#安装node包
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

#创建相关文件目录
mkdir /data/mysql
chown mysql.mysql /data/mysql

#更改配置文件
vim /etc/my.cnf
[mysqld]
server-id=8
skip_name_resolve=1             #取消反向解析
log_bin=/data/mysql/mysql-bin
general_log                     #观察结果使用,可不加

systemctl restart mysqld

#创建账号,授权
mysql
create user wei@'10.0.0.%' identified by '123456';
grant replication slave on *.* to wei@'10.0.0.%';
create user li@'10.0.0.%' identified by '123456';
grant all on *.* to li@'10.0.0.%';

#备份并复制到从服务器
mysqldump -uroot -p123456 -A -F --single-transaction --source-data > /backup/full-`date +%F`.sql
scp /data/backup/full-2023-05-16.sql 10.0.0.18:/backup

#添加虚拟地址vip地址,配合后面脚本需使用ifconfig工具添加备注别名,如没有工具可下载net-tools包
ifconfig eth0:1 10.0.0.100/24
在10.0.0.18上
#安装node包
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

#创建相关文件目录
mkdir /data/mysql
chown mysql.mysql /data/mysql

#更改配置文件
vim /etc/my.cnf
[mysqld]
server-id=8
skip_name_resolve=1             #取消反向解析
log_bin=/data/mysql/mysql-bin
general_log    
relay_log_purge=0               #中继日志是否定期清空
read_only

systemctl restart mysqld

#更改主节点信息
vim /backup/full-2023-05-16.sql
CHANGE MASTER TO
  MASTER_HOST='10.0.0.8',                                  
  MASTER_USER='wei',                                       
  MASTER_PASSWORD='123456',                               
  MASTER_PORT=3306,                                        
  MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=156; 

#还原
mysql -e 'set sql_log_bin=0;source /backup/full-2023-05-16.sql;set sql_log_bin=1;start slave;show slave status\G'
scp /data/backup/full-2023-05-16.sql 10.0.0.28:/backup
在10.0.0.28上
#安装node包
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

#创建相关文件目录
mkdir /data/mysql
chown mysql.mysql /data/mysql

#更改配置文件
vim /etc/my.cnf
[mysqld]
server-id=8
skip_name_resolve=1             #取消反向解析
log_bin=/data/mysql/mysql-bin
general_log    
relay_log_purge=0               #中继日志是否定期清空
read_only

systemctl restart mysqld

#还原
mysql -e 'set sql_log_bin=0;source /backup/full-2023-05-16.sql;set sql_log_bin=1;start slave;show slave status\G'

#检测同步数据,在主服务器上更改数据
mysql hellodb -e 'insert teachers (name,age,gender)values('x',32,'M');'
#在从服务器查看数据
mysql hellodb -e 'select * from teachers;'
在10.0.0.7上
#安装rpm包
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

#使用基于key验证,实验使用、简单创建,共用一套钥匙
[root@centos7 ~]#ssh-keygen
[root@centos7 ~]#ssh-copy-id 127.0.0.1
[root@centos7 ~]#ssh 10.0.0.7
[root@centos7 ~]#rsync -av .ssh 10.0.0.8:/root/       #注意拷贝.ssh后面不加斜线
[root@centos7 ~]#rsync -av .ssh 10.0.0.18:/root/
[root@centos7 ~]#rsync -av .ssh 10.0.0.28:/root/

#创建目录并添加修改相关文件
mkdir /etc/mastermha/                              #路径不绝对,可选
vim /etc/mastermha/app1.cnf                        #相关更改项看下面

vim /usr/1ocal/bin/master_ip_failover              #更改脚本中的虚拟vip地址
vim /usr/1oca1/bin/sendmai1.sh                     #更改邮件地址
vim /etc/mail.rc                                   #添加发送邮件的信息
	set from=xxx@qq.com
	set smtp=smtp.qq.com
	set smtp-auth-user=xxx@qq.com
	set smtp-auth-password=邮件授权码

chmod +x /usr/1ocal/bin/master_ip_failover
chmod +x /usr/1oca1/bin/sendmai1.sh

#检查MHA环境 
masterha_check_ssh --conf=/etc/mastermha/app1.cnf       #检查ssh基于key验证
masterha_check_repl --conf=/etc/mastermha/app1.cnf      #检查备份的复制功能
#查看MHA状态
masterha_check_status --conf=/etc/mastermha/app1.cnf  


#开启MHA,生产中建议后台运行
nohup masterha_manager --conf=/etc/mastermha/app1.cnf --remove_dead_master_conf --ignore_last_failover &> /dev/null 
#实验使用,可看过程
masterha_manager --conf=/etc/mastermha/app1.cnf --remove_dead_master_conf --ignore_last_failover
#停止MHA服务
masterha_manager --conf=/etc/mastermha/app1.cnf Stopped app1 successfully
#跟踪查看日志,也可查看状态,会显示有当主服务器宕机时提升哪台从服务器为主服务器
tail -f /data/mastermha/app1/manager.1og

#在10.0.0.8上可看到监控状态,从服务器没有
tail -f /var/lib/mysql/centos8.log

当主服务器10.0.0.8损坏后会被提出全局集群,修好后可将其作为从服务器添加到集群中,建立主从服务器关系,以MHA指向的服务器为主服务器,注意MHA是一次性的,当主服务器损坏后想再次使用需要再次启动MHA服务

app1.cnf脚本

注意该文件行尾不要添加空格等符号,建议开启set list

#具体实例
[root@mha-manager ~]#vim /etc/mastermha/app1.cnf
[server defau1t]
user=li                                   #用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=123456
manager_Workdir=/data/mastermha/app1/     #目录会自动生成,,无需手动创建
manager_1og=/data/mastermha/app1/manager.1og    #日志文件路径
remote_workdir=/data/mastermha/app1/
ssh_user=root                             #用于实现远程ssh基于KEY的连接,访问二进制日志
rep1_user=wei                             #主从复制的用户信息
rep1_password=123456
ping_interva1=1                           #健康性检查的时间间隔吗,单位:秒
master_ip_failover_script=/usr/1ocal/bin/master_ip_failover
#切换VIP的per1脚本,不支持跨网络,也可用Keepalived实现
report_script=/usr/1oca1/bin/sendmai1.sh   #当执行报警脚本,发邮件
check_rep1_delay=0
#默认值为1,表示如果slave中从库落后主库relay1og超过100M,主库不会选择这个从库为新的master,因为这个从库进行恢复需要很长的时间.通过设置参数check_rep1_delay=0,mha触发主从切换时会忽略复制的延时,对于设置candidate_master=1的从库非常有用,这样确保这个从库一定能成为最新的master
master_binlog_dir=/data/mysq1/ #指定二进制日志存放的目录,mha4mysq1-manager-0.58必须指定,之前版本不需要指定

[server1]
hostname=10.0.0.8
port=3306
[server2]
hostname=10.0.0.18
port=3306
candidate_master=1   #指定优先成为新的master
[server3]
hostname=10.0.0.28
port=3306
master_ip_failover脚本
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;
use MHA::DBHelper;

my (
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);
my $vip = '10.0.0.100/24';                      #####在该位置更改虚拟地址vip的值
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
sendmai1.sh脚本
#!/bin/bash
echo "MHA is failover!" | mail -s "MHA Warning" 29308620@qq.com
Galera Cluster
具体实现pxc

以5.7版本为例,在centos7上实现

环境准备
#四台主机
10.0.0.7    pxc1
10.0.0.17   pxc2
10.0.0.27   pxc3
10.0.0.37   pxc4
#关闭防火墙和SELinux,保证时间同步
#注意:如果已经安装MySQL,必须卸载,pxc自带mysql,且是配置过的mysql
搭建yum源并安装
[root@pxc1 ~]#vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0
#实验用的清华大学的percona源,也可用其他国内站点的源仓库

[root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 10.0.0.17:/etc/yum.repos.d
[root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 10.0.0.27:/etc/yum.repos.d
[root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 10.0.0.37:/etc/yum.repos.d

#在三个节点都安装好PXC 5.7 
[root@pxc1 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc2 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc3 ~]#yum install Percona-XtraDB-Cluster-57 -y
更改配置文件
[root@pxc1 ~]#vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so          #所调用的模块
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27  #三个节点的IP,集群内的所有id
binlog_format=ROW                      
default_storage_engine=InnoDB          
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.7             #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster          #集群的名称
wsrep_node_name=pxc-cluster-node-1      #各个节点,指定自已节点名称,集群内各不相同
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2          #SST默认的同步机制,不用动
wsrep_sst_auth="sstuser:s3cretPass"     #取消本行注释,同步使用的连接账号,需创建,可改

#拷贝到其他主机并更改相关内容,节点ip,节点名称,集群ip,连接账号
[root@pxc1 ~]#scp /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 10.0.0.17:/etc/percona-xtradb-cluster.conf.d
[root@pxc1 ~]#scp /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 10.0.0.27:/etc/percona-xtradb-cluster.conf.d
[root@pxc1 ~]#scp /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 10.0.0.37:/etc/percona-xtradb-cluster.conf.d
启动服务
#注意!!!启动第一个节点需使用下面的指令,仅第一个节点使用
systemctl start mysql@bootstrap.service

#其他节点正常启动即可
systemctl start mysql

#查看日志找到第一次登录密码并更改密码用以登录
grep "temporary password" /var/log/mysqld.log
mysql -uroot -p'=tWFP0oRJl8t'
mysql> alter user 'root'@'localhost' identified by '123456';

#创建账号,授权,权限照抄文档即可
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cretPass';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';

#查看集群相关变量
mysql> SHOW VARIABLES LIKE 'wsrep%'\G

#查看集群状态变量
mysql> SHOW STATUS LIKE 'wsrep%'\G
#重点关注下面内容
mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | aad2c02e-131c-11ea-9294-b2e80a6c08c4 |
| ...                        | ...                                  |
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
| ...                        | ...                                  |
| wsrep_cluster_size         | 1                                    |     #集群内主机数
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
| ...                        | ...                                  |
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+

#到此就已经完成搭建了,集群内主机数据库信息已完成同步操作
添加或删除新节点
#添加
#安装包、更改配置文件步骤相同,将需要添加的节点ip加入集群ip
#启动mysql服务即可
systemctl start mysql

#删除节点,将节点上的mysql停止就可以
实用规范

http://zhuanlan.51cto.com/art/201702/531364.htm

基础规范
1.必须使用InnoDB存储引擎

2.使用UTF8MB4字符集

3.数据表、数据字段必须加入中文注释

4.禁止使用存储过程、视图、触发器、Event

5.禁止存储大文件或大照片

命名规范
6.只允许使用内网域名,而不是IP连接数据库

7.线上环境、开发环境、测试环境数据库内网域名遵循命名规范

8.库名、表名、字段名:小写,下划线风格,不超过32个字符,必须见名知意

9.库名与应用名称尽量一致

表设计规范
10.单实例表数目必须小于500

11.单表列数目必须小于30

12.表必须有主键

13.禁止使用外键,如果有外键完整性约束,需要应用程序控制

字段设计规范
14.必须把字段定义为NOT NULL并且提供默认值

15.禁止使用TEXT、BLOB类型

16.禁止使用小数存储货币

17.必须使用varchar(20)存储手机号

18.禁止使用ENUM,可使用TINYINT代替

索引设计规范
19.单表索引建议在五个以内

20.单索引字段数不允许超过5个

21.禁止在更新十分频繁、区分度不高的属性建立索引

22.建立组合索引、必须把区分度高的字段放在前面

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值