MySQL 集群
一、集群原理
以上可以作为企业中常用的数据库解决方案;
- MySQL-MMM 是 Master-Master Replication Manager for MySQL(mysql 主主复制管理器)的简称,是 Google 的开源项目(Perl 脚本)。MMM 基于 MySQLReplication 做的扩展架构,主要用来监控 mysql 主主复制并做失败转移。其原理是将真实数据库节点的IP(RIP)映射为虚拟 IP(VIP)集。mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 mysql 之上,当某一台 mysql 宕机时,监管会将 VIP迁移至其他 mysql。在整个监管过程中,需要在 mysql 中添加相关授权用户,以便让 mysql 可以支持监理机的维护。授权的用户包括一个mmm_monitor 用户和一个 mmm_agent 用户,如果想使用 mmm 的备份工具则还要添加一个 mmm_tools 用户。
-
MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案, 由日本 DeNA 公司 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为
MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,
MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作(以 2019 年的眼光来说太
慢了),并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以
达到真正意义上的高可用。 -
InnoDB Cluster 支持自动 Failover、强一致性、读写分离、读库高可用、读请求负载均
衡,横向扩展的特性,是比较完备的一套方案。但是部署起来复杂,想要解决 router
单点问题好需要新增组件,如没有其他更好的方案可考虑该方案。 InnoDB Cluster 主
要由 MySQL Shell、MySQL Router 和 MySQL 服务器集群组成,三者协同工作,共同为
MySQL 提供完整的高可用性解决方案。MySQL Shell 对管理人员提供管理接口,可以
很方便的对集群进行配置和管理,MySQL Router 可以根据部署的集群状况自动的初始
化,是客户端连接实例。如果有节点 down 机,集群会自动更新配置。集群包含单点写
入和多点写入两种模式。在单主模式下,如果主节点 down 掉,从节点自动替换上来,
MySQL Router 会自动探测,并将客户端连接到新节点。
二、Docker 安装模拟 MySQL 主从复制集群
1、下载 mysql 镜像
docker pull mysql:5.7
2、创建 Master 实例并启动
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
参数说明
-p 3307:3306:将容器的 3306 端口映射到主机的 3307 端口
-v /mydata/mysql/master/conf:/etc/mysql:将配置文件夹挂在到主机
-v /mydata/mysql/master/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/master/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
修改 master 基本配置
vi /mydata/mysql/master/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
注意:skip-name-resolve 一定要加,不然连接 mysql 会超级慢
添加 master 主从复制部分配置
vi /mydata/mysql/master/conf/my.cnf
server_id=1 log-bin=mysql-bin read-only=0 binlog-do-db=gulimall_ums binlog-do-db=gulimall_pms binlog-do-db=gulimall_oms binlog-do-db=gulimall_sms binlog-do-db=gulimall_wms binlog-do-db=gulimall_admin replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
重启 master
3、创建 Slave 实例并启动
docker run -p 3317:3306 --name mysql-slaver-01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
修改 slave 基本配置
vi /mydata/mysql/slaver/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=2 log-bin=mysql-bin read-only=1
binlog-do-db=gulimall_ums binlog-do-db=gulimall_pms binlog-do-db=gulimall_oms binlog-do-db=gulimall_sms binlog-do-db=gulimall_wms binlog-do-db=gulimall_admin replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
重启 slaver
4、为 master 授权用户来他的同步数据
添加用来同步的用户(使用navicat远程连接mysql-master 执行下面一行)
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
查看 master 状态
show master status;
5、配置 slaver 同步 master 数据
设置从库连接主库(远程连接mysql-slaver 执行下面一行)
change master to master_host='192.168.56.10',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307;
查看 slaver 状态
show slave status;
至此主从配置完成;
总结:
1)、主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。
并且 server-id 不能一样
2)、主库授权某个账号密码来同步自己的数据
3)、从库使用这个账号密码连接主库来同步数据
三、ShardingSphere-分库分表
为了解决主从同步的性能问题,单点单表的数据量太大时,检索性能就会大打折扣,所以使用分库分表解决单点的性能瓶颈
shardingSphere: http://shardingsphere.apache.org/index_zh.html
具体使用根据官网的用户手册的示例进行测试