Bootstrap

MySql集群搭建

MySql集群原理

MySQL-MMM(mysql主主复制管理器) 的简称,是Google的开源项目(Perl脚本) .MMM基于MSQLReplication做的扩展架构,主要用来监控mysa!主主复制并做失败转移。其原理是将真实数据库节点的IP (RIP) 映射为處拟IP (VIP)集。mysal-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysq!启机时,监管会将VIP迁移至其他mysal。在整个监管过程中,需要在mysal中添加相关授权用户,以便让mysal可以支持监理机的维护。授权的用户包括一个mmm-monitor用户和一个mmm-agent用户,如果想使用mmm的备份工具则还要添加一个mmm-tools用户。

在这里插入图片描述
Monitor(监控器),MySql(主Master1,备主Master2,从Slave),这种架构下从(Slave)只是用来复制主(Master1)上的数据的,当前存在两个Master节点,当然只有Master1是当前真正的主节点,Master2是备用的主节点,在没有故障的情况下是一主(Master1)两从(Master2,Slave),这里MMM架构是利用Monitor监控器,为了达到失败的容错,Monitor为这些MySql创建VIP也就是虚拟IP,如这里分配3个虚拟IP0.0.0.1-Master1、0.0.0.2-Master2、0.0.0.3-Slave,Master1是主MySql分配有0.1的IP这个IP只能用于写的,如果客户端需要增删改的话就连向0.1这个IP,如果客户端需要读取查询那么就连向0.2、0.3的IP,相当于做了读写分离,那么这里出现问题了核心就再Monitor中的虚拟IP上面,Monitor对MySql节点做的监控,当Master1挂了,那么原来Master1的0.1ip就会被拿过来分配到新的备主节点Master2上面,这个操作叫做IP漂移,客户端实际正删改连接写的IP不变,但是集群中实际造作的MySql已经发生变化了,这些操作都是由Monitor来处理!

MHA (Master High Availability) 目前在MySQL高可用方面是一个相对成熟的解决方案,由日本DeNA公司youshimaton (现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0-30秒之内自动完成数据库的故障切换操作(以2019年的眼光来说太慢了) ,并且在进行故障切换的过程中, MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

InnoDB Cluster (官方支持)支持自动Failover、强一致性、读写分离、读库高可用、读请求负载均衡,横向扩展的特性,是比较完备的一套方案。但是部署起来复杂,想要解决router单点问题好需要新增组件,如没有其他更好的方案可考虑该方案。InnoDB Cluster主DE要由MySQL Shell. MySQL Router和MySQL服务器集群组成,三者协同工作,共同为MySQL提供完整的高可用性解决方案。MySQL Shell对管理人员提供管理接口,可以.很方便的对集群进行配置和管理MySQL Router可以根据部署的集群状况自动的初始化,是客户端连接实例。如果有节点down机,集群会自动更新配置。集群包含单点写入和多点写入两种模式。在单主模式下,如果主节点down掉,从节点自动替换上来,MySQL Router会自动探测,并将客户端连接到新节点。
在这里插入图片描述
详细介绍

企业中常用数据库解决方案
应用程序不在直接连接MySql数据库,而是变相的连接数据库代理如DBProxy、MyCat,这里也防止数据库代理宕机,所以这里也做了热备,连接上数据库连接后,读写请求分离,写操作交给Master1节点,读交给Slave1、Slave2、Slave3、Slave4、Slave5,如果存在宕机,从节点一定是来同步主节点Master1的,主节点的数据从节点一定都会同步的,多台从节点还能进行角色拆分,如Slave1、Slave2、Slave3就是面向公众用户访问的,如Slave4节点就是提供后台管理系统访问的,Slave5就是用来数据备份的,无论多少从节点,都是需要从主节点中同步数据的,当主节点出现奔溃问题的时候,这里需要准备Master2备主节点,如果Master1主节点出现奔溃后,Master2就会接任Master1 的任务,成为新的主节点,因为刚开始Master2就对Master1的数据进行同步了所以数据是一致的,当主节点变更为Master2 后所有的Slave从节点就会同步迁移到Master2上面,这里在Master1和Master2存活检测和切换在MySql里面不是使用InnoDB Cluster的话之前是没有提供这种机制的,之前要达到这种效果需要使用keepaliver来检查存活来进行热备,之前很多种解决方案都是要基于keepaliver来处理的,这中模式会存在数据容量限制的问题,如果想要更大容量的存储数据,那么就需要对MySql的数据进行分片存储,如一个此架构的MySql集群分为一个片区;
在这里插入图片描述

MySql集群搭建

1.拉取、启动MySql

主节点
 docker run -p 3307:3306 --name mysql-master -v /data/mysql/mysql3307/log:/var/log/mysql -v /data/mysql/mysql3307/data:/var/lib/mysql -v /data/mysql/mysql3307/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7


docker run -p 3306:3306 --name mysql-master --restart=always -v /data/mysql3306/conf:/etc/mysql/conf.d -v  /data/mysql3306/logs:/logs -v /data/mysql3306/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootroot -d mysql:8.0.23
从节点
 docker run -p 3317:3306 --name mysql-master -v /data/mysql/mysql3317/log:/var/log/mysql -v /data/mysql/mysql3317/data:/var/lib/mysql -v /data/mysql/mysql3317/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

 docker run -p 3307:3306 --name mysql-slave --restart=always -v /data/mysql3307/conf:/etc/mysql/conf.d -v  /data/mysql3307/logs:/logs -v /data/mysql3307/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootroot -d mysql:8.0.23

2.修改配置文件
上面直接在外部挂载目录,这里需要在两台mysql挂载的conf目录下创建my.cnf配置文件
主节点

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=1
log-bin=mysql-bin
#是否只读  0=false   1=true
read-only=0

#需要同步的表数据
binlog-do-db=you_tab

#排除同步的表数据
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema

从节点

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

server_id=2
log-bin=mysql-bin
#是否只读  0=false   1=true
read-only=1


#需要同步的表数据
binlog-do-db=you_tab

#排除同步的表数据
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema

3.重启主从节点

docker restart xxx

4.主节点创建授权
可以在mysql容器里面

docker exec -it 容器名 /bin/bash

也可以在客户端SQLyou

创建授权用户backup密码为123456,可以是任何主机*.*
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456'

查看主节点状态
SHOW MASTER STATUS

在这里插入图片描述

5.从节点改变连接

#改变slave连接
CHANGE MASTER TO MASTER_HOST='192.168.0.177',MASTER_USER='backup',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=0,MASTER_PORT=3307;


#开始同步
start slave;

#查看当前slave的状态
show slave status;

在这里插入图片描述
这里圈起来的两个yes必须的,否者主从搭建失败

那么到这里基本的主从复制模式就搭建完毕!但是在主从复制模式情况下不能解决单表数据量大了的性能问题,如一张表书记量太大了,查询效率会比较低,那么此时就需要对数据进行分片处理,每个MySql就只存储部分数据,也就是MySql分库分表!

;